Compare commits

...

18 Commits

Author SHA1 Message Date
7ae43bc4f8 Set version to 5.0.7 2015-11-25 21:15:11 +01:00
056682327b Changed String to be a typedef of std::string (issues #142 and #161) 2015-11-25 21:09:18 +01:00
8b66a25f66 Removed a useless line of code 2015-11-22 10:18:21 +01:00
96245dd3b4 Made library easier to use from a CMake project: simply add_subdirectory(ArduinoJson/src) 2015-11-19 21:53:27 +01:00
9cc49da68a Moved to the new Travis infrastructure 2015-11-19 21:31:23 +01:00
224918b463 Set version to 5.0.6 2015-11-09 23:10:14 +01:00
cbeefa2503 Examples: Added a loop to wait for serial port to be ready (issue #156) 2015-11-09 22:56:49 +01:00
6d68806633 Added donators list 2015-11-09 22:55:29 +01:00
ba3617c22f Added parameter to DynamicJsonBuffer constructor to set initial size (issue #152) 2015-11-09 21:37:40 +01:00
b7d9bb2765 Merge pull request #150 from marvinroger/patch-1
Add library category
2015-11-06 14:50:18 +01:00
74b42e2251 Add library category 2015-11-06 14:30:20 +01:00
c0cf9c3fcc Use float instead of double to reduce the size of JsonVariant (issue #134) 2015-10-30 23:03:16 +01:00
9f3ce18f06 Add overload JsonObjectSuscript::set(value, decimals) (issue #143) 2015-10-30 22:29:47 +01:00
b9e3255c9e Reached 100.00% code coverage :-) 2015-09-29 22:20:36 +02:00
e657396f65 Added -fno-rtti 2015-09-29 21:51:21 +02:00
929f608f2f Added list of supported platforms 2015-09-29 21:49:19 +02:00
c6a4bfa886 Fixed ambiguous overload with JsonArraySubscript and JsonObjectSubscript (issue #122) 2015-09-28 22:14:50 +02:00
d5e25b12b8 Added a comment to prevent issue #112 2015-09-27 14:18:14 +02:00
49 changed files with 1043 additions and 495 deletions

2
.gitignore vendored
View File

@ -4,3 +4,5 @@
/bin /bin
/lib /lib
/sftp-config.json /sftp-config.json
.tags
.tags_sorted_by_file

View File

@ -1,17 +1,20 @@
sudo: false
language: c++ language: c++
compiler: compiler:
- gcc - gcc
- clang - clang
before_install: before_install:
- pip install --user cpp-coveralls
- mkdir -p /tmp/cmake
- curl https://cmake.org/files/v3.4/cmake-3.4.0-Linux-x86_64.tar.gz | tar xz -C /tmp/cmake --strip 1
- export PATH=/tmp/cmake/bin:$PATH
- "/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_1.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :1 -ac -screen 0 1280x1024x16" - "/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_1.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :1 -ac -screen 0 1280x1024x16"
- sleep 3 - sleep 3
- export DISPLAY=:1.0 - export DISPLAY=:1.0
- wget http://downloads.arduino.cc/arduino-1.6.5-linux64.tar.xz - mkdir -p /tmp/arduino
- tar xf arduino-1.6.5-linux64.tar.xz - curl http://downloads.arduino.cc/arduino-1.6.5-linux64.tar.xz | tar xJ -C /tmp/arduino --strip 1
- sudo mv arduino-1.6.5 /usr/local/share/arduino - export PATH=$PATH:/tmp/arduino/
- sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino - ln -s $PWD /tmp/arduino/libraries/ArduinoJson
- sudo ln -s $PWD /usr/local/share/arduino/libraries/ArduinoJson
- sudo pip install cpp-coveralls
script: script:
- cmake -DCOVERAGE=true . && make && make test - cmake -DCOVERAGE=true . && make && make test
- arduino --verify --board arduino:avr:uno $PWD/examples/JsonParserExample/JsonParserExample.ino - arduino --verify --board arduino:avr:uno $PWD/examples/JsonParserExample/JsonParserExample.ino

View File

@ -1,6 +1,34 @@
ArduinoJson: change log ArduinoJson: change log
======================= =======================
v5.0.7
------
* Made library easier to use from a CMake project: simply `add_subdirectory(ArduinoJson/src)`
* Changed `String` to be a `typedef` of `std::string` (issues #142 and #161)
**BREAKING CHANGES**:
- `JsonVariant(true).as<String>()` now returns `"true"` instead of `"1"`
- `JsonVariant(false).as<String>()` now returns `"false"` instead of `"0"`
v5.0.6
------
* Added parameter to `DynamicJsonBuffer` constructor to set initial size (issue #152)
* Fixed warning about library category in Arduino 1.6.6 (issue #147)
* Examples: Added a loop to wait for serial port to be ready (issue #156)
v5.0.5
------
* Added overload `JsonObjectSuscript::set(value, decimals)` (issue #143)
* Use `float` instead of `double` to reduce the size of `JsonVariant` (issue #134)
v5.0.4
------
* Fixed ambiguous overload with `JsonArraySubscript` and `JsonObjectSubscript` (issue #122)
v5.0.3 v5.0.3
------ ------

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 2.8.4) cmake_minimum_required(VERSION 2.8.12)
project(ArduinoJson) project(ArduinoJson)
enable_testing() enable_testing()
@ -7,10 +7,6 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
if(MSVC)
add_definitions(-D_CRT_SECURE_NO_WARNINGS -W4)
endif()
if(${COVERAGE}) if(${COVERAGE})
set(CMAKE_CXX_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage") set(CMAKE_CXX_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage")
endif() endif()

View File

@ -21,37 +21,49 @@ Features
* Small footprint * Small footprint
* MIT License * MIT License
Works on
--------
* All Arduino boards
* ESP8266
* Teensy
* Computers (Windows, Linux, OSX...)
Quick start Quick start
----------- -----------
#### Decoding / Parsing #### Decoding / Parsing
char json[] = "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}"; ```c++
char json[] = "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
StaticJsonBuffer<200> jsonBuffer; StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(json); JsonObject& root = jsonBuffer.parseObject(json);
const char* sensor = root["sensor"]; const char* sensor = root["sensor"];
long time = root["time"]; long time = root["time"];
double latitude = root["data"][0]; double latitude = root["data"][0];
double longitude = root["data"][1]; double longitude = root["data"][1];
```
#### Encoding / Generating #### Encoding / Generating
StaticJsonBuffer<200> jsonBuffer; ```c++
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.createObject(); JsonObject& root = jsonBuffer.createObject();
root["sensor"] = "gps"; root["sensor"] = "gps";
root["time"] = 1351824120; root["time"] = 1351824120;
JsonArray& data = root.createNestedArray("data"); JsonArray& data = root.createNestedArray("data");
data.add(48.756080, 6); // 6 is the number of decimals to print data.add(48.756080, 6); // 6 is the number of decimals to print
data.add(2.302038, 6); // if not specified, 2 digits are printed data.add(2.302038, 6); // if not specified, 2 digits are printed
root.printTo(Serial); root.printTo(Serial);
// This prints: // This prints:
// {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]} // {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]}
```
Documentation Documentation
@ -86,6 +98,18 @@ From GitHub user `zacsketches`:
> I am just starting an ESP8266 clock project and now I can output JSON from my server script and interpret it painlessly. > I am just starting an ESP8266 clock project and now I can output JSON from my server script and interpret it painlessly.
Donators
--------
Special thanks to the following persons and companies who made generous donations to the library author:
* Robert Murphy
* Surge Communications
* Alex Scott
* Firepick Services LLC
* A B Doodkorte
* Scott Smith
--- ---
Found this library useful? Please star this project or [help me back with a donation!](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=donate%40benoitblanchon%2efr&lc=GB&item_name=Benoit%20Blanchon&item_number=Arduino%20JSON&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted) :smile: Found this library useful? Please star this project or [help me back with a donation!](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=donate%40benoitblanchon%2efr&lc=GB&item_name=Benoit%20Blanchon&item_number=Arduino%20JSON&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted) :smile:

View File

@ -10,6 +10,9 @@ using namespace ArduinoJson::Internals;
void setup() { void setup() {
Serial.begin(9600); Serial.begin(9600);
while (!Serial) {
// wait serial port initialization
}
IndentedPrint serial(Serial); IndentedPrint serial(Serial);
serial.setTabSize(4); serial.setTabSize(4);

View File

@ -8,6 +8,9 @@
void setup() { void setup() {
Serial.begin(9600); Serial.begin(9600);
while (!Serial) {
// wait serial port initialization
}
StaticJsonBuffer<200> jsonBuffer; StaticJsonBuffer<200> jsonBuffer;

View File

@ -8,6 +8,9 @@
void setup() { void setup() {
Serial.begin(9600); Serial.begin(9600);
while (!Serial) {
// wait serial port initialization
}
StaticJsonBuffer<200> jsonBuffer; StaticJsonBuffer<200> jsonBuffer;

View File

@ -20,6 +20,7 @@ class Print {
size_t print(const char[]); size_t print(const char[]);
size_t print(double, int = 2); size_t print(double, int = 2);
size_t print(int);
size_t print(long); size_t print(long);
size_t println(); size_t println();
}; };

View File

@ -9,15 +9,7 @@
#ifndef ARDUINO #ifndef ARDUINO
#include <string> #include <string>
typedef std::string String;
// This class reproduces Arduino's String class
class String : public std::string {
public:
String(const char *cstr = "") : std::string(cstr) {}
String(const String &str) : std::string(str) {}
explicit String(long);
explicit String(double, unsigned char decimalPlaces = 2);
};
#else #else

View File

@ -31,7 +31,8 @@ class BlockJsonBuffer : public JsonBuffer {
}; };
public: public:
BlockJsonBuffer() : _head(NULL) {} BlockJsonBuffer(size_t initialSize = 256)
: _head(NULL), _nextBlockSize(initialSize) {}
~BlockJsonBuffer() { ~BlockJsonBuffer() {
Block* currentBlock = _head; Block* currentBlock = _head;
@ -55,8 +56,6 @@ class BlockJsonBuffer : public JsonBuffer {
} }
private: private:
static const size_t FIRST_BLOCK_CAPACITY = 32;
bool canAllocInHead(size_t bytes) const { bool canAllocInHead(size_t bytes) const {
return _head != NULL && _head->size + bytes <= _head->capacity; return _head != NULL && _head->size + bytes <= _head->capacity;
} }
@ -68,10 +67,10 @@ class BlockJsonBuffer : public JsonBuffer {
} }
void* allocInNewBlock(size_t bytes) { void* allocInNewBlock(size_t bytes) {
size_t capacity = FIRST_BLOCK_CAPACITY; size_t capacity = _nextBlockSize;
if (_head != NULL) capacity = _head->capacity * 2;
if (bytes > capacity) capacity = bytes; if (bytes > capacity) capacity = bytes;
if (!addNewBlock(capacity)) return NULL; if (!addNewBlock(capacity)) return NULL;
_nextBlockSize *= 2;
return allocInHead(bytes); return allocInHead(bytes);
} }
@ -86,8 +85,9 @@ class BlockJsonBuffer : public JsonBuffer {
return true; return true;
} }
Block* _head;
TAllocator _allocator; TAllocator _allocator;
Block* _head;
size_t _nextBlockSize;
}; };
} }
} }

View File

@ -0,0 +1,20 @@
// Copyright Benoit Blanchon 2014-2015
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson
#pragma once
namespace ArduinoJson {
namespace Internals {
#ifdef ARDUINO
// On embedded platform, we with use float instead of double to keep JsonVariant
// small (issue #134)
typedef float JsonFloat;
#else
typedef double JsonFloat;
#endif
}
}

View File

@ -0,0 +1,13 @@
// Copyright Benoit Blanchon 2014-2015
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson
#pragma once
namespace ArduinoJson {
namespace Internals {
typedef long JsonInteger;
}
}

View File

@ -6,6 +6,9 @@
#pragma once #pragma once
#include "JsonFloat.hpp"
#include "JsonInteger.hpp"
namespace ArduinoJson { namespace ArduinoJson {
// Forward declarations // Forward declarations
@ -13,15 +16,14 @@ class JsonArray;
class JsonObject; class JsonObject;
namespace Internals { namespace Internals {
// A union that defines the actual content of a JsonVariant. // A union that defines the actual content of a JsonVariant.
// The enum JsonVariantType determines which member is in use. // The enum JsonVariantType determines which member is in use.
union JsonVariantContent { union JsonVariantContent {
double asDouble; // asDouble is also used for float JsonFloat asFloat; // used for double and float
long asLong; // asLong is also used for bool, char, short and int JsonInteger asInteger; // used for bool, char, short, int and longs
const char* asString; // asString can be null const char* asString; // asString can be null
JsonArray* asArray; // asArray cannot be null JsonArray* asArray; // asArray cannot be null
JsonObject* asObject; // asObject cannot be null JsonObject* asObject; // asObject cannot be null
}; };
} }
} }

View File

@ -19,17 +19,17 @@ enum JsonVariantType {
JSON_UNPARSED, // the JsonVariant contains an unparsed string JSON_UNPARSED, // the JsonVariant contains an unparsed string
JSON_STRING, // the JsonVariant stores a const char* JSON_STRING, // the JsonVariant stores a const char*
JSON_BOOLEAN, // the JsonVariant stores a bool JSON_BOOLEAN, // the JsonVariant stores a bool
JSON_LONG, // the JsonVariant stores a long JSON_INTEGER, // the JsonVariant stores an integer
JSON_ARRAY, // the JsonVariant stores a pointer to a JsonArray JSON_ARRAY, // the JsonVariant stores a pointer to a JsonArray
JSON_OBJECT, // the JsonVariant stores a pointer to a JsonObject JSON_OBJECT, // the JsonVariant stores a pointer to a JsonObject
// The following values are reserved for double values // The following values are reserved for float values
// Multiple values are used for double, depending on the number of decimal // Multiple values are used for double, depending on the number of decimal
// digits that must be printed in the JSON output. // digits that must be printed in the JSON output.
// This little trick allow to save one extra member in JsonVariant // This little trick allow to save one extra member in JsonVariant
JSON_DOUBLE_0_DECIMALS JSON_FLOAT_0_DECIMALS
// JSON_DOUBLE_1_DECIMAL // JSON_FLOAT_1_DECIMAL
// JSON_DOUBLE_2_DECIMALS // JSON_FLOAT_2_DECIMALS
// ... // ...
}; };
} }

View File

@ -9,6 +9,8 @@
#include "../Arduino/Print.hpp" #include "../Arduino/Print.hpp"
#include "Encoding.hpp" #include "Encoding.hpp"
#include "ForceInline.hpp" #include "ForceInline.hpp"
#include "JsonFloat.hpp"
#include "JsonInteger.hpp"
namespace ArduinoJson { namespace ArduinoJson {
namespace Internals { namespace Internals {
@ -60,9 +62,9 @@ class JsonWriter {
} }
} }
void writeLong(long value) { _length += _sink.print(value); } void writeInteger(JsonInteger value) { _length += _sink.print(value); }
void writeDouble(double value, uint8_t decimals) { void writeFloat(JsonFloat value, uint8_t decimals) {
_length += _sink.print(value, decimals); _length += _sink.print(value, decimals);
} }

View File

@ -14,7 +14,7 @@ namespace Internals {
// A Print implementation that allows to write in a char[] // A Print implementation that allows to write in a char[]
class StaticStringBuilder : public Print { class StaticStringBuilder : public Print {
public: public:
StaticStringBuilder(char *buf, int size) StaticStringBuilder(char *buf, size_t size)
: buffer(buf), capacity(size - 1), length(0) { : buffer(buf), capacity(size - 1), length(0) {
buffer[0] = '\0'; buffer[0] = '\0';
} }
@ -23,8 +23,8 @@ class StaticStringBuilder : public Print {
private: private:
char *buffer; char *buffer;
int capacity; size_t capacity;
int length; size_t length;
}; };
} }
} }

View File

@ -63,7 +63,8 @@ class JsonArray : public Internals::JsonPrintable<JsonArray>,
FORCE_INLINE bool add(const String &value); FORCE_INLINE bool add(const String &value);
FORCE_INLINE bool add(JsonArray &array); FORCE_INLINE bool add(JsonArray &array);
FORCE_INLINE bool add(JsonObject &object); FORCE_INLINE bool add(JsonObject &object);
FORCE_INLINE bool add(const JsonVariant &object); template <typename T>
FORCE_INLINE bool add(const T &value);
// Sets the value at specified index. // Sets the value at specified index.
FORCE_INLINE void set(size_t index, bool value); FORCE_INLINE void set(size_t index, bool value);
@ -81,7 +82,8 @@ class JsonArray : public Internals::JsonPrintable<JsonArray>,
FORCE_INLINE void set(size_t index, const String &value); FORCE_INLINE void set(size_t index, const String &value);
FORCE_INLINE void set(size_t index, JsonArray &array); FORCE_INLINE void set(size_t index, JsonArray &array);
FORCE_INLINE void set(size_t index, JsonObject &object); FORCE_INLINE void set(size_t index, JsonObject &object);
FORCE_INLINE void set(size_t index, const JsonVariant &object); template <typename T>
FORCE_INLINE void set(size_t index, const T &value);
// Gets the value at the specified index. // Gets the value at the specified index.
FORCE_INLINE JsonVariant get(size_t index) const; FORCE_INLINE JsonVariant get(size_t index) const;

View File

@ -77,8 +77,9 @@ inline bool JsonArray::add(JsonObject &object) {
return addNode<JsonObject &>(object); return addNode<JsonObject &>(object);
} }
inline bool JsonArray::add(const JsonVariant &object) { template <typename T>
return addNode<const JsonVariant &>(object); inline bool JsonArray::add(const T &variant) {
return addNode<const JsonVariant &>(variant);
} }
template <typename TValue> template <typename TValue>
@ -149,8 +150,9 @@ inline void JsonArray::set(size_t index, JsonObject &object) {
return setNodeAt<JsonObject &>(index, object); return setNodeAt<JsonObject &>(index, object);
} }
inline void JsonArray::set(size_t index, const JsonVariant &object) { template <typename T>
return setNodeAt<const JsonVariant &>(index, object); inline void JsonArray::set(size_t index, const T &variant) {
return setNodeAt<const JsonVariant &>(index, variant);
} }
template <typename TValue> template <typename TValue>

View File

@ -8,6 +8,11 @@
#include "JsonSubscriptBase.hpp" #include "JsonSubscriptBase.hpp"
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4522)
#endif
namespace ArduinoJson { namespace ArduinoJson {
class JsonArraySubscript : public JsonSubscriptBase<JsonArraySubscript> { class JsonArraySubscript : public JsonSubscriptBase<JsonArraySubscript> {
public: public:
@ -16,6 +21,15 @@ class JsonArraySubscript : public JsonSubscriptBase<JsonArraySubscript> {
using JsonSubscriptBase<JsonArraySubscript>::operator=; using JsonSubscriptBase<JsonArraySubscript>::operator=;
JsonArraySubscript& operator=(const JsonArraySubscript& src) {
return assign<const JsonVariant&>(src);
}
template <typename T>
JsonArraySubscript& operator=(const T& src) {
return assign<const JsonVariant&>(src);
}
FORCE_INLINE bool success() const { return _index < _array.size(); } FORCE_INLINE bool success() const { return _index < _array.size(); }
FORCE_INLINE operator JsonVariant() const { return _array.get(_index); } FORCE_INLINE operator JsonVariant() const { return _array.get(_index); }
@ -52,3 +66,7 @@ inline std::ostream& operator<<(std::ostream& os,
#endif #endif
} // namespace ArduinoJson } // namespace ArduinoJson
#ifdef _MSC_VER
#pragma warning(pop)
#endif

View File

@ -65,6 +65,9 @@ class JsonObject : public Internals::JsonPrintable<JsonObject>,
FORCE_INLINE bool set(const char* key, JsonArray& array); FORCE_INLINE bool set(const char* key, JsonArray& array);
FORCE_INLINE bool set(const char* key, JsonObject& object); FORCE_INLINE bool set(const char* key, JsonObject& object);
FORCE_INLINE bool set(const char* key, const JsonVariant& value); FORCE_INLINE bool set(const char* key, const JsonVariant& value);
template <typename T>
FORCE_INLINE bool set(const char* key, const T& value);
FORCE_INLINE bool set(const String& key, bool value); FORCE_INLINE bool set(const String& key, bool value);
FORCE_INLINE bool set(const String& key, float value, uint8_t decimals = 2); FORCE_INLINE bool set(const String& key, float value, uint8_t decimals = 2);
FORCE_INLINE bool set(const String& key, double value, uint8_t decimals = 2); FORCE_INLINE bool set(const String& key, double value, uint8_t decimals = 2);
@ -81,6 +84,8 @@ class JsonObject : public Internals::JsonPrintable<JsonObject>,
FORCE_INLINE bool set(const String& key, JsonArray& array); FORCE_INLINE bool set(const String& key, JsonArray& array);
FORCE_INLINE bool set(const String& key, JsonObject& object); FORCE_INLINE bool set(const String& key, JsonObject& object);
FORCE_INLINE bool set(const String& key, const JsonVariant& value); FORCE_INLINE bool set(const String& key, const JsonVariant& value);
template <typename T>
FORCE_INLINE bool set(const String& key, const T& value);
// Gets the value associated with the specified key. // Gets the value associated with the specified key.
FORCE_INLINE JsonVariant get(JsonObjectKey) const; FORCE_INLINE JsonVariant get(JsonObjectKey) const;

View File

@ -116,6 +116,10 @@ inline bool JsonObject::set(const char *key, JsonObject &object) {
inline bool JsonObject::set(const char *key, const JsonVariant &value) { inline bool JsonObject::set(const char *key, const JsonVariant &value) {
return setNodeAt<const char *, const JsonVariant &>(key, value); return setNodeAt<const char *, const JsonVariant &>(key, value);
} }
template <typename T>
inline bool JsonObject::set(const char *key, const T &value) {
return setNodeAt<const char *, JsonVariant>(key, value);
}
inline bool JsonObject::set(const String &key, bool value) { inline bool JsonObject::set(const String &key, bool value) {
return setNodeAt<const String &, bool>(key, value); return setNodeAt<const String &, bool>(key, value);
} }
@ -166,6 +170,10 @@ inline bool JsonObject::set(const String &key, JsonObject &object) {
inline bool JsonObject::set(const String &key, const JsonVariant &value) { inline bool JsonObject::set(const String &key, const JsonVariant &value) {
return setNodeAt<const String &, const JsonVariant &>(key, value); return setNodeAt<const String &, const JsonVariant &>(key, value);
} }
template <typename T>
inline bool JsonObject::set(const String &key, const T &value) {
return setNodeAt<const String &, JsonVariant>(key, value);
}
template <typename TKey, typename TValue> template <typename TKey, typename TValue>
inline bool JsonObject::setNodeAt(TKey key, TValue value) { inline bool JsonObject::setNodeAt(TKey key, TValue value) {

View File

@ -8,6 +8,11 @@
#include "JsonSubscriptBase.hpp" #include "JsonSubscriptBase.hpp"
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4522)
#endif
namespace ArduinoJson { namespace ArduinoJson {
template <typename TKey> template <typename TKey>
@ -19,6 +24,17 @@ class JsonObjectSubscript
using JsonSubscriptBase<JsonObjectSubscript<TKey> >::operator=; using JsonSubscriptBase<JsonObjectSubscript<TKey> >::operator=;
JsonObjectSubscript<TKey>& operator=(const JsonObjectSubscript<TKey>& src) {
return JsonSubscriptBase<JsonObjectSubscript<TKey> >::template assign<
JsonVariant>(src);
}
template <typename T>
JsonObjectSubscript<TKey>& operator=(const T& src) {
return JsonSubscriptBase<JsonObjectSubscript<TKey> >::template assign<
JsonVariant>(src);
}
FORCE_INLINE bool success() const { return _object.containsKey(_key); } FORCE_INLINE bool success() const { return _object.containsKey(_key); }
FORCE_INLINE operator JsonVariant() const { return _object.get(_key); } FORCE_INLINE operator JsonVariant() const { return _object.get(_key); }
@ -38,6 +54,11 @@ class JsonObjectSubscript
return _object.set(_key, value); return _object.set(_key, value);
} }
template <typename TValue>
FORCE_INLINE bool set(TValue value, uint8_t decimals) {
return _object.set(_key, value, decimals);
}
FORCE_INLINE JsonVariant get() { return _object.get(_key); } FORCE_INLINE JsonVariant get() { return _object.get(_key); }
void writeTo(Internals::JsonWriter& writer) const { void writeTo(Internals::JsonWriter& writer) const {
@ -60,4 +81,8 @@ inline std::ostream& operator<<(
return source.printTo(os); return source.printTo(os);
} }
#endif #endif
} } // namespace ArduinoJson
#ifdef _MSC_VER
#pragma warning(pop)
#endif

View File

@ -68,10 +68,10 @@ class JsonSubscriptBase : public JsonVariantBase<TImpl> {
} }
FORCE_INLINE TImpl& operator=(JsonVariant value) { FORCE_INLINE TImpl& operator=(JsonVariant value) {
return assign<JsonVariant>(value); return assign<const JsonVariant&>(value);
} }
private: protected:
template <typename TValue> template <typename TValue>
FORCE_INLINE TImpl& assign(TValue value) { FORCE_INLINE TImpl& assign(TValue value) {
TImpl* that = static_cast<TImpl*>(this); TImpl* that = static_cast<TImpl*>(this);

View File

@ -83,6 +83,9 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
static T invalid(); static T invalid();
private: private:
Internals::JsonFloat asFloat() const;
Internals::JsonInteger asInteger() const;
// The current type of the variant // The current type of the variant
Internals::JsonVariantType _type; Internals::JsonVariantType _type;

View File

@ -11,8 +11,9 @@
namespace ArduinoJson { namespace ArduinoJson {
inline JsonVariant::JsonVariant(bool value) { inline JsonVariant::JsonVariant(bool value) {
_type = Internals::JSON_BOOLEAN; using namespace Internals;
_content.asLong = value; _type = JSON_BOOLEAN;
_content.asInteger = static_cast<JsonInteger>(value);
} }
inline JsonVariant::JsonVariant(const char *value) { inline JsonVariant::JsonVariant(const char *value) {
@ -26,15 +27,15 @@ inline JsonVariant::JsonVariant(Internals::Unparsed value) {
} }
inline JsonVariant::JsonVariant(double value, uint8_t decimals) { inline JsonVariant::JsonVariant(double value, uint8_t decimals) {
_type = static_cast<Internals::JsonVariantType>( using namespace Internals;
Internals::JSON_DOUBLE_0_DECIMALS + decimals); _type = static_cast<JsonVariantType>(JSON_FLOAT_0_DECIMALS + decimals);
_content.asDouble = value; _content.asFloat = static_cast<JsonFloat>(value);
} }
inline JsonVariant::JsonVariant(float value, uint8_t decimals) { inline JsonVariant::JsonVariant(float value, uint8_t decimals) {
_type = static_cast<Internals::JsonVariantType>( using namespace Internals;
Internals::JSON_DOUBLE_0_DECIMALS + decimals); _type = static_cast<JsonVariantType>(JSON_FLOAT_0_DECIMALS + decimals);
_content.asDouble = value; _content.asFloat = static_cast<JsonFloat>(value);
} }
inline JsonVariant::JsonVariant(JsonArray &array) { inline JsonVariant::JsonVariant(JsonArray &array) {
@ -48,51 +49,53 @@ inline JsonVariant::JsonVariant(JsonObject &object) {
} }
inline JsonVariant::JsonVariant(signed char value) { inline JsonVariant::JsonVariant(signed char value) {
_type = Internals::JSON_LONG; using namespace Internals;
_content.asLong = value; _type = JSON_INTEGER;
_content.asInteger = static_cast<JsonInteger>(value);
} }
inline JsonVariant::JsonVariant(signed int value) { inline JsonVariant::JsonVariant(signed int value) {
_type = Internals::JSON_LONG; using namespace Internals;
_content.asLong = value; _type = JSON_INTEGER;
_content.asInteger = static_cast<JsonInteger>(value);
} }
inline JsonVariant::JsonVariant(signed long value) { inline JsonVariant::JsonVariant(signed long value) {
_type = Internals::JSON_LONG; using namespace Internals;
_content.asLong = value; _type = JSON_INTEGER;
_content.asInteger = static_cast<JsonInteger>(value);
} }
inline JsonVariant::JsonVariant(signed short value) { inline JsonVariant::JsonVariant(signed short value) {
_type = Internals::JSON_LONG; using namespace Internals;
_content.asLong = value; _type = JSON_INTEGER;
_content.asInteger = static_cast<JsonInteger>(value);
} }
inline JsonVariant::JsonVariant(unsigned char value) { inline JsonVariant::JsonVariant(unsigned char value) {
_type = Internals::JSON_LONG; using namespace Internals;
_content.asLong = value; _type = JSON_INTEGER;
_content.asInteger = static_cast<JsonInteger>(value);
} }
inline JsonVariant::JsonVariant(unsigned int value) { inline JsonVariant::JsonVariant(unsigned int value) {
_type = Internals::JSON_LONG; using namespace Internals;
_content.asLong = value; _type = JSON_INTEGER;
_content.asInteger = static_cast<JsonInteger>(value);
} }
inline JsonVariant::JsonVariant(unsigned long value) { inline JsonVariant::JsonVariant(unsigned long value) {
_type = Internals::JSON_LONG; using namespace Internals;
_content.asLong = value; _type = JSON_INTEGER;
_content.asInteger = static_cast<JsonInteger>(value);
} }
inline JsonVariant::JsonVariant(unsigned short value) { inline JsonVariant::JsonVariant(unsigned short value) {
_type = Internals::JSON_LONG; using namespace Internals;
_content.asLong = value; _type = JSON_INTEGER;
_content.asInteger = static_cast<JsonInteger>(value);
} }
template <>
double JsonVariant::as<double>() const;
template <>
long JsonVariant::as<long>() const;
template <> template <>
String JsonVariant::as<String>() const; String JsonVariant::as<String>() const;
@ -101,47 +104,57 @@ const char *JsonVariant::as<const char *>() const;
template <> template <>
inline bool JsonVariant::as<bool>() const { inline bool JsonVariant::as<bool>() const {
return as<long>() != 0; return asInteger() != 0;
} }
template <> template <>
inline signed char JsonVariant::as<signed char>() const { inline signed char JsonVariant::as<signed char>() const {
return static_cast<signed char>(as<long>()); return static_cast<signed char>(asInteger());
} }
template <> template <>
inline unsigned char JsonVariant::as<unsigned char>() const { inline unsigned char JsonVariant::as<unsigned char>() const {
return static_cast<unsigned char>(as<long>()); return static_cast<unsigned char>(asInteger());
} }
template <> template <>
inline signed short JsonVariant::as<signed short>() const { inline signed short JsonVariant::as<signed short>() const {
return static_cast<signed short>(as<long>()); return static_cast<signed short>(asInteger());
} }
template <> template <>
inline unsigned short JsonVariant::as<unsigned short>() const { inline unsigned short JsonVariant::as<unsigned short>() const {
return static_cast<unsigned short>(as<long>()); return static_cast<unsigned short>(asInteger());
} }
template <> template <>
inline signed int JsonVariant::as<signed int>() const { inline signed int JsonVariant::as<signed int>() const {
return static_cast<signed int>(as<long>()); return static_cast<signed int>(asInteger());
} }
template <> template <>
inline unsigned int JsonVariant::as<unsigned int>() const { inline unsigned int JsonVariant::as<unsigned int>() const {
return static_cast<unsigned int>(as<long>()); return static_cast<unsigned int>(asInteger());
} }
template <> template <>
inline unsigned long JsonVariant::as<unsigned long>() const { inline unsigned long JsonVariant::as<unsigned long>() const {
return static_cast<unsigned long>(as<long>()); return static_cast<unsigned long>(asInteger());
}
template <>
inline signed long JsonVariant::as<signed long>() const {
return static_cast<unsigned long>(asInteger());
}
template <>
inline double JsonVariant::as<double>() const {
return static_cast<double>(asFloat());
} }
template <> template <>
inline float JsonVariant::as<float>() const { inline float JsonVariant::as<float>() const {
return static_cast<float>(as<double>()); return static_cast<float>(asFloat());
} }
template <typename T> template <typename T>

View File

@ -1,8 +1,9 @@
name=ArduinoJson name=ArduinoJson
version=5.0.3 version=5.0.7
author=Benoit Blanchon <blog.benoitblanchon.fr> author=Benoit Blanchon <blog.benoitblanchon.fr>
maintainer=Benoit Blanchon <blog.benoitblanchon.fr> maintainer=Benoit Blanchon <blog.benoitblanchon.fr>
sentence=An efficient and elegant JSON library for Arduino. sentence=An efficient and elegant JSON library for Arduino.
paragraph=Like this project? Please star it on GitHub! paragraph=Like this project? Please star it on GitHub!
category=Data Processing
url=https://github.com/bblanchon/ArduinoJson url=https://github.com/bblanchon/ArduinoJson
architectures=* architectures=*

View File

@ -60,6 +60,12 @@ size_t Print::print(long value) {
return print(tmp); return print(tmp);
} }
size_t Print::print(int value) {
char tmp[32];
sprintf(tmp, "%d", value);
return print(tmp);
}
size_t Print::println() { return write('\r') + write('\n'); } size_t Print::println() { return write('\r') + write('\n'); }
#endif #endif

View File

@ -1,25 +0,0 @@
// Copyright Benoit Blanchon 2014-2015
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson
#ifndef ARDUINO
#include "../../include/ArduinoJson/Arduino/String.hpp"
#include <stdio.h> // for sprintf()
String::String(double value, unsigned char digits) {
char tmp[32];
sprintf(tmp, "%.*f", digits, value);
*this = tmp;
}
String::String(long value) {
char tmp[32];
sprintf(tmp, "%ld", value);
*this = tmp;
}
#endif

View File

@ -5,6 +5,7 @@ file(GLOB_RECURSE CPP_FILES *.cpp)
if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)") if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)")
add_definitions( add_definitions(
-fno-exceptions -fno-exceptions
-fno-rtti
-pedantic -pedantic
-Wall -Wall
-Wcast-align -Wcast-align
@ -47,4 +48,12 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
) )
endif() endif()
if(MSVC)
add_definitions(
-D_CRT_SECURE_NO_WARNINGS
-W4)
endif()
add_library(ArduinoJson ${CPP_FILES} ${HPP_FILES} ${IPP_FILES}) add_library(ArduinoJson ${CPP_FILES} ${HPP_FILES} ${IPP_FILES})
target_include_directories(ArduinoJson INTERFACE ${CMAKE_CURRENT_LIST_DIR}/../include)

View File

@ -16,6 +16,29 @@ using namespace ArduinoJson::Internals;
namespace ArduinoJson { namespace ArduinoJson {
template <typename TFloat>
static TFloat parse(const char *);
template <>
float parse<float>(const char *s) {
return static_cast<float>(strtod(s, NULL));
}
template <>
double parse<double>(const char *s) {
return strtod(s, NULL);
}
template <>
long parse<long>(const char *s) {
return strtol(s, NULL, 10);
}
template <>
int parse<int>(const char *s) {
return atoi(s);
}
template <> template <>
const char *JsonVariant::as<const char *>() const { const char *JsonVariant::as<const char *>() const {
if (_type == JSON_UNPARSED && _content.asString && if (_type == JSON_UNPARSED && _content.asString &&
@ -25,29 +48,27 @@ const char *JsonVariant::as<const char *>() const {
return NULL; return NULL;
} }
template <> JsonFloat JsonVariant::asFloat() const {
double JsonVariant::as<double>() const { if (_type >= JSON_FLOAT_0_DECIMALS) return _content.asFloat;
if (_type >= JSON_DOUBLE_0_DECIMALS) return _content.asDouble;
if (_type == JSON_LONG || _type == JSON_BOOLEAN) if (_type == JSON_INTEGER || _type == JSON_BOOLEAN)
return static_cast<double>(_content.asLong); return static_cast<JsonFloat>(_content.asInteger);
if ((_type == JSON_STRING || _type == JSON_UNPARSED) && _content.asString) if ((_type == JSON_STRING || _type == JSON_UNPARSED) && _content.asString)
return strtod(_content.asString, NULL); return parse<JsonFloat>(_content.asString);
return 0.0; return 0.0;
} }
template <> JsonInteger JsonVariant::asInteger() const {
long JsonVariant::as<long>() const { if (_type == JSON_INTEGER || _type == JSON_BOOLEAN) return _content.asInteger;
if (_type == JSON_LONG || _type == JSON_BOOLEAN) return _content.asLong;
if (_type >= JSON_DOUBLE_0_DECIMALS) if (_type >= JSON_FLOAT_0_DECIMALS)
return static_cast<long>(_content.asDouble); return static_cast<JsonInteger>(_content.asFloat);
if ((_type == JSON_STRING || _type == JSON_UNPARSED) && _content.asString) { if ((_type == JSON_STRING || _type == JSON_UNPARSED) && _content.asString) {
if (!strcmp("true", _content.asString)) return 1; if (!strcmp("true", _content.asString)) return 1;
return strtol(_content.asString, NULL, 10); return parse<JsonInteger>(_content.asString);
} }
return 0L; return 0L;
@ -55,26 +76,18 @@ long JsonVariant::as<long>() const {
template <> template <>
String JsonVariant::as<String>() const { String JsonVariant::as<String>() const {
String s;
if ((_type == JSON_STRING || _type == JSON_UNPARSED) && if ((_type == JSON_STRING || _type == JSON_UNPARSED) &&
_content.asString != NULL) _content.asString != NULL)
return String(_content.asString); s = _content.asString;
else
if (_type == JSON_LONG || _type == JSON_BOOLEAN) printTo(s);
return String(_content.asLong);
if (_type >= JSON_DOUBLE_0_DECIMALS) {
uint8_t decimals = static_cast<uint8_t>(_type - JSON_DOUBLE_0_DECIMALS);
return String(_content.asDouble, decimals);
}
String s;
printTo(s);
return s; return s;
} }
template <> template <>
bool JsonVariant::is<signed long>() const { bool JsonVariant::is<signed long>() const {
if (_type == JSON_LONG) return true; if (_type == JSON_INTEGER) return true;
if (_type != JSON_UNPARSED || _content.asString == NULL) return false; if (_type != JSON_UNPARSED || _content.asString == NULL) return false;
@ -87,7 +100,7 @@ bool JsonVariant::is<signed long>() const {
template <> template <>
bool JsonVariant::is<double>() const { bool JsonVariant::is<double>() const {
if (_type >= JSON_DOUBLE_0_DECIMALS) return true; if (_type >= JSON_FLOAT_0_DECIMALS) return true;
if (_type != JSON_UNPARSED || _content.asString == NULL) return false; if (_type != JSON_UNPARSED || _content.asString == NULL) return false;
@ -111,15 +124,15 @@ void JsonVariant::writeTo(JsonWriter &writer) const {
else if (_type == JSON_UNPARSED) else if (_type == JSON_UNPARSED)
writer.writeRaw(_content.asString); writer.writeRaw(_content.asString);
else if (_type == JSON_LONG) else if (_type == JSON_INTEGER)
writer.writeLong(_content.asLong); writer.writeInteger(_content.asInteger);
else if (_type == JSON_BOOLEAN) else if (_type == JSON_BOOLEAN)
writer.writeBoolean(_content.asLong != 0); writer.writeBoolean(_content.asInteger != 0);
else if (_type >= JSON_DOUBLE_0_DECIMALS) { else if (_type >= JSON_FLOAT_0_DECIMALS) {
uint8_t decimals = static_cast<uint8_t>(_type - JSON_DOUBLE_0_DECIMALS); uint8_t decimals = static_cast<uint8_t>(_type - JSON_FLOAT_0_DECIMALS);
writer.writeDouble(_content.asDouble, decimals); writer.writeFloat(_content.asFloat, decimals);
} }
} }
} }

View File

@ -71,6 +71,26 @@ TEST_F(ArduinoStringTests, JsonObject_SetKeyValue) {
ASSERT_STREQ("world", object["hello"]); ASSERT_STREQ("world", object["hello"]);
} }
TEST_F(ArduinoStringTests, JsonObject_SetToArraySubscript) {
JsonArray &arr = _jsonBuffer.createArray();
arr.add("world");
JsonObject &object = _jsonBuffer.createObject();
object.set(String("hello"), arr[0]);
ASSERT_STREQ("world", object["hello"]);
}
TEST_F(ArduinoStringTests, JsonObject_SetToObjectSubscript) {
JsonObject &arr = _jsonBuffer.createObject();
arr.set("x", "world");
JsonObject &object = _jsonBuffer.createObject();
object.set(String("hello"), arr["x"]);
ASSERT_STREQ("world", object["hello"]);
}
TEST_F(ArduinoStringTests, JsonObject_Get) { TEST_F(ArduinoStringTests, JsonObject_Get) {
char json[] = "{\"key\":\"value\"}"; char json[] = "{\"key\":\"value\"}";
const JsonObject &object = _jsonBuffer.parseObject(json); const JsonObject &object = _jsonBuffer.parseObject(json);

View File

@ -1,10 +1,8 @@
set(GTEST_DIR ../third-party/gtest-1.7.0) set(GTEST_DIR ../third-party/gtest-1.7.0)
file(GLOB_RECURSE INC_FILES ../include/*.h)
file(GLOB TESTS_FILES *.hpp *.cpp) file(GLOB TESTS_FILES *.hpp *.cpp)
include_directories( include_directories(
../include
${GTEST_DIR} ${GTEST_DIR}
${GTEST_DIR}/include) ${GTEST_DIR}/include)
@ -17,7 +15,6 @@ endif()
add_executable(ArduinoJsonTests add_executable(ArduinoJsonTests
${TESTS_FILES} ${TESTS_FILES}
${INC_FILES}
${GTEST_DIR}/src/gtest-all.cc ${GTEST_DIR}/src/gtest-all.cc
${GTEST_DIR}/src/gtest_main.cc) ${GTEST_DIR}/src/gtest_main.cc)

View File

@ -22,9 +22,9 @@ TEST_F(DynamicJsonBuffer_Basic_Tests, InitialSizeIsZero) {
TEST_F(DynamicJsonBuffer_Basic_Tests, SizeIncreasesAfterAlloc) { TEST_F(DynamicJsonBuffer_Basic_Tests, SizeIncreasesAfterAlloc) {
buffer.alloc(1); buffer.alloc(1);
ASSERT_LE(1, buffer.size()); ASSERT_LE(1U, buffer.size());
buffer.alloc(1); buffer.alloc(1);
ASSERT_LE(2, buffer.size()); ASSERT_LE(2U, buffer.size());
} }
TEST_F(DynamicJsonBuffer_Basic_Tests, ReturnDifferentPointer) { TEST_F(DynamicJsonBuffer_Basic_Tests, ReturnDifferentPointer) {

View File

@ -7,17 +7,22 @@
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <ArduinoJson.h> #include <ArduinoJson.h>
class DynamicJsonBuffer_NoMemory_Tests : public ::testing::Test { class NoMemoryAllocator {
class NoMemoryAllocator { public:
public: void* allocate(size_t) { return NULL; }
void* allocate(size_t) { return NULL; } void deallocate(void*) {}
void deallocate(void*) {} };
};
class DynamicJsonBuffer_NoMemory_Tests : public ::testing::Test {
protected: protected:
Internals::BlockJsonBuffer<NoMemoryAllocator> _jsonBuffer; Internals::BlockJsonBuffer<NoMemoryAllocator> _jsonBuffer;
}; };
TEST_F(DynamicJsonBuffer_NoMemory_Tests, FixCodeCoverage) {
// call this function to fix code coverage
NoMemoryAllocator().deallocate(NULL);
}
TEST_F(DynamicJsonBuffer_NoMemory_Tests, CreateArray) { TEST_F(DynamicJsonBuffer_NoMemory_Tests, CreateArray) {
ASSERT_FALSE(_jsonBuffer.createArray().success()); ASSERT_FALSE(_jsonBuffer.createArray().success());
} }

View File

@ -0,0 +1,90 @@
// Copyright Benoit Blanchon 2014-2015
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson
#include <gtest/gtest.h>
#define ARDUINOJSON_ENABLE_STD_STREAM
#include <ArduinoJson.h>
class JsonArray_Add_Tests : public ::testing::Test {
protected:
JsonArray_Add_Tests() : _array(_jsonBuffer.createArray()) {}
DynamicJsonBuffer _jsonBuffer;
JsonArray& _array;
};
#define TEST_(name) TEST_F(JsonArray_Add_Tests, name)
TEST_(SizeIncreased_WhenValuesAreAdded) {
_array.add("hello");
EXPECT_EQ(1U, _array.size());
}
TEST_(StoreInteger) {
_array.add(123);
EXPECT_EQ(123, _array[0].as<int>());
EXPECT_TRUE(_array[0].is<int>());
EXPECT_FALSE(_array[0].is<double>());
}
TEST_(StoreDouble) {
_array.add(123.45);
EXPECT_EQ(123.45, _array[0].as<double>());
EXPECT_TRUE(_array[0].is<double>());
EXPECT_FALSE(_array[0].is<int>());
}
TEST_(StoreBoolean) {
_array.add(true);
EXPECT_EQ(true, _array[0].as<bool>());
EXPECT_TRUE(_array[0].is<bool>());
EXPECT_FALSE(_array[0].is<int>());
}
TEST_(StoreString) {
_array.add("hello");
EXPECT_STREQ("hello", _array[0].as<const char*>());
EXPECT_TRUE(_array[0].is<const char*>());
EXPECT_FALSE(_array[0].is<int>());
}
TEST_(StoreNestedArray) {
JsonArray& arr = _jsonBuffer.createArray();
_array.add(arr);
EXPECT_EQ(&arr, &_array[0].as<JsonArray&>());
EXPECT_TRUE(_array[0].is<JsonArray&>());
EXPECT_FALSE(_array[0].is<int>());
}
TEST_(StoreNestedObject) {
JsonObject& obj = _jsonBuffer.createObject();
_array.add(obj);
EXPECT_EQ(&obj, &_array[0].as<JsonObject&>());
EXPECT_TRUE(_array[0].is<JsonObject&>());
EXPECT_FALSE(_array[0].is<int>());
}
TEST_(StoreArraySubscript) {
JsonArray& arr = _jsonBuffer.createArray();
arr.add("hello");
_array.add(arr[0]);
EXPECT_STREQ("hello", _array[0]);
}
TEST_(StoreObjectSubscript) {
JsonObject& obj = _jsonBuffer.createObject();
obj["x"] = "hello";
_array.add(obj["x"]);
EXPECT_STREQ("hello", _array[0]);
}

View File

@ -0,0 +1,41 @@
// Copyright Benoit Blanchon 2014-2015
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson
#include <gtest/gtest.h>
#define ARDUINOJSON_ENABLE_STD_STREAM
#include <ArduinoJson.h>
#define TEST_(name) TEST(JsonArray_Basic_Tests, name)
TEST_(SuccessIsTrue) {
DynamicJsonBuffer _jsonBuffer;
JsonArray& array = _jsonBuffer.createArray();
EXPECT_TRUE(array.success());
}
TEST_(InitialSizeIsZero) {
DynamicJsonBuffer _jsonBuffer;
JsonArray& array = _jsonBuffer.createArray();
EXPECT_EQ(0U, array.size());
}
TEST_(CreateNestedArray) {
DynamicJsonBuffer _jsonBuffer;
JsonArray& array = _jsonBuffer.createArray();
JsonArray& arr = array.createNestedArray();
EXPECT_EQ(&arr, &array[0].as<JsonArray&>());
}
TEST_(CreateNestedObject) {
DynamicJsonBuffer _jsonBuffer;
JsonArray& array = _jsonBuffer.createArray();
JsonObject& obj = array.createNestedObject();
EXPECT_EQ(&obj, &array[0].as<JsonObject&>());
}

View File

@ -1,182 +0,0 @@
// Copyright Benoit Blanchon 2014-2015
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson
#include <gtest/gtest.h>
#include <ArduinoJson.h>
class JsonArray_Container_Tests : public ::testing::Test {
protected:
JsonArray_Container_Tests() : _array(_jsonBuffer.createArray()) {}
template <typename T>
void firstMustEqual(T expected) {
itemMustEqual(0, expected);
}
template <typename T>
void secondMustEqual(T expected) {
itemMustEqual(1, expected);
}
template <typename T>
void firstMustReference(const T& expected) {
itemMustReference(0, expected);
}
template <typename T>
void secondMustReference(const T& expected) {
itemMustReference(1, expected);
}
void sizeMustBe(int expected) { EXPECT_EQ(expected, _array.size()); }
DynamicJsonBuffer _jsonBuffer;
JsonArray& _array;
private:
template <typename T>
void itemMustEqual(int index, T expected) {
EXPECT_TRUE(_array[index].is<T>());
EXPECT_EQ(expected, _array[index].as<T>());
}
template <typename T>
void itemMustReference(int index, const T& expected) {
EXPECT_TRUE(_array[index].is<T&>());
EXPECT_EQ(&expected, &_array[index].as<T&>());
}
};
template <>
void JsonArray_Container_Tests::itemMustEqual(int index, const char* expected) {
EXPECT_STREQ(expected, _array[index].asString());
}
TEST_F(JsonArray_Container_Tests, SuccessIsTrue) {
EXPECT_TRUE(_array.success());
}
TEST_F(JsonArray_Container_Tests, InitialSizeIsZero) { sizeMustBe(0); }
TEST_F(JsonArray_Container_Tests, Grow_WhenValuesAreAdded) {
_array.add("hello");
sizeMustBe(1);
_array.add("world");
sizeMustBe(2);
}
TEST_F(JsonArray_Container_Tests, DontGrow_WhenValuesAreReplaced) {
_array.add("hello");
_array[0] = "world";
sizeMustBe(1);
}
TEST_F(JsonArray_Container_Tests, CanStoreIntegers) {
_array.add(123);
_array.add(456);
firstMustEqual(123);
secondMustEqual(456);
}
TEST_F(JsonArray_Container_Tests, CanStoreDoubles) {
_array.add(123.45);
_array.add(456.78);
firstMustEqual(123.45);
secondMustEqual(456.78);
}
TEST_F(JsonArray_Container_Tests, CanStoreBooleans) {
_array.add(true);
_array.add(false);
firstMustEqual(true);
secondMustEqual(false);
}
TEST_F(JsonArray_Container_Tests, CanStoreStrings) {
_array.add("hello");
_array.add("world");
firstMustEqual("hello");
secondMustEqual("world");
}
TEST_F(JsonArray_Container_Tests, CanStoreNestedArrays) {
JsonArray& inner_array1 = _jsonBuffer.createArray();
JsonArray& inner_array2 = _jsonBuffer.createArray();
_array.add(inner_array1);
_array.add(inner_array2);
firstMustReference(inner_array1);
secondMustReference(inner_array2);
}
TEST_F(JsonArray_Container_Tests, CanStoreNestedObjects) {
JsonObject& innerObject1 = _jsonBuffer.createObject();
JsonObject& innerObject2 = _jsonBuffer.createObject();
_array.add(innerObject1);
_array.add(innerObject2);
firstMustReference(innerObject1);
secondMustReference(innerObject2);
}
TEST_F(JsonArray_Container_Tests, CanCreateNestedArrays) {
JsonArray& inner_array1 = _array.createNestedArray();
JsonArray& inner_array2 = _array.createNestedArray();
firstMustReference(inner_array1);
secondMustReference(inner_array2);
}
TEST_F(JsonArray_Container_Tests, CanCreateNestedObjects) {
JsonObject& innerObject1 = _array.createNestedObject();
JsonObject& innerObject2 = _array.createNestedObject();
firstMustReference(innerObject1);
secondMustReference(innerObject2);
}
TEST_F(JsonArray_Container_Tests, RemoveFirstElement) {
_array.add("one");
_array.add("two");
_array.add("three");
_array.removeAt(0);
sizeMustBe(2);
firstMustEqual("two");
secondMustEqual("three");
}
TEST_F(JsonArray_Container_Tests, RemoveMiddleElement) {
_array.add("one");
_array.add("two");
_array.add("three");
_array.removeAt(1);
sizeMustBe(2);
firstMustEqual("one");
secondMustEqual("three");
}
TEST_F(JsonArray_Container_Tests, RemoveLastElement) {
_array.add("one");
_array.add("two");
_array.add("three");
_array.removeAt(2);
sizeMustBe(2);
firstMustEqual("one");
secondMustEqual("two");
}

View File

@ -0,0 +1,46 @@
// Copyright Benoit Blanchon 2014-2015
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson
#include <gtest/gtest.h>
#include <ArduinoJson.h>
class JsonArray_Remove_Tests : public ::testing::Test {
protected:
JsonArray_Remove_Tests() : _array(_jsonBuffer.createArray()) {
_array.add("one");
_array.add("two");
_array.add("three");
}
DynamicJsonBuffer _jsonBuffer;
JsonArray& _array;
};
#define TEST_(name) TEST_F(JsonArray_Remove_Tests, name)
TEST_(RemoveFirstElement) {
_array.removeAt(0);
EXPECT_EQ(2, _array.size());
EXPECT_STREQ("two", _array[0]);
EXPECT_STREQ("three", _array[1]);
}
TEST_(RemoveMiddleElement) {
_array.removeAt(1);
EXPECT_EQ(2, _array.size());
EXPECT_STREQ("one", _array[0]);
EXPECT_STREQ("three", _array[1]);
}
TEST_(RemoveLastElement) {
_array.removeAt(2);
EXPECT_EQ(2, _array.size());
EXPECT_STREQ("one", _array[0]);
EXPECT_STREQ("two", _array[1]);
}

View File

@ -0,0 +1,90 @@
// Copyright Benoit Blanchon 2014-2015
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson
#include <gtest/gtest.h>
#define ARDUINOJSON_ENABLE_STD_STREAM
#include <ArduinoJson.h>
class JsonArray_Set_Tests : public ::testing::Test {
protected:
JsonArray_Set_Tests() : _array(_jsonBuffer.createArray()) { _array.add(0); }
DynamicJsonBuffer _jsonBuffer;
JsonArray& _array;
};
#define TEST_(name) TEST_F(JsonArray_Set_Tests, name)
TEST_(SizeIsUnchanged) {
_array.set(0, "hello");
EXPECT_EQ(1U, _array.size());
}
TEST_(StoreInteger) {
_array.set(0, 123);
EXPECT_EQ(123, _array[0].as<int>());
EXPECT_TRUE(_array[0].is<int>());
EXPECT_FALSE(_array[0].is<double>());
}
TEST_(StoreDouble) {
_array.set(0, 123.45);
EXPECT_EQ(123.45, _array[0].as<double>());
EXPECT_TRUE(_array[0].is<double>());
EXPECT_FALSE(_array[0].is<int>());
}
TEST_(StoreBoolean) {
_array.set(0, true);
EXPECT_EQ(true, _array[0].as<bool>());
EXPECT_TRUE(_array[0].is<bool>());
EXPECT_FALSE(_array[0].is<int>());
}
TEST_(StoreString) {
_array.set(0, "hello");
EXPECT_STREQ("hello", _array[0].as<const char*>());
EXPECT_TRUE(_array[0].is<const char*>());
EXPECT_FALSE(_array[0].is<int>());
}
TEST_(StoreNestedArray) {
JsonArray& arr = _jsonBuffer.createArray();
_array.set(0, arr);
EXPECT_EQ(&arr, &_array[0].as<JsonArray&>());
EXPECT_TRUE(_array[0].is<JsonArray&>());
EXPECT_FALSE(_array[0].is<int>());
}
TEST_(StoreNestedObject) {
JsonObject& obj = _jsonBuffer.createObject();
_array.set(0, obj);
EXPECT_EQ(&obj, &_array[0].as<JsonObject&>());
EXPECT_TRUE(_array[0].is<JsonObject&>());
EXPECT_FALSE(_array[0].is<int>());
}
TEST_(StoreArraySubscript) {
JsonArray& arr = _jsonBuffer.createArray();
arr.add("hello");
_array.set(0, arr[0]);
EXPECT_STREQ("hello", _array[0]);
}
TEST_(StoreObjectSubscript) {
JsonObject& obj = _jsonBuffer.createObject();
obj["x"] = "hello";
_array.set(0, obj["x"]);
EXPECT_STREQ("hello", _array[0]);
}

View File

@ -0,0 +1,92 @@
// Copyright Benoit Blanchon 2014-2015
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson
#include <gtest/gtest.h>
#define ARDUINOJSON_ENABLE_STD_STREAM
#include <ArduinoJson.h>
class JsonArray_Subscript_Tests : public ::testing::Test {
protected:
JsonArray_Subscript_Tests() : _array(_jsonBuffer.createArray()) {
_array.add(0);
}
DynamicJsonBuffer _jsonBuffer;
JsonArray& _array;
};
#define TEST_(name) TEST_F(JsonArray_Subscript_Tests, name)
TEST_(SizeIsUnchanged) {
_array[0] = "hello";
EXPECT_EQ(1U, _array.size());
}
TEST_(StoreInteger) {
_array[0] = 123;
EXPECT_EQ(123, _array[0].as<int>());
EXPECT_TRUE(_array[0].is<int>());
EXPECT_FALSE(_array[0].is<double>());
}
TEST_(StoreDouble) {
_array[0] = 123.45;
EXPECT_EQ(123.45, _array[0].as<double>());
EXPECT_TRUE(_array[0].is<double>());
EXPECT_FALSE(_array[0].is<int>());
}
TEST_(StoreBoolean) {
_array[0] = true;
EXPECT_EQ(true, _array[0].as<bool>());
EXPECT_TRUE(_array[0].is<bool>());
EXPECT_FALSE(_array[0].is<int>());
}
TEST_(StoreString) {
_array[0] = "hello";
EXPECT_STREQ("hello", _array[0].as<const char*>());
EXPECT_TRUE(_array[0].is<const char*>());
EXPECT_FALSE(_array[0].is<int>());
}
TEST_(StoreNestedArray) {
JsonArray& arr = _jsonBuffer.createArray();
_array[0] = arr;
EXPECT_EQ(&arr, &_array[0].as<JsonArray&>());
EXPECT_TRUE(_array[0].is<JsonArray&>());
EXPECT_FALSE(_array[0].is<int>());
}
TEST_(StoreNestedObject) {
JsonObject& obj = _jsonBuffer.createObject();
_array[0] = obj;
EXPECT_EQ(&obj, &_array[0].as<JsonObject&>());
EXPECT_TRUE(_array[0].is<JsonObject&>());
EXPECT_FALSE(_array[0].is<int>());
}
TEST_(StoreArraySubscript) {
JsonArray& arr = _jsonBuffer.createArray();
arr.add("hello");
_array[0] = arr[0];
EXPECT_STREQ("hello", _array[0]);
}
TEST_(StoreObjectSubscript) {
JsonObject& obj = _jsonBuffer.createObject();
obj["x"] = "hello";
_array[0] = obj["x"];
EXPECT_STREQ("hello", _array[0]);
}

View File

@ -0,0 +1,24 @@
// Copyright Benoit Blanchon 2014-2015
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson
#include <gtest/gtest.h>
#include <ArduinoJson.h>
#define TEST_(name) TEST(JsonObject_Basic_Tests, name)
TEST_(InitialSizeIsZero) {
DynamicJsonBuffer _jsonBuffer;
JsonObject& _object = _jsonBuffer.createObject();
EXPECT_EQ(0, _object.size());
}
TEST_(SuccessIsTrue) {
DynamicJsonBuffer _jsonBuffer;
JsonObject& _object = _jsonBuffer.createObject();
EXPECT_TRUE(_object.success());
}

View File

@ -1,133 +0,0 @@
// Copyright Benoit Blanchon 2014-2015
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson
#include <gtest/gtest.h>
#include <ArduinoJson.h>
class JsonObject_Container_Tests : public ::testing::Test {
public:
JsonObject_Container_Tests() : _object(_jsonBuffer.createObject()) {}
protected:
DynamicJsonBuffer _jsonBuffer;
JsonObject& _object;
};
TEST_F(JsonObject_Container_Tests, InitialSizeIsZero) {
EXPECT_EQ(0, _object.size());
}
TEST_F(JsonObject_Container_Tests, Grow_WhenValuesAreAdded) {
_object["hello"] = 1;
EXPECT_EQ(1, _object.size());
_object.set("world", 2);
EXPECT_EQ(2, _object.size());
}
TEST_F(JsonObject_Container_Tests, DoNotGrow_WhenSameValueIsAdded) {
_object["hello"] = 1;
EXPECT_EQ(1, _object.size());
_object["hello"] = 2;
EXPECT_EQ(1, _object.size());
}
TEST_F(JsonObject_Container_Tests, Shrink_WhenValuesAreRemoved) {
_object["hello"] = 1;
_object["world"] = 2;
_object.remove("hello");
EXPECT_EQ(1, _object.size());
_object.remove("world");
EXPECT_EQ(0, _object.size());
}
TEST_F(JsonObject_Container_Tests,
DoNotShrink_WhenRemoveIsCalledWithAWrongKey) {
_object["hello"] = 1;
_object["world"] = 2;
_object.remove(":-P");
EXPECT_EQ(2, _object.size());
}
TEST_F(JsonObject_Container_Tests, CanStoreIntegers) {
_object["hello"] = 123;
_object.set("world", 456);
EXPECT_TRUE(_object["hello"].is<int>());
EXPECT_FALSE(_object["hello"].is<double>());
EXPECT_EQ(123, _object["hello"].as<int>());
EXPECT_EQ(456, _object["world"].as<int>());
}
TEST_F(JsonObject_Container_Tests, CanStoreDoubles) {
_object["hello"] = 123.45;
_object.set("world", 456.78);
EXPECT_TRUE(_object["hello"].is<double>());
EXPECT_FALSE(_object["hello"].is<long>());
EXPECT_EQ(123.45, _object["hello"].as<double>());
EXPECT_EQ(456.78, _object["world"].as<double>());
}
TEST_F(JsonObject_Container_Tests, CanStoreBooleans) {
_object["hello"] = true;
_object.set("world", false);
EXPECT_TRUE(_object["hello"].is<bool>());
EXPECT_FALSE(_object["hello"].is<long>());
EXPECT_TRUE(_object["hello"].as<bool>());
EXPECT_FALSE(_object["world"].as<bool>());
}
TEST_F(JsonObject_Container_Tests, CanStoreStrings) {
_object["hello"] = "h3110";
_object.set("world", "w0r1d");
EXPECT_TRUE(_object["hello"].is<const char*>());
EXPECT_FALSE(_object["hello"].is<long>());
EXPECT_STREQ("h3110", _object["hello"].as<const char*>());
EXPECT_STREQ("w0r1d", _object["world"].as<const char*>());
}
TEST_F(JsonObject_Container_Tests, CanStoreArrays) {
JsonArray& array1 = _jsonBuffer.createArray();
JsonArray& array2 = _jsonBuffer.createArray();
_object["hello"] = array1;
_object.set("world", array2);
EXPECT_TRUE(_object["hello"].is<JsonArray&>());
EXPECT_FALSE(_object["hello"].is<JsonObject&>());
EXPECT_EQ(&array1, &_object["hello"].asArray());
EXPECT_EQ(&array2, &_object["world"].asArray());
}
TEST_F(JsonObject_Container_Tests, CanStoreObjects) {
JsonObject& object1 = _jsonBuffer.createObject();
JsonObject& object2 = _jsonBuffer.createObject();
_object["hello"] = object1;
_object.set("world", object2);
EXPECT_TRUE(_object["hello"].is<JsonObject&>());
EXPECT_FALSE(_object["hello"].is<JsonArray&>());
EXPECT_EQ(&object1, &_object["hello"].asObject());
EXPECT_EQ(&object2, &_object["world"].asObject());
}
TEST_F(JsonObject_Container_Tests, ContainsKeyReturnsFalseForNonExistingKey) {
EXPECT_FALSE(_object.containsKey("hello"));
}
TEST_F(JsonObject_Container_Tests, ContainsKeyReturnsTrueForDefinedValue) {
_object.set("hello", 42);
EXPECT_TRUE(_object.containsKey("hello"));
}

View File

@ -0,0 +1,38 @@
// Copyright Benoit Blanchon 2014-2015
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson
#include <gtest/gtest.h>
#include <ArduinoJson.h>
#define TEST_(name) TEST(JsonObject_Basic_Tests, name)
TEST_(ContainsKeyReturnsFalseForNonExistingKey) {
DynamicJsonBuffer _jsonBuffer;
JsonObject& _object = _jsonBuffer.createObject();
_object.set("hello", 42);
EXPECT_FALSE(_object.containsKey("world"));
}
TEST_(ContainsKeyReturnsTrueForDefinedValue) {
DynamicJsonBuffer _jsonBuffer;
JsonObject& _object = _jsonBuffer.createObject();
_object.set("hello", 42);
EXPECT_TRUE(_object.containsKey("hello"));
}
TEST_(ContainsKeyReturnsFalseAfterRemove) {
DynamicJsonBuffer _jsonBuffer;
JsonObject& _object = _jsonBuffer.createObject();
_object.set("hello", 42);
_object.remove("hello");
EXPECT_FALSE(_object.containsKey("hello"));
}

View File

@ -0,0 +1,30 @@
// Copyright Benoit Blanchon 2014-2015
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson
#include <gtest/gtest.h>
#include <ArduinoJson.h>
#define TEST_(name) TEST(JsonObject_Remove_Tests, name)
TEST_(SizeDecreased_WhenValuesAreRemoved) {
DynamicJsonBuffer _jsonBuffer;
JsonObject& _object = _jsonBuffer.createObject();
_object["hello"] = 1;
_object.remove("hello");
EXPECT_EQ(0, _object.size());
}
TEST_(SizeUntouched_WhenRemoveIsCalledWithAWrongKey) {
DynamicJsonBuffer _jsonBuffer;
JsonObject& _object = _jsonBuffer.createObject();
_object["hello"] = 1;
_object.remove("world");
EXPECT_EQ(1, _object.size());
}

View File

@ -0,0 +1,109 @@
// Copyright Benoit Blanchon 2014-2015
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson
#include <gtest/gtest.h>
#define ARDUINOJSON_ENABLE_STD_STREAM
#include <ArduinoJson.h>
class JsonObject_Set_Tests : public ::testing::Test {
public:
JsonObject_Set_Tests() : _object(_jsonBuffer.createObject()) {}
protected:
DynamicJsonBuffer _jsonBuffer;
JsonObject& _object;
};
#define TEST_(name) TEST_F(JsonObject_Set_Tests, name)
TEST_(SizeIncreased_WhenValuesAreAdded) {
_object.set("hello", 42);
EXPECT_EQ(1, _object.size());
}
TEST_(SizeUntouched_WhenSameValueIsAdded) {
_object["hello"] = 1;
_object["hello"] = 2;
EXPECT_EQ(1, _object.size());
}
TEST_(StoreInteger) {
_object.set("hello", 123);
EXPECT_EQ(123, _object["hello"].as<int>());
EXPECT_TRUE(_object["hello"].is<int>());
EXPECT_FALSE(_object["hello"].is<double>());
}
TEST_(StoreDouble) {
_object.set("hello", 123.45);
EXPECT_EQ(123.45, _object["hello"].as<double>());
EXPECT_TRUE(_object["hello"].is<double>());
EXPECT_FALSE(_object["hello"].is<long>());
}
TEST_(StoreDoubleWithDigits) {
_object.set("hello", 123.45, 2);
EXPECT_EQ(123.45, _object["hello"].as<double>());
EXPECT_TRUE(_object["hello"].is<double>());
EXPECT_FALSE(_object["hello"].is<long>());
}
TEST_(StoreBoolean) {
_object.set("hello", true);
EXPECT_TRUE(_object["hello"].as<bool>());
EXPECT_TRUE(_object["hello"].is<bool>());
EXPECT_FALSE(_object["hello"].is<long>());
}
TEST_(StoreString) {
_object.set("hello", "h3110");
EXPECT_STREQ("h3110", _object["hello"].as<const char*>());
EXPECT_TRUE(_object["hello"].is<const char*>());
EXPECT_FALSE(_object["hello"].is<long>());
}
TEST_(StoreArray) {
JsonArray& arr = _jsonBuffer.createArray();
_object.set("hello", arr);
EXPECT_EQ(&arr, &_object["hello"].asArray());
EXPECT_TRUE(_object["hello"].is<JsonArray&>());
EXPECT_FALSE(_object["hello"].is<JsonObject&>());
}
TEST_(StoreObject) {
JsonObject& obj = _jsonBuffer.createObject();
_object.set("hello", obj);
EXPECT_EQ(&obj, &_object["hello"].asObject());
EXPECT_TRUE(_object["hello"].is<JsonObject&>());
EXPECT_FALSE(_object["hello"].is<JsonArray&>());
}
TEST_(StoreArraySubscript) {
JsonArray& arr = _jsonBuffer.createArray();
arr.add(42);
_object.set("a", arr[0]);
EXPECT_EQ(42, _object["a"]);
}
TEST_(StoreObjectSubscript) {
JsonObject& obj = _jsonBuffer.createObject();
obj.set("x", 42);
_object.set("a", obj["x"]);
EXPECT_EQ(42, _object["a"]);
}

View File

@ -0,0 +1,109 @@
// Copyright Benoit Blanchon 2014-2015
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson
#include <gtest/gtest.h>
#define ARDUINOJSON_ENABLE_STD_STREAM
#include <ArduinoJson.h>
class JsonObject_Subscript_Tests : public ::testing::Test {
public:
JsonObject_Subscript_Tests() : _object(_jsonBuffer.createObject()) {}
protected:
DynamicJsonBuffer _jsonBuffer;
JsonObject& _object;
};
#define TEST_(name) TEST_F(JsonObject_Subscript_Tests, name)
TEST_(SizeIncreased_WhenValuesAreAdded) {
_object["hello"] = 1;
EXPECT_EQ(1, _object.size());
}
TEST_(SizeUntouched_WhenSameValueIsAdded) {
_object["hello"] = 1;
_object["hello"] = 2;
EXPECT_EQ(1, _object.size());
}
TEST_(StoreInteger) {
_object["hello"] = 123;
EXPECT_EQ(123, _object["hello"].as<int>());
EXPECT_TRUE(_object["hello"].is<int>());
EXPECT_FALSE(_object["hello"].is<double>());
}
TEST_(StoreDouble) {
_object["hello"] = 123.45;
EXPECT_TRUE(_object["hello"].is<double>());
EXPECT_FALSE(_object["hello"].is<long>());
EXPECT_EQ(123.45, _object["hello"].as<double>());
}
TEST_(StoreDoubleWithDigits) {
_object["hello"].set(123.45, 2);
EXPECT_TRUE(_object["hello"].is<double>());
EXPECT_FALSE(_object["hello"].is<long>());
EXPECT_EQ(123.45, _object["hello"].as<double>());
}
TEST_(StoreBoolean) {
_object["hello"] = true;
EXPECT_TRUE(_object["hello"].is<bool>());
EXPECT_FALSE(_object["hello"].is<long>());
EXPECT_TRUE(_object["hello"].as<bool>());
}
TEST_(StoreString) {
_object["hello"] = "h3110";
EXPECT_TRUE(_object["hello"].is<const char*>());
EXPECT_FALSE(_object["hello"].is<long>());
EXPECT_STREQ("h3110", _object["hello"].as<const char*>());
}
TEST_(StoreArray) {
JsonArray& arr = _jsonBuffer.createArray();
_object["hello"] = arr;
EXPECT_EQ(&arr, &_object["hello"].asArray());
EXPECT_TRUE(_object["hello"].is<JsonArray&>());
EXPECT_FALSE(_object["hello"].is<JsonObject&>());
}
TEST_(StoreObject) {
JsonObject& obj = _jsonBuffer.createObject();
_object["hello"] = obj;
EXPECT_EQ(&obj, &_object["hello"].asObject());
EXPECT_TRUE(_object["hello"].is<JsonObject&>());
EXPECT_FALSE(_object["hello"].is<JsonArray&>());
}
TEST_(StoreArraySubscript) {
JsonArray& arr = _jsonBuffer.createArray();
arr.add(42);
_object["a"] = arr[0];
EXPECT_EQ(42, _object["a"]);
}
TEST_(StoreObjectSubscript) {
JsonObject& obj = _jsonBuffer.createObject();
obj.set("x", 42);
_object["a"] = obj["x"];
EXPECT_EQ(42, _object["a"]);
}

View File

@ -57,7 +57,7 @@ TEST(JsonVariant_As_Tests, FalseAsLong) {
TEST(JsonVariant_As_Tests, FalseAsString) { TEST(JsonVariant_As_Tests, FalseAsString) {
JsonVariant variant = false; JsonVariant variant = false;
ASSERT_EQ(String("0"), variant.as<String>()); ASSERT_EQ(String("false"), variant.as<String>());
} }
TEST(JsonVariant_As_Tests, TrueAsBool) { TEST(JsonVariant_As_Tests, TrueAsBool) {
@ -77,7 +77,7 @@ TEST(JsonVariant_As_Tests, TrueAsLong) {
TEST(JsonVariant_As_Tests, TrueAsString) { TEST(JsonVariant_As_Tests, TrueAsString) {
JsonVariant variant = true; JsonVariant variant = true;
ASSERT_EQ(String("1"), variant.as<String>()); ASSERT_EQ(String("true"), variant.as<String>());
} }
TEST(JsonVariant_As_Tests, LongAsBool) { TEST(JsonVariant_As_Tests, LongAsBool) {

View File

@ -26,9 +26,9 @@ TEST_F(StaticJsonBuffer_Basic_Tests, InitialSizeIsZero) {
TEST_F(StaticJsonBuffer_Basic_Tests, GrowsAfterAlloc) { TEST_F(StaticJsonBuffer_Basic_Tests, GrowsAfterAlloc) {
buffer.alloc(1); buffer.alloc(1);
ASSERT_LE(1, buffer.size()); ASSERT_LE(1U, buffer.size());
buffer.alloc(1); buffer.alloc(1);
ASSERT_LE(2, buffer.size()); ASSERT_LE(2U, buffer.size());
} }
TEST_F(StaticJsonBuffer_Basic_Tests, DoesntGrowWhenFull) { TEST_F(StaticJsonBuffer_Basic_Tests, DoesntGrowWhenFull) {