| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361 |
- // ArduinoJson - arduinojson.org
- // Copyright Benoit Blanchon 2014-2018
- // MIT License
- #include <ArduinoJson.h>
- #include <catch.hpp>
- TEST_CASE("deserializeJson(DynamicJsonArray&)") {
- DynamicJsonArray arr;
- SECTION("An empty array") {
- JsonError err = deserializeJson(arr, "[]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(0 == arr.size());
- }
- SECTION("Spaces") {
- SECTION("Before the opening bracket") {
- JsonError err = deserializeJson(arr, " []");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(0 == arr.size());
- }
- SECTION("Before first value") {
- JsonError err = deserializeJson(arr, "[ \t\r\n42]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(1 == arr.size());
- REQUIRE(arr[0] == 42);
- }
- SECTION("After first value") {
- JsonError err = deserializeJson(arr, "[42 \t\r\n]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(1 == arr.size());
- REQUIRE(arr[0] == 42);
- }
- }
- SECTION("Values types") {
- SECTION("On integer") {
- JsonError err = deserializeJson(arr, "[42]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(1 == arr.size());
- REQUIRE(arr[0] == 42);
- }
- SECTION("Two integers") {
- JsonError err = deserializeJson(arr, "[42,84]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(2 == arr.size());
- REQUIRE(arr[0] == 42);
- REQUIRE(arr[1] == 84);
- }
- SECTION("Double") {
- JsonError err = deserializeJson(arr, "[4.2,1e2]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(2 == arr.size());
- REQUIRE(arr[0] == 4.2);
- REQUIRE(arr[1] == 1e2);
- }
- SECTION("Unsigned long") {
- JsonError err = deserializeJson(arr, "[4294967295]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(1 == arr.size());
- REQUIRE(arr[0] == 4294967295UL);
- }
- SECTION("Boolean") {
- JsonError err = deserializeJson(arr, "[true,false]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(2 == arr.size());
- REQUIRE(arr[0] == true);
- REQUIRE(arr[1] == false);
- }
- SECTION("Null") {
- JsonError err = deserializeJson(arr, "[null,null]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(2 == arr.size());
- REQUIRE(arr[0].as<char *>() == 0);
- REQUIRE(arr[1].as<char *>() == 0);
- }
- }
- SECTION("Quotes") {
- SECTION("Double quotes") {
- JsonError err = deserializeJson(arr, "[ \"hello\" , \"world\" ]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(2 == arr.size());
- REQUIRE(arr[0] == "hello");
- REQUIRE(arr[1] == "world");
- }
- SECTION("Single quotes") {
- JsonError err = deserializeJson(arr, "[ 'hello' , 'world' ]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(2 == arr.size());
- REQUIRE(arr[0] == "hello");
- REQUIRE(arr[1] == "world");
- }
- SECTION("No quotes") {
- JsonError err = deserializeJson(arr, "[ hello , world ]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(2 == arr.size());
- REQUIRE(arr[0] == "hello");
- REQUIRE(arr[1] == "world");
- }
- SECTION("Double quotes (empty strings)") {
- JsonError err = deserializeJson(arr, "[\"\",\"\"]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(2 == arr.size());
- REQUIRE(arr[0] == "");
- REQUIRE(arr[1] == "");
- }
- SECTION("Single quotes (empty strings)") {
- JsonError err = deserializeJson(arr, "[\'\',\'\']");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(2 == arr.size());
- REQUIRE(arr[0] == "");
- REQUIRE(arr[1] == "");
- }
- SECTION("No quotes (empty strings)") {
- JsonError err = deserializeJson(arr, "[,]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(2 == arr.size());
- REQUIRE(arr[0] == "");
- REQUIRE(arr[1] == "");
- }
- SECTION("Closing single quotes missing") {
- JsonError err = deserializeJson(arr, "[\"]");
- REQUIRE(err != JsonError::Ok);
- }
- SECTION("Closing double quotes missing") {
- JsonError err = deserializeJson(arr, "[\']");
- REQUIRE(err != JsonError::Ok);
- }
- }
- SECTION("Block comments") {
- SECTION("Before opening bracket") {
- JsonError err = deserializeJson(arr, "/*COMMENT*/ [\"hello\"]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(1 == arr.size());
- REQUIRE(arr[0] == "hello");
- }
- SECTION("After opening bracket") {
- JsonError err = deserializeJson(arr, "[/*COMMENT*/ \"hello\"]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(1 == arr.size());
- REQUIRE(arr[0] == "hello");
- }
- SECTION("Before closing bracket") {
- JsonError err = deserializeJson(arr, "[\"hello\"/*COMMENT*/]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(1 == arr.size());
- REQUIRE(arr[0] == "hello");
- }
- SECTION("After closing bracket") {
- JsonError err = deserializeJson(arr, "[\"hello\"]/*COMMENT*/");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(1 == arr.size());
- REQUIRE(arr[0] == "hello");
- }
- SECTION("Before comma") {
- JsonError err = deserializeJson(arr, "[\"hello\"/*COMMENT*/,\"world\"]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(2 == arr.size());
- REQUIRE(arr[0] == "hello");
- REQUIRE(arr[1] == "world");
- }
- SECTION("After comma") {
- JsonError err = deserializeJson(arr, "[\"hello\",/*COMMENT*/ \"world\"]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(2 == arr.size());
- REQUIRE(arr[0] == "hello");
- REQUIRE(arr[1] == "world");
- }
- SECTION("/*/") {
- JsonError err = deserializeJson(arr, "[/*/\n]");
- REQUIRE(err != JsonError::Ok);
- }
- SECTION("Unfinished comment") {
- JsonError err = deserializeJson(arr, "[/*COMMENT]");
- REQUIRE(err != JsonError::Ok);
- }
- SECTION("Final slash missing") {
- JsonError err = deserializeJson(arr, "[/*COMMENT*]");
- REQUIRE(err != JsonError::Ok);
- }
- }
- SECTION("Line comments") {
- SECTION("Before opening bracket") {
- JsonError err = deserializeJson(arr, "//COMMENT\n\t[\"hello\"]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(1 == arr.size());
- REQUIRE(arr[0] == "hello");
- }
- SECTION("After opening bracket") {
- JsonError err = deserializeJson(arr, "[//COMMENT\n\"hello\"]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(1 == arr.size());
- REQUIRE(arr[0] == "hello");
- }
- SECTION("Before closing bracket") {
- JsonError err = deserializeJson(arr, "[\"hello\"//COMMENT\r\n]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(1 == arr.size());
- REQUIRE(arr[0] == "hello");
- }
- SECTION("After closing bracket") {
- JsonError err = deserializeJson(arr, "[\"hello\"]//COMMENT\n");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(1 == arr.size());
- REQUIRE(arr[0] == "hello");
- }
- SECTION("Before comma") {
- JsonError err = deserializeJson(arr, "[\"hello\"//COMMENT\n,\"world\"]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(2 == arr.size());
- REQUIRE(arr[0] == "hello");
- REQUIRE(arr[1] == "world");
- }
- SECTION("After comma") {
- JsonError err = deserializeJson(arr, "[\"hello\",//COMMENT\n\"world\"]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(2 == arr.size());
- REQUIRE(arr[0] == "hello");
- REQUIRE(arr[1] == "world");
- }
- SECTION("Invalid comment") {
- JsonError err = deserializeJson(arr, "[/COMMENT\n]");
- REQUIRE(err != JsonError::Ok);
- }
- SECTION("End document with comment") {
- JsonError err = deserializeJson(arr, "[//COMMENT");
- REQUIRE(err != JsonError::Ok);
- }
- }
- SECTION("Misc") {
- SECTION("Garbage") {
- JsonError err = deserializeJson(arr, "%*$£¤");
- REQUIRE(err != JsonError::Ok);
- }
- SECTION("The opening bracket is missing") {
- JsonError err = deserializeJson(arr, "]");
- REQUIRE(err != JsonError::Ok); // TODO
- }
- SECTION("The closing bracket is missing") {
- JsonError err = deserializeJson(arr, "[");
- REQUIRE(err != JsonError::Ok); // TODO
- }
- SECTION("Escape sequences") {
- JsonError err =
- deserializeJson(arr, "[\"1\\\"2\\\\3\\/4\\b5\\f6\\n7\\r8\\t9\"]");
- REQUIRE(err == JsonError::Ok);
- REQUIRE(1 == arr.size());
- REQUIRE(arr[0] == "1\"2\\3/4\b5\f6\n7\r8\t9");
- }
- SECTION("Unterminated escape sequence") {
- JsonError err = deserializeJson(arr, "\"\\\0\"", 4);
- REQUIRE(err != JsonError::Ok);
- }
- SECTION("Nested objects") {
- char jsonString[] =
- " [ { \"a\" : 1 , \"b\" : 2 } , { \"c\" : 3 , \"d\" : 4 } ] ";
- JsonError err = deserializeJson(arr, jsonString);
- JsonObject &object1 = arr[0];
- const JsonObject &object2 = arr[1];
- JsonObject &object3 = arr[2];
- REQUIRE(err == JsonError::Ok);
- REQUIRE(true == object1.success());
- REQUIRE(true == object2.success());
- REQUIRE(false == object3.success());
- REQUIRE(2 == object1.size());
- REQUIRE(2 == object2.size());
- REQUIRE(0 == object3.size());
- REQUIRE(1 == object1["a"].as<int>());
- REQUIRE(2 == object1["b"].as<int>());
- REQUIRE(3 == object2["c"].as<int>());
- REQUIRE(4 == object2["d"].as<int>());
- REQUIRE(0 == object3["e"].as<int>());
- }
- }
- SECTION("Should clear the JsonArray") {
- deserializeJson(arr, "[1,2,3,4]");
- deserializeJson(arr, "[]");
- REQUIRE(arr.size() == 0);
- REQUIRE(arr.memoryUsage() == JSON_ARRAY_SIZE(0));
- }
- }
|