diff --git a/src/exp.h b/src/exp.h index 33c4b7b..bdfa6b8 100644 --- a/src/exp.h +++ b/src/exp.h @@ -164,8 +164,7 @@ inline const RegEx& EndScalar() { } inline const RegEx& EndScalarInFlow() { static const RegEx e = - (RegEx(':') + (BlankOrBreak() | RegEx() | RegEx(",]}", REGEX_OR))) | - RegEx(",?[]{}", REGEX_OR); + (RegEx(':') + (BlankOrBreak() | RegEx())) | RegEx(",?[]{}", REGEX_OR); return e; } diff --git a/test/integration/load_node_test.cpp b/test/integration/load_node_test.cpp index b28cd37..0f03a9a 100644 --- a/test/integration/load_node_test.cpp +++ b/test/integration/load_node_test.cpp @@ -246,13 +246,13 @@ struct ParserExceptionTestCase { TEST(NodeTest, IncompleteJson) { std::vector tests = { - {"JSON map without value", "{\"access\"", ErrorMsg::END_OF_MAP_FLOW}, - {"JSON map with colon but no value", "{\"access\":", - ErrorMsg::END_OF_MAP_FLOW}, - {"JSON map with unclosed value quote", "{\"access\":\"", - ErrorMsg::END_OF_MAP_FLOW}, - {"JSON map without end brace", "{\"access\":\"abc\"", - ErrorMsg::END_OF_MAP_FLOW}, + {"JSON map without value", "{\"access\"", ErrorMsg::END_OF_MAP_FLOW}, + {"JSON map with colon but no value", "{\"access\":", + ErrorMsg::END_OF_MAP_FLOW}, + {"JSON map with unclosed value quote", "{\"access\":\"", + ErrorMsg::END_OF_MAP_FLOW}, + {"JSON map without end brace", "{\"access\":\"abc\"", + ErrorMsg::END_OF_MAP_FLOW}, }; for (const ParserExceptionTestCase& test : tests) { try { @@ -265,6 +265,50 @@ TEST(NodeTest, IncompleteJson) { } } +struct SingleNodeTestCase { + std::string input; + NodeType::value nodeType; + int nodeSize; + std::string expected_content; +}; + +TEST(NodeTest, SpecialFlow) { + std::vector tests = { + {"[,]", NodeType::Sequence, 1, "[~]"}, + {"[a:]", NodeType::Sequence, 1, "[\"a:\"]"}, + {"[:a]", NodeType::Sequence, 1, "[:a]"}, + {"[:]", NodeType::Sequence, 1, "[\":\"]"}, + {"{:}", NodeType::Map, 1, "{~: ~}"}, + {"{,}", NodeType::Map, 1, "{~: ~}"}, + {"{a:}", NodeType::Map, 1, "{\"a:\": ~}"}, + {"{:a}", NodeType::Map, 1, "{:a: ~}"}, + }; + for (const SingleNodeTestCase& test : tests) { + Node node = Load(test.input); + Emitter emitter; + emitter << node; + EXPECT_EQ(test.nodeType, node.Type()); + EXPECT_EQ(test.nodeSize, node.size()); + EXPECT_EQ(test.expected_content, std::string(emitter.c_str())); + } +} + +TEST(NodeTest, IncorrectFlow) { + std::vector tests = { + {"Incorrect yaml: \"{:]\"", "{:]", ErrorMsg::FLOW_END}, + {"Incorrect yaml: \"[:}\"", "[:}", ErrorMsg::FLOW_END}, + }; + for (const ParserExceptionTestCase test : tests) { + try { + Load(test.input); + FAIL() << "Expected exception " << test.expected_exception << " for " + << test.name << ", input: " << test.input; + } catch (const ParserException& e) { + EXPECT_EQ(test.expected_exception, e.msg); + } + } +} + TEST(NodeTest, LoadTildeAsNull) { Node node = Load("~"); ASSERT_TRUE(node.IsNull()); diff --git a/test/specexamples.h b/test/specexamples.h index 46e2c4c..d9a50bf 100644 --- a/test/specexamples.h +++ b/test/specexamples.h @@ -552,7 +552,7 @@ const char *ex7_2 = const char *ex7_3 = "{\n" - " ? foo :,\n" + " ? foo : ,\n" " : bar,\n" "}\n"; @@ -641,8 +641,8 @@ const char *ex7_17 = "{\n" "unquoted : \"separate\",\n" "http://foo.com,\n" - "omitted value:,\n" - ": omitted key,\n" + "omitted value: ,\n" + " : omitted key,\n" "}"; const char *ex7_18 =