Commit 7c0e9d94 authored by Nicholas Fraser's avatar Nicholas Fraser

Added additional tests for trailing commas

parent 3e21bb42
...@@ -1562,7 +1562,6 @@ TEST(Reader, NumbersAsStrings) { ...@@ -1562,7 +1562,6 @@ TEST(Reader, NumbersAsStrings) {
TEST(Reader, TrailingCommas) { TEST(Reader, TrailingCommas) {
{ {
// trailing array comma
StringStream s("[1,2,3,]"); StringStream s("[1,2,3,]");
ParseArrayHandler<3> h; ParseArrayHandler<3> h;
Reader reader; Reader reader;
...@@ -1570,8 +1569,8 @@ TEST(Reader, TrailingCommas) { ...@@ -1570,8 +1569,8 @@ TEST(Reader, TrailingCommas) {
EXPECT_EQ(5u, h.step_); EXPECT_EQ(5u, h.step_);
} }
{ {
// trailing object comma const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false,"
const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3],}"; "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3],}";
StringStream s(json); StringStream s(json);
ParseObjectHandler h; ParseObjectHandler h;
Reader reader; Reader reader;
...@@ -1579,14 +1578,93 @@ TEST(Reader, TrailingCommas) { ...@@ -1579,14 +1578,93 @@ TEST(Reader, TrailingCommas) {
EXPECT_EQ(20u, h.step_); EXPECT_EQ(20u, h.step_);
} }
{ {
// trailing object and array commas with whitespace // whitespace around trailing commas
const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3\n,\n]\n,\n } "; const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false,"
"\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3\n,\n]\n,\n} ";
StringStream s(json); StringStream s(json);
ParseObjectHandler h; ParseObjectHandler h;
Reader reader; Reader reader;
EXPECT_TRUE(reader.Parse<kParseTrailingCommasFlag>(s, h)); EXPECT_TRUE(reader.Parse<kParseTrailingCommasFlag>(s, h));
EXPECT_EQ(20u, h.step_); EXPECT_EQ(20u, h.step_);
} }
{
// comments around trailing commas
const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null,"
"\"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3/*test*/,/*test*/]/*test*/,/*test*/}";
StringStream s(json);
ParseObjectHandler h;
Reader reader;
EXPECT_TRUE(reader.Parse<kParseTrailingCommasFlag|kParseCommentsFlag>(s, h));
EXPECT_EQ(20u, h.step_);
}
}
TEST(Reader, MultipleTrailingCommaErrors) {
// only a single trailing comma is allowed.
{
StringStream s("[1,2,3,,]");
ParseArrayHandler<3> h;
Reader reader;
ParseResult r = reader.Parse<kParseTrailingCommasFlag>(s, h);
EXPECT_TRUE(reader.HasParseError());
EXPECT_EQ(kParseErrorValueInvalid, r.Code());
EXPECT_EQ(7u, r.Offset());
}
{
const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false,"
"\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3,],,}";
StringStream s(json);
ParseObjectHandler h;
Reader reader;
ParseResult r = reader.Parse<kParseTrailingCommasFlag>(s, h);
EXPECT_TRUE(reader.HasParseError());
EXPECT_EQ(kParseErrorObjectMissName, r.Code());
EXPECT_EQ(95u, r.Offset());
}
}
TEST(Reader, EmptyExceptForCommaErrors) {
// not allowed even with trailing commas enabled; the
// trailing comma must follow a value.
{
StringStream s("[,]");
ParseArrayHandler<3> h;
Reader reader;
ParseResult r = reader.Parse<kParseTrailingCommasFlag>(s, h);
EXPECT_TRUE(reader.HasParseError());
EXPECT_EQ(kParseErrorValueInvalid, r.Code());
EXPECT_EQ(1u, r.Offset());
}
{
StringStream s("{,}");
ParseObjectHandler h;
Reader reader;
ParseResult r = reader.Parse<kParseTrailingCommasFlag>(s, h);
EXPECT_TRUE(reader.HasParseError());
EXPECT_EQ(kParseErrorObjectMissName, r.Code());
EXPECT_EQ(1u, r.Offset());
}
}
TEST(Reader, TrailingCommaHandlerTermination) {
{
HandlerTerminateAtEndArray h;
Reader reader;
StringStream s("[1,2,3,]");
ParseResult r = reader.Parse<kParseTrailingCommasFlag>(s, h);
EXPECT_TRUE(reader.HasParseError());
EXPECT_EQ(kParseErrorTermination, r.Code());
EXPECT_EQ(8u, r.Offset());
}
{
HandlerTerminateAtEndObject h;
Reader reader;
StringStream s("{\"t\": true, \"f\": false,}");
ParseResult r = reader.Parse<kParseTrailingCommasFlag>(s, h);
EXPECT_TRUE(reader.HasParseError());
EXPECT_EQ(kParseErrorTermination, r.Code());
EXPECT_EQ(24u, r.Offset());
}
} }
#ifdef __GNUC__ #ifdef __GNUC__
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment