|
@@ -763,6 +763,10 @@ bool ConformanceTestSuite::RunSuite(ConformanceTestRunner* runner,
|
|
|
"FieldNameEscaped",
|
|
|
R"({"fieldn\u0061me1": 1})",
|
|
|
"fieldname1: 1");
|
|
|
+ // String ends with escape character.
|
|
|
+ ExpectParseFailureForJson(
|
|
|
+ "StringEndsWithEscapeChar",
|
|
|
+ "{\"optionalString\": \"abc\\");
|
|
|
// Field names must be quoted (or it's not valid JSON).
|
|
|
ExpectParseFailureForJson(
|
|
|
"FieldNameNotQuoted",
|
|
@@ -771,6 +775,17 @@ bool ConformanceTestSuite::RunSuite(ConformanceTestRunner* runner,
|
|
|
ExpectParseFailureForJson(
|
|
|
"TrailingCommaInAnObject",
|
|
|
R"({"fieldname1":1,})");
|
|
|
+ ExpectParseFailureForJson(
|
|
|
+ "TrailingCommaInAnObjectWithSpace",
|
|
|
+ R"({"fieldname1":1 ,})");
|
|
|
+ ExpectParseFailureForJson(
|
|
|
+ "TrailingCommaInAnObjectWithSpaceCommaSpace",
|
|
|
+ R"({"fieldname1":1 , })");
|
|
|
+ ExpectParseFailureForJson(
|
|
|
+ "TrailingCommaInAnObjectWithNewlines",
|
|
|
+ R"({
|
|
|
+ "fieldname1":1,
|
|
|
+ })");
|
|
|
// JSON doesn't support comments.
|
|
|
ExpectParseFailureForJson(
|
|
|
"JsonWithComments",
|
|
@@ -778,6 +793,42 @@ bool ConformanceTestSuite::RunSuite(ConformanceTestRunner* runner,
|
|
|
// This is a comment.
|
|
|
"fieldname1": 1
|
|
|
})");
|
|
|
+ // JSON spec says whitespace doesn't matter, so try a few spacings to be sure.
|
|
|
+ RunValidJsonTest(
|
|
|
+ "OneLineNoSpaces",
|
|
|
+ "{\"optionalInt32\":1,\"optionalInt64\":2}",
|
|
|
+ R"(
|
|
|
+ optional_int32: 1
|
|
|
+ optional_int64: 2
|
|
|
+ )");
|
|
|
+ RunValidJsonTest(
|
|
|
+ "OneLineWithSpaces",
|
|
|
+ "{ \"optionalInt32\" : 1 , \"optionalInt64\" : 2 }",
|
|
|
+ R"(
|
|
|
+ optional_int32: 1
|
|
|
+ optional_int64: 2
|
|
|
+ )");
|
|
|
+ RunValidJsonTest(
|
|
|
+ "MultilineNoSpaces",
|
|
|
+ "{\n\"optionalInt32\"\n:\n1\n,\n\"optionalInt64\"\n:\n2\n}",
|
|
|
+ R"(
|
|
|
+ optional_int32: 1
|
|
|
+ optional_int64: 2
|
|
|
+ )");
|
|
|
+ RunValidJsonTest(
|
|
|
+ "MultilineWithSpaces",
|
|
|
+ "{\n \"optionalInt32\" : 1\n ,\n \"optionalInt64\" : 2\n}\n",
|
|
|
+ R"(
|
|
|
+ optional_int32: 1
|
|
|
+ optional_int64: 2
|
|
|
+ )");
|
|
|
+ // Missing comma between key/value pairs.
|
|
|
+ ExpectParseFailureForJson(
|
|
|
+ "MissingCommaOneLine",
|
|
|
+ "{ \"optionalInt32\": 1 \"optionalInt64\": 2 }");
|
|
|
+ ExpectParseFailureForJson(
|
|
|
+ "MissingCommaMultiline",
|
|
|
+ "{\n \"optionalInt32\": 1\n \"optionalInt64\": 2\n}");
|
|
|
// Duplicated field names are not allowed.
|
|
|
ExpectParseFailureForJson(
|
|
|
"FieldNameDuplicate",
|
|
@@ -1389,6 +1440,15 @@ bool ConformanceTestSuite::RunSuite(ConformanceTestRunner* runner,
|
|
|
ExpectParseFailureForJson(
|
|
|
"RepeatedFieldTrailingComma",
|
|
|
R"({"repeatedInt32": [1, 2, 3, 4,]})");
|
|
|
+ ExpectParseFailureForJson(
|
|
|
+ "RepeatedFieldTrailingCommaWithSpace",
|
|
|
+ "{\"repeatedInt32\": [1, 2, 3, 4 ,]}");
|
|
|
+ ExpectParseFailureForJson(
|
|
|
+ "RepeatedFieldTrailingCommaWithSpaceCommaSpace",
|
|
|
+ "{\"repeatedInt32\": [1, 2, 3, 4 , ]}");
|
|
|
+ ExpectParseFailureForJson(
|
|
|
+ "RepeatedFieldTrailingCommaWithNewlines",
|
|
|
+ "{\"repeatedInt32\": [\n 1,\n 2,\n 3,\n 4,\n]}");
|
|
|
|
|
|
// Map fields.
|
|
|
RunValidJsonTest(
|
|
@@ -1507,6 +1567,18 @@ bool ConformanceTestSuite::RunSuite(ConformanceTestRunner* runner,
|
|
|
"MapFieldValueIsNull",
|
|
|
R"({"mapInt32Int32": {"0": null}})");
|
|
|
|
|
|
+ // http://www.rfc-editor.org/rfc/rfc7159.txt says strings have to use double
|
|
|
+ // quotes.
|
|
|
+ ExpectParseFailureForJson(
|
|
|
+ "StringFieldSingleQuoteKey",
|
|
|
+ R"({'optionalString': "Hello world!"})");
|
|
|
+ ExpectParseFailureForJson(
|
|
|
+ "StringFieldSingleQuoteValue",
|
|
|
+ R"({"optionalString": 'Hello world!'})");
|
|
|
+ ExpectParseFailureForJson(
|
|
|
+ "StringFieldSingleQuoteBoth",
|
|
|
+ R"({'optionalString': 'Hello world!'})");
|
|
|
+
|
|
|
// Wrapper types.
|
|
|
RunValidJsonTest(
|
|
|
"OptionalBoolWrapper",
|