// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ZIRCON_SYSTEM_UTEST_FIDL_COMPILER_ERROR_TEST_H_
#define ZIRCON_SYSTEM_UTEST_FIDL_COMPILER_ERROR_TEST_H_

#define ASSERT_COMPILED(library)                  \
  {                                               \
    TestLibrary& library_ref = (library);         \
    if (!library_ref.Compile()) {                 \
      const auto& errors = library_ref.errors();  \
      EXPECT_EQ(errors.size(), 0);                \
      for (const auto& error : errors) {          \
        EXPECT_STR_EQ("", error->err.msg.data()); \
      }                                           \
      FAIL("stopping test, compilation failed");  \
    }                                             \
  }

#define ASSERT_ERRORED_DURING_COMPILE(library, error) \
  {                                                   \
    TestLibrary& library_ref = (library);             \
    ASSERT_FALSE(library_ref.Compile());              \
    ASSERT_EQ(library_ref.errors().size(), 1u);       \
    EXPECT_ERR(library_ref.errors()[0], (error));     \
  }

#define ASSERT_ERRORED_TWICE_DURING_COMPILE(library, err0, err1) \
  {                                                              \
    TestLibrary& library_ref = (library);                        \
    ASSERT_FALSE(library_ref.Compile());                         \
    ASSERT_EQ(library_ref.errors().size(), 2u);                  \
    EXPECT_ERR(library_ref.errors()[0], (err0));                 \
    EXPECT_ERR(library_ref.errors()[1], (err1));                 \
  }

#define ASSERT_COMPILED_AND_CONVERT(library)        \
  {                                                 \
    TestLibrary& library_ref = (library);           \
    if (!library_ref.CompileAndCheckConversion()) { \
      const auto& errors = library_ref.errors();    \
      EXPECT_EQ(errors.size(), 0);                  \
      for (const auto& error : errors) {            \
        EXPECT_STR_EQ("", error->err.msg.data());   \
      }                                             \
      FAIL("stopping test, compilation failed");    \
    }                                               \
  }

#define ASSERT_ERR(actual_err, err_def, ...) \
  ASSERT_STR_EQ(actual_err->err.msg.data(), err_def.msg.data(), ##__VA_ARGS__)

#define EXPECT_ERR(actual_err, err_def, ...) \
  EXPECT_STR_EQ(actual_err->err.msg.data(), err_def.msg.data(), ##__VA_ARGS__)

#endif  // ZIRCON_SYSTEM_UTEST_FIDL_COMPILER_ERROR_TEST_H_
