More JSON tests

- String behaviors
- Testing only valid JSON is allowed
This commit is contained in:
Thomas Van Lenten 2016-08-19 16:56:46 -04:00
parent ff2a6600e5
commit 7437774a27
4 changed files with 85 additions and 0 deletions

View File

@ -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",

View File

@ -30,8 +30,17 @@ JsonInput.MapFieldValueIsNull
JsonInput.RepeatedFieldMessageElementIsNull
JsonInput.RepeatedFieldPrimitiveElementIsNull
JsonInput.RepeatedFieldTrailingComma
JsonInput.RepeatedFieldTrailingCommaWithNewlines
JsonInput.RepeatedFieldTrailingCommaWithSpace
JsonInput.RepeatedFieldTrailingCommaWithSpaceCommaSpace
JsonInput.StringFieldSingleQuoteBoth
JsonInput.StringFieldSingleQuoteKey
JsonInput.StringFieldSingleQuoteValue
JsonInput.StringFieldUppercaseEscapeLetter
JsonInput.TrailingCommaInAnObject
JsonInput.TrailingCommaInAnObjectWithNewlines
JsonInput.TrailingCommaInAnObjectWithSpace
JsonInput.TrailingCommaInAnObjectWithSpaceCommaSpace
JsonInput.WrapperTypesWithNullValue.JsonOutput
JsonInput.WrapperTypesWithNullValue.ProtobufOutput
ProtobufInput.PrematureEofBeforeKnownRepeatedValue.MESSAGE

View File

@ -38,6 +38,9 @@ JsonInput.OriginalProtoFieldName.JsonOutput
JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotBool
JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotInt
JsonInput.StringFieldNotAString
JsonInput.StringFieldSingleQuoteBoth
JsonInput.StringFieldSingleQuoteKey
JsonInput.StringFieldSingleQuoteValue
JsonInput.StringFieldSurrogateInWrongOrder
JsonInput.StringFieldUnpairedHighSurrogate
JsonInput.StringFieldUnpairedLowSurrogate

View File

@ -156,6 +156,7 @@ JsonInput.RepeatedUint32Wrapper.JsonOutput
JsonInput.RepeatedUint32Wrapper.ProtobufOutput
JsonInput.RepeatedUint64Wrapper.JsonOutput
JsonInput.RepeatedUint64Wrapper.ProtobufOutput
JsonInput.StringEndsWithEscapeChar
JsonInput.StringFieldNotAString
JsonInput.StringFieldSurrogateInWrongOrder
JsonInput.StringFieldSurrogatePair.JsonOutput