Add unit tests for assert() builtin Change-Id: I3b34617ec39f6863627c9c7a23b45f5e8c2782c3 Reviewed-on: https://gn-review.googlesource.com/c/gn/+/6564 Reviewed-by: Brett Wilson <brettw@chromium.org> Commit-Queue: Brett Wilson <brettw@chromium.org>
diff --git a/src/gn/functions_unittest.cc b/src/gn/functions_unittest.cc index ef5330e..1de8fdc 100644 --- a/src/gn/functions_unittest.cc +++ b/src/gn/functions_unittest.cc
@@ -12,6 +12,66 @@ #include "gn/value.h" #include "util/test/test.h" +TEST(Functions, Assert) { + TestWithScope setup; + + // Verify cases where the assertion passes. + std::vector<std::string> assert_pass_examples = { + R"gn(assert(true))gn", + R"gn(assert(true, "This message is ignored for passed assertions."))gn", + }; + for (const auto& assert_pass_example : assert_pass_examples) { + TestParseInput input(assert_pass_example); + ASSERT_FALSE(input.has_error()); + Err err; + input.parsed()->Execute(setup.scope(), &err); + ASSERT_FALSE(err.has_error()) << assert_pass_example; + } + + // Verify case where the assertion fails, with no message. + { + TestParseInput input("assert(false)"); + ASSERT_FALSE(input.has_error()); + Err err; + input.parsed()->Execute(setup.scope(), &err); + ASSERT_TRUE(err.has_error()); + ASSERT_EQ(err.message(), "Assertion failed."); + } + + // Verify case where the assertion fails, with a message. + { + TestParseInput input("assert(false, \"What failed\")"); + ASSERT_FALSE(input.has_error()); + Err err; + input.parsed()->Execute(setup.scope(), &err); + ASSERT_TRUE(err.has_error()); + ASSERT_EQ(err.message(), "Assertion failed."); + ASSERT_EQ(err.help_text(), "What failed"); + } + + // Verify usage errors are detected. + std::vector<std::string> bad_usage_examples = { + // Number of arguments. + R"gn(assert())gn", + R"gn(assert(1, 2, 3))gn", + + // Argument types. + R"gn(assert(1))gn", + R"gn(assert("oops"))gn", + R"gn(assert(true, 1))gn", + R"gn(assert(true, []))gn", + }; + for (const auto& bad_usage_example : bad_usage_examples) { + TestParseInput input(bad_usage_example); + ASSERT_FALSE(input.has_error()); + Err err; + input.parsed()->Execute(setup.scope(), &err); + ASSERT_TRUE(err.has_error()) << bad_usage_example; + // We are checking for usage errors, not assertion failures. + ASSERT_NE(err.message(), "Assertion failed.") << bad_usage_example; + } +} + TEST(Functions, Defined) { TestWithScope setup;