diff --git a/src/scanner.cpp b/src/scanner.cpp index d0eb03cc7..4dff1417e 100644 --- a/src/scanner.cpp +++ b/src/scanner.cpp @@ -280,6 +280,7 @@ void Scanner::EndStream() { INPUT.ResetColumn(); } + InvalidateSimpleKey(); PopAllIndents(); PopAllSimpleKeys(); diff --git a/test/integration/load_node_test.cpp b/test/integration/load_node_test.cpp index 65366175e..5adb8800e 100644 --- a/test/integration/load_node_test.cpp +++ b/test/integration/load_node_test.cpp @@ -271,6 +271,42 @@ struct ParserExceptionTestCase { std::string expected_exception; }; +TEST(LoadNodeTest, RejectTrailingScalarInBlockMap) { + const std::vector inputs = { + "---\nfoo: bar\nnot-a-key", + "---\nfoo: bar\nnot-a-key\n", + "---\nfoo: bar\nnot-a-key\n# A comment", + }; + + for (const std::string& input : inputs) { + try { + Load(input); + FAIL() << "Expected trailing scalar to be rejected, input: " << input; + } catch (const ParserException& e) { + EXPECT_EQ(ErrorMsg::END_OF_MAP, e.msg); + EXPECT_EQ(2, e.mark.line); + EXPECT_EQ(0, e.mark.column); + } + } +} + +TEST(LoadNodeTest, AcceptValidDocumentsWhenPoppingSimpleKeys) { + Node scalar = Load("not-a-key"); + EXPECT_TRUE(scalar.IsScalar()); + EXPECT_EQ("not-a-key", scalar.as()); + + Node explicit_key = Load("? key"); + ASSERT_TRUE(explicit_key.IsMap()); + ASSERT_EQ(1, explicit_key.size()); + EXPECT_TRUE(explicit_key["key"].IsNull()); + + Node map = Load("foo: bar\nbaz: qux\n..."); + ASSERT_TRUE(map.IsMap()); + ASSERT_EQ(2, map.size()); + EXPECT_EQ("bar", map["foo"].as()); + EXPECT_EQ("qux", map["baz"].as()); +} + TEST(NodeTest, IncompleteJson) { std::vector tests = { {"JSON map without value", "{\"access\"", ErrorMsg::END_OF_MAP_FLOW},