blob: be78cc304352a03ad21d3a76a96ad64d1c989ecf [file] [log] [blame]
// 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_DURING_COMPILE_WITH_DEP(library, dep, error) \
{ \
TestLibrary& library_ref = (library); \
library_ref.AddDependentLibrary(std::move(dep)); \
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_WITH_DEP_INTO(library, dep, into) \
{ \
TestLibrary& library_ref = (library); \
if (!library_ref.CompileAndCheckConversion(&(into), &(dep))) { \
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"); \
} \
}
// ASSERT_COMPILED_AND_CONVERT_INTO takes an uninitialized TestLibrary
// and populates it with the result of compiling a converted file. This is
// useful for converting a library that will be consumed as a dependency of
// another library.
#define ASSERT_COMPILED_AND_CONVERT_INTO(library, into) \
{ \
TestLibrary no_dep; \
TestLibrary& into_ref = (into); \
ASSERT_COMPILED_AND_CONVERT_WITH_DEP_INTO(library, no_dep, into_ref); \
}
// ASSERT_COMPILED_AND_CONVERT_WITH_DEP allows a library to be converted
// with a dependency, generated from one of ASSERT_COMPILED_AND_CONVERT_INTO or
// ASSERT_COMPILED_AND_CLONE_INTO.
#define ASSERT_COMPILED_AND_CONVERT_WITH_DEP(library, dep) \
{ \
TestLibrary no_into; \
TestLibrary& dep_ref = (dep); \
ASSERT_COMPILED_AND_CONVERT_WITH_DEP_INTO(library, dep_ref, no_into); \
}
#define ASSERT_COMPILED_AND_CONVERT(library) \
{ \
TestLibrary no_dep; \
ASSERT_COMPILED_AND_CONVERT_WITH_DEP(library, no_dep); \
}
// ASSERT_COMPILED_AND_CLONE_INTO is identical to
// ASSERT_COMPILED_AND_CONVERT_INTO, except that it does not convert the second
// library (ie, it clones it instead). This is necessary because we will need
// two copies of the dependent library: one to successfully complete the
// pre-conversion compilation of the target library, and one to use as an
// unconverted dependency for its converted version.
#define ASSERT_COMPILED_AND_CLONE_INTO(library, into) \
{ \
TestLibrary& library_ref = (library); \
TestLibrary no_dep; \
if (!library_ref.CompileTwice(&(into), &(no_dep), fidl::utils::Syntax::kOld)) { \
FAIL("stopping test, dependency duplication 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_