Files
ArduinoJson/test/JsonParser_Array_Tests.cpp

368 lines
7.7 KiB
C++
Raw Normal View History

// Copyright Benoit Blanchon 2014-2016
2014-10-23 23:39:22 +02:00
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson
// If you like this project, please add a star!
2014-10-23 23:39:22 +02:00
#include <ArduinoJson.h>
#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 {
protected:
void whenInputIs(const char *json) {
strcpy(_jsonString, json);
}
void whenInputIs(const char *json, size_t len) {
memcpy(_jsonString, json, len);
2014-10-23 19:54:00 +02:00
}
void parseMustSucceed() {
_array = &_jsonBuffer.parseArray(_jsonString);
EXPECT_TRUE(_array->success());
}
2014-10-23 19:54:00 +02:00
void parseMustFail() {
_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
}
void sizeMustBe(int expected) {
ASSERT_EQ(expected, _array->size());
}
2014-10-23 19:54:00 +02:00
template <typename T>
void firstElementMustBe(T expected) {
2014-10-23 19:54:00 +02:00
elementAtIndexMustBe(0, expected);
}
template <typename T>
void secondElementMustBe(T expected) {
2014-10-23 19:54:00 +02:00
elementAtIndexMustBe(1, expected);
}
template <typename T>
void elementAtIndexMustBe(int index, T expected) {
EXPECT_EQ(expected, (*_array)[index].as<T>());
2014-10-23 19:54:00 +02:00
}
void elementAtIndexMustBe(int index, const char *expected) {
EXPECT_STREQ(expected, (*_array)[index].as<const char *>());
2014-10-23 19:54:00 +02: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
}
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-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) {
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);
secondElementMustBe(1e2);
2014-10-15 14:54:31 +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
}
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
}
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();
}
TEST_F(JsonParser_Array_Tests, CCommentBeforeOpeningBracket) {
whenInputIs("/*COMMENT*/[\"hello\"]");
parseMustSucceed();
sizeMustBe(1);
firstElementMustBe("hello");
}
TEST_F(JsonParser_Array_Tests, CCommentAfterOpeningBracket) {
whenInputIs("[/*COMMENT*/\"hello\"]");
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) {
whenInputIs("[\"hello\",/*COMMENT*/\"world\"]");
parseMustSucceed();
sizeMustBe(2);
firstElementMustBe("hello");
secondElementMustBe("world");
}
TEST_F(JsonParser_Array_Tests, CppCommentBeforeOpeningBracket) {
whenInputIs("//COMMENT\n[\"hello\"]");
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) {
whenInputIs("[\"hello\"//COMMENT\n]");
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();
}
TEST_F(JsonParser_Array_Tests, EndsInCppComment) {
whenInputIs("[//COMMENT");
parseMustFail();
}
TEST_F(JsonParser_Array_Tests, AfterClosingStar) {
whenInputIs("[/*COMMENT*");
parseMustFail();
}
TEST_F(JsonParser_Array_Tests, DeeplyNested) {
whenInputIs("[[[[[[[[[[[[[[[[[[[\"Not too deep\"]]]]]]]]]]]]]]]]]]]");
parseMustSucceed();
}