Added JsonError

This commit is contained in:
Benoit Blanchon
2018-03-09 16:58:01 +01:00
parent 83d73c93f7
commit b2a8085651
24 changed files with 641 additions and 515 deletions

View File

@ -4,6 +4,7 @@
add_executable(JsonParserTests
JsonArray.cpp
JsonError.cpp
JsonObject.cpp
JsonVariant.cpp
nestingLimit.cpp

View File

@ -8,339 +8,346 @@
TEST_CASE("deserializeJson(JsonArray&)") {
DynamicJsonArray arr;
SECTION("EmptyArray") {
bool success = deserializeJson(arr, "[]");
SECTION("An empty array") {
JsonError err = deserializeJson(arr, "[]");
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
REQUIRE(0 == arr.size());
}
SECTION("MissingOpeningBracket") {
bool success = deserializeJson(arr, "]");
REQUIRE_FALSE(success == true);
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("ArrayWithNoEnd") {
bool success = deserializeJson(arr, "[");
REQUIRE_FALSE(success == true);
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("EmptyArrayWithLeadingSpaces") {
bool success = deserializeJson(arr, " []");
SECTION("Quotes") {
SECTION("Double quotes") {
JsonError err = deserializeJson(arr, "[ \"hello\" , \"world\" ]");
REQUIRE(success == true);
REQUIRE(0 == arr.size());
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("Garbage") {
bool success = deserializeJson(arr, "%*$£¤");
SECTION("Block comments") {
SECTION("Before opening bracket") {
JsonError err = deserializeJson(arr, "/*COMMENT*/ [\"hello\"]");
REQUIRE_FALSE(success == true);
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("OneInteger") {
bool success = deserializeJson(arr, "[42]");
SECTION("Line comments") {
SECTION("Before opening bracket") {
JsonError err = deserializeJson(arr, "//COMMENT\n\t[\"hello\"]");
REQUIRE(success == true);
REQUIRE(1 == arr.size());
REQUIRE(arr[0] == 42);
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("OneIntegerWithSpacesBefore") {
bool success = deserializeJson(arr, "[ \t\r\n42]");
SECTION("Misc") {
SECTION("Garbage") {
JsonError err = deserializeJson(arr, "%*$£¤");
REQUIRE(success == true);
REQUIRE(1 == arr.size());
REQUIRE(arr[0] == 42);
}
REQUIRE(err != JsonError::Ok);
}
SECTION("OneIntegerWithSpaceAfter") {
bool success = deserializeJson(arr, "[42 \t\r\n]");
SECTION("The opening bracket is missing") {
JsonError err = deserializeJson(arr, "]");
REQUIRE(success == true);
REQUIRE(1 == arr.size());
REQUIRE(arr[0] == 42);
}
REQUIRE(err != JsonError::Ok); // TODO
}
SECTION("TwoIntegers") {
bool success = deserializeJson(arr, "[42,84]");
SECTION("The closing bracket is missing") {
JsonError err = deserializeJson(arr, "[");
REQUIRE(err != JsonError::Ok); // TODO
}
REQUIRE(success == true);
REQUIRE(2 == arr.size());
REQUIRE(arr[0] == 42);
REQUIRE(arr[1] == 84);
}
SECTION("Escape sequences") {
JsonError err =
deserializeJson(arr, "[\"1\\\"2\\\\3\\/4\\b5\\f6\\n7\\r8\\t9\"]");
SECTION("TwoDoubles") {
bool success = deserializeJson(arr, "[4.2,1e2]");
REQUIRE(err == JsonError::Ok);
REQUIRE(1 == arr.size());
REQUIRE(arr[0] == "1\"2\\3/4\b5\f6\n7\r8\t9");
}
REQUIRE(success == true);
REQUIRE(2 == arr.size());
REQUIRE(arr[0] == 4.2);
REQUIRE(arr[1] == 1e2);
}
SECTION("Unterminated escape sequence") {
JsonError err = deserializeJson(arr, "\"\\\0\"", 4);
REQUIRE(err != JsonError::Ok);
}
SECTION("UnsignedLong") {
bool success = deserializeJson(arr, "[4294967295]");
SECTION("Nested objects") {
char jsonString[] =
" [ { \"a\" : 1 , \"b\" : 2 } , { \"c\" : 3 , \"d\" : 4 } ] ";
REQUIRE(success == true);
REQUIRE(1 == arr.size());
REQUIRE(arr[0] == 4294967295UL);
}
JsonError err = deserializeJson(arr, jsonString);
SECTION("TwoBooleans") {
bool success = deserializeJson(arr, "[true,false]");
JsonObject &object1 = arr[0];
const JsonObject &object2 = arr[1];
JsonObject &object3 = arr[2];
REQUIRE(success == true);
REQUIRE(2 == arr.size());
REQUIRE(arr[0] == true);
REQUIRE(arr[1] == false);
}
REQUIRE(err == JsonError::Ok);
SECTION("TwoNulls") {
bool success = deserializeJson(arr, "[null,null]");
REQUIRE(true == object1.success());
REQUIRE(true == object2.success());
REQUIRE(false == object3.success());
REQUIRE(success == true);
REQUIRE(2 == arr.size());
REQUIRE(arr[0].as<char *>() == 0);
REQUIRE(arr[1].as<char *>() == 0);
}
REQUIRE(2 == object1.size());
REQUIRE(2 == object2.size());
REQUIRE(0 == object3.size());
SECTION("TwoStringsDoubleQuotes") {
bool success = deserializeJson(arr, "[ \"hello\" , \"world\" ]");
REQUIRE(success == true);
REQUIRE(2 == arr.size());
REQUIRE(arr[0] == "hello");
REQUIRE(arr[1] == "world");
}
SECTION("TwoStringsSingleQuotes") {
bool success = deserializeJson(arr, "[ 'hello' , 'world' ]");
REQUIRE(success == true);
REQUIRE(2 == arr.size());
REQUIRE(arr[0] == "hello");
REQUIRE(arr[1] == "world");
}
SECTION("TwoStringsNoQuotes") {
bool success = deserializeJson(arr, "[ hello , world ]");
REQUIRE(success == true);
REQUIRE(2 == arr.size());
REQUIRE(arr[0] == "hello");
REQUIRE(arr[1] == "world");
}
SECTION("EmptyStringsDoubleQuotes") {
bool success = deserializeJson(arr, "[\"\",\"\"]");
REQUIRE(success == true);
REQUIRE(2 == arr.size());
REQUIRE(arr[0] == "");
REQUIRE(arr[1] == "");
}
SECTION("EmptyStringSingleQuotes") {
bool success = deserializeJson(arr, "[\'\',\'\']");
REQUIRE(success == true);
REQUIRE(2 == arr.size());
REQUIRE(arr[0] == "");
REQUIRE(arr[1] == "");
}
SECTION("EmptyStringNoQuotes") {
bool success = deserializeJson(arr, "[,]");
REQUIRE(success == true);
REQUIRE(2 == arr.size());
REQUIRE(arr[0] == "");
REQUIRE(arr[1] == "");
}
SECTION("ClosingDoubleQuoteMissing") {
bool success = deserializeJson(arr, "[\"]");
REQUIRE_FALSE(success == true);
}
SECTION("ClosingSignleQuoteMissing") {
bool success = deserializeJson(arr, "[\']");
REQUIRE_FALSE(success == true);
}
SECTION("StringWithEscapedChars") {
bool success =
deserializeJson(arr, "[\"1\\\"2\\\\3\\/4\\b5\\f6\\n7\\r8\\t9\"]");
REQUIRE(success == true);
REQUIRE(1 == arr.size());
REQUIRE(arr[0] == "1\"2\\3/4\b5\f6\n7\r8\t9");
}
SECTION("StringWithUnterminatedEscapeSequence") {
bool success = deserializeJson(arr, "\"\\\0\"", 4);
REQUIRE_FALSE(success == true);
}
SECTION("CCommentBeforeOpeningBracket") {
bool success = deserializeJson(arr, "/*COMMENT*/ [\"hello\"]");
REQUIRE(success == true);
REQUIRE(1 == arr.size());
REQUIRE(arr[0] == "hello");
}
SECTION("CCommentAfterOpeningBracket") {
bool success = deserializeJson(arr, "[/*COMMENT*/ \"hello\"]");
REQUIRE(success == true);
REQUIRE(1 == arr.size());
REQUIRE(arr[0] == "hello");
}
SECTION("CCommentBeforeClosingBracket") {
bool success = deserializeJson(arr, "[\"hello\"/*COMMENT*/]");
REQUIRE(success == true);
REQUIRE(1 == arr.size());
REQUIRE(arr[0] == "hello");
}
SECTION("CCommentAfterClosingBracket") {
bool success = deserializeJson(arr, "[\"hello\"]/*COMMENT*/");
REQUIRE(success == true);
REQUIRE(1 == arr.size());
REQUIRE(arr[0] == "hello");
}
SECTION("CCommentBeforeComma") {
bool success = deserializeJson(arr, "[\"hello\"/*COMMENT*/,\"world\"]");
REQUIRE(success == true);
REQUIRE(2 == arr.size());
REQUIRE(arr[0] == "hello");
REQUIRE(arr[1] == "world");
}
SECTION("CCommentAfterComma") {
bool success = deserializeJson(arr, "[\"hello\",/*COMMENT*/ \"world\"]");
REQUIRE(success == true);
REQUIRE(2 == arr.size());
REQUIRE(arr[0] == "hello");
REQUIRE(arr[1] == "world");
}
SECTION("CppCommentBeforeOpeningBracket") {
bool success = deserializeJson(arr, "//COMMENT\n\t[\"hello\"]");
REQUIRE(success == true);
REQUIRE(1 == arr.size());
REQUIRE(arr[0] == "hello");
}
SECTION("CppCommentAfterOpeningBracket") {
bool success = deserializeJson(arr, "[//COMMENT\n\"hello\"]");
REQUIRE(success == true);
REQUIRE(1 == arr.size());
REQUIRE(arr[0] == "hello");
}
SECTION("CppCommentBeforeClosingBracket") {
bool success = deserializeJson(arr, "[\"hello\"//COMMENT\r\n]");
REQUIRE(success == true);
REQUIRE(1 == arr.size());
REQUIRE(arr[0] == "hello");
}
SECTION("CppCommentAfterClosingBracket") {
bool success = deserializeJson(arr, "[\"hello\"]//COMMENT\n");
REQUIRE(success == true);
REQUIRE(1 == arr.size());
REQUIRE(arr[0] == "hello");
}
SECTION("CppCommentBeforeComma") {
bool success = deserializeJson(arr, "[\"hello\"//COMMENT\n,\"world\"]");
REQUIRE(success == true);
REQUIRE(2 == arr.size());
REQUIRE(arr[0] == "hello");
REQUIRE(arr[1] == "world");
}
SECTION("CppCommentAfterComma") {
bool success = deserializeJson(arr, "[\"hello\",//COMMENT\n\"world\"]");
REQUIRE(success == true);
REQUIRE(2 == arr.size());
REQUIRE(arr[0] == "hello");
REQUIRE(arr[1] == "world");
}
SECTION("InvalidCppComment") {
bool success = deserializeJson(arr, "[/COMMENT\n]");
REQUIRE_FALSE(success == true);
}
SECTION("InvalidComment") {
bool success = deserializeJson(arr, "[/*/\n]");
REQUIRE_FALSE(success == true);
}
SECTION("UnfinishedCComment") {
bool success = deserializeJson(arr, "[/*COMMENT]");
REQUIRE_FALSE(success == true);
}
SECTION("EndsInCppComment") {
bool success = deserializeJson(arr, "[//COMMENT");
REQUIRE_FALSE(success == true);
}
SECTION("AfterClosingStar") {
bool success = deserializeJson(arr, "[/*COMMENT*");
REQUIRE_FALSE(success == true);
}
SECTION("DeeplyNested") {
bool success = deserializeJson(
arr, "[[[[[[[[[[[[[[[[[[[\"Not too deep\"]]]]]]]]]]]]]]]]]]]");
REQUIRE(success == true);
}
SECTION("ObjectNestedInArray") {
char jsonString[] =
" [ { \"a\" : 1 , \"b\" : 2 } , { \"c\" : 3 , \"d\" : 4 } ] ";
bool success = deserializeJson(arr, jsonString);
JsonObject &object1 = arr[0];
const JsonObject &object2 = arr[1];
JsonObject &object3 = arr[2];
REQUIRE(true == success);
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>());
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>());
}
}
}

View File

@ -0,0 +1,44 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#include <ArduinoJson.h>
#include <catch.hpp>
void testStringification(JsonError error, std::string expected) {
REQUIRE(error.c_str() == expected);
}
void testBoolification(JsonError error, bool expected) {
CHECK(error == expected);
}
#define TEST_STRINGIFICATION(symbol) \
testStringification(JsonError::symbol, #symbol)
#define TEST_BOOLIFICATION(symbol, expected) \
testBoolification(JsonError::symbol, expected)
TEST_CASE("JsonError") {
SECTION("c_str()") {
TEST_STRINGIFICATION(Ok);
TEST_STRINGIFICATION(OpeningBraceExpected);
TEST_STRINGIFICATION(ClosingBraceExpected);
TEST_STRINGIFICATION(OpeningBracketExpected);
TEST_STRINGIFICATION(ClosingBracketExpected);
TEST_STRINGIFICATION(ColonExpected);
TEST_STRINGIFICATION(TooDeep);
TEST_STRINGIFICATION(NoMemory);
}
SECTION("as boolean") {
TEST_BOOLIFICATION(Ok, false);
TEST_BOOLIFICATION(OpeningBraceExpected, true);
TEST_BOOLIFICATION(ClosingBraceExpected, true);
TEST_BOOLIFICATION(OpeningBracketExpected, true);
TEST_BOOLIFICATION(ClosingBracketExpected, true);
TEST_BOOLIFICATION(ColonExpected, true);
TEST_BOOLIFICATION(TooDeep, true);
TEST_BOOLIFICATION(NoMemory, true);
}
}

View File

@ -9,36 +9,36 @@ TEST_CASE("deserializeJson(JsonObject&)") {
DynamicJsonObject obj;
SECTION("An empty object") {
bool success = deserializeJson(obj, "{}");
REQUIRE(success == true);
JsonError err = deserializeJson(obj, "{}");
REQUIRE(err == JsonError::Ok);
REQUIRE(obj.size() == 0);
}
SECTION("Quotes") {
SECTION("Double quotes") {
bool success = deserializeJson(obj, "{\"key\":\"value\"}");
REQUIRE(success == true);
JsonError err = deserializeJson(obj, "{\"key\":\"value\"}");
REQUIRE(err == JsonError::Ok);
REQUIRE(obj.size() == 1);
REQUIRE(obj["key"] == "value");
}
SECTION("Single quotes") {
bool success = deserializeJson(obj, "{'key':'value'}");
REQUIRE(success == true);
JsonError err = deserializeJson(obj, "{'key':'value'}");
REQUIRE(err == JsonError::Ok);
REQUIRE(obj.size() == 1);
REQUIRE(obj["key"] == "value");
}
SECTION("No quotes") {
bool success = deserializeJson(obj, "{key:value}");
REQUIRE(success == true);
JsonError err = deserializeJson(obj, "{key:value}");
REQUIRE(err == JsonError::Ok);
REQUIRE(obj.size() == 1);
REQUIRE(obj["key"] == "value");
}
SECTION("No quotes, allow underscore in key") {
bool success = deserializeJson(obj, "{_k_e_y_:42}");
REQUIRE(success == true);
JsonError err = deserializeJson(obj, "{_k_e_y_:42}");
REQUIRE(err == JsonError::Ok);
REQUIRE(obj.size() == 1);
REQUIRE(obj["_k_e_y_"] == 42);
}
@ -46,46 +46,46 @@ TEST_CASE("deserializeJson(JsonObject&)") {
SECTION("Spaces") {
SECTION("Before the key") {
bool success = deserializeJson(obj, "{ \"key\":\"value\"}");
REQUIRE(success == true);
JsonError err = deserializeJson(obj, "{ \"key\":\"value\"}");
REQUIRE(err == JsonError::Ok);
REQUIRE(obj.size() == 1);
REQUIRE(obj["key"] == "value");
}
SECTION("After the key") {
bool success = deserializeJson(obj, "{\"key\" :\"value\"}");
REQUIRE(success == true);
JsonError err = deserializeJson(obj, "{\"key\" :\"value\"}");
REQUIRE(err == JsonError::Ok);
REQUIRE(obj.size() == 1);
REQUIRE(obj["key"] == "value");
}
SECTION("Before the value") {
bool success = deserializeJson(obj, "{\"key\": \"value\"}");
REQUIRE(success == true);
JsonError err = deserializeJson(obj, "{\"key\": \"value\"}");
REQUIRE(err == JsonError::Ok);
REQUIRE(obj.size() == 1);
REQUIRE(obj["key"] == "value");
}
SECTION("After the value") {
bool success = deserializeJson(obj, "{\"key\":\"value\" }");
REQUIRE(success == true);
JsonError err = deserializeJson(obj, "{\"key\":\"value\" }");
REQUIRE(err == JsonError::Ok);
REQUIRE(obj.size() == 1);
REQUIRE(obj["key"] == "value");
}
SECTION("Before the colon") {
bool success =
JsonError err =
deserializeJson(obj, "{\"key1\":\"value1\" ,\"key2\":\"value2\"}");
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
REQUIRE(obj.size() == 2);
REQUIRE(obj["key1"] == "value1");
REQUIRE(obj["key2"] == "value2");
}
SECTION("After the colon") {
bool success =
JsonError err =
deserializeJson(obj, "{\"key1\":\"value1\" ,\"key2\":\"value2\"}");
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
REQUIRE(obj.size() == 2);
REQUIRE(obj["key1"] == "value1");
REQUIRE(obj["key2"] == "value2");
@ -94,41 +94,41 @@ TEST_CASE("deserializeJson(JsonObject&)") {
SECTION("Values types") {
SECTION("String") {
bool success =
JsonError err =
deserializeJson(obj, "{\"key1\":\"value1\",\"key2\":\"value2\"}");
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
REQUIRE(obj.size() == 2);
REQUIRE(obj["key1"] == "value1");
REQUIRE(obj["key2"] == "value2");
}
SECTION("Integer") {
bool success = deserializeJson(obj, "{\"key1\":42,\"key2\":-42}");
REQUIRE(success == true);
JsonError err = deserializeJson(obj, "{\"key1\":42,\"key2\":-42}");
REQUIRE(err == JsonError::Ok);
REQUIRE(obj.size() == 2);
REQUIRE(obj["key1"] == 42);
REQUIRE(obj["key2"] == -42);
}
SECTION("Double") {
bool success = deserializeJson(obj, "{\"key1\":12.345,\"key2\":-7E89}");
REQUIRE(success == true);
JsonError err = deserializeJson(obj, "{\"key1\":12.345,\"key2\":-7E89}");
REQUIRE(err == JsonError::Ok);
REQUIRE(obj.size() == 2);
REQUIRE(obj["key1"] == 12.345);
REQUIRE(obj["key2"] == -7E89);
}
SECTION("Booleans") {
bool success = deserializeJson(obj, "{\"key1\":true,\"key2\":false}");
REQUIRE(success == true);
JsonError err = deserializeJson(obj, "{\"key1\":true,\"key2\":false}");
REQUIRE(err == JsonError::Ok);
REQUIRE(obj.size() == 2);
REQUIRE(obj["key1"] == true);
REQUIRE(obj["key2"] == false);
}
SECTION("Null") {
bool success = deserializeJson(obj, "{\"key1\":null,\"key2\":null}");
REQUIRE(success == true);
JsonError err = deserializeJson(obj, "{\"key1\":null,\"key2\":null}");
REQUIRE(err == JsonError::Ok);
REQUIRE(obj.size() == 2);
REQUIRE(obj["key1"].as<char *>() == 0);
REQUIRE(obj["key2"].as<char *>() == 0);
@ -137,13 +137,13 @@ TEST_CASE("deserializeJson(JsonObject&)") {
SECTION("Array") {
char jsonString[] = " { \"ab\" : [ 1 , 2 ] , \"cd\" : [ 3 , 4 ] } ";
bool success = deserializeJson(obj, jsonString);
JsonError err = deserializeJson(obj, jsonString);
JsonArray &array1 = obj["ab"];
const JsonArray &array2 = obj["cd"];
JsonArray &array3 = obj["ef"];
REQUIRE(true == success);
REQUIRE(err == JsonError::Ok);
REQUIRE(true == array1.success());
REQUIRE(true == array2.success());
@ -165,33 +165,33 @@ TEST_CASE("deserializeJson(JsonObject&)") {
SECTION("Misc") {
SECTION("The opening brace is missing") {
bool success = deserializeJson(obj, "}");
REQUIRE(success == false);
JsonError err = deserializeJson(obj, "}");
REQUIRE(err == JsonError::OpeningBraceExpected);
}
SECTION("The closing brace is missing") {
bool success = deserializeJson(obj, "{");
REQUIRE(success == false);
JsonError err = deserializeJson(obj, "{\"hello\":\"world\"");
REQUIRE(err == JsonError::ClosingBraceExpected);
}
SECTION("A quoted key without value") {
bool success = deserializeJson(obj, "{\"key\"}");
REQUIRE(success == false);
JsonError err = deserializeJson(obj, "{\"key\"}");
REQUIRE(err == JsonError::ColonExpected);
}
SECTION("A non-quoted key without value") {
bool success = deserializeJson(obj, "{key}");
REQUIRE(success == false);
JsonError err = deserializeJson(obj, "{key}");
REQUIRE(err == JsonError::ColonExpected);
}
SECTION("A dangling comma") {
bool success = deserializeJson(obj, "{\"key1\":\"value1\",}");
REQUIRE(success == false);
JsonError err = deserializeJson(obj, "{\"key1\":\"value1\",}");
REQUIRE(err == JsonError::ColonExpected);
}
SECTION("null as a key") {
bool success = deserializeJson(obj, "null:\"value\"}");
REQUIRE(success == false);
JsonError err = deserializeJson(obj, "{null:\"value\"}");
REQUIRE(err == JsonError::Ok);
}
}
}

View File

@ -11,79 +11,79 @@ TEST_CASE("deserializeJson(JsonVariant&)") {
DynamicJsonVariant variant;
SECTION("EmptyObject") {
bool success = deserializeJson(variant, "{}");
JsonError err = deserializeJson(variant, "{}");
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
REQUIRE(variant.is<JsonObject>());
}
SECTION("EmptyArray") {
bool success = deserializeJson(variant, "[]");
JsonError err = deserializeJson(variant, "[]");
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
REQUIRE(variant.is<JsonArray>());
}
SECTION("Integer") {
bool success = deserializeJson(variant, "-42");
JsonError err = deserializeJson(variant, "-42");
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
REQUIRE(variant.is<int>());
REQUIRE_FALSE(variant.is<bool>());
REQUIRE(variant == -42);
}
SECTION("Double") {
bool success = deserializeJson(variant, "-1.23e+4");
JsonError err = deserializeJson(variant, "-1.23e+4");
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
REQUIRE_FALSE(variant.is<int>());
REQUIRE(variant.is<double>());
REQUIRE(variant.as<double>() == Approx(-1.23e+4));
}
SECTION("Double quoted string") {
bool success = deserializeJson(variant, "\"hello world\"");
JsonError err = deserializeJson(variant, "\"hello world\"");
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
REQUIRE(variant.is<char*>());
REQUIRE_THAT(variant.as<char*>(), Equals("hello world"));
}
SECTION("Single quoted string") {
bool success = deserializeJson(variant, "\'hello world\'");
JsonError err = deserializeJson(variant, "\'hello world\'");
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
REQUIRE(variant.is<char*>());
REQUIRE_THAT(variant.as<char*>(), Equals("hello world"));
}
SECTION("True") {
bool success = deserializeJson(variant, "true");
JsonError err = deserializeJson(variant, "true");
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
REQUIRE(variant.is<bool>());
REQUIRE(variant == true);
}
SECTION("False") {
bool success = deserializeJson(variant, "false");
JsonError err = deserializeJson(variant, "false");
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
REQUIRE(variant.is<bool>());
REQUIRE(variant == false);
}
SECTION("OpenBrace") {
bool success = deserializeJson(variant, "{");
JsonError err = deserializeJson(variant, "{");
REQUIRE(success == false);
REQUIRE(err != JsonError::Ok);
}
SECTION("Incomplete string") {
bool success = deserializeJson(variant, "\"hello");
JsonError err = deserializeJson(variant, "\"hello");
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
REQUIRE(variant.is<char*>());
REQUIRE_THAT(variant.as<char*>(), Equals("hello"));
}

View File

@ -10,61 +10,61 @@ TEST_CASE("deserializeJson(StaticJsonArray&)") {
StaticJsonArray<JSON_ARRAY_SIZE(0)> arr;
char input[] = "[]";
bool success = deserializeJson(arr, input);
JsonError err = deserializeJson(arr, input);
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
}
SECTION("TooSmallBufferForArrayWithOneValue") {
StaticJsonArray<JSON_ARRAY_SIZE(1) - 1> arr;
char input[] = "[1]";
bool success = deserializeJson(arr, input);
JsonError err = deserializeJson(arr, input);
REQUIRE(success == false);
REQUIRE(err != JsonError::Ok);
}
SECTION("BufferOfTheRightSizeForArrayWithOneValue") {
StaticJsonArray<JSON_ARRAY_SIZE(1)> arr;
char input[] = "[1]";
bool success = deserializeJson(arr, input);
JsonError err = deserializeJson(arr, input);
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
}
SECTION("TooSmallBufferForArrayWithNestedObject") {
StaticJsonArray<JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(0) - 1> arr;
char input[] = "[{}]";
bool success = deserializeJson(arr, input);
JsonError err = deserializeJson(arr, input);
REQUIRE(success == false);
REQUIRE(err != JsonError::Ok);
}
SECTION("BufferOfTheRightSizeForArrayWithNestedObject") {
StaticJsonArray<JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(0)> arr;
char input[] = "[{}]";
bool success = deserializeJson(arr, input);
JsonError err = deserializeJson(arr, input);
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
}
SECTION("CharPtrNull") {
StaticJsonArray<100> arr;
bool success = deserializeJson(arr, static_cast<char*>(0));
JsonError err = deserializeJson(arr, static_cast<char*>(0));
REQUIRE(success == false);
REQUIRE(err != JsonError::Ok);
}
SECTION("ConstCharPtrNull") {
StaticJsonArray<100> arr;
bool success = deserializeJson(arr, static_cast<const char*>(0));
JsonError err = deserializeJson(arr, static_cast<const char*>(0));
REQUIRE(success == false);
REQUIRE(err != JsonError::Ok);
}
SECTION("CopyStringNotSpaces") {

View File

@ -10,60 +10,60 @@ TEST_CASE("deserializeJson(StaticJsonObject&)") {
StaticJsonObject<JSON_OBJECT_SIZE(0)> obj;
char input[] = "{}";
bool success = deserializeJson(obj, input);
JsonError err = deserializeJson(obj, input);
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
}
SECTION("TooSmallBufferForObjectWithOneValue") {
StaticJsonObject<JSON_OBJECT_SIZE(1) - 1> obj;
char input[] = "{\"a\":1}";
bool success = deserializeJson(obj, input);
JsonError err = deserializeJson(obj, input);
REQUIRE(success == false);
REQUIRE(err != JsonError::Ok);
}
SECTION("BufferOfTheRightSizeForObjectWithOneValue") {
StaticJsonObject<JSON_OBJECT_SIZE(1)> obj;
char input[] = "{\"a\":1}";
bool success = deserializeJson(obj, input);
JsonError err = deserializeJson(obj, input);
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
}
SECTION("TooSmallBufferForObjectWithNestedObject") {
StaticJsonObject<JSON_OBJECT_SIZE(1) + JSON_ARRAY_SIZE(0) - 1> obj;
char input[] = "{\"a\":[]}";
bool success = deserializeJson(obj, input);
JsonError err = deserializeJson(obj, input);
REQUIRE(success == false);
REQUIRE(err != JsonError::Ok);
}
SECTION("BufferOfTheRightSizeForObjectWithNestedObject") {
StaticJsonObject<JSON_OBJECT_SIZE(1) + JSON_ARRAY_SIZE(0)> obj;
char input[] = "{\"a\":[]}";
bool success = deserializeJson(obj, input);
JsonError err = deserializeJson(obj, input);
REQUIRE(success == true);
REQUIRE(err == JsonError::Ok);
}
SECTION("CharPtrNull") {
StaticJsonObject<100> obj;
bool success = deserializeJson(obj, static_cast<char*>(0));
JsonError err = deserializeJson(obj, static_cast<char*>(0));
REQUIRE(success == false);
REQUIRE(err != JsonError::Ok);
}
SECTION("ConstCharPtrNull") {
StaticJsonObject<100> obj;
bool success = deserializeJson(obj, static_cast<const char*>(0));
JsonError err = deserializeJson(obj, static_cast<const char*>(0));
REQUIRE(success == false);
REQUIRE(err != JsonError::Ok);
}
}

View File

@ -5,44 +5,45 @@
#include <ArduinoJson.h>
#include <catch.hpp>
bool tryParseArray(const char *json, uint8_t nestingLimit) {
JsonError tryParseArray(const char *json, uint8_t nestingLimit) {
DynamicJsonArray array;
return deserializeJson(array, json, nestingLimit);
}
bool tryParseObject(const char *json, uint8_t nestingLimit) {
JsonError tryParseObject(const char *json, uint8_t nestingLimit) {
DynamicJsonObject obj;
return deserializeJson(obj, json, nestingLimit);
}
TEST_CASE("JsonParser nestingLimit") {
SECTION("ParseArrayWithNestingLimit0") {
REQUIRE(true == tryParseArray("[]", 0));
REQUIRE(false == tryParseArray("[[]]", 0));
REQUIRE(tryParseArray("[]", 0) == JsonError::Ok);
REQUIRE(tryParseArray("[[]]", 0) == JsonError::TooDeep);
}
SECTION("ParseArrayWithNestingLimit1") {
REQUIRE(true == tryParseArray("[[]]", 1));
REQUIRE(false == tryParseArray("[[[]]]", 1));
REQUIRE(tryParseArray("[[]]", 1) == JsonError::Ok);
REQUIRE(tryParseArray("[[[]]]", 1) == JsonError::TooDeep);
}
SECTION("ParseArrayWithNestingLimit2") {
REQUIRE(true == tryParseArray("[[[]]]", 2));
REQUIRE(false == tryParseArray("[[[[]]]]", 2));
REQUIRE(tryParseArray("[[[]]]", 2) == JsonError::Ok);
REQUIRE(tryParseArray("[[[[]]]]", 2) == JsonError::TooDeep);
}
SECTION("ParseObjectWithNestingLimit0") {
REQUIRE(true == tryParseObject("{}", 0));
REQUIRE(false == tryParseObject("{\"key\":{}}", 0));
REQUIRE(tryParseObject("{}", 0) == JsonError::Ok);
REQUIRE(tryParseObject("{\"key\":{}}", 0) == JsonError::TooDeep);
}
SECTION("ParseObjectWithNestingLimit1") {
REQUIRE(true == tryParseObject("{\"key\":{}}", 1));
REQUIRE(false == tryParseObject("{\"key\":{\"key\":{}}}", 1));
REQUIRE(tryParseObject("{\"key\":{}}", 1) == JsonError::Ok);
REQUIRE(tryParseObject("{\"key\":{\"key\":{}}}", 1) == JsonError::TooDeep);
}
SECTION("ParseObjectWithNestingLimit2") {
REQUIRE(true == tryParseObject("{\"key\":{\"key\":{}}}", 2));
REQUIRE(false == tryParseObject("{\"key\":{\"key\":{\"key\":{}}}}", 2));
REQUIRE(tryParseObject("{\"key\":{\"key\":{}}}", 2) == JsonError::Ok);
REQUIRE(tryParseObject("{\"key\":{\"key\":{\"key\":{}}}}", 2) ==
JsonError::TooDeep);
}
}