From ecc5ebbea00ef7dc4fe30e64524e1f8e889f2348 Mon Sep 17 00:00:00 2001 From: dota17 Date: Wed, 27 Nov 2019 09:59:50 +0800 Subject: [PATCH 1/5] update testcase for reader --- src/test_lib_json/main.cpp | 268 ++++++++++++++++++++++++++++++++++--- 1 file changed, 249 insertions(+), 19 deletions(-) diff --git a/src/test_lib_json/main.cpp b/src/test_lib_json/main.cpp index 87be51591..8210d2b59 100644 --- a/src/test_lib_json/main.cpp +++ b/src/test_lib_json/main.cpp @@ -2653,16 +2653,193 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithNoErrors) { JSONTEST_ASSERT(reader.getStructuredErrors().empty()); } +JSONTEST_FIXTURE_LOCAL(ReaderTest, parseObject) { + Json::Reader reader; + Json::Value root; + { + bool ok = reader.parse("{\"property\"}", root); + JSONTEST_ASSERT(!ok); + JSONTEST_ASSERT(reader.getFormattedErrorMessages() == + "* Line 1, Column 12\n Missing ':' after object " + "member name\n"); + std::vector errors = + reader.getStructuredErrors(); + JSONTEST_ASSERT(errors.size() == 1); + JSONTEST_ASSERT(errors.at(0).offset_start == 11); + JSONTEST_ASSERT(errors.at(0).offset_limit == 12); + JSONTEST_ASSERT(errors.at(0).message == + "Missing ':' after object member name"); + } + { + bool ok = reader.parse("{\"property\" : \"value\" ", root); + JSONTEST_ASSERT(!ok); + JSONTEST_ASSERT(reader.getFormattedErrorMessages() == + "* Line 1, Column 23\n Missing ',' or '}' in object " + "declaration\n"); + std::vector errors = + reader.getStructuredErrors(); + JSONTEST_ASSERT(errors.size() == 1); + JSONTEST_ASSERT(errors.at(0).offset_start == 22); + JSONTEST_ASSERT(errors.at(0).offset_limit == 22); + JSONTEST_ASSERT(errors.at(0).message == + "Missing ',' or '}' in object declaration"); + } + { + bool ok = reader.parse("{\"property\" : \"value\", ", root); + JSONTEST_ASSERT(!ok); + JSONTEST_ASSERT(reader.getFormattedErrorMessages() == + "* Line 1, Column 24\n Missing '}' or object " + "member name\n"); + std::vector errors = + reader.getStructuredErrors(); + JSONTEST_ASSERT(errors.size() == 1); + JSONTEST_ASSERT(errors.at(0).offset_start == 23); + JSONTEST_ASSERT(errors.at(0).offset_limit == 23); + JSONTEST_ASSERT(errors.at(0).message == + "Missing '}' or object member name"); + } +} + +JSONTEST_FIXTURE_LOCAL(ReaderTest, parseArray) { + Json::Reader reader; + Json::Value root; + { + bool ok = reader.parse("[ \"value\" ", root); + JSONTEST_ASSERT(!ok); + JSONTEST_ASSERT(reader.getFormattedErrorMessages() == + "* Line 1, Column 11\n Missing ',' or ']' in array " + "declaration\n"); + std::vector errors = + reader.getStructuredErrors(); + JSONTEST_ASSERT(errors.size() == 1); + JSONTEST_ASSERT(errors.at(0).offset_start == 10); + JSONTEST_ASSERT(errors.at(0).offset_limit == 10); + JSONTEST_ASSERT(errors.at(0).message == + "Missing ',' or ']' in array declaration"); + } + { + bool ok = reader.parse("[ \"value1\" \"value2\" ] ", root); + JSONTEST_ASSERT(!ok); + JSONTEST_ASSERT(reader.getFormattedErrorMessages() == + "* Line 1, Column 12\n Missing ',' or ']' in array " + "declaration\n"); + std::vector errors = + reader.getStructuredErrors(); + JSONTEST_ASSERT(errors.size() == 1); + JSONTEST_ASSERT(errors.at(0).offset_start == 11); + JSONTEST_ASSERT(errors.at(0).offset_limit == 19); + JSONTEST_ASSERT(errors.at(0).message == + "Missing ',' or ']' in array declaration"); + } +} + +JSONTEST_FIXTURE_LOCAL(ReaderTest, parseString) { + Json::Reader reader; + Json::Value root; + { + bool ok = reader.parse("[ \"\\u8A2a\" ]", root); + JSONTEST_ASSERT(ok); + JSONTEST_ASSERT(reader.getFormattedErrorMessages().empty()); + JSONTEST_ASSERT(reader.getStructuredErrors().empty()); + } + { + bool ok = reader.parse("[ \"\\uD801\" ]", root); + JSONTEST_ASSERT(!ok); + JSONTEST_ASSERT(reader.getFormattedErrorMessages() == + "* Line 1, Column 3\n" + " additional six characters expected to " + "parse unicode surrogate pair.\n" + "See Line 1, Column 10 for detail.\n"); + std::vector errors = + reader.getStructuredErrors(); + JSONTEST_ASSERT(errors.size() == 1); + JSONTEST_ASSERT(errors.at(0).offset_start == 2); + JSONTEST_ASSERT(errors.at(0).offset_limit == 10); + JSONTEST_ASSERT(errors.at(0).message == + "additional six characters expected to " + "parse unicode surrogate pair."); + } + { + bool ok = reader.parse("[ \"\\uD801\\d1234\" ]", root); + JSONTEST_ASSERT(!ok); + JSONTEST_ASSERT(reader.getFormattedErrorMessages() == + "* Line 1, Column 3\n" + " expecting another \\u token to begin the " + "second half of a unicode surrogate pair\n" + "See Line 1, Column 12 for detail.\n"); + std::vector errors = + reader.getStructuredErrors(); + JSONTEST_ASSERT(errors.size() == 1); + JSONTEST_ASSERT(errors.at(0).offset_start == 2); + JSONTEST_ASSERT(errors.at(0).offset_limit == 16); + JSONTEST_ASSERT(errors.at(0).message == + "expecting another \\u token to begin the " + "second half of a unicode surrogate pair"); + } + { + bool ok = reader.parse("[ \"\\ua3t@\" ]", root); + JSONTEST_ASSERT(!ok); + JSONTEST_ASSERT(reader.getFormattedErrorMessages() == + "* Line 1, Column 3\n" + " Bad unicode escape sequence in string: " + "hexadecimal digit expected.\n" + "See Line 1, Column 9 for detail.\n"); + std::vector errors = + reader.getStructuredErrors(); + JSONTEST_ASSERT(errors.size() == 1); + JSONTEST_ASSERT(errors.at(0).offset_start == 2); + JSONTEST_ASSERT(errors.at(0).offset_limit == 10); + JSONTEST_ASSERT(errors.at(0).message == + "Bad unicode escape sequence in string: " + "hexadecimal digit expected."); + } + { + bool ok = reader.parse("[ \"\\ua3t\" ]", root); + JSONTEST_ASSERT(!ok); + JSONTEST_ASSERT( + reader.getFormattedErrorMessages() == + "* Line 1, Column 3\n" + " Bad unicode escape sequence in string: four digits expected.\n" + "See Line 1, Column 6 for detail.\n"); + std::vector errors = + reader.getStructuredErrors(); + JSONTEST_ASSERT(errors.size() == 1); + JSONTEST_ASSERT(errors.at(0).offset_start == 2); + JSONTEST_ASSERT(errors.at(0).offset_limit == 9); + JSONTEST_ASSERT( + errors.at(0).message == + "Bad unicode escape sequence in string: four digits expected."); + } +} + JSONTEST_FIXTURE_LOCAL(ReaderTest, parseComment) { Json::Reader reader; Json::Value root; - bool ok = reader.parse("{ /*commentBeforeValue*/" - " \"property\" : \"value\" }" - "//commentAfterValue\n", - root); - JSONTEST_ASSERT(ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages().empty()); - JSONTEST_ASSERT(reader.getStructuredErrors().empty()); + { + bool ok = reader.parse("{ /*commentBeforeValue*/" + " \"property\" : \"value\" }" + "//commentAfterValue\n", + root); + JSONTEST_ASSERT(ok); + JSONTEST_ASSERT(reader.getFormattedErrorMessages().empty()); + JSONTEST_ASSERT(reader.getStructuredErrors().empty()); + } + { + bool ok = reader.parse("{ \"property\" : \"value\" } " + "//trailing\n//comment\n", + root); + JSONTEST_ASSERT(ok); + JSONTEST_ASSERT(reader.getFormattedErrorMessages().empty()); + JSONTEST_ASSERT(reader.getStructuredErrors().empty()); + } + { + bool ok = reader.parse(" true //comment1\n//comment2\r" + "//comment3\r\n", + root); + JSONTEST_ASSERT(ok); + JSONTEST_ASSERT(reader.getFormattedErrorMessages().empty()); + JSONTEST_ASSERT(reader.getStructuredErrors().empty()); + } } JSONTEST_FIXTURE_LOCAL(ReaderTest, streamParseWithNoErrors) { @@ -2709,18 +2886,71 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithNoErrorsTestingOffsets) { JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithOneError) { Json::Reader reader; Json::Value root; - bool ok = reader.parse("{ \"property\" :: \"value\" }", root); - JSONTEST_ASSERT(!ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages() == - "* Line 1, Column 15\n Syntax error: value, object or array " - "expected.\n"); - std::vector errors = - reader.getStructuredErrors(); - JSONTEST_ASSERT(errors.size() == 1); - JSONTEST_ASSERT(errors.at(0).offset_start == 14); - JSONTEST_ASSERT(errors.at(0).offset_limit == 15); - JSONTEST_ASSERT(errors.at(0).message == - "Syntax error: value, object or array expected."); + { + bool ok = reader.parse("{ \"property\" :: \"value\" }", root); + JSONTEST_ASSERT(!ok); + JSONTEST_ASSERT( + reader.getFormattedErrorMessages() == + "* Line 1, Column 15\n Syntax error: value, object or array " + "expected.\n"); + std::vector errors = + reader.getStructuredErrors(); + JSONTEST_ASSERT(errors.size() == 1); + JSONTEST_ASSERT(errors.at(0).offset_start == 14); + JSONTEST_ASSERT(errors.at(0).offset_limit == 15); + JSONTEST_ASSERT(errors.at(0).message == + "Syntax error: value, object or array expected."); + } + { + bool ok = reader.parse("s", root); + JSONTEST_ASSERT(!ok); + JSONTEST_ASSERT( + reader.getFormattedErrorMessages() == + "* Line 1, Column 1\n Syntax error: value, object or array " + "expected.\n"); + std::vector errors = + reader.getStructuredErrors(); + JSONTEST_ASSERT(errors.size() == 1); + JSONTEST_ASSERT(errors.at(0).offset_start == 0); + JSONTEST_ASSERT(errors.at(0).offset_limit == 1); + JSONTEST_ASSERT(errors.at(0).message == + "Syntax error: value, object or array expected."); + } +} + +JSONTEST_FIXTURE_LOCAL(ReaderTest, parseSpecialFloat) { + Json::Reader reader; + Json::Value root; + { + bool ok = reader.parse("{ \"a\" : Infi }", root); + JSONTEST_ASSERT(!ok); + JSONTEST_ASSERT( + reader.getFormattedErrorMessages() == + "* Line 1, Column 9\n Syntax error: value, object or array " + "expected.\n"); + std::vector errors = + reader.getStructuredErrors(); + JSONTEST_ASSERT(errors.size() == 1); + JSONTEST_ASSERT(errors.at(0).offset_start == 8); + JSONTEST_ASSERT(errors.at(0).offset_limit == 9); + JSONTEST_ASSERT(errors.at(0).message == + "Syntax error: value, object or array expected."); + } + { + bool ok = reader.parse("{ \"a\" : Infiniaa }", root); + JSONTEST_ASSERT(!ok); + JSONTEST_ASSERT( + reader.getFormattedErrorMessages() == + "* Line 1, Column 9\n Syntax error: value, object or array " + "expected.\n"); + std::vector errors = + reader.getStructuredErrors(); + JSONTEST_ASSERT(errors.size() == 1); + JSONTEST_ASSERT(errors.at(0).offset_start == 8); + JSONTEST_ASSERT(errors.at(0).offset_limit == 9); + JSONTEST_ASSERT(errors.at(0).message == + "Syntax error: value, object or array expected."); + } } JSONTEST_FIXTURE_LOCAL(ReaderTest, strictModeParseNumber) { From 771ea78fd9fea1193e55a8bbe3247a4470327491 Mon Sep 17 00:00:00 2001 From: dota17 Date: Thu, 28 Nov 2019 16:20:38 +0800 Subject: [PATCH 2/5] remove extra offsets test --- src/test_lib_json/main.cpp | 106 +------------------------------------ 1 file changed, 2 insertions(+), 104 deletions(-) diff --git a/src/test_lib_json/main.cpp b/src/test_lib_json/main.cpp index 8210d2b59..2a9af669b 100644 --- a/src/test_lib_json/main.cpp +++ b/src/test_lib_json/main.cpp @@ -2662,13 +2662,6 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseObject) { JSONTEST_ASSERT(reader.getFormattedErrorMessages() == "* Line 1, Column 12\n Missing ':' after object " "member name\n"); - std::vector errors = - reader.getStructuredErrors(); - JSONTEST_ASSERT(errors.size() == 1); - JSONTEST_ASSERT(errors.at(0).offset_start == 11); - JSONTEST_ASSERT(errors.at(0).offset_limit == 12); - JSONTEST_ASSERT(errors.at(0).message == - "Missing ':' after object member name"); } { bool ok = reader.parse("{\"property\" : \"value\" ", root); @@ -2676,13 +2669,6 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseObject) { JSONTEST_ASSERT(reader.getFormattedErrorMessages() == "* Line 1, Column 23\n Missing ',' or '}' in object " "declaration\n"); - std::vector errors = - reader.getStructuredErrors(); - JSONTEST_ASSERT(errors.size() == 1); - JSONTEST_ASSERT(errors.at(0).offset_start == 22); - JSONTEST_ASSERT(errors.at(0).offset_limit == 22); - JSONTEST_ASSERT(errors.at(0).message == - "Missing ',' or '}' in object declaration"); } { bool ok = reader.parse("{\"property\" : \"value\", ", root); @@ -2690,13 +2676,6 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseObject) { JSONTEST_ASSERT(reader.getFormattedErrorMessages() == "* Line 1, Column 24\n Missing '}' or object " "member name\n"); - std::vector errors = - reader.getStructuredErrors(); - JSONTEST_ASSERT(errors.size() == 1); - JSONTEST_ASSERT(errors.at(0).offset_start == 23); - JSONTEST_ASSERT(errors.at(0).offset_limit == 23); - JSONTEST_ASSERT(errors.at(0).message == - "Missing '}' or object member name"); } } @@ -2709,13 +2688,6 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseArray) { JSONTEST_ASSERT(reader.getFormattedErrorMessages() == "* Line 1, Column 11\n Missing ',' or ']' in array " "declaration\n"); - std::vector errors = - reader.getStructuredErrors(); - JSONTEST_ASSERT(errors.size() == 1); - JSONTEST_ASSERT(errors.at(0).offset_start == 10); - JSONTEST_ASSERT(errors.at(0).offset_limit == 10); - JSONTEST_ASSERT(errors.at(0).message == - "Missing ',' or ']' in array declaration"); } { bool ok = reader.parse("[ \"value1\" \"value2\" ] ", root); @@ -2723,13 +2695,6 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseArray) { JSONTEST_ASSERT(reader.getFormattedErrorMessages() == "* Line 1, Column 12\n Missing ',' or ']' in array " "declaration\n"); - std::vector errors = - reader.getStructuredErrors(); - JSONTEST_ASSERT(errors.size() == 1); - JSONTEST_ASSERT(errors.at(0).offset_start == 11); - JSONTEST_ASSERT(errors.at(0).offset_limit == 19); - JSONTEST_ASSERT(errors.at(0).message == - "Missing ',' or ']' in array declaration"); } } @@ -2750,31 +2715,15 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseString) { " additional six characters expected to " "parse unicode surrogate pair.\n" "See Line 1, Column 10 for detail.\n"); - std::vector errors = - reader.getStructuredErrors(); - JSONTEST_ASSERT(errors.size() == 1); - JSONTEST_ASSERT(errors.at(0).offset_start == 2); - JSONTEST_ASSERT(errors.at(0).offset_limit == 10); - JSONTEST_ASSERT(errors.at(0).message == - "additional six characters expected to " - "parse unicode surrogate pair."); } { - bool ok = reader.parse("[ \"\\uD801\\d1234\" ]", root); + bool ok = reader.parse("[ \"\\ud801\\d1234\" ]", root); JSONTEST_ASSERT(!ok); JSONTEST_ASSERT(reader.getFormattedErrorMessages() == "* Line 1, Column 3\n" " expecting another \\u token to begin the " "second half of a unicode surrogate pair\n" "See Line 1, Column 12 for detail.\n"); - std::vector errors = - reader.getStructuredErrors(); - JSONTEST_ASSERT(errors.size() == 1); - JSONTEST_ASSERT(errors.at(0).offset_start == 2); - JSONTEST_ASSERT(errors.at(0).offset_limit == 16); - JSONTEST_ASSERT(errors.at(0).message == - "expecting another \\u token to begin the " - "second half of a unicode surrogate pair"); } { bool ok = reader.parse("[ \"\\ua3t@\" ]", root); @@ -2784,14 +2733,6 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseString) { " Bad unicode escape sequence in string: " "hexadecimal digit expected.\n" "See Line 1, Column 9 for detail.\n"); - std::vector errors = - reader.getStructuredErrors(); - JSONTEST_ASSERT(errors.size() == 1); - JSONTEST_ASSERT(errors.at(0).offset_start == 2); - JSONTEST_ASSERT(errors.at(0).offset_limit == 10); - JSONTEST_ASSERT(errors.at(0).message == - "Bad unicode escape sequence in string: " - "hexadecimal digit expected."); } { bool ok = reader.parse("[ \"\\ua3t\" ]", root); @@ -2801,14 +2742,6 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseString) { "* Line 1, Column 3\n" " Bad unicode escape sequence in string: four digits expected.\n" "See Line 1, Column 6 for detail.\n"); - std::vector errors = - reader.getStructuredErrors(); - JSONTEST_ASSERT(errors.size() == 1); - JSONTEST_ASSERT(errors.at(0).offset_start == 2); - JSONTEST_ASSERT(errors.at(0).offset_limit == 9); - JSONTEST_ASSERT( - errors.at(0).message == - "Bad unicode escape sequence in string: four digits expected."); } } @@ -2883,7 +2816,7 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithNoErrorsTestingOffsets) { JSONTEST_ASSERT(root.getOffsetLimit() == 115); } -JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithOneError) { +JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithOneErrorTestingOffsets) { Json::Reader reader; Json::Value root; { @@ -2928,13 +2861,6 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseSpecialFloat) { reader.getFormattedErrorMessages() == "* Line 1, Column 9\n Syntax error: value, object or array " "expected.\n"); - std::vector errors = - reader.getStructuredErrors(); - JSONTEST_ASSERT(errors.size() == 1); - JSONTEST_ASSERT(errors.at(0).offset_start == 8); - JSONTEST_ASSERT(errors.at(0).offset_limit == 9); - JSONTEST_ASSERT(errors.at(0).message == - "Syntax error: value, object or array expected."); } { bool ok = reader.parse("{ \"a\" : Infiniaa }", root); @@ -2943,13 +2869,6 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseSpecialFloat) { reader.getFormattedErrorMessages() == "* Line 1, Column 9\n Syntax error: value, object or array " "expected.\n"); - std::vector errors = - reader.getStructuredErrors(); - JSONTEST_ASSERT(errors.size() == 1); - JSONTEST_ASSERT(errors.at(0).offset_start == 8); - JSONTEST_ASSERT(errors.at(0).offset_limit == 9); - JSONTEST_ASSERT(errors.at(0).message == - "Syntax error: value, object or array expected."); } } @@ -2963,14 +2882,6 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, strictModeParseNumber) { "* Line 1, Column 1\n" " A valid JSON document must be either an array or" " an object value.\n"); - std::vector errors = - reader.getStructuredErrors(); - JSONTEST_ASSERT(errors.size() == 1); - JSONTEST_ASSERT(errors.at(0).offset_start == 0); - JSONTEST_ASSERT(errors.at(0).offset_limit == 3); - JSONTEST_ASSERT(errors.at(0).message == - "A valid JSON document must be either an array or" - " an object value."); } JSONTEST_FIXTURE_LOCAL(ReaderTest, parseChineseWithOneError) { @@ -2981,13 +2892,6 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseChineseWithOneError) { JSONTEST_ASSERT(reader.getFormattedErrorMessages() == "* Line 1, Column 19\n Syntax error: value, object or array " "expected.\n"); - std::vector errors = - reader.getStructuredErrors(); - JSONTEST_ASSERT(errors.size() == 1); - JSONTEST_ASSERT(errors.at(0).offset_start == 18); - JSONTEST_ASSERT(errors.at(0).offset_limit == 19); - JSONTEST_ASSERT(errors.at(0).message == - "Syntax error: value, object or array expected."); } JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithDetailError) { @@ -2998,12 +2902,6 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithDetailError) { JSONTEST_ASSERT(reader.getFormattedErrorMessages() == "* Line 1, Column 16\n Bad escape sequence in string\nSee " "Line 1, Column 20 for detail.\n"); - std::vector errors = - reader.getStructuredErrors(); - JSONTEST_ASSERT(errors.size() == 1); - JSONTEST_ASSERT(errors.at(0).offset_start == 15); - JSONTEST_ASSERT(errors.at(0).offset_limit == 23); - JSONTEST_ASSERT(errors.at(0).message == "Bad escape sequence in string"); } JSONTEST_FIXTURE_LOCAL(ReaderTest, pushErrorTest) { From e4f0554ed3ffdee379adca4212790a5aed90dcec Mon Sep 17 00:00:00 2001 From: dota17 Date: Sat, 30 Nov 2019 17:01:32 +0800 Subject: [PATCH 3/5] add a helper function --- src/test_lib_json/main.cpp | 90 +++++++++++++++++++++++++++++++------- 1 file changed, 73 insertions(+), 17 deletions(-) diff --git a/src/test_lib_json/main.cpp b/src/test_lib_json/main.cpp index 2a9af669b..95ac782bc 100644 --- a/src/test_lib_json/main.cpp +++ b/src/test_lib_json/main.cpp @@ -2642,7 +2642,21 @@ JSONTEST_FIXTURE_LOCAL(StreamWriterTest, unicode) { "\"\\t\\n\\ud806\\udca1=\\u0133\\ud82c\\udd1b\\uff67\"\n}"); } -struct ReaderTest : JsonTest::TestCase {}; +struct ReaderTest : JsonTest::TestCase { + void testStructuredError(Json::Reader reader, Json::ArrayIndex errors_size, + Json::Reader::StructuredError structederror[]) { + std::vector errors = + reader.getStructuredErrors(); + JSONTEST_ASSERT(errors.size() == errors_size); + for (size_t i = 0; i < errors_size; i++) { + JSONTEST_ASSERT(errors.at(i).offset_start == + structederror[i].offset_start); + JSONTEST_ASSERT(errors.at(i).offset_limit == + structederror[i].offset_limit); + JSONTEST_ASSERT(errors.at(i).message == structederror[i].message); + } + } +}; JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithNoErrors) { Json::Reader reader; @@ -2662,6 +2676,9 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseObject) { JSONTEST_ASSERT(reader.getFormattedErrorMessages() == "* Line 1, Column 12\n Missing ':' after object " "member name\n"); + Json::Reader::StructuredError structuredError[] = { + {11, 12, "Missing ':' after object member name"}}; + testStructuredError(reader, 1, structuredError); } { bool ok = reader.parse("{\"property\" : \"value\" ", root); @@ -2669,6 +2686,9 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseObject) { JSONTEST_ASSERT(reader.getFormattedErrorMessages() == "* Line 1, Column 23\n Missing ',' or '}' in object " "declaration\n"); + Json::Reader::StructuredError structuredError[] = { + {22, 22, "Missing ',' or '}' in object declaration"}}; + testStructuredError(reader, 1, structuredError); } { bool ok = reader.parse("{\"property\" : \"value\", ", root); @@ -2676,6 +2696,9 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseObject) { JSONTEST_ASSERT(reader.getFormattedErrorMessages() == "* Line 1, Column 24\n Missing '}' or object " "member name\n"); + Json::Reader::StructuredError structuredError[] = { + {23, 23, "Missing '}' or object member name"}}; + testStructuredError(reader, 1, structuredError); } } @@ -2688,6 +2711,9 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseArray) { JSONTEST_ASSERT(reader.getFormattedErrorMessages() == "* Line 1, Column 11\n Missing ',' or ']' in array " "declaration\n"); + Json::Reader::StructuredError structuredError[] = { + {10, 10, "Missing ',' or ']' in array declaration"}}; + testStructuredError(reader, 1, structuredError); } { bool ok = reader.parse("[ \"value1\" \"value2\" ] ", root); @@ -2695,6 +2721,9 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseArray) { JSONTEST_ASSERT(reader.getFormattedErrorMessages() == "* Line 1, Column 12\n Missing ',' or ']' in array " "declaration\n"); + Json::Reader::StructuredError structuredError[] = { + {11, 19, "Missing ',' or ']' in array declaration"}}; + testStructuredError(reader, 1, structuredError); } } @@ -2708,13 +2737,18 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseString) { JSONTEST_ASSERT(reader.getStructuredErrors().empty()); } { - bool ok = reader.parse("[ \"\\uD801\" ]", root); + bool ok = reader.parse("[ \"\\ud801\" ]", root); JSONTEST_ASSERT(!ok); JSONTEST_ASSERT(reader.getFormattedErrorMessages() == "* Line 1, Column 3\n" " additional six characters expected to " "parse unicode surrogate pair.\n" "See Line 1, Column 10 for detail.\n"); + Json::Reader::StructuredError structuredError[] = { + {2, 10, + "additional six characters expected to " + "parse unicode surrogate pair."}}; + testStructuredError(reader, 1, structuredError); } { bool ok = reader.parse("[ \"\\ud801\\d1234\" ]", root); @@ -2724,6 +2758,11 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseString) { " expecting another \\u token to begin the " "second half of a unicode surrogate pair\n" "See Line 1, Column 12 for detail.\n"); + Json::Reader::StructuredError structuredError[] = { + {2, 16, + "expecting another \\u token to begin the " + "second half of a unicode surrogate pair"}}; + testStructuredError(reader, 1, structuredError); } { bool ok = reader.parse("[ \"\\ua3t@\" ]", root); @@ -2733,6 +2772,11 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseString) { " Bad unicode escape sequence in string: " "hexadecimal digit expected.\n" "See Line 1, Column 9 for detail.\n"); + Json::Reader::StructuredError structuredError[] = { + {2, 10, + "Bad unicode escape sequence in string: " + "hexadecimal digit expected."}}; + testStructuredError(reader, 1, structuredError); } { bool ok = reader.parse("[ \"\\ua3t\" ]", root); @@ -2742,6 +2786,9 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseString) { "* Line 1, Column 3\n" " Bad unicode escape sequence in string: four digits expected.\n" "See Line 1, Column 6 for detail.\n"); + Json::Reader::StructuredError structuredError[] = { + {2, 9, "Bad unicode escape sequence in string: four digits expected."}}; + testStructuredError(reader, 1, structuredError); } } @@ -2816,7 +2863,7 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithNoErrorsTestingOffsets) { JSONTEST_ASSERT(root.getOffsetLimit() == 115); } -JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithOneErrorTestingOffsets) { +JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithOneError) { Json::Reader reader; Json::Value root; { @@ -2826,13 +2873,9 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithOneErrorTestingOffsets) { reader.getFormattedErrorMessages() == "* Line 1, Column 15\n Syntax error: value, object or array " "expected.\n"); - std::vector errors = - reader.getStructuredErrors(); - JSONTEST_ASSERT(errors.size() == 1); - JSONTEST_ASSERT(errors.at(0).offset_start == 14); - JSONTEST_ASSERT(errors.at(0).offset_limit == 15); - JSONTEST_ASSERT(errors.at(0).message == - "Syntax error: value, object or array expected."); + Json::Reader::StructuredError structuredError[] = { + {14, 15, "Syntax error: value, object or array expected."}}; + testStructuredError(reader, 1, structuredError); } { bool ok = reader.parse("s", root); @@ -2841,13 +2884,9 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithOneErrorTestingOffsets) { reader.getFormattedErrorMessages() == "* Line 1, Column 1\n Syntax error: value, object or array " "expected.\n"); - std::vector errors = - reader.getStructuredErrors(); - JSONTEST_ASSERT(errors.size() == 1); - JSONTEST_ASSERT(errors.at(0).offset_start == 0); - JSONTEST_ASSERT(errors.at(0).offset_limit == 1); - JSONTEST_ASSERT(errors.at(0).message == - "Syntax error: value, object or array expected."); + Json::Reader::StructuredError structuredError[] = { + {0, 1, "Syntax error: value, object or array expected."}}; + testStructuredError(reader, 1, structuredError); } } @@ -2861,6 +2900,9 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseSpecialFloat) { reader.getFormattedErrorMessages() == "* Line 1, Column 9\n Syntax error: value, object or array " "expected.\n"); + Json::Reader::StructuredError structuredError[] = { + {8, 9, "Syntax error: value, object or array expected."}}; + testStructuredError(reader, 1, structuredError); } { bool ok = reader.parse("{ \"a\" : Infiniaa }", root); @@ -2869,6 +2911,9 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseSpecialFloat) { reader.getFormattedErrorMessages() == "* Line 1, Column 9\n Syntax error: value, object or array " "expected.\n"); + Json::Reader::StructuredError structuredError[] = { + {8, 9, "Syntax error: value, object or array expected."}}; + testStructuredError(reader, 1, structuredError); } } @@ -2882,6 +2927,11 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, strictModeParseNumber) { "* Line 1, Column 1\n" " A valid JSON document must be either an array or" " an object value.\n"); + Json::Reader::StructuredError structuredError[] = { + {0, 3, + "A valid JSON document must be either an array or" + " an object value."}}; + testStructuredError(reader, 1, structuredError); } JSONTEST_FIXTURE_LOCAL(ReaderTest, parseChineseWithOneError) { @@ -2892,6 +2942,9 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseChineseWithOneError) { JSONTEST_ASSERT(reader.getFormattedErrorMessages() == "* Line 1, Column 19\n Syntax error: value, object or array " "expected.\n"); + Json::Reader::StructuredError structuredError[] = { + {18, 19, "Syntax error: value, object or array expected."}}; + testStructuredError(reader, 1, structuredError); } JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithDetailError) { @@ -2902,6 +2955,9 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithDetailError) { JSONTEST_ASSERT(reader.getFormattedErrorMessages() == "* Line 1, Column 16\n Bad escape sequence in string\nSee " "Line 1, Column 20 for detail.\n"); + Json::Reader::StructuredError structuredError[] = { + {15, 23, "Bad escape sequence in string"}}; + testStructuredError(reader, 1, structuredError); } JSONTEST_FIXTURE_LOCAL(ReaderTest, pushErrorTest) { From 776a8527a757d95150688b9b9c37ad6461c826cb Mon Sep 17 00:00:00 2001 From: Billy Donahue Date: Sun, 1 Dec 2019 09:37:21 -0500 Subject: [PATCH 4/5] refactor structured error testing --- src/test_lib_json/main.cpp | 465 +++++++++++++------------------------ 1 file changed, 165 insertions(+), 300 deletions(-) diff --git a/src/test_lib_json/main.cpp b/src/test_lib_json/main.cpp index 95ac782bc..a4fb59f61 100644 --- a/src/test_lib_json/main.cpp +++ b/src/test_lib_json/main.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -2643,350 +2644,214 @@ JSONTEST_FIXTURE_LOCAL(StreamWriterTest, unicode) { } struct ReaderTest : JsonTest::TestCase { - void testStructuredError(Json::Reader reader, Json::ArrayIndex errors_size, - Json::Reader::StructuredError structederror[]) { - std::vector errors = - reader.getStructuredErrors(); - JSONTEST_ASSERT(errors.size() == errors_size); - for (size_t i = 0; i < errors_size; i++) { - JSONTEST_ASSERT(errors.at(i).offset_start == - structederror[i].offset_start); - JSONTEST_ASSERT(errors.at(i).offset_limit == - structederror[i].offset_limit); - JSONTEST_ASSERT(errors.at(i).message == structederror[i].message); + void setStrictMode() { + reader = std::unique_ptr( + new Json::Reader(Json::Features{}.strictMode())); + } + + void checkStructuredErrors( + const std::vector& actual, + const std::vector& expected) { + JSONTEST_ASSERT_EQUAL(actual.size(), expected.size()); + for (size_t i = 0; i < actual.size(); ++i) { + const auto& a = actual[i]; + const auto& e = expected[i]; + JSONTEST_ASSERT_EQUAL(a.offset_start, e.offset_start) << i; + JSONTEST_ASSERT_EQUAL(a.offset_limit, e.offset_limit) << i; + JSONTEST_ASSERT_EQUAL(a.message, e.message) << i; } } + + template void checkParse(Input&& input) { + JSONTEST_ASSERT(reader->parse(input, root)); + } + + template + void + checkParse(Input&& input, + const std::vector& structured) { + JSONTEST_ASSERT(!reader->parse(input, root)); + checkStructuredErrors(reader->getStructuredErrors(), structured); + } + + template + void checkParse(Input&& input, + const std::vector& structured, + const std::string& formatted) { + checkParse(input, structured); + JSONTEST_ASSERT_EQUAL(reader->getFormattedErrorMessages(), formatted); + } + + std::unique_ptr reader{new Json::Reader()}; + Json::Value root; }; JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithNoErrors) { - Json::Reader reader; - Json::Value root; - bool ok = reader.parse("{ \"property\" : \"value\" }", root); - JSONTEST_ASSERT(ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages().empty()); - JSONTEST_ASSERT(reader.getStructuredErrors().empty()); + checkParse(R"({ "property" : "value" })"); } JSONTEST_FIXTURE_LOCAL(ReaderTest, parseObject) { - Json::Reader reader; - Json::Value root; - { - bool ok = reader.parse("{\"property\"}", root); - JSONTEST_ASSERT(!ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages() == - "* Line 1, Column 12\n Missing ':' after object " - "member name\n"); - Json::Reader::StructuredError structuredError[] = { - {11, 12, "Missing ':' after object member name"}}; - testStructuredError(reader, 1, structuredError); - } - { - bool ok = reader.parse("{\"property\" : \"value\" ", root); - JSONTEST_ASSERT(!ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages() == - "* Line 1, Column 23\n Missing ',' or '}' in object " - "declaration\n"); - Json::Reader::StructuredError structuredError[] = { - {22, 22, "Missing ',' or '}' in object declaration"}}; - testStructuredError(reader, 1, structuredError); - } - { - bool ok = reader.parse("{\"property\" : \"value\", ", root); - JSONTEST_ASSERT(!ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages() == - "* Line 1, Column 24\n Missing '}' or object " - "member name\n"); - Json::Reader::StructuredError structuredError[] = { - {23, 23, "Missing '}' or object member name"}}; - testStructuredError(reader, 1, structuredError); - } + checkParse( + R"({"property"})", {{11, 12, "Missing ':' after object member name"}}, + "* Line 1, Column 12\n Missing ':' after object member name\n"); + checkParse( + R"({"property" : "value" )", + {{22, 22, "Missing ',' or '}' in object declaration"}}, + "* Line 1, Column 23\n Missing ',' or '}' in object declaration\n"); + checkParse( + R"({"property" : "value", )", + {{23, 23, "Missing '}' or object member name"}}, + "* Line 1, Column 24\n Missing '}' or object member name\n"); } JSONTEST_FIXTURE_LOCAL(ReaderTest, parseArray) { - Json::Reader reader; - Json::Value root; - { - bool ok = reader.parse("[ \"value\" ", root); - JSONTEST_ASSERT(!ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages() == - "* Line 1, Column 11\n Missing ',' or ']' in array " - "declaration\n"); - Json::Reader::StructuredError structuredError[] = { - {10, 10, "Missing ',' or ']' in array declaration"}}; - testStructuredError(reader, 1, structuredError); - } - { - bool ok = reader.parse("[ \"value1\" \"value2\" ] ", root); - JSONTEST_ASSERT(!ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages() == - "* Line 1, Column 12\n Missing ',' or ']' in array " - "declaration\n"); - Json::Reader::StructuredError structuredError[] = { - {11, 19, "Missing ',' or ']' in array declaration"}}; - testStructuredError(reader, 1, structuredError); - } + checkParse( + R"([ "value" )", {{10, 10, "Missing ',' or ']' in array declaration"}}, + "* Line 1, Column 11\n Missing ',' or ']' in array declaration\n"); + checkParse( + R"([ "value1" "value2" ] )", + {{11, 19, "Missing ',' or ']' in array declaration"}}, + "* Line 1, Column 12\n Missing ',' or ']' in array declaration\n"); } JSONTEST_FIXTURE_LOCAL(ReaderTest, parseString) { - Json::Reader reader; - Json::Value root; - { - bool ok = reader.parse("[ \"\\u8A2a\" ]", root); - JSONTEST_ASSERT(ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages().empty()); - JSONTEST_ASSERT(reader.getStructuredErrors().empty()); - } - { - bool ok = reader.parse("[ \"\\ud801\" ]", root); - JSONTEST_ASSERT(!ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages() == - "* Line 1, Column 3\n" - " additional six characters expected to " - "parse unicode surrogate pair.\n" - "See Line 1, Column 10 for detail.\n"); - Json::Reader::StructuredError structuredError[] = { - {2, 10, - "additional six characters expected to " - "parse unicode surrogate pair."}}; - testStructuredError(reader, 1, structuredError); - } - { - bool ok = reader.parse("[ \"\\ud801\\d1234\" ]", root); - JSONTEST_ASSERT(!ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages() == - "* Line 1, Column 3\n" - " expecting another \\u token to begin the " - "second half of a unicode surrogate pair\n" - "See Line 1, Column 12 for detail.\n"); - Json::Reader::StructuredError structuredError[] = { - {2, 16, - "expecting another \\u token to begin the " - "second half of a unicode surrogate pair"}}; - testStructuredError(reader, 1, structuredError); - } - { - bool ok = reader.parse("[ \"\\ua3t@\" ]", root); - JSONTEST_ASSERT(!ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages() == - "* Line 1, Column 3\n" - " Bad unicode escape sequence in string: " - "hexadecimal digit expected.\n" - "See Line 1, Column 9 for detail.\n"); - Json::Reader::StructuredError structuredError[] = { - {2, 10, - "Bad unicode escape sequence in string: " - "hexadecimal digit expected."}}; - testStructuredError(reader, 1, structuredError); - } - { - bool ok = reader.parse("[ \"\\ua3t\" ]", root); - JSONTEST_ASSERT(!ok); - JSONTEST_ASSERT( - reader.getFormattedErrorMessages() == - "* Line 1, Column 3\n" - " Bad unicode escape sequence in string: four digits expected.\n" - "See Line 1, Column 6 for detail.\n"); - Json::Reader::StructuredError structuredError[] = { - {2, 9, "Bad unicode escape sequence in string: four digits expected."}}; - testStructuredError(reader, 1, structuredError); - } + checkParse(R"([ "\u8a2a" ])"); + checkParse( + R"([ "\ud801" ])", + {{2, 10, + "additional six characters expected to parse unicode surrogate " + "pair."}}, + "* Line 1, Column 3\n" + " additional six characters expected to parse unicode surrogate pair.\n" + "See Line 1, Column 10 for detail.\n"); + checkParse(R"([ "\ud801\d1234" ])", + {{2, 16, + "expecting another \\u token to begin the " + "second half of a unicode surrogate pair"}}, + "* Line 1, Column 3\n" + " expecting another \\u token to begin the " + "second half of a unicode surrogate pair\n" + "See Line 1, Column 12 for detail.\n"); + checkParse(R"([ "\ua3t@" ])", + {{2, 10, + "Bad unicode escape sequence in string: " + "hexadecimal digit expected."}}, + "* Line 1, Column 3\n" + " Bad unicode escape sequence in string: " + "hexadecimal digit expected.\n" + "See Line 1, Column 9 for detail.\n"); + checkParse( + R"([ "\ua3t" ])", + {{2, 9, "Bad unicode escape sequence in string: four digits expected."}}, + "* Line 1, Column 3\n" + " Bad unicode escape sequence in string: four digits expected.\n" + "See Line 1, Column 6 for detail.\n"); } JSONTEST_FIXTURE_LOCAL(ReaderTest, parseComment) { - Json::Reader reader; - Json::Value root; - { - bool ok = reader.parse("{ /*commentBeforeValue*/" - " \"property\" : \"value\" }" - "//commentAfterValue\n", - root); - JSONTEST_ASSERT(ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages().empty()); - JSONTEST_ASSERT(reader.getStructuredErrors().empty()); - } - { - bool ok = reader.parse("{ \"property\" : \"value\" } " - "//trailing\n//comment\n", - root); - JSONTEST_ASSERT(ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages().empty()); - JSONTEST_ASSERT(reader.getStructuredErrors().empty()); - } - { - bool ok = reader.parse(" true //comment1\n//comment2\r" - "//comment3\r\n", - root); - JSONTEST_ASSERT(ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages().empty()); - JSONTEST_ASSERT(reader.getStructuredErrors().empty()); - } + checkParse( + R"({ /*commentBeforeValue*/ "property" : "value" }//commentAfterValue)" + "\n"); + checkParse(" true //comment1\n//comment2\r//comment3\r\n"); } JSONTEST_FIXTURE_LOCAL(ReaderTest, streamParseWithNoErrors) { - Json::Reader reader; - std::string styled = "{ \"property\" : \"value\" }"; + std::string styled = R"({ "property" : "value" })"; std::istringstream iss(styled); - Json::Value root; - bool ok = reader.parse(iss, root); - JSONTEST_ASSERT(ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages().empty()); - JSONTEST_ASSERT(reader.getStructuredErrors().empty()); + checkParse(iss); } JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithNoErrorsTestingOffsets) { - Json::Reader reader; - Json::Value root; - bool ok = reader.parse("{ \"property\" : [\"value\", \"value2\"], \"obj\" : " - "{ \"nested\" : -6.2e+15, \"bool\" : true}, \"null\" :" - " null, \"false\" : false }", - root); - JSONTEST_ASSERT(ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages().empty()); - JSONTEST_ASSERT(reader.getStructuredErrors().empty()); - JSONTEST_ASSERT(root["property"].getOffsetStart() == 15); - JSONTEST_ASSERT(root["property"].getOffsetLimit() == 34); - JSONTEST_ASSERT(root["property"][0].getOffsetStart() == 16); - JSONTEST_ASSERT(root["property"][0].getOffsetLimit() == 23); - JSONTEST_ASSERT(root["property"][1].getOffsetStart() == 25); - JSONTEST_ASSERT(root["property"][1].getOffsetLimit() == 33); - JSONTEST_ASSERT(root["obj"].getOffsetStart() == 44); - JSONTEST_ASSERT(root["obj"].getOffsetLimit() == 81); - JSONTEST_ASSERT(root["obj"]["nested"].getOffsetStart() == 57); - JSONTEST_ASSERT(root["obj"]["nested"].getOffsetLimit() == 65); - JSONTEST_ASSERT(root["obj"]["bool"].getOffsetStart() == 76); - JSONTEST_ASSERT(root["obj"]["bool"].getOffsetLimit() == 80); - JSONTEST_ASSERT(root["null"].getOffsetStart() == 92); - JSONTEST_ASSERT(root["null"].getOffsetLimit() == 96); - JSONTEST_ASSERT(root["false"].getOffsetStart() == 108); - JSONTEST_ASSERT(root["false"].getOffsetLimit() == 113); - JSONTEST_ASSERT(root.getOffsetStart() == 0); - JSONTEST_ASSERT(root.getOffsetLimit() == 115); + checkParse( + R"({)" + R"( "property" : ["value", "value2"],)" + R"( "obj" : { "nested" : -6.2e+15, "bool" : true},)" + R"( "null" : null,)" + R"( "false" : false)" + R"( })"); + auto checkOffsets = [&](const Json::Value& v, int start, int limit) { + JSONTEST_ASSERT_EQUAL(v.getOffsetStart(), start); + JSONTEST_ASSERT_EQUAL(v.getOffsetLimit(), limit); + }; + checkOffsets(root, 0, 115); + checkOffsets(root["property"], 15, 34); + checkOffsets(root["property"][0], 16, 23); + checkOffsets(root["property"][1], 25, 33); + checkOffsets(root["obj"], 44, 81); + checkOffsets(root["obj"]["nested"], 57, 65); + checkOffsets(root["obj"]["bool"], 76, 80); + checkOffsets(root["null"], 92, 96); + checkOffsets(root["false"], 108, 113); } JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithOneError) { - Json::Reader reader; - Json::Value root; - { - bool ok = reader.parse("{ \"property\" :: \"value\" }", root); - JSONTEST_ASSERT(!ok); - JSONTEST_ASSERT( - reader.getFormattedErrorMessages() == - "* Line 1, Column 15\n Syntax error: value, object or array " - "expected.\n"); - Json::Reader::StructuredError structuredError[] = { - {14, 15, "Syntax error: value, object or array expected."}}; - testStructuredError(reader, 1, structuredError); - } - { - bool ok = reader.parse("s", root); - JSONTEST_ASSERT(!ok); - JSONTEST_ASSERT( - reader.getFormattedErrorMessages() == - "* Line 1, Column 1\n Syntax error: value, object or array " - "expected.\n"); - Json::Reader::StructuredError structuredError[] = { - {0, 1, "Syntax error: value, object or array expected."}}; - testStructuredError(reader, 1, structuredError); - } + checkParse(R"({ "property" :: "value" })", + {{14, 15, "Syntax error: value, object or array expected."}}, + "* Line 1, Column 15\n Syntax error: value, object or array " + "expected.\n"); + checkParse("s", {{0, 1, "Syntax error: value, object or array expected."}}, + "* Line 1, Column 1\n Syntax error: value, object or array " + "expected.\n"); } JSONTEST_FIXTURE_LOCAL(ReaderTest, parseSpecialFloat) { - Json::Reader reader; - Json::Value root; - { - bool ok = reader.parse("{ \"a\" : Infi }", root); - JSONTEST_ASSERT(!ok); - JSONTEST_ASSERT( - reader.getFormattedErrorMessages() == - "* Line 1, Column 9\n Syntax error: value, object or array " - "expected.\n"); - Json::Reader::StructuredError structuredError[] = { - {8, 9, "Syntax error: value, object or array expected."}}; - testStructuredError(reader, 1, structuredError); - } - { - bool ok = reader.parse("{ \"a\" : Infiniaa }", root); - JSONTEST_ASSERT(!ok); - JSONTEST_ASSERT( - reader.getFormattedErrorMessages() == - "* Line 1, Column 9\n Syntax error: value, object or array " - "expected.\n"); - Json::Reader::StructuredError structuredError[] = { - {8, 9, "Syntax error: value, object or array expected."}}; - testStructuredError(reader, 1, structuredError); - } + checkParse(R"({ "a" : Infi })", + {{8, 9, "Syntax error: value, object or array expected."}}, + "* Line 1, Column 9\n Syntax error: value, object or array " + "expected.\n"); + checkParse(R"({ "a" : Infiniaa })", + {{8, 9, "Syntax error: value, object or array expected."}}, + "* Line 1, Column 9\n Syntax error: value, object or array " + "expected.\n"); } JSONTEST_FIXTURE_LOCAL(ReaderTest, strictModeParseNumber) { - Json::Features feature; - Json::Reader reader(feature.strictMode()); - Json::Value root; - bool ok = reader.parse("123", root); - JSONTEST_ASSERT(!ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages() == - "* Line 1, Column 1\n" - " A valid JSON document must be either an array or" - " an object value.\n"); - Json::Reader::StructuredError structuredError[] = { - {0, 3, - "A valid JSON document must be either an array or" - " an object value."}}; - testStructuredError(reader, 1, structuredError); + setStrictMode(); + checkParse( + "123", + {{0, 3, + "A valid JSON document must be either an array or an object value."}}, + "* Line 1, Column 1\n" + " A valid JSON document must be either an array or an object value.\n"); } JSONTEST_FIXTURE_LOCAL(ReaderTest, parseChineseWithOneError) { - Json::Reader reader; - Json::Value root; - bool ok = reader.parse("{ \"pr佐藤erty\" :: \"value\" }", root); - JSONTEST_ASSERT(!ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages() == - "* Line 1, Column 19\n Syntax error: value, object or array " - "expected.\n"); - Json::Reader::StructuredError structuredError[] = { - {18, 19, "Syntax error: value, object or array expected."}}; - testStructuredError(reader, 1, structuredError); + checkParse( + R"({ "pr)" + "\u4f50\u8574" + R"(erty" :: "value" })", + {{18, 19, "Syntax error: value, object or array expected."}}, + "* Line 1, Column 19\n Syntax error: value, object or array " + "expected.\n"); } JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithDetailError) { - Json::Reader reader; - Json::Value root; - bool ok = reader.parse("{ \"property\" : \"v\\alue\" }", root); - JSONTEST_ASSERT(!ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages() == - "* Line 1, Column 16\n Bad escape sequence in string\nSee " - "Line 1, Column 20 for detail.\n"); - Json::Reader::StructuredError structuredError[] = { - {15, 23, "Bad escape sequence in string"}}; - testStructuredError(reader, 1, structuredError); + checkParse(R"({ "property" : "v\alue" })", + {{15, 23, "Bad escape sequence in string"}}, + "* Line 1, Column 16\n" + " Bad escape sequence in string\n" + "See Line 1, Column 20 for detail.\n"); } JSONTEST_FIXTURE_LOCAL(ReaderTest, pushErrorTest) { - Json::Reader reader; - Json::Value root; - { - bool ok = reader.parse("{ \"AUTHOR\" : 123 }", root); - JSONTEST_ASSERT(ok); - if (!root["AUTHOR"].isString()) { - ok = reader.pushError(root["AUTHOR"], "AUTHOR must be a string"); - } - JSONTEST_ASSERT(ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages() == - "* Line 1, Column 14\n" - " AUTHOR must be a string\n"); + checkParse(R"({ "AUTHOR" : 123 })"); + if (!root["AUTHOR"].isString()) { + JSONTEST_ASSERT( + reader->pushError(root["AUTHOR"], "AUTHOR must be a string")); } - { - bool ok = reader.parse("{ \"AUTHOR\" : 123 }", root); - JSONTEST_ASSERT(ok); - if (!root["AUTHOR"].isString()) { - ok = reader.pushError(root["AUTHOR"], "AUTHOR must be a string", - root["AUTHOR"]); - } - JSONTEST_ASSERT(ok); - JSONTEST_ASSERT(reader.getFormattedErrorMessages() == - "* Line 1, Column 14\n" - " AUTHOR must be a string\n" - "See Line 1, Column 14 for detail.\n"); + JSONTEST_ASSERT_STRING_EQUAL(reader->getFormattedErrorMessages(), + "* Line 1, Column 14\n" + " AUTHOR must be a string\n"); + + checkParse(R"({ "AUTHOR" : 123 })"); + if (!root["AUTHOR"].isString()) { + JSONTEST_ASSERT(reader->pushError(root["AUTHOR"], "AUTHOR must be a string", + root["AUTHOR"])); } + JSONTEST_ASSERT_STRING_EQUAL(reader->getFormattedErrorMessages(), + "* Line 1, Column 14\n" + " AUTHOR must be a string\n" + "See Line 1, Column 14 for detail.\n"); } struct CharReaderTest : JsonTest::TestCase {}; From a56f35a3866c3415a21b6249fbf7f1670aee84b2 Mon Sep 17 00:00:00 2001 From: dota17 Date: Mon, 2 Dec 2019 15:01:12 +0800 Subject: [PATCH 5/5] run clang-format --- src/test_lib_json/main.cpp | 40 ++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/test_lib_json/main.cpp b/src/test_lib_json/main.cpp index a4fb59f61..3bb67450d 100644 --- a/src/test_lib_json/main.cpp +++ b/src/test_lib_json/main.cpp @@ -2691,17 +2691,16 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithNoErrors) { } JSONTEST_FIXTURE_LOCAL(ReaderTest, parseObject) { - checkParse( - R"({"property"})", {{11, 12, "Missing ':' after object member name"}}, - "* Line 1, Column 12\n Missing ':' after object member name\n"); + checkParse(R"({"property"})", + {{11, 12, "Missing ':' after object member name"}}, + "* Line 1, Column 12\n Missing ':' after object member name\n"); checkParse( R"({"property" : "value" )", {{22, 22, "Missing ',' or '}' in object declaration"}}, "* Line 1, Column 23\n Missing ',' or '}' in object declaration\n"); - checkParse( - R"({"property" : "value", )", - {{23, 23, "Missing '}' or object member name"}}, - "* Line 1, Column 24\n Missing '}' or object member name\n"); + checkParse(R"({"property" : "value", )", + {{23, 23, "Missing '}' or object member name"}}, + "* Line 1, Column 24\n Missing '}' or object member name\n"); } JSONTEST_FIXTURE_LOCAL(ReaderTest, parseArray) { @@ -2762,13 +2761,12 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, streamParseWithNoErrors) { } JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithNoErrorsTestingOffsets) { - checkParse( - R"({)" - R"( "property" : ["value", "value2"],)" - R"( "obj" : { "nested" : -6.2e+15, "bool" : true},)" - R"( "null" : null,)" - R"( "false" : false)" - R"( })"); + checkParse(R"({)" + R"( "property" : ["value", "value2"],)" + R"( "obj" : { "nested" : -6.2e+15, "bool" : true},)" + R"( "null" : null,)" + R"( "false" : false)" + R"( })"); auto checkOffsets = [&](const Json::Value& v, int start, int limit) { JSONTEST_ASSERT_EQUAL(v.getOffsetStart(), start); JSONTEST_ASSERT_EQUAL(v.getOffsetLimit(), limit); @@ -2816,13 +2814,13 @@ JSONTEST_FIXTURE_LOCAL(ReaderTest, strictModeParseNumber) { } JSONTEST_FIXTURE_LOCAL(ReaderTest, parseChineseWithOneError) { - checkParse( - R"({ "pr)" - "\u4f50\u8574" - R"(erty" :: "value" })", - {{18, 19, "Syntax error: value, object or array expected."}}, - "* Line 1, Column 19\n Syntax error: value, object or array " - "expected.\n"); + // \u4f50\u85e4 佐藤 + checkParse(R"({ "pr)" + "佐藤" + R"(erty" :: "value" })", + {{18, 19, "Syntax error: value, object or array expected."}}, + "* Line 1, Column 19\n Syntax error: value, object or array " + "expected.\n"); } JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithDetailError) {