2017-01-06 21:07:34 +01:00
|
|
|
// Copyright Benoit Blanchon 2014-2017
|
2014-10-23 23:39:22 +02:00
|
|
|
// MIT License
|
|
|
|
//
|
|
|
|
// Arduino JSON library
|
|
|
|
// https://github.com/bblanchon/ArduinoJson
|
2016-01-07 22:35:12 +01:00
|
|
|
// If you like this project, please add a star!
|
2014-10-23 23:39:22 +02:00
|
|
|
|
2014-11-11 16:54:46 +01:00
|
|
|
#include <ArduinoJson.h>
|
2016-09-21 22:11:38 +02:00
|
|
|
#include <gtest/gtest.h>
|
2014-10-18 23:05:54 +02:00
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
class JsonParser_Array_Tests : public testing::Test {
|
2014-10-23 23:13:13 +02:00
|
|
|
protected:
|
2016-09-21 22:11:38 +02:00
|
|
|
void whenInputIs(const char *json) {
|
|
|
|
strcpy(_jsonString, json);
|
|
|
|
}
|
2015-07-10 22:11:26 +02:00
|
|
|
|
|
|
|
void whenInputIs(const char *json, size_t len) {
|
|
|
|
memcpy(_jsonString, json, len);
|
2014-10-23 19:54:00 +02:00
|
|
|
}
|
|
|
|
|
2015-07-10 22:11:26 +02:00
|
|
|
void parseMustSucceed() {
|
|
|
|
_array = &_jsonBuffer.parseArray(_jsonString);
|
|
|
|
EXPECT_TRUE(_array->success());
|
|
|
|
}
|
2014-10-23 19:54:00 +02:00
|
|
|
|
|
|
|
void parseMustFail() {
|
2015-07-10 22:11:26 +02:00
|
|
|
_array = &_jsonBuffer.parseArray(_jsonString);
|
2014-10-30 14:03:33 +01:00
|
|
|
EXPECT_FALSE(_array->success());
|
|
|
|
EXPECT_EQ(0, _array->size());
|
2014-10-23 19:54:00 +02:00
|
|
|
}
|
|
|
|
|
2016-09-21 22:11:38 +02:00
|
|
|
void sizeMustBe(int expected) {
|
|
|
|
ASSERT_EQ(expected, _array->size());
|
|
|
|
}
|
2014-10-23 19:54:00 +02:00
|
|
|
|
2014-10-23 23:13:13 +02:00
|
|
|
template <typename T>
|
|
|
|
void firstElementMustBe(T expected) {
|
2014-10-23 19:54:00 +02:00
|
|
|
elementAtIndexMustBe(0, expected);
|
|
|
|
}
|
|
|
|
|
2014-10-23 23:13:13 +02:00
|
|
|
template <typename T>
|
|
|
|
void secondElementMustBe(T expected) {
|
2014-10-23 19:54:00 +02:00
|
|
|
elementAtIndexMustBe(1, expected);
|
|
|
|
}
|
|
|
|
|
2014-10-23 23:13:13 +02:00
|
|
|
template <typename T>
|
|
|
|
void elementAtIndexMustBe(int index, T expected) {
|
2015-05-23 15:32:50 +02:00
|
|
|
EXPECT_EQ(expected, (*_array)[index].as<T>());
|
2014-10-23 19:54:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void elementAtIndexMustBe(int index, const char *expected) {
|
2015-05-23 15:32:50 +02:00
|
|
|
EXPECT_STREQ(expected, (*_array)[index].as<const char *>());
|
2014-10-23 19:54:00 +02:00
|
|
|
}
|
|
|
|
|
2014-12-20 15:42:43 +01:00
|
|
|
DynamicJsonBuffer _jsonBuffer;
|
2014-10-30 14:03:33 +01:00
|
|
|
JsonArray *_array;
|
2014-10-23 19:54:00 +02:00
|
|
|
char _jsonString[256];
|
2014-10-14 17:16:21 +02:00
|
|
|
};
|
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
TEST_F(JsonParser_Array_Tests, EmptyArray) {
|
|
|
|
whenInputIs("[]");
|
2014-10-14 17:16:21 +02:00
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(0);
|
2014-10-14 17:28:57 +02:00
|
|
|
}
|
|
|
|
|
2014-10-31 16:50:21 +01:00
|
|
|
TEST_F(JsonParser_Array_Tests, MissingOpeningBracket) {
|
|
|
|
whenInputIs("]");
|
|
|
|
parseMustFail();
|
|
|
|
}
|
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
TEST_F(JsonParser_Array_Tests, ArrayWithNoEnd) {
|
|
|
|
whenInputIs("[");
|
|
|
|
parseMustFail();
|
2014-10-14 21:35:47 +02:00
|
|
|
}
|
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
TEST_F(JsonParser_Array_Tests, EmptyArrayWithLeadingSpaces) {
|
|
|
|
whenInputIs(" []");
|
2014-10-14 18:01:49 +02:00
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(0);
|
2014-10-14 18:01:49 +02:00
|
|
|
}
|
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
TEST_F(JsonParser_Array_Tests, Garbage) {
|
|
|
|
whenInputIs("%*$£¤");
|
2014-10-14 17:28:57 +02:00
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
parseMustFail();
|
2014-10-14 21:24:26 +02:00
|
|
|
}
|
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
TEST_F(JsonParser_Array_Tests, OneInteger) {
|
|
|
|
whenInputIs("[42]");
|
2014-10-14 21:24:26 +02:00
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(1);
|
|
|
|
firstElementMustBe(42);
|
2014-10-14 21:49:56 +02:00
|
|
|
}
|
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
TEST_F(JsonParser_Array_Tests, OneIntegerWithSpacesBefore) {
|
|
|
|
whenInputIs("[ \t\r\n42]");
|
2014-10-14 21:49:56 +02:00
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(1);
|
|
|
|
firstElementMustBe(42);
|
2014-10-14 21:49:56 +02:00
|
|
|
}
|
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
TEST_F(JsonParser_Array_Tests, OneIntegerWithSpaceAfter) {
|
|
|
|
whenInputIs("[42 \t\r\n]");
|
2014-10-14 21:49:56 +02:00
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(1);
|
|
|
|
firstElementMustBe(42);
|
2014-10-14 21:48:22 +02:00
|
|
|
}
|
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
TEST_F(JsonParser_Array_Tests, TwoIntegers) {
|
|
|
|
whenInputIs("[42,84]");
|
2014-10-14 21:48:22 +02:00
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(2);
|
|
|
|
firstElementMustBe(42);
|
|
|
|
secondElementMustBe(84);
|
2014-10-15 14:54:31 +02:00
|
|
|
}
|
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
TEST_F(JsonParser_Array_Tests, TwoDoubles) {
|
2014-11-08 15:56:40 +01:00
|
|
|
whenInputIs("[4.2,1e2]");
|
2014-10-15 14:54:31 +02:00
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(2);
|
|
|
|
firstElementMustBe(4.2);
|
2014-11-08 15:56:40 +01:00
|
|
|
secondElementMustBe(1e2);
|
2014-10-15 14:54:31 +02:00
|
|
|
}
|
|
|
|
|
2016-04-28 08:42:59 +02:00
|
|
|
TEST_F(JsonParser_Array_Tests, UnsignedLong) {
|
|
|
|
whenInputIs("[4294967295]");
|
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(1);
|
|
|
|
firstElementMustBe(4294967295UL);
|
|
|
|
}
|
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
TEST_F(JsonParser_Array_Tests, TwoBooleans) {
|
|
|
|
whenInputIs("[true,false]");
|
2014-10-15 14:54:31 +02:00
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(2);
|
|
|
|
firstElementMustBe(true);
|
|
|
|
secondElementMustBe(false);
|
2014-10-15 23:27:38 +02:00
|
|
|
}
|
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
TEST_F(JsonParser_Array_Tests, TwoNulls) {
|
|
|
|
const char *const nullCharPtr = 0;
|
2014-10-15 23:27:38 +02:00
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
whenInputIs("[null,null]");
|
2014-10-15 23:27:38 +02:00
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(2);
|
|
|
|
firstElementMustBe(nullCharPtr);
|
|
|
|
secondElementMustBe(nullCharPtr);
|
2014-10-15 23:39:25 +02:00
|
|
|
}
|
|
|
|
|
2015-07-27 22:16:42 +02:00
|
|
|
TEST_F(JsonParser_Array_Tests, TwoStringsDoubleQuotes) {
|
|
|
|
whenInputIs("[ \"hello\" , \"world\" ]");
|
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(2);
|
|
|
|
firstElementMustBe("hello");
|
|
|
|
secondElementMustBe("world");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, TwoStringsSingleQuotes) {
|
|
|
|
whenInputIs("[ 'hello' , 'world' ]");
|
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(2);
|
|
|
|
firstElementMustBe("hello");
|
|
|
|
secondElementMustBe("world");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, TwoStringsNoQuotes) {
|
|
|
|
whenInputIs("[ hello , world ]");
|
2014-10-15 23:39:25 +02:00
|
|
|
|
2014-10-23 19:54:00 +02:00
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(2);
|
|
|
|
firstElementMustBe("hello");
|
|
|
|
secondElementMustBe("world");
|
2014-10-23 23:45:36 +02:00
|
|
|
}
|
2015-07-10 22:11:26 +02:00
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, EmptyStringsDoubleQuotes) {
|
|
|
|
whenInputIs("[\"\",\"\"]");
|
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(2);
|
|
|
|
firstElementMustBe("");
|
|
|
|
secondElementMustBe("");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, EmptyStringSingleQuotes) {
|
|
|
|
whenInputIs("[\'\',\'\']");
|
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(2);
|
|
|
|
firstElementMustBe("");
|
|
|
|
secondElementMustBe("");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, EmptyStringNoQuotes) {
|
|
|
|
whenInputIs("[,]");
|
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(2);
|
|
|
|
firstElementMustBe("");
|
|
|
|
secondElementMustBe("");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, ClosingDoubleQuoteMissing) {
|
|
|
|
whenInputIs("[\"]");
|
|
|
|
|
|
|
|
parseMustFail();
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, ClosingSignleQuoteMissing) {
|
|
|
|
whenInputIs("[\']");
|
|
|
|
|
|
|
|
parseMustFail();
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, StringWithEscapedChars) {
|
|
|
|
whenInputIs("[\"1\\\"2\\\\3\\/4\\b5\\f6\\n7\\r8\\t9\"]");
|
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(1);
|
|
|
|
firstElementMustBe("1\"2\\3/4\b5\f6\n7\r8\t9");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, StringWithUnterminatedEscapeSequence) {
|
|
|
|
whenInputIs("\"\\\0\"", 4);
|
|
|
|
parseMustFail();
|
|
|
|
}
|
2015-07-27 22:16:42 +02:00
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, CCommentBeforeOpeningBracket) {
|
2017-01-17 21:48:13 +01:00
|
|
|
whenInputIs("/*COMMENT*/ [\"hello\"]");
|
2015-07-27 22:16:42 +02:00
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(1);
|
|
|
|
firstElementMustBe("hello");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, CCommentAfterOpeningBracket) {
|
2017-01-17 21:48:13 +01:00
|
|
|
whenInputIs("[/*COMMENT*/ \"hello\"]");
|
2015-07-27 22:16:42 +02:00
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(1);
|
|
|
|
firstElementMustBe("hello");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, CCommentBeforeClosingBracket) {
|
|
|
|
whenInputIs("[\"hello\"/*COMMENT*/]");
|
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(1);
|
|
|
|
firstElementMustBe("hello");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, CCommentAfterClosingBracket) {
|
|
|
|
whenInputIs("[\"hello\"]/*COMMENT*/");
|
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(1);
|
|
|
|
firstElementMustBe("hello");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, CCommentBeforeComma) {
|
|
|
|
whenInputIs("[\"hello\"/*COMMENT*/,\"world\"]");
|
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(2);
|
|
|
|
firstElementMustBe("hello");
|
|
|
|
secondElementMustBe("world");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, CCommentAfterComma) {
|
2017-01-17 21:48:13 +01:00
|
|
|
whenInputIs("[\"hello\",/*COMMENT*/ \"world\"]");
|
2015-07-27 22:16:42 +02:00
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(2);
|
|
|
|
firstElementMustBe("hello");
|
|
|
|
secondElementMustBe("world");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, CppCommentBeforeOpeningBracket) {
|
2017-01-17 21:48:13 +01:00
|
|
|
whenInputIs("//COMMENT\n\t[\"hello\"]");
|
2015-07-27 22:16:42 +02:00
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(1);
|
|
|
|
firstElementMustBe("hello");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, CppCommentAfterOpeningBracket) {
|
|
|
|
whenInputIs("[//COMMENT\n\"hello\"]");
|
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(1);
|
|
|
|
firstElementMustBe("hello");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, CppCommentBeforeClosingBracket) {
|
2017-01-17 21:48:13 +01:00
|
|
|
whenInputIs("[\"hello\"//COMMENT\r\n]");
|
2015-07-27 22:16:42 +02:00
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(1);
|
|
|
|
firstElementMustBe("hello");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, CppCommentAfterClosingBracket) {
|
|
|
|
whenInputIs("[\"hello\"]//COMMENT\n");
|
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(1);
|
|
|
|
firstElementMustBe("hello");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, CppCommentBeforeComma) {
|
|
|
|
whenInputIs("[\"hello\"//COMMENT\n,\"world\"]");
|
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(2);
|
|
|
|
firstElementMustBe("hello");
|
|
|
|
secondElementMustBe("world");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, CppCommentAfterComma) {
|
|
|
|
whenInputIs("[\"hello\",//COMMENT\n\"world\"]");
|
|
|
|
|
|
|
|
parseMustSucceed();
|
|
|
|
sizeMustBe(2);
|
|
|
|
firstElementMustBe("hello");
|
|
|
|
secondElementMustBe("world");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, InvalidCppComment) {
|
|
|
|
whenInputIs("[/COMMENT\n]");
|
|
|
|
parseMustFail();
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, InvalidComment) {
|
|
|
|
whenInputIs("[/*/\n]");
|
|
|
|
parseMustFail();
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, UnfinishedCComment) {
|
|
|
|
whenInputIs("[/*COMMENT]");
|
|
|
|
parseMustFail();
|
|
|
|
}
|
2016-09-21 22:11:38 +02:00
|
|
|
|
2017-01-03 22:03:50 +01:00
|
|
|
TEST_F(JsonParser_Array_Tests, EndsInCppComment) {
|
|
|
|
whenInputIs("[//COMMENT");
|
|
|
|
parseMustFail();
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(JsonParser_Array_Tests, AfterClosingStar) {
|
|
|
|
whenInputIs("[/*COMMENT*");
|
|
|
|
parseMustFail();
|
|
|
|
}
|
|
|
|
|
2016-09-21 22:11:38 +02:00
|
|
|
TEST_F(JsonParser_Array_Tests, DeeplyNested) {
|
|
|
|
whenInputIs("[[[[[[[[[[[[[[[[[[[\"Not too deep\"]]]]]]]]]]]]]]]]]]]");
|
|
|
|
parseMustSucceed();
|
|
|
|
}
|