diff --git a/extras/tests/JsonDeserializer/filter.cpp b/extras/tests/JsonDeserializer/filter.cpp index 2fa9f1e7..f0890e98 100644 --- a/extras/tests/JsonDeserializer/filter.cpp +++ b/extras/tests/JsonDeserializer/filter.cpp @@ -16,6 +16,7 @@ using ArduinoJson::detail::sizeofObject; TEST_CASE("Filtering") { struct TestCase { + const char* description; const char* input; const char* filter; uint8_t nestingLimit; @@ -26,14 +27,16 @@ TEST_CASE("Filtering") { TestCase testCases[] = { { - "{\"hello\":\"world\"}", // 1. input - "null", // 2. filter - 10, // 3. nestingLimit - DeserializationError::Ok, // 4. error - "null", // 5. output - 0, // 6. memoryUsage + "Input is object, filter is null", // description + "{\"hello\":\"world\"}", // input + "null", // filter + 10, // nestingLimit + DeserializationError::Ok, // error + "null", // output + 0, // memoryUsage }, { + "Input is object, filter is false", "{\"hello\":\"world\"}", "false", 10, @@ -42,6 +45,7 @@ TEST_CASE("Filtering") { 0, }, { + "Input is object, filter is true", "{\"abcdefg\":\"hijklmn\"}", "true", 10, @@ -50,6 +54,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("abcdefg") + sizeofString("hijklmn"), }, { + "Input is object, filter is empty object", "{\"hello\":\"world\"}", "{}", 10, @@ -58,7 +63,7 @@ TEST_CASE("Filtering") { sizeofObject(0), }, { - // Input in an object, but filter wants an array + "Input in an object, but filter wants an array", "{\"hello\":\"world\"}", "[]", 10, @@ -67,7 +72,7 @@ TEST_CASE("Filtering") { 0, }, { - // Member is a string, but filter wants an array + "Member is a string, but filter wants an array", "{\"example\":\"example\"}", "{\"example\":[true]}", 10, @@ -76,7 +81,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("example"), }, { - // Member is a number, but filter wants an array + "Member is a number, but filter wants an array", "{\"example\":42}", "{\"example\":[true]}", 10, @@ -85,7 +90,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("example"), }, { - // Input is an array, but filter wants an object + "Input is an array, but filter wants an object", "[\"hello\",\"world\"]", "{}", 10, @@ -94,7 +99,7 @@ TEST_CASE("Filtering") { 0, }, { - // Input is a bool, but filter wants an object + "Input is a bool, but filter wants an object", "true", "{}", 10, @@ -103,7 +108,7 @@ TEST_CASE("Filtering") { 0, }, { - // Input is a string, but filter wants an object + "Input is a string, but filter wants an object", "\"hello\"", "{}", 10, @@ -112,7 +117,7 @@ TEST_CASE("Filtering") { 0, }, { - // skip an integer + "Skip an integer", "{\"an_integer\":666,example:42}", "{\"example\":true}", 10, @@ -121,7 +126,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("example"), }, { - // skip a float + "Skip a float", "{\"a_float\":12.34e-6,example:42}", "{\"example\":true}", 10, @@ -130,7 +135,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("example"), }, { - // skip false + "Skip false", "{\"a_bool\":false,example:42}", "{\"example\":true}", 10, @@ -139,7 +144,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("example"), }, { - // skip true + "Skip true", "{\"a_bool\":true,example:42}", "{\"example\":true}", 10, @@ -148,7 +153,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("example"), }, { - // skip null + "Skip null", "{\"a_bool\":null,example:42}", "{\"example\":true}", 10, @@ -157,7 +162,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("example"), }, { - // can skip a double-quoted string + "Skip a double-quoted string", "{\"a_double_quoted_string\":\"hello\",example:42}", "{\"example\":true}", 10, @@ -166,7 +171,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("example"), }, { - // can skip a single-quoted string + "Skip a single-quoted string", "{\"a_single_quoted_string\":'hello',example:42}", "{\"example\":true}", 10, @@ -175,7 +180,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("example"), }, { - // can skip an empty array + "Skip an empty array", "{\"an_empty_array\":[],example:42}", "{\"example\":true}", 10, @@ -184,7 +189,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("example"), }, { - // can skip an empty array with spaces in it + "Skip an empty array with spaces in it", "{\"an_empty_array\":[\t],example:42}", "{\"example\":true}", 10, @@ -193,7 +198,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("example"), }, { - // can skip an array + "Skip an array", "{\"an_array\":[1,2,3],example:42}", "{\"example\":true}", 10, @@ -202,7 +207,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("example"), }, { - // can skip an array with spaces in it + "Skip an array with spaces in it", "{\"an_array\": [ 1 , 2 , 3 ] ,example:42}", "{\"example\":true}", 10, @@ -211,7 +216,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("example"), }, { - // can skip an empty object + "Skip an empty nested object", "{\"an_empty_object\":{},example:42}", "{\"example\":true}", 10, @@ -220,7 +225,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("example"), }, { - // can skip an empty object with spaces in it + "Skip an empty nested object with spaces in it", "{\"an_empty_object\":{ },example:42}", "{\"example\":true}", 10, @@ -229,7 +234,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("example"), }, { - // can skip an object + "Skip a nested object", "{\"an_object\":{a:1,'b':2,\"c\":3},example:42}", "{\"example\":true}", 10, @@ -238,7 +243,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("example"), }, { - // skip an object with spaces in it + "Skip an object with spaces in it", "{\"an_object\" : { a : 1 , 'b' : 2 , \"c\" : 3 } ,example:42}", "{\"example\":true}", 10, @@ -247,6 +252,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("example"), }, { + "Skip a string in a nested object", "{\"an_integer\": 0,\"example\":{\"type\":\"int\",\"outcome\":42}}", "{\"example\":{\"outcome\":true}}", 10, @@ -255,7 +261,7 @@ TEST_CASE("Filtering") { 2 * sizeofObject(1) + 2 * sizeofString("example"), }, { - // wildcard + "wildcard", "{\"example\":{\"type\":\"int\",\"outcome\":42}}", "{\"*\":{\"outcome\":true}}", 10, @@ -264,7 +270,7 @@ TEST_CASE("Filtering") { 2 * sizeofObject(1) + 2 * sizeofString("example"), }, { - // exclusion filter (issue #1628) + "exclusion filter (issue #1628)", "{\"example\":1,\"ignored\":2}", "{\"*\":true,\"ignored\":false}", 10, @@ -273,7 +279,7 @@ TEST_CASE("Filtering") { sizeofObject(1) + sizeofString("example"), }, { - // only the first element of array counts + "only the first element of array counts", "[1,2,3]", "[true, false]", 10, @@ -282,7 +288,7 @@ TEST_CASE("Filtering") { sizeofArray(3), }, { - // only the first element of array counts + "only the first element of array counts", "[1,2,3]", "[false, true]", 10, @@ -291,7 +297,7 @@ TEST_CASE("Filtering") { sizeofArray(0), }, { - // filter members of object in array + "filter members of object in array", "[{\"example\":1,\"ignore\":2},{\"example\":3,\"ignore\":4}]", "[{\"example\":true}]", 10, @@ -300,6 +306,7 @@ TEST_CASE("Filtering") { sizeofArray(2) + 2 * sizeofObject(1) + sizeofString("example"), }, { + "Unclosed single quote in skipped element", "[',2,3]", "[false,true]", 10, @@ -308,6 +315,7 @@ TEST_CASE("Filtering") { sizeofArray(0), }, { + "Unclosed double quote in skipped element", "[\",2,3]", "[false,true]", 10, @@ -316,7 +324,7 @@ TEST_CASE("Filtering") { sizeofArray(0), }, { - // detect errors in skipped value + "Detect errors in skipped value", "[!,2,\\]", "[false]", 10, @@ -325,7 +333,7 @@ TEST_CASE("Filtering") { sizeofArray(0), }, { - // detect incomplete string event if it's skipped + "Detect incomplete string event if it's skipped", "\"ABC", "false", 10, @@ -334,7 +342,7 @@ TEST_CASE("Filtering") { 0, }, { - // detect incomplete string event if it's skipped + "Detect incomplete string event if it's skipped", "'ABC", "false", 10, @@ -343,7 +351,7 @@ TEST_CASE("Filtering") { 0, }, { - // handle escaped quotes + "Handle escaped quotes", "'A\\'BC'", "false", 10, @@ -352,7 +360,7 @@ TEST_CASE("Filtering") { 0, }, { - // handle escaped quotes + "Handle escaped quotes", "\"A\\\"BC\"", "false", 10, @@ -361,7 +369,7 @@ TEST_CASE("Filtering") { 0, }, { - // detect incomplete string in presence of escaped quotes + "Detect incomplete string in presence of escaped quotes", "'A\\'BC", "false", 10, @@ -370,7 +378,7 @@ TEST_CASE("Filtering") { 0, }, { - // detect incomplete string in presence of escaped quotes + "Detect incomplete string in presence of escaped quotes", "\"A\\\"BC", "false", 10, @@ -379,7 +387,7 @@ TEST_CASE("Filtering") { 0, }, { - // skip empty array + "skip empty array", "[]", "false", 10, @@ -388,7 +396,7 @@ TEST_CASE("Filtering") { 0, }, { - // skip empty array with spaces + "Skip empty array with spaces", " [ ] ", "false", 10, @@ -397,7 +405,7 @@ TEST_CASE("Filtering") { 0, }, { - // bubble up element error even if array is skipped + "Bubble up element error even if array is skipped", "[1,'2,3]", "false", 10, @@ -406,7 +414,7 @@ TEST_CASE("Filtering") { 0, }, { - // bubble up member error even if object is skipped + "Bubble up member error even if object is skipped", "{'hello':'worl}", "false", 10, @@ -415,7 +423,7 @@ TEST_CASE("Filtering") { 0, }, { - // bubble up colon error even if object is skipped + "Bubble up colon error even if object is skipped", "{'hello','world'}", "false", 10, @@ -424,7 +432,7 @@ TEST_CASE("Filtering") { 0, }, { - // bubble up key error even if object is skipped + "Bubble up key error even if object is skipped", "{'hello:1}", "false", 10, @@ -433,7 +441,7 @@ TEST_CASE("Filtering") { 0, }, { - // detect invalid value in skipped object + "Detect invalid value in skipped object", "{'hello':!}", "false", 10, @@ -442,7 +450,7 @@ TEST_CASE("Filtering") { 0, }, { - // ignore invalid value in skipped object + "Ignore invalid value in skipped object", "{'hello':\\}", "false", 10, @@ -451,7 +459,7 @@ TEST_CASE("Filtering") { 0, }, { - // check nesting limit even for ignored objects + "Check nesting limit even for ignored objects", "{}", "false", 0, @@ -460,7 +468,7 @@ TEST_CASE("Filtering") { 0, }, { - // check nesting limit even for ignored objects + "Check nesting limit even for ignored objects", "{'hello':{}}", "false", 1, @@ -469,7 +477,7 @@ TEST_CASE("Filtering") { 0, }, { - // check nesting limit even for ignored values in objects + "Check nesting limit even for ignored values in objects", "{'hello':{}}", "{}", 1, @@ -478,7 +486,7 @@ TEST_CASE("Filtering") { sizeofObject(0), }, { - // check nesting limit even for ignored arrays + "Check nesting limit even for ignored arrays", "[]", "false", 0, @@ -487,7 +495,7 @@ TEST_CASE("Filtering") { 0, }, { - // check nesting limit even for ignored arrays + "Check nesting limit even for ignored arrays", "[[]]", "false", 1, @@ -496,7 +504,7 @@ TEST_CASE("Filtering") { 0, }, { - // check nesting limit even for ignored values in arrays + "Check nesting limit even for ignored values in arrays", "[[]]", "[]", 1, @@ -505,7 +513,7 @@ TEST_CASE("Filtering") { sizeofArray(0), }, { - // supports back-slash at the end of skipped string + "Supports back-slash at the end of skipped string", "\"hell\\", "false", 1, @@ -514,7 +522,7 @@ TEST_CASE("Filtering") { 0, }, { - // invalid comment at after an element in a skipped array + "Invalid comment at after an element in a skipped array", "[1/]", "false", 10, @@ -523,7 +531,7 @@ TEST_CASE("Filtering") { 0, }, { - // incomplete comment at after an element in a skipped array + "Incomplete comment at after an element in a skipped array", "[1/*]", "false", 10, @@ -532,7 +540,7 @@ TEST_CASE("Filtering") { 0, }, { - // missing comma in a skipped array + "Missing comma in a skipped array", "[1 2]", "false", 10, @@ -541,7 +549,7 @@ TEST_CASE("Filtering") { 0, }, { - // invalid comment at the beginning of array + "Invalid comment at the beginning of array", "[/1]", "[false]", 10, @@ -550,7 +558,7 @@ TEST_CASE("Filtering") { sizeofArray(0), }, { - // incomplete comment at the begining of an array + "Incomplete comment at the begining of an array", "[/*]", "[false]", 10, @@ -559,7 +567,7 @@ TEST_CASE("Filtering") { sizeofArray(0), }, { - // invalid comment before key + "Invalid comment before key", "{/1:2}", "{}", 10, @@ -568,7 +576,7 @@ TEST_CASE("Filtering") { sizeofObject(0), }, { - // incomplete comment before key + "Incomplete comment before key", "{/*:2}", "{}", 10, @@ -577,7 +585,7 @@ TEST_CASE("Filtering") { sizeofObject(0), }, { - // invalid comment after key + "Invalid comment after key", "{\"example\"/1:2}", "{}", 10, @@ -586,7 +594,7 @@ TEST_CASE("Filtering") { sizeofObject(0), }, { - // incomplete comment after key + "Incomplete comment after key", "{\"example\"/*:2}", "{}", 10, @@ -595,7 +603,7 @@ TEST_CASE("Filtering") { sizeofObject(0), }, { - // invalid comment after colon + "Invalid comment after colon", "{\"example\":/12}", "{}", 10, @@ -604,7 +612,7 @@ TEST_CASE("Filtering") { sizeofObject(0), }, { - // incomplete comment after colon + "Incomplete comment after colon", "{\"example\":/*2}", "{}", 10, @@ -613,7 +621,7 @@ TEST_CASE("Filtering") { sizeofObject(0), }, { - // comment next to an integer + "Comment next to an integer", "{\"ignore\":1//,\"example\":2\n}", "{\"example\":true}", 10, @@ -622,7 +630,7 @@ TEST_CASE("Filtering") { sizeofObject(0), }, { - // invalid comment after opening brace of a skipped object + "Invalid comment after opening brace of a skipped object", "{/1:2}", "false", 10, @@ -631,7 +639,7 @@ TEST_CASE("Filtering") { 0, }, { - // incomplete after opening brace of a skipped object + "Incomplete after opening brace of a skipped object", "{/*:2}", "false", 10, @@ -640,7 +648,7 @@ TEST_CASE("Filtering") { 0, }, { - // invalid comment after key of a skipped object + "Invalid comment after key of a skipped object", "{\"example\"/:2}", "false", 10, @@ -649,7 +657,7 @@ TEST_CASE("Filtering") { 0, }, { - // incomplete comment after key of a skipped object + "Incomplete comment after key of a skipped object", "{\"example\"/*:2}", "false", 10, @@ -658,7 +666,7 @@ TEST_CASE("Filtering") { 0, }, { - // invalid comment after value in a skipped object + "Invalid comment after value in a skipped object", "{\"example\":2/}", "false", 10, @@ -667,7 +675,7 @@ TEST_CASE("Filtering") { 0, }, { - // incomplete comment after value of a skipped object + "Incomplete comment after value of a skipped object", "{\"example\":2/*}", "false", 10, @@ -676,7 +684,7 @@ TEST_CASE("Filtering") { 0, }, { - // incomplete comment after comma in skipped object + "Incomplete comment after comma in skipped object", "{\"example\":2,/*}", "false", 10, @@ -686,27 +694,24 @@ TEST_CASE("Filtering") { }, }; - for (size_t i = 0; i < sizeof(testCases) / sizeof(testCases[0]); i++) { - CAPTURE(i); + for (auto& tc : testCases) { + SECTION(tc.description) { + SpyingAllocator spy; + JsonDocument filter; + JsonDocument doc(&spy); - SpyingAllocator spy; - JsonDocument filter; - JsonDocument doc(&spy); - TestCase& tc = testCases[i]; + REQUIRE(deserializeJson(filter, tc.filter) == DeserializationError::Ok); - CAPTURE(tc.filter); - REQUIRE(deserializeJson(filter, tc.filter) == DeserializationError::Ok); + CHECK(deserializeJson( + doc, tc.input, DeserializationOption::Filter(filter), + DeserializationOption::NestingLimit(tc.nestingLimit)) == + tc.error); - CAPTURE(tc.input); - CAPTURE(tc.nestingLimit); - CHECK(deserializeJson(doc, tc.input, DeserializationOption::Filter(filter), - DeserializationOption::NestingLimit( - tc.nestingLimit)) == tc.error); + CHECK(doc.as() == tc.output); - CHECK(doc.as() == tc.output); - - doc.shrinkToFit(); - CHECK(spy.allocatedBytes() == tc.memoryUsage); + doc.shrinkToFit(); + CHECK(spy.allocatedBytes() == tc.memoryUsage); + } } }