#include "yaml-cpp/yaml.h" // IWYU pragma: keep #include "gtest/gtest.h" #define EXPECT_THROW_EXCEPTION(exception_type, statement, message) \ ASSERT_THROW(statement, exception_type); \ try { \ statement; \ } catch (const exception_type& e) { \ EXPECT_EQ(e.msg, message); \ } namespace YAML { namespace { TEST(ErrorMessageTest, BadSubscriptErrorMessage) { const char *example_yaml = "first:\n" " second: 1\n" " third: 2\n"; Node doc = Load(example_yaml); // Test that printable key is part of error message EXPECT_THROW_EXCEPTION(YAML::BadSubscript, doc["first"]["second"]["fourth"], "operator[] call on a scalar (key: \"fourth\")"); EXPECT_THROW_EXCEPTION(YAML::BadSubscript, doc["first"]["second"][37], "operator[] call on a scalar (key: \"37\")"); // Non-printable key is not included in error message EXPECT_THROW_EXCEPTION(YAML::BadSubscript, doc["first"]["second"][std::vector()], "operator[] call on a scalar"); EXPECT_THROW_EXCEPTION(YAML::BadSubscript, doc["first"]["second"][Node()], "operator[] call on a scalar"); } TEST(ErrorMessageTest, Ex9_1_InvalidNodeErrorMessage) { const char *example_yaml = "first:\n" " second: 1\n" " third: 2\n"; const Node doc = Load(example_yaml); // Test that printable key is part of error message EXPECT_THROW_EXCEPTION(YAML::InvalidNode, doc["first"]["fourth"].as(), "invalid node; first invalid key: \"fourth\""); EXPECT_THROW_EXCEPTION(YAML::InvalidNode, doc["first"][37].as(), "invalid node; first invalid key: \"37\""); // Non-printable key is not included in error message EXPECT_THROW_EXCEPTION(YAML::InvalidNode, doc["first"][std::vector()].as(), "invalid node; this may result from using a map " "iterator as a sequence iterator, or vice-versa"); } } }