mirror of
https://github.com/bblanchon/ArduinoJson.git
synced 2025-07-30 10:47:34 +02:00
Removed duplicate code of v3
This commit is contained in:
@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "EscapedString.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
static inline char getSpecialChar(char c)
|
|
||||||
{
|
|
||||||
// Optimized for code size on a 8-bit AVR
|
|
||||||
|
|
||||||
const char* p = "\"\"\\\\\bb\ff\nn\rr\tt\0";
|
|
||||||
|
|
||||||
while (p[0] && p[0] != c)
|
|
||||||
{
|
|
||||||
p += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
return p[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline size_t printCharTo(char c, Print& p)
|
|
||||||
{
|
|
||||||
char specialChar = getSpecialChar(c);
|
|
||||||
|
|
||||||
return specialChar != 0
|
|
||||||
? p.write('\\') + p.write(specialChar)
|
|
||||||
: p.write(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t EscapedString::printTo(const char* s, Print& p)
|
|
||||||
{
|
|
||||||
if (!s) return p.print("null");
|
|
||||||
|
|
||||||
size_t n = p.write('\"');
|
|
||||||
|
|
||||||
while (*s)
|
|
||||||
{
|
|
||||||
n += printCharTo(*s++, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
return n + p.write('\"');
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Print.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Internals
|
|
||||||
{
|
|
||||||
class EscapedString
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static size_t printTo(const char*, Print&);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,45 +0,0 @@
|
|||||||
#include "IndentedPrint.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
|
|
||||||
void IndentedPrint::indent()
|
|
||||||
{
|
|
||||||
if (level < MAX_LEVEL)
|
|
||||||
level++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void IndentedPrint::unindent()
|
|
||||||
{
|
|
||||||
if (level > 0)
|
|
||||||
level--;
|
|
||||||
}
|
|
||||||
|
|
||||||
void IndentedPrint::setTabSize(uint8_t n)
|
|
||||||
{
|
|
||||||
if (n < MAX_TAB_SIZE)
|
|
||||||
tabSize = n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t IndentedPrint::write(uint8_t c)
|
|
||||||
{
|
|
||||||
size_t n = 0;
|
|
||||||
|
|
||||||
if (isNewLine)
|
|
||||||
n += writeTabs();
|
|
||||||
|
|
||||||
n += sink.write(c);
|
|
||||||
|
|
||||||
isNewLine = c == '\n';
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline size_t IndentedPrint::writeTabs()
|
|
||||||
{
|
|
||||||
size_t n = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < level*tabSize; i++)
|
|
||||||
n += sink.write(' ');
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
@ -1,53 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Print.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Generator
|
|
||||||
{
|
|
||||||
// Decorator on top of Print to allow indented output.
|
|
||||||
// This class is used by JsonPrintable::prettyPrintTo() but can also be used
|
|
||||||
// for your own purpose, like logging.
|
|
||||||
class IndentedPrint : public Print
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
IndentedPrint(Print& p)
|
|
||||||
: sink(p)
|
|
||||||
{
|
|
||||||
level = 0;
|
|
||||||
tabSize = 2;
|
|
||||||
isNewLine = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual size_t write(uint8_t);
|
|
||||||
|
|
||||||
// Adds one level of indentation
|
|
||||||
void indent();
|
|
||||||
|
|
||||||
// Removes one level of indentation
|
|
||||||
void unindent();
|
|
||||||
|
|
||||||
// Set the number of space printed for each level of indentation
|
|
||||||
void setTabSize(uint8_t n);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Print& sink;
|
|
||||||
uint8_t level : 4;
|
|
||||||
uint8_t tabSize : 3;
|
|
||||||
bool isNewLine : 1;
|
|
||||||
|
|
||||||
size_t writeTabs();
|
|
||||||
|
|
||||||
static const int MAX_LEVEL = 15; // because it's only 4 bits
|
|
||||||
static const int MAX_TAB_SIZE = 7; // because it's only 3 bits
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "JsonArrayBase.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Generator
|
|
||||||
{
|
|
||||||
template<int N>
|
|
||||||
class JsonArray : public JsonArrayBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
JsonArray()
|
|
||||||
: JsonArrayBase(items, N)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
JsonValue items[N];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "JsonArrayBase.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
size_t JsonArrayBase::printTo(Print& p) const
|
|
||||||
{
|
|
||||||
size_t n = 0;
|
|
||||||
|
|
||||||
n += p.write('[');
|
|
||||||
|
|
||||||
// NB: the code has been optimized for a small size on a 8-bit AVR
|
|
||||||
|
|
||||||
const JsonValue* current = items;
|
|
||||||
for (int i = count; i > 0; i--)
|
|
||||||
{
|
|
||||||
n += current->printTo(p);
|
|
||||||
current++;
|
|
||||||
|
|
||||||
if (i > 1)
|
|
||||||
{
|
|
||||||
n += p.write(',');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
n += p.write(']');
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
@ -1,79 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "JsonPrintable.h"
|
|
||||||
#include "JsonValue.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Generator
|
|
||||||
{
|
|
||||||
class JsonArrayBase : public JsonPrintable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
JsonArrayBase(JsonValue* items, int capacity)
|
|
||||||
: items(items), capacity(capacity), count(0)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void add(const Printable& value)
|
|
||||||
{
|
|
||||||
addIfPossible<const Printable&>(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void add(bool value)
|
|
||||||
{
|
|
||||||
addIfPossible<bool>(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void add(int value)
|
|
||||||
{
|
|
||||||
addIfPossible<long>(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void add(long value)
|
|
||||||
{
|
|
||||||
addIfPossible<long>(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void add(double value)
|
|
||||||
{
|
|
||||||
addIfPossible<double>(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void add(const char* value)
|
|
||||||
{
|
|
||||||
addIfPossible<const char*>(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<int DIGITS>
|
|
||||||
void add(double value)
|
|
||||||
{
|
|
||||||
if (count >= capacity) return;
|
|
||||||
|
|
||||||
JsonValue& v = items[count++];
|
|
||||||
v.set<DIGITS>(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual size_t printTo(Print& p) const;
|
|
||||||
|
|
||||||
using JsonPrintable::printTo;
|
|
||||||
|
|
||||||
private:
|
|
||||||
JsonValue* items;
|
|
||||||
int capacity, count;
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void addIfPossible(T value)
|
|
||||||
{
|
|
||||||
if (count < capacity)
|
|
||||||
items[count++] = value;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,101 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="EscapedString.h" />
|
|
||||||
<ClInclude Include="IndentedPrint.h" />
|
|
||||||
<ClInclude Include="JsonPrettyPrint.h" />
|
|
||||||
<ClInclude Include="JsonArray.h" />
|
|
||||||
<ClInclude Include="JsonArrayBase.h" />
|
|
||||||
<ClInclude Include="JsonObject.h" />
|
|
||||||
<ClInclude Include="JsonObjectBase.h" />
|
|
||||||
<ClInclude Include="JsonPrintable.h" />
|
|
||||||
<ClInclude Include="JsonValue.h" />
|
|
||||||
<ClInclude Include="Print.h" />
|
|
||||||
<ClInclude Include="Printable.h" />
|
|
||||||
<ClInclude Include="StringBuilder.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="EscapedString.cpp" />
|
|
||||||
<ClCompile Include="IndentedPrint.cpp" />
|
|
||||||
<ClCompile Include="JsonPrettyPrint.cpp" />
|
|
||||||
<ClCompile Include="JsonArrayBase.cpp" />
|
|
||||||
<ClCompile Include="JsonObjectBase.cpp" />
|
|
||||||
<ClCompile Include="JsonPrintable.cpp" />
|
|
||||||
<ClCompile Include="JsonValue.cpp" />
|
|
||||||
<ClCompile Include="Print.cpp" />
|
|
||||||
<ClCompile Include="StringBuilder.cpp" />
|
|
||||||
</ItemGroup>
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{C6536D27-738D-4CEB-A2BC-E13C8897D894}</ProjectGuid>
|
|
||||||
<Keyword>Win32Proj</Keyword>
|
|
||||||
<RootNamespace>JsonGenerator</RootNamespace>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v120</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v120</PlatformToolset>
|
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup />
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<Optimization>Disabled</Optimization>
|
|
||||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<Optimization>MaxSpeed</Optimization>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets">
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
@ -1,84 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Header Files">
|
|
||||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
|
||||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Resource Files">
|
|
||||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
|
||||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="EscapedString.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonArray.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonArrayBase.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonPrintable.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonValue.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="Print.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="Printable.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="StringBuilder.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonObjectBase.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonObject.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="IndentedPrint.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="JsonPrettyPrint.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="EscapedString.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonArrayBase.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonValue.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="StringBuilder.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="Print.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonObjectBase.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="IndentedPrint.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonPrettyPrint.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonPrintable.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
@ -1,44 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "JsonObjectBase.h"
|
|
||||||
|
|
||||||
#ifndef ARDUINO_JSON_NO_DEPRECATION_WARNING
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#define DEPRECATED __attribute__((deprecated))
|
|
||||||
#elif defined(_MSC_VER)
|
|
||||||
#define DEPRECATED __declspec(deprecated)
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define DEPRECATED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Generator
|
|
||||||
{
|
|
||||||
template <int N>
|
|
||||||
class JsonObject : public JsonObjectBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
JsonObject()
|
|
||||||
: JsonObjectBase(items, N)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
KeyValuePair items[N];
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Obsolete: use JsonObject instead
|
|
||||||
template <int N>
|
|
||||||
class DEPRECATED JsonHashTable : public JsonObject<N>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,92 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "JsonObjectBase.h"
|
|
||||||
#include <string.h> // for strcmp
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
JsonValue JsonObjectBase::nullValue;
|
|
||||||
|
|
||||||
size_t JsonObjectBase::printTo(Print& p) const
|
|
||||||
{
|
|
||||||
size_t n = 0;
|
|
||||||
|
|
||||||
n += p.write('{');
|
|
||||||
|
|
||||||
// NB: the code has been optimized for a small size on a 8-bit AVR
|
|
||||||
|
|
||||||
const KeyValuePair* current = items;
|
|
||||||
for (int i = count; i > 0; i--)
|
|
||||||
{
|
|
||||||
n += EscapedString::printTo(current->key, p);
|
|
||||||
n += p.write(':');
|
|
||||||
n += current->value.printTo(p);
|
|
||||||
|
|
||||||
current++;
|
|
||||||
|
|
||||||
if (i > 1)
|
|
||||||
{
|
|
||||||
n += p.write(',');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
n += p.write('}');
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
JsonObjectBase::KeyValuePair* JsonObjectBase::getMatchingPair(JsonKey key) const
|
|
||||||
{
|
|
||||||
KeyValuePair* p = items;
|
|
||||||
|
|
||||||
for (int i = count; i > 0; --i)
|
|
||||||
{
|
|
||||||
if (!strcmp(p->key, key))
|
|
||||||
return p;
|
|
||||||
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
JsonValue& JsonObjectBase::operator[](JsonKey key)
|
|
||||||
{
|
|
||||||
KeyValuePair* match = getMatchingPair(key);
|
|
||||||
|
|
||||||
if (match)
|
|
||||||
return match->value;
|
|
||||||
|
|
||||||
JsonValue* value;
|
|
||||||
|
|
||||||
if (count < capacity)
|
|
||||||
{
|
|
||||||
items[count].key = key;
|
|
||||||
value = &items[count].value;
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
value = &nullValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
value->reset();
|
|
||||||
return *value;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool JsonObjectBase::containsKey(JsonKey key) const
|
|
||||||
{
|
|
||||||
return getMatchingPair(key) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void JsonObjectBase::remove(JsonKey key)
|
|
||||||
{
|
|
||||||
KeyValuePair* match = getMatchingPair(key);
|
|
||||||
if (match == 0) return;
|
|
||||||
|
|
||||||
*match = items[--count];
|
|
||||||
}
|
|
@ -1,62 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "JsonPrintable.h"
|
|
||||||
#include "JsonValue.h"
|
|
||||||
#include "EscapedString.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Generator
|
|
||||||
{
|
|
||||||
typedef const char* JsonKey;
|
|
||||||
|
|
||||||
class JsonObjectBase : public JsonPrintable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
JsonValue& operator[](JsonKey);
|
|
||||||
bool containsKey(JsonKey) const;
|
|
||||||
void remove(JsonKey key);
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void add(JsonKey key, T value)
|
|
||||||
{
|
|
||||||
operator[](key) = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<int DIGITS>
|
|
||||||
void add(JsonKey key, double value)
|
|
||||||
{
|
|
||||||
operator[](key).set<DIGITS>(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
using JsonPrintable::printTo;
|
|
||||||
|
|
||||||
virtual size_t printTo(Print& p) const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
struct KeyValuePair
|
|
||||||
{
|
|
||||||
JsonKey key;
|
|
||||||
JsonValue value;
|
|
||||||
};
|
|
||||||
|
|
||||||
JsonObjectBase(KeyValuePair* items, int capacity)
|
|
||||||
: items(items), capacity(capacity), count(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
KeyValuePair* items;
|
|
||||||
int capacity, count;
|
|
||||||
static JsonValue nullValue;
|
|
||||||
|
|
||||||
KeyValuePair* getMatchingPair(JsonKey key) const;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,97 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "JsonPrettyPrint.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
|
|
||||||
size_t JsonPrettyPrint::write(uint8_t c)
|
|
||||||
{
|
|
||||||
size_t n = inString ? handleStringChar(c) : handleMarkupChar(c);
|
|
||||||
previousChar = c;
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline size_t JsonPrettyPrint::handleStringChar(uint8_t c)
|
|
||||||
{
|
|
||||||
bool isQuote = c == '"' && previousChar != '\\';
|
|
||||||
|
|
||||||
if (isQuote) inString = false;
|
|
||||||
|
|
||||||
return sink.write(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline size_t JsonPrettyPrint::handleMarkupChar(uint8_t c)
|
|
||||||
{
|
|
||||||
switch (c)
|
|
||||||
{
|
|
||||||
case '{':
|
|
||||||
case '[':
|
|
||||||
return handleBlockOpen(c);
|
|
||||||
|
|
||||||
case '}':
|
|
||||||
case ']':
|
|
||||||
return handleBlockClose(c);
|
|
||||||
|
|
||||||
case ':':
|
|
||||||
return handleColumn();
|
|
||||||
|
|
||||||
case ',':
|
|
||||||
return handleComma();
|
|
||||||
|
|
||||||
case '"':
|
|
||||||
return handleQuoteOpen();
|
|
||||||
|
|
||||||
default:
|
|
||||||
return handleNormalChar(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline size_t JsonPrettyPrint::handleBlockOpen(uint8_t c)
|
|
||||||
{
|
|
||||||
return indentIfNeeded() + sink.write(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline size_t JsonPrettyPrint::handleBlockClose(uint8_t c)
|
|
||||||
{
|
|
||||||
return unindentIfNeeded() + sink.write(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline size_t JsonPrettyPrint::handleColumn()
|
|
||||||
{
|
|
||||||
return sink.write(':') + sink.write(' ');
|
|
||||||
}
|
|
||||||
|
|
||||||
inline size_t JsonPrettyPrint::handleComma()
|
|
||||||
{
|
|
||||||
return sink.write(',') + sink.println();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline size_t JsonPrettyPrint::handleQuoteOpen()
|
|
||||||
{
|
|
||||||
inString = true;
|
|
||||||
return indentIfNeeded() + sink.write('"');
|
|
||||||
}
|
|
||||||
|
|
||||||
inline size_t JsonPrettyPrint::handleNormalChar(uint8_t c)
|
|
||||||
{
|
|
||||||
return indentIfNeeded() + sink.write(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t JsonPrettyPrint::indentIfNeeded()
|
|
||||||
{
|
|
||||||
if (!inEmptyBlock()) return 0;
|
|
||||||
|
|
||||||
sink.indent();
|
|
||||||
return sink.println();
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t JsonPrettyPrint::unindentIfNeeded()
|
|
||||||
{
|
|
||||||
if (inEmptyBlock()) return 0;
|
|
||||||
|
|
||||||
sink.unindent();
|
|
||||||
return sink.println();
|
|
||||||
}
|
|
@ -1,52 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Print.h"
|
|
||||||
#include "IndentedPrint.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Generator
|
|
||||||
{
|
|
||||||
// Converts a compact JSON string into an indented one.
|
|
||||||
class JsonPrettyPrint : public Print
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
JsonPrettyPrint(IndentedPrint& p)
|
|
||||||
: sink(p)
|
|
||||||
{
|
|
||||||
previousChar = 0;
|
|
||||||
inString = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual size_t write(uint8_t);
|
|
||||||
|
|
||||||
private:
|
|
||||||
uint8_t previousChar;
|
|
||||||
IndentedPrint& sink;
|
|
||||||
bool inString;
|
|
||||||
|
|
||||||
bool inEmptyBlock()
|
|
||||||
{
|
|
||||||
return previousChar == '{' || previousChar == '[';
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t handleStringChar(uint8_t);
|
|
||||||
size_t handleMarkupChar(uint8_t);
|
|
||||||
|
|
||||||
size_t handleBlockClose(uint8_t);
|
|
||||||
size_t handleBlockOpen(uint8_t);
|
|
||||||
size_t handleColumn();
|
|
||||||
size_t handleComma();
|
|
||||||
size_t handleQuoteOpen();
|
|
||||||
size_t handleNormalChar(uint8_t);
|
|
||||||
size_t indentIfNeeded();
|
|
||||||
size_t unindentIfNeeded();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "JsonPrintable.h"
|
|
||||||
#include "JsonPrettyPrint.h"
|
|
||||||
#include "StringBuilder.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
size_t JsonPrintable::printTo(char* buffer, size_t bufferSize) const
|
|
||||||
{
|
|
||||||
StringBuilder sb(buffer, bufferSize);
|
|
||||||
return printTo(sb);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t JsonPrintable::prettyPrintTo(char* buffer, size_t bufferSize) const
|
|
||||||
{
|
|
||||||
StringBuilder sb(buffer, bufferSize);
|
|
||||||
return prettyPrintTo(sb);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t JsonPrintable::prettyPrintTo(IndentedPrint& p) const
|
|
||||||
{
|
|
||||||
JsonPrettyPrint prettyPrint(p);
|
|
||||||
return printTo(prettyPrint);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t JsonPrintable::prettyPrintTo(Print& p) const
|
|
||||||
{
|
|
||||||
IndentedPrint indentedPrint(p);
|
|
||||||
return prettyPrintTo(indentedPrint);
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Print.h"
|
|
||||||
#include "Printable.h"
|
|
||||||
#include "IndentedPrint.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Generator
|
|
||||||
{
|
|
||||||
// Contains methods to generate a JSON string.
|
|
||||||
// Implemented by both JsonObject and JsonArray
|
|
||||||
class JsonPrintable : public Printable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Generates the compact JSON string and sends it to a Print stream
|
|
||||||
virtual size_t printTo(Print& p) const = 0;
|
|
||||||
|
|
||||||
// Generates the compact JSON string and writes it in a buffer
|
|
||||||
size_t printTo(char* buffer, size_t bufferSize) const;
|
|
||||||
|
|
||||||
// Generates the indented JSON string and sends it to a Print stream
|
|
||||||
size_t prettyPrintTo(Print& p) const;
|
|
||||||
|
|
||||||
// Generates the indented JSON string and sends it to a IndentedPrint stream
|
|
||||||
// This overload allows a finer control of the output because you can customize
|
|
||||||
// the IndentedPrint.
|
|
||||||
size_t prettyPrintTo(IndentedPrint& p) const;
|
|
||||||
|
|
||||||
// Generates the indented JSON string and writes it in a buffer
|
|
||||||
size_t prettyPrintTo(char* buffer, size_t bufferSize) const;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "EscapedString.h"
|
|
||||||
#include "JsonValue.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
size_t JsonValue::printBoolTo(const Content& c, Print& p)
|
|
||||||
{
|
|
||||||
return p.print(c.asBool ? "true" : "false");
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t JsonValue::printLongTo(const Content& c, Print& p)
|
|
||||||
{
|
|
||||||
return p.print(c.asLong);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t JsonValue::printPrintableTo(const Content& c, Print& p)
|
|
||||||
{
|
|
||||||
if (c.asPrintable)
|
|
||||||
return c.asPrintable->printTo(p);
|
|
||||||
else
|
|
||||||
return p.print("null");
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t JsonValue::printStringTo(const Content& c, Print& p)
|
|
||||||
{
|
|
||||||
return EscapedString::printTo(c.asString, p);
|
|
||||||
}
|
|
@ -1,135 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "EscapedString.h"
|
|
||||||
#include "Printable.h"
|
|
||||||
#include "StringBuilder.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Generator
|
|
||||||
{
|
|
||||||
class JsonValue
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
void operator=(bool value)
|
|
||||||
{
|
|
||||||
printToImpl = &printBoolTo;
|
|
||||||
content.asBool = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void operator=(long value)
|
|
||||||
{
|
|
||||||
printToImpl = &printLongTo;
|
|
||||||
content.asLong = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void operator=(int value)
|
|
||||||
{
|
|
||||||
printToImpl = &printLongTo;
|
|
||||||
content.asLong = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void operator=(const Printable& value)
|
|
||||||
{
|
|
||||||
printToImpl = &printPrintableTo;
|
|
||||||
content.asPrintable = &value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void operator=(const char* value)
|
|
||||||
{
|
|
||||||
printToImpl = &printStringTo;
|
|
||||||
content.asString = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void operator=(double value)
|
|
||||||
{
|
|
||||||
set<2>(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <int DIGITS>
|
|
||||||
void set(double value)
|
|
||||||
{
|
|
||||||
printToImpl = &printDoubleTo < DIGITS > ;
|
|
||||||
content.asDouble = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator bool()
|
|
||||||
{
|
|
||||||
return content.asBool;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator const char*()
|
|
||||||
{
|
|
||||||
return content.asString;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator double()
|
|
||||||
{
|
|
||||||
return content.asDouble;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator float()
|
|
||||||
{
|
|
||||||
return (float)content.asDouble;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator int()
|
|
||||||
{
|
|
||||||
return content.asLong;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator long()
|
|
||||||
{
|
|
||||||
return content.asLong;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator const Printable&()
|
|
||||||
{
|
|
||||||
return *content.asPrintable;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t printTo(Print& p) const
|
|
||||||
{
|
|
||||||
// handmade polymorphism
|
|
||||||
return printToImpl(content, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
void reset()
|
|
||||||
{
|
|
||||||
content.asDouble = 0;
|
|
||||||
printToImpl = printStringTo;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
union Content
|
|
||||||
{
|
|
||||||
bool asBool;
|
|
||||||
double asDouble;
|
|
||||||
long asLong;
|
|
||||||
const Printable* asPrintable;
|
|
||||||
const char* asString;
|
|
||||||
};
|
|
||||||
|
|
||||||
Content content;
|
|
||||||
|
|
||||||
size_t(*printToImpl)(const Content&, Print&);
|
|
||||||
|
|
||||||
static size_t printBoolTo(const Content&, Print&);
|
|
||||||
static size_t printLongTo(const Content&, Print&);
|
|
||||||
static size_t printPrintableTo(const Content&, Print&);
|
|
||||||
static size_t printStringTo(const Content&, Print&);
|
|
||||||
|
|
||||||
template <int DIGITS>
|
|
||||||
static size_t printDoubleTo(const Content& c, Print& p)
|
|
||||||
{
|
|
||||||
return p.print(c.asDouble, DIGITS);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ARDUINO
|
|
||||||
|
|
||||||
#include "Print.h"
|
|
||||||
#include <cstdio>
|
|
||||||
|
|
||||||
size_t Print::print(const char s[])
|
|
||||||
{
|
|
||||||
size_t n = 0;
|
|
||||||
while (*s)
|
|
||||||
{
|
|
||||||
n += write(*s++);
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(double value, int digits)
|
|
||||||
{
|
|
||||||
char tmp[32];
|
|
||||||
sprintf(tmp, "%.*lg", digits+1, value);
|
|
||||||
return print(tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::print(long value)
|
|
||||||
{
|
|
||||||
char tmp[32];
|
|
||||||
sprintf(tmp, "%ld", value);
|
|
||||||
return print(tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Print::println()
|
|
||||||
{
|
|
||||||
return write('\r') + write('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,30 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#ifndef ARDUINO
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
// This class reproduces Arduino's Print
|
|
||||||
class Print
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
virtual size_t write(uint8_t) = 0;
|
|
||||||
|
|
||||||
size_t print(const char[]);
|
|
||||||
size_t print(double, int = 2);
|
|
||||||
size_t print(long);
|
|
||||||
size_t println();
|
|
||||||
};
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#include <Print.h>
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,24 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#ifndef ARDUINO
|
|
||||||
|
|
||||||
class Print;
|
|
||||||
|
|
||||||
class Printable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
virtual size_t printTo(Print& p) const = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#include <Printable.h>
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,247 +0,0 @@
|
|||||||
Arduino JSON library - Generator
|
|
||||||
================================
|
|
||||||
|
|
||||||
*An elegant and efficient JSON encoder for embedded systems.*
|
|
||||||
|
|
||||||
It's design to have the most intuitive API, the smallest footprint and works without any allocation on the heap (no malloc).
|
|
||||||
|
|
||||||
It has been written with Arduino in mind, but it isn't linked to Arduino libraries so you can use this library in any other C++ project.
|
|
||||||
|
|
||||||
|
|
||||||
Features
|
|
||||||
--------
|
|
||||||
|
|
||||||
* Elegant API, very easy to use
|
|
||||||
* Fixed memory allocation (no malloc)
|
|
||||||
* Small footprint
|
|
||||||
* Supports nested objects
|
|
||||||
* Supports indented output
|
|
||||||
* Implements Arduino's `Printable interface
|
|
||||||
* MIT License
|
|
||||||
|
|
||||||
|
|
||||||
Example
|
|
||||||
-------
|
|
||||||
|
|
||||||
JsonArray<2> array;
|
|
||||||
array.add<6>(48.756080); // <6> specifies the number of digits in the output
|
|
||||||
array.add<6>(2.302038); // (the default is 2)
|
|
||||||
|
|
||||||
JsonObject<3> root;
|
|
||||||
root["sensor"] = "gps";
|
|
||||||
root["time"] = 1351824120;
|
|
||||||
root["data"] = array;
|
|
||||||
|
|
||||||
Serial.print(root); // {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]}
|
|
||||||
|
|
||||||
|
|
||||||
How to use?
|
|
||||||
------------
|
|
||||||
|
|
||||||
### 1. Install the library
|
|
||||||
|
|
||||||
Download the library and extract it to:
|
|
||||||
|
|
||||||
<your Arduino Sketch folder>/libraries/ArduinoJson
|
|
||||||
|
|
||||||
### 2. Import in your sketch
|
|
||||||
|
|
||||||
Just add the following lines at the top of your `.ino` file:
|
|
||||||
|
|
||||||
#include <JsonGenerator.h>
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
|
|
||||||
> ##### Having a namespace conflict?
|
|
||||||
> To be able to use both `ArduinoJson::Generator` and `ArduinoJson::Parser` in the same file, you need to do one of the followings:
|
|
||||||
>
|
|
||||||
> * Put the `using` statements into different functions
|
|
||||||
> * `using namespace ArduinoJson`, then prefix the type names by `Generator::` or `Parser::`
|
|
||||||
> * Create aliases for the namespaces or the types (C++11 only)
|
|
||||||
|
|
||||||
### 3. Create object tree
|
|
||||||
|
|
||||||
In order to generate a JSON string, you need to build the equivalent object tree. You usually start by the root which can be either a JSON Array or a JSON Object.
|
|
||||||
|
|
||||||
#### JSON Array
|
|
||||||
|
|
||||||
You create an array with the following line:
|
|
||||||
|
|
||||||
JsonArray<8> array;
|
|
||||||
|
|
||||||
See the little `<8>`? It's a template parameter that gives the capacity of the array, it's the maximum number of elements you can put in it.
|
|
||||||
|
|
||||||
> ##### About the capacity
|
|
||||||
> As stated in the feature list, this library works with a fixed memory allocation.
|
|
||||||
> This means that the size of the object must be know at the compilation time, therefore you can **not** use a variable to set the capacity of the array.
|
|
||||||
|
|
||||||
Then you can add strings, integer, booleans, etc:
|
|
||||||
|
|
||||||
array.add("bazinga!");
|
|
||||||
array.add(42);
|
|
||||||
array.add(true);
|
|
||||||
|
|
||||||
There are two syntaxes for floating point values:
|
|
||||||
|
|
||||||
array.add<4>(3.1415); // 4 digits: "3.1415"
|
|
||||||
array.add(3.14); // 2 digits: "3.14"
|
|
||||||
|
|
||||||
> ##### About floating point precision
|
|
||||||
> The overload of `add()` with 2 parameters allows you to specify the number of decimals to save in the JSON string.
|
|
||||||
> When you use the overload with one parameter, you use the default number of decimals which is two.
|
|
||||||
> Note that this behavior is the exact same as Arduino's `Print::print(double,int);` which is implemented by `Serial`.
|
|
||||||
> So you may already be familiar with it.
|
|
||||||
|
|
||||||
Finally you can add nested object to the array:
|
|
||||||
|
|
||||||
JsonArray<8> nestedArray;
|
|
||||||
array.add(nestedArray);
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
JsonObject<8> nestedObject;
|
|
||||||
array.add(nestedObject);
|
|
||||||
|
|
||||||
> ##### CAUTION! Nested objects must be in memory
|
|
||||||
> Calling `add()` makes the `JsonArray` store a pointer to the nested object.
|
|
||||||
> This is designed to avoid memory duplication.
|
|
||||||
> But it can only work if the object is in memory when `printTo()` is executed.
|
|
||||||
> For instance, don't do this:
|
|
||||||
>
|
|
||||||
> void addNestedObject()
|
|
||||||
> {
|
|
||||||
> JsonObject<2> nestedObject;
|
|
||||||
> // ...
|
|
||||||
> array.add(nestedObject); // <- DON'T !!
|
|
||||||
>
|
|
||||||
> // array now contains a pointer to a local variable that will be
|
|
||||||
> // discarded as soon as the function exits
|
|
||||||
> }
|
|
||||||
>
|
|
||||||
> For the same reason, don't do this either:
|
|
||||||
>
|
|
||||||
> for( int i=0; i<100; i++)
|
|
||||||
> {
|
|
||||||
> JsonObject<2> nestedObject;
|
|
||||||
> // ...
|
|
||||||
> array.add(nestedObject); // <- DON'T !!
|
|
||||||
> }
|
|
||||||
> // array now contains 100 pointers to the same a local variable
|
|
||||||
> // that is out of the scope anyway
|
|
||||||
|
|
||||||
#### JSON Object
|
|
||||||
|
|
||||||
You create a JSON object (ie hash-table/dictionary) with the following line:
|
|
||||||
|
|
||||||
JsonObject<8> object;
|
|
||||||
|
|
||||||
Like with the array class, there is a template parameter that gives the capacity of the object.
|
|
||||||
|
|
||||||
Then you can add strings, integer, booleans, etc:
|
|
||||||
|
|
||||||
object["key1"] = "bazinga!";
|
|
||||||
object["key2"] = 42;
|
|
||||||
object["key3"] = true;
|
|
||||||
|
|
||||||
As for the arrays, there are two syntaxes for the floating point values:
|
|
||||||
|
|
||||||
object["key4"].set<4>(3.1415); // 4 digits "3.1415"
|
|
||||||
object["key5"] = 3.1415; // default: 2 digits "3.14"
|
|
||||||
|
|
||||||
Finally you can add nested objects:
|
|
||||||
|
|
||||||
JsonArray<8> nestedArray;
|
|
||||||
object["key6"] = nestedArray;
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
JsonObject<8> nestedObject;
|
|
||||||
object["key7"] = nestedObject;
|
|
||||||
|
|
||||||
> ##### Other JsonObject functions
|
|
||||||
> * `object.add(key, value)` is a synonym for `object[key] = value`
|
|
||||||
> * `object.containsKey(key)` returns `true` is the `key` is present in `object`
|
|
||||||
> * `object.remove(key)` removes the `value` associated with `key`
|
|
||||||
|
|
||||||
### 4. Get the JSON string
|
|
||||||
|
|
||||||
There are two ways tho get the resulting JSON string.
|
|
||||||
|
|
||||||
Depending on your project, you may need to dump the string in a classic `char[]` or send it to a stream like `Serial` or `EthernetClient `.
|
|
||||||
|
|
||||||
Both ways are the easy way :-)
|
|
||||||
|
|
||||||
#### Use a classic `char[]`
|
|
||||||
|
|
||||||
Whether you have a `JsonArray` or a `JsonObject`, simply call `printTo()` with the destination buffer, like so:
|
|
||||||
|
|
||||||
char buffer[256];
|
|
||||||
array.printTo(buffer, sizeof(buffer));
|
|
||||||
|
|
||||||
> ##### Want an indented output?
|
|
||||||
> By default the generated JSON is as small as possible. It contains no extra space, nor line break.
|
|
||||||
> But if you want an indented, more readable output, you can.
|
|
||||||
> Simply call `prettyPrintTo` instead of `printTo()`:
|
|
||||||
>
|
|
||||||
> array.prettyPrintTo(buffer, sizeof(buffer));
|
|
||||||
|
|
||||||
#### Send to a stream
|
|
||||||
|
|
||||||
It's very likely that the generated JSON will end up in a stream like `Serial` or `EthernetClient `, so you can save some time and memory by doing this:
|
|
||||||
|
|
||||||
Serial.print(array);
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
array.printTo(Serial);
|
|
||||||
|
|
||||||
> ##### About the Printable interface
|
|
||||||
> `JsonArray` and `JsonObject` implement Arduino's `Printable` interface.
|
|
||||||
> This is why you can call `Serial.print()` like in the example above.
|
|
||||||
> You can do the same with any other implementation of `Print`: `HardwareSerial`, `SoftwareSerial`, `LiquidCrystal`, `EthernetClient`, `WiFiClient`, `Wire`...
|
|
||||||
|
|
||||||
|
|
||||||
Memory usage
|
|
||||||
------------
|
|
||||||
|
|
||||||
Here are the size of the main classes of the library.
|
|
||||||
|
|
||||||
This table is for an 8-bit Arduino, types would be bigger on a 32-bit processor.
|
|
||||||
|
|
||||||
| Type | Size in bytes |
|
|
||||||
| --------------------| ------------- |
|
|
||||||
| JsonArray<N> | 8 + 6 x N |
|
|
||||||
| JsonObject<N> | 8 + 8 x N |
|
|
||||||
|
|
||||||
|
|
||||||
Code size
|
|
||||||
---------
|
|
||||||
|
|
||||||
The following values has been obtained with Arduino IDE 1.0.5, targeting an Arduino Duelmilanove with an ATmega 328.
|
|
||||||
|
|
||||||
### Minimum setup
|
|
||||||
|
|
||||||
| Function | Size |
|
|
||||||
| ----------------------------------- | ---- |
|
|
||||||
| `JsonObjectBase::printTo()` | 234 |
|
|
||||||
| `EscapedString::printTo()` | 196 |
|
|
||||||
| `JsonArrayBase::printTo()` | 164 |
|
|
||||||
| `Print::print(char const*)` | 146 |
|
|
||||||
| `JsonObjectBase::operator[]` | 114 |
|
|
||||||
| `JsonObjectBase::getMatchingPair()` | 72 |
|
|
||||||
| `JsonValue::printPrintableTo()` | 40 |
|
|
||||||
| `JsonValue::printStringTo()` | 12 |
|
|
||||||
|
|
||||||
### Additional space for integers
|
|
||||||
|
|
||||||
| Function | Size |
|
|
||||||
| ---------------------------- | ---- |
|
|
||||||
| `Print::print(long, int)` | 328 |
|
|
||||||
| `JsonValue::printLongTo()` | 22 |
|
|
||||||
|
|
||||||
### Additional space for floating point
|
|
||||||
|
|
||||||
| Function | Size |
|
|
||||||
| ------------------------------ | ---- |
|
|
||||||
| `Print::print(double, int)` | 1548 |
|
|
||||||
| `JsonValue::printDouleTo<2>()` | 22 |
|
|
@ -1,17 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "StringBuilder.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
size_t StringBuilder::write(uint8_t c)
|
|
||||||
{
|
|
||||||
if (length >= capacity) return 0;
|
|
||||||
|
|
||||||
buffer[length++] = c;
|
|
||||||
buffer[length] = 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Print.h"
|
|
||||||
|
|
||||||
namespace ArduinoJson
|
|
||||||
{
|
|
||||||
namespace Internals
|
|
||||||
{
|
|
||||||
class StringBuilder : public Print
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
StringBuilder(char* buf, int size)
|
|
||||||
: buffer(buf), capacity(size - 1), length(0)
|
|
||||||
{
|
|
||||||
buffer[0] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual size_t write(uint8_t c);
|
|
||||||
|
|
||||||
private:
|
|
||||||
char* buffer;
|
|
||||||
int capacity;
|
|
||||||
int length;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,95 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "EscapedString.h"
|
|
||||||
#include "StringBuilder.h"
|
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
namespace JsonGeneratorTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(EscapedStringTests)
|
|
||||||
{
|
|
||||||
char buffer[1024];
|
|
||||||
size_t returnValue;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD(Null)
|
|
||||||
{
|
|
||||||
whenInputIs(0);
|
|
||||||
outputMustBe("null");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(EmptyString)
|
|
||||||
{
|
|
||||||
whenInputIs("");
|
|
||||||
outputMustBe("\"\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(QuotationMark)
|
|
||||||
{
|
|
||||||
whenInputIs("\"");
|
|
||||||
outputMustBe("\"\\\"\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(ReverseSolidus)
|
|
||||||
{
|
|
||||||
whenInputIs("\\");
|
|
||||||
outputMustBe("\"\\\\\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Solidus)
|
|
||||||
{
|
|
||||||
whenInputIs("/");
|
|
||||||
outputMustBe("\"/\""); // but the JSON format allows \/
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Backspace)
|
|
||||||
{
|
|
||||||
whenInputIs("\b");
|
|
||||||
outputMustBe("\"\\b\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Formfeed)
|
|
||||||
{
|
|
||||||
whenInputIs("\f");
|
|
||||||
outputMustBe("\"\\f\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Newline)
|
|
||||||
{
|
|
||||||
whenInputIs("\n");
|
|
||||||
outputMustBe("\"\\n\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(CarriageReturn)
|
|
||||||
{
|
|
||||||
whenInputIs("\r");
|
|
||||||
outputMustBe("\"\\r\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(HorizontalTab)
|
|
||||||
{
|
|
||||||
whenInputIs("\t");
|
|
||||||
outputMustBe("\"\\t\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void whenInputIs(const char* input)
|
|
||||||
{
|
|
||||||
StringBuilder sb(buffer, sizeof(buffer));
|
|
||||||
returnValue = EscapedString::printTo(input, sb);
|
|
||||||
}
|
|
||||||
|
|
||||||
void outputMustBe(const char* expected)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected, buffer);
|
|
||||||
Assert::AreEqual(strlen(expected), returnValue);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,73 +0,0 @@
|
|||||||
#include "CppUnitTest.h"
|
|
||||||
#include "JsonArray.h"
|
|
||||||
#include "JsonObject.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
|
|
||||||
namespace JsonGeneratorTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(Issue10)
|
|
||||||
{
|
|
||||||
struct Person {
|
|
||||||
int id;
|
|
||||||
char name[32];
|
|
||||||
};
|
|
||||||
|
|
||||||
Person persons[2];
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD_INITIALIZE(Initialize)
|
|
||||||
{
|
|
||||||
Person boss;
|
|
||||||
boss.id = 1;
|
|
||||||
strcpy(boss.name, "Jeff");
|
|
||||||
Person employee;
|
|
||||||
employee.id = 2;
|
|
||||||
strcpy(employee.name, "John");
|
|
||||||
persons[0] = boss;
|
|
||||||
persons[1] = employee;
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(WrongWayToAddObjectInAnArray)
|
|
||||||
{
|
|
||||||
JsonArray<2> json;
|
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++)
|
|
||||||
{
|
|
||||||
JsonObject<2> object;
|
|
||||||
|
|
||||||
object["id"] = persons[i].id;
|
|
||||||
object["name"] = persons[i].name;
|
|
||||||
|
|
||||||
json.add(object); // <- Adding a reference to a temporary variable
|
|
||||||
}
|
|
||||||
|
|
||||||
char buffer[256];
|
|
||||||
json.printTo(buffer, sizeof(buffer));
|
|
||||||
|
|
||||||
// the same values are repeated, that's normal
|
|
||||||
Assert::AreEqual("[{\"id\":2,\"name\":\"John\"},{\"id\":2,\"name\":\"John\"}]", buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(RightWayToAddObjectInAnArray)
|
|
||||||
{
|
|
||||||
JsonArray<2> json;
|
|
||||||
JsonObject<2> object[2];
|
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++)
|
|
||||||
{
|
|
||||||
object[i]["id"] = persons[i].id;
|
|
||||||
object[i]["name"] = persons[i].name;
|
|
||||||
|
|
||||||
json.add(object[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
char buffer[256];
|
|
||||||
json.printTo(buffer, sizeof(buffer));
|
|
||||||
|
|
||||||
Assert::AreEqual("[{\"id\":1,\"name\":\"Jeff\"},{\"id\":2,\"name\":\"John\"}]", buffer);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,162 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "JsonArray.h"
|
|
||||||
#include "JsonObject.h"
|
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
|
|
||||||
namespace JsonGeneratorTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(JsonArrayTests)
|
|
||||||
{
|
|
||||||
JsonArray<2> array;
|
|
||||||
char buffer[256];
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD(Empty)
|
|
||||||
{
|
|
||||||
outputMustBe("[]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Null)
|
|
||||||
{
|
|
||||||
array.add((char*) 0);
|
|
||||||
|
|
||||||
outputMustBe("[null]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneString)
|
|
||||||
{
|
|
||||||
array.add("hello");
|
|
||||||
|
|
||||||
outputMustBe("[\"hello\"]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TwoStrings)
|
|
||||||
{
|
|
||||||
array.add("hello");
|
|
||||||
array.add("world");
|
|
||||||
|
|
||||||
outputMustBe("[\"hello\",\"world\"]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneStringOverCapacity)
|
|
||||||
{
|
|
||||||
array.add("hello");
|
|
||||||
array.add("world");
|
|
||||||
array.add("lost");
|
|
||||||
|
|
||||||
outputMustBe("[\"hello\",\"world\"]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneDoubleDefaultDigits)
|
|
||||||
{
|
|
||||||
array.add(3.14159265358979323846);
|
|
||||||
outputMustBe("[3.14]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneDoubleFourDigits)
|
|
||||||
{
|
|
||||||
array.add<4>(3.14159265358979323846);
|
|
||||||
outputMustBe("[3.1416]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneInteger)
|
|
||||||
{
|
|
||||||
array.add(1);
|
|
||||||
|
|
||||||
outputMustBe("[1]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TwoIntegers)
|
|
||||||
{
|
|
||||||
array.add(1);
|
|
||||||
array.add(2);
|
|
||||||
|
|
||||||
outputMustBe("[1,2]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneIntegerOverCapacity)
|
|
||||||
{
|
|
||||||
array.add(1);
|
|
||||||
array.add(2);
|
|
||||||
array.add(3);
|
|
||||||
|
|
||||||
outputMustBe("[1,2]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneTrue)
|
|
||||||
{
|
|
||||||
array.add(true);
|
|
||||||
|
|
||||||
outputMustBe("[true]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneFalse)
|
|
||||||
{
|
|
||||||
array.add(false);
|
|
||||||
|
|
||||||
outputMustBe("[false]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TwoBooleans)
|
|
||||||
{
|
|
||||||
array.add(false);
|
|
||||||
array.add(true);
|
|
||||||
|
|
||||||
outputMustBe("[false,true]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneBooleanOverCapacity)
|
|
||||||
{
|
|
||||||
array.add(false);
|
|
||||||
array.add(true);
|
|
||||||
array.add(false);
|
|
||||||
|
|
||||||
outputMustBe("[false,true]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneEmptyNestedArray)
|
|
||||||
{
|
|
||||||
JsonArray<1> nestedArray;
|
|
||||||
|
|
||||||
array.add(nestedArray);
|
|
||||||
|
|
||||||
outputMustBe("[[]]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneEmptyNestedHash)
|
|
||||||
{
|
|
||||||
JsonObject<1> nestedObject;
|
|
||||||
|
|
||||||
array.add(nestedObject);
|
|
||||||
|
|
||||||
outputMustBe("[{}]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneNestedArrayWithOneInteger)
|
|
||||||
{
|
|
||||||
JsonArray<1> nestedArray;
|
|
||||||
nestedArray.add(1);
|
|
||||||
|
|
||||||
array.add(nestedArray);
|
|
||||||
|
|
||||||
outputMustBe("[[1]]");
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void outputMustBe(const char* expected)
|
|
||||||
{
|
|
||||||
size_t n = array.printTo(buffer, sizeof(buffer));
|
|
||||||
Assert::AreEqual(expected, buffer);
|
|
||||||
Assert::AreEqual(strlen(expected), n);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,107 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{B9545D97-E084-4A19-8E48-929157064360}</ProjectGuid>
|
|
||||||
<Keyword>Win32Proj</Keyword>
|
|
||||||
<RootNamespace>JsonGeneratorTests</RootNamespace>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v120</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
<UseOfMfc>false</UseOfMfc>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v120</PlatformToolset>
|
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
<UseOfMfc>false</UseOfMfc>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<LinkIncremental>true</LinkIncremental>
|
|
||||||
<IncludePath>$(ProjectDir)/../JsonGenerator;$(IncludePath)</IncludePath>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<LinkIncremental>true</LinkIncremental>
|
|
||||||
<IncludePath>$(ProjectDir)/../JsonGenerator;$(IncludePath)</IncludePath>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<Optimization>Disabled</Optimization>
|
|
||||||
<AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
|
||||||
<PreprocessorDefinitions>ARDUINO_JSON_NO_DEPRECATION_WARNING;_DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<UseFullPaths>true</UseFullPaths>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
|
||||||
<Optimization>MaxSpeed</Optimization>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<UseFullPaths>true</UseFullPaths>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="EscapedStringTests.cpp" />
|
|
||||||
<ClCompile Include="PrettyPrint_Array_Tests.cpp" />
|
|
||||||
<ClCompile Include="PrettyPrint_Object_Tests.cpp" />
|
|
||||||
<ClCompile Include="PrettyPrint_String_Tests.cpp" />
|
|
||||||
<ClCompile Include="Issue10.cpp" />
|
|
||||||
<ClCompile Include="JsonArrayTests.cpp" />
|
|
||||||
<ClCompile Include="JsonObject_Indexer_Tests.cpp" />
|
|
||||||
<ClCompile Include="JsonObject_PrintTo_Tests.cpp" />
|
|
||||||
<ClCompile Include="JsonValue_Cast_Tests.cpp" />
|
|
||||||
<ClCompile Include="JsonValue_PrintTo_Tests.cpp" />
|
|
||||||
<ClCompile Include="StringBuilderTests.cpp" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\JsonGenerator\JsonGenerator.vcxproj">
|
|
||||||
<Project>{c6536d27-738d-4ceb-a2bc-e13c8897d894}</Project>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets">
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
@ -1,52 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Header Files">
|
|
||||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
|
||||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Resource Files">
|
|
||||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
|
||||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="JsonArrayTests.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="StringBuilderTests.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="EscapedStringTests.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonObject_PrintTo_Tests.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonObject_Indexer_Tests.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonValue_PrintTo_Tests.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="JsonValue_Cast_Tests.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="Issue10.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="PrettyPrint_Array_Tests.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="PrettyPrint_Object_Tests.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="PrettyPrint_String_Tests.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
@ -1,73 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "JsonArray.h"
|
|
||||||
#include "JsonObject.h"
|
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
|
|
||||||
namespace JsonGeneratorTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(JsonObject_Indexer_Tests)
|
|
||||||
{
|
|
||||||
JsonObject<2> object;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD(Empty)
|
|
||||||
{
|
|
||||||
mustNotContain("key");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TwoStrings)
|
|
||||||
{
|
|
||||||
object["key1"] = "value1";
|
|
||||||
object["key2"] = "value2";
|
|
||||||
|
|
||||||
mustContain("key1", "value1");
|
|
||||||
mustContain("key2", "value2");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(RemoveFirst)
|
|
||||||
{
|
|
||||||
object["key1"] = "value1";
|
|
||||||
object["key2"] = "value2";
|
|
||||||
object.remove("key1");
|
|
||||||
|
|
||||||
mustNotContain("key1");
|
|
||||||
mustContain("key2", "value2");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(RemoveLast)
|
|
||||||
{
|
|
||||||
object["key1"] = "value1";
|
|
||||||
object["key2"] = "value2";
|
|
||||||
object.remove("key2");
|
|
||||||
|
|
||||||
mustContain("key1", "value1");
|
|
||||||
mustNotContain("key2");
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void mustContain(const char* key, const char* expected)
|
|
||||||
{
|
|
||||||
Assert::IsTrue(object.containsKey(key));
|
|
||||||
|
|
||||||
const char* actual = object[key];
|
|
||||||
Assert::AreEqual(expected, actual);
|
|
||||||
}
|
|
||||||
|
|
||||||
void mustNotContain(const char* key)
|
|
||||||
{
|
|
||||||
Assert::IsFalse(object.containsKey(key));
|
|
||||||
|
|
||||||
const char* actual = object[key];
|
|
||||||
Assert::IsNull(actual);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,152 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "JsonArray.h"
|
|
||||||
#include "JsonObject.h"
|
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
|
|
||||||
namespace JsonGeneratorTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(JsonObject_PrintTo_Tests)
|
|
||||||
{
|
|
||||||
JsonObject<2> object;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD(Empty)
|
|
||||||
{
|
|
||||||
outputMustBe("{}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneString)
|
|
||||||
{
|
|
||||||
object["key"] = "value";
|
|
||||||
|
|
||||||
outputMustBe("{\"key\":\"value\"}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TwoStrings)
|
|
||||||
{
|
|
||||||
object["key1"] = "value1";
|
|
||||||
object["key2"] = "value2";
|
|
||||||
|
|
||||||
outputMustBe("{\"key1\":\"value1\",\"key2\":\"value2\"}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(RemoveFirst)
|
|
||||||
{
|
|
||||||
object["key1"] = "value1";
|
|
||||||
object["key2"] = "value2";
|
|
||||||
object.remove("key1");
|
|
||||||
|
|
||||||
outputMustBe("{\"key2\":\"value2\"}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(RemoveLast)
|
|
||||||
{
|
|
||||||
object["key1"] = "value1";
|
|
||||||
object["key2"] = "value2";
|
|
||||||
object.remove("key2");
|
|
||||||
|
|
||||||
outputMustBe("{\"key1\":\"value1\"}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(RemoveUnexistingKey)
|
|
||||||
{
|
|
||||||
object["key1"] = "value1";
|
|
||||||
object["key2"] = "value2";
|
|
||||||
object.remove("key3");
|
|
||||||
|
|
||||||
outputMustBe("{\"key1\":\"value1\",\"key2\":\"value2\"}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(ReplaceExistingKey)
|
|
||||||
{
|
|
||||||
object["key"] = "value1";
|
|
||||||
object["key"] = "value2";
|
|
||||||
|
|
||||||
outputMustBe("{\"key\":\"value2\"}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneStringOverCapacity)
|
|
||||||
{
|
|
||||||
object["key1"] = "value1";
|
|
||||||
object["key2"] = "value2";
|
|
||||||
object["key3"] = "value3";
|
|
||||||
|
|
||||||
outputMustBe("{\"key1\":\"value1\",\"key2\":\"value2\"}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneInteger)
|
|
||||||
{
|
|
||||||
object["key"] = 1;
|
|
||||||
outputMustBe("{\"key\":1}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneDoubleFourDigits)
|
|
||||||
{
|
|
||||||
object["key"].set<4>(3.14159265358979323846);
|
|
||||||
outputMustBe("{\"key\":3.1416}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneDoubleDefaultDigits)
|
|
||||||
{
|
|
||||||
object["key"] = 3.14159265358979323846;
|
|
||||||
outputMustBe("{\"key\":3.14}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneNull)
|
|
||||||
{
|
|
||||||
object["key"] = (char*) 0;
|
|
||||||
outputMustBe("{\"key\":null}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneTrue)
|
|
||||||
{
|
|
||||||
object["key"] = true;
|
|
||||||
outputMustBe("{\"key\":true}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneFalse)
|
|
||||||
{
|
|
||||||
object["key"] = false;
|
|
||||||
outputMustBe("{\"key\":false}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneEmptyNestedArray)
|
|
||||||
{
|
|
||||||
auto nestedArray = JsonArray<1>();
|
|
||||||
|
|
||||||
object["key"] = nestedArray;
|
|
||||||
|
|
||||||
outputMustBe("{\"key\":[]}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneEmptyNestedObject)
|
|
||||||
{
|
|
||||||
auto nestedObject = JsonObject<1>();
|
|
||||||
|
|
||||||
object["key"] = nestedObject;
|
|
||||||
|
|
||||||
outputMustBe("{\"key\":{}}");
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void outputMustBe(const char* expected)
|
|
||||||
{
|
|
||||||
char buffer[256];
|
|
||||||
size_t result;
|
|
||||||
|
|
||||||
result = object.printTo(buffer, sizeof(buffer));
|
|
||||||
|
|
||||||
Assert::AreEqual(strlen(expected), result);
|
|
||||||
Assert::AreEqual(expected, buffer);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,78 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "StringBuilder.h"
|
|
||||||
#include "JsonValue.h"
|
|
||||||
#include "JsonArray.h"
|
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
namespace JsonGeneratorTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(JsonValue_Cast_Tests)
|
|
||||||
{
|
|
||||||
JsonValue value;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD(Bool)
|
|
||||||
{
|
|
||||||
setValueAndCheckCast(true);
|
|
||||||
setValueAndCheckCast(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Double)
|
|
||||||
{
|
|
||||||
setValueAndCheckCast(3.14156);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Float)
|
|
||||||
{
|
|
||||||
setValueAndCheckCast(3.14f);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Integer)
|
|
||||||
{
|
|
||||||
setValueAndCheckCast(42);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Long)
|
|
||||||
{
|
|
||||||
setValueAndCheckCast(42L);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Array)
|
|
||||||
{
|
|
||||||
JsonArray<2> array;
|
|
||||||
setValueAndCheckCast(array);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(String)
|
|
||||||
{
|
|
||||||
setValueAndCheckCast("hello");
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void setValueAndCheckCast(T expected)
|
|
||||||
{
|
|
||||||
value = expected;
|
|
||||||
T actual = value;
|
|
||||||
Assert::AreEqual(expected, actual);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<int N>
|
|
||||||
void setValueAndCheckCast(JsonArray<N>& expected)
|
|
||||||
{
|
|
||||||
value = expected;
|
|
||||||
const Printable& actual = value;
|
|
||||||
Assert::AreEqual((void*) &expected, (void*) &actual);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,103 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "StringBuilder.h"
|
|
||||||
#include "JsonValue.h"
|
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
namespace JsonGeneratorTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(JsonValue_PrintTo_Tests)
|
|
||||||
{
|
|
||||||
char buffer[1024];
|
|
||||||
size_t returnValue;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD(String)
|
|
||||||
{
|
|
||||||
setValueTo("hello");
|
|
||||||
outputMustBe("\"hello\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Float)
|
|
||||||
{
|
|
||||||
setValueTo(3.1415f);
|
|
||||||
outputMustBe("3.14");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(DoubleZeroDigits)
|
|
||||||
{
|
|
||||||
setValueTo<0>(3.14159265358979323846);
|
|
||||||
outputMustBe("3");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(DoubleOneDigit)
|
|
||||||
{
|
|
||||||
setValueTo<1>(3.14159265358979323846);
|
|
||||||
outputMustBe("3.1");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(DoubleTwoDigits)
|
|
||||||
{
|
|
||||||
setValueTo<2>(3.14159265358979323846);
|
|
||||||
outputMustBe("3.14");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Integer)
|
|
||||||
{
|
|
||||||
setValueTo(314);
|
|
||||||
outputMustBe("314");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Char)
|
|
||||||
{
|
|
||||||
setValueTo('A');
|
|
||||||
outputMustBe("65");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Short)
|
|
||||||
{
|
|
||||||
setValueTo((short)314);
|
|
||||||
outputMustBe("314");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Long)
|
|
||||||
{
|
|
||||||
setValueTo(314159265L);
|
|
||||||
outputMustBe("314159265");
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
template<int DIGITS>
|
|
||||||
void setValueTo(double value)
|
|
||||||
{
|
|
||||||
StringBuilder sb(buffer, sizeof(buffer));
|
|
||||||
JsonValue jsonValue;
|
|
||||||
jsonValue.set<DIGITS>(value);
|
|
||||||
returnValue = jsonValue.printTo(sb);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void setValueTo(T value)
|
|
||||||
{
|
|
||||||
StringBuilder sb(buffer, sizeof(buffer));
|
|
||||||
JsonValue jsonValue;
|
|
||||||
jsonValue = value;
|
|
||||||
returnValue = jsonValue.printTo(sb);
|
|
||||||
}
|
|
||||||
|
|
||||||
void outputMustBe(const char* expected)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected, buffer);
|
|
||||||
Assert::AreEqual(strlen(expected), returnValue);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,91 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "JsonPrettyPrint.h"
|
|
||||||
#include "StringBuilder.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
|
|
||||||
namespace JsonGeneratorTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(PrettyPrint_Array_Tests)
|
|
||||||
{
|
|
||||||
char buffer[1024];
|
|
||||||
size_t returnValue;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD(EmptyArray)
|
|
||||||
{
|
|
||||||
whenInputIs("[]");
|
|
||||||
outputMustBe("[]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneElement)
|
|
||||||
{
|
|
||||||
whenInputIs("[1]");
|
|
||||||
outputMustBe(
|
|
||||||
"[\r\n"
|
|
||||||
" 1\r\n"
|
|
||||||
"]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TwoElements)
|
|
||||||
{
|
|
||||||
whenInputIs("[1,2]");
|
|
||||||
outputMustBe(
|
|
||||||
"[\r\n"
|
|
||||||
" 1,\r\n"
|
|
||||||
" 2\r\n"
|
|
||||||
"]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(EmptyNestedArrays)
|
|
||||||
{
|
|
||||||
whenInputIs("[[],[]]");
|
|
||||||
outputMustBe(
|
|
||||||
"[\r\n"
|
|
||||||
" [],\r\n"
|
|
||||||
" []\r\n"
|
|
||||||
"]");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(NestedArrays)
|
|
||||||
{
|
|
||||||
whenInputIs("[[1,2],[3,4]]");
|
|
||||||
outputMustBe(
|
|
||||||
"[\r\n"
|
|
||||||
" [\r\n"
|
|
||||||
" 1,\r\n"
|
|
||||||
" 2\r\n"
|
|
||||||
" ],\r\n"
|
|
||||||
" [\r\n"
|
|
||||||
" 3,\r\n"
|
|
||||||
" 4\r\n"
|
|
||||||
" ]\r\n"
|
|
||||||
"]");
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void whenInputIs(const char input[])
|
|
||||||
{
|
|
||||||
StringBuilder sb(buffer, sizeof(buffer));
|
|
||||||
IndentedPrint indentedPrint(sb);
|
|
||||||
JsonPrettyPrint decorator(indentedPrint);
|
|
||||||
|
|
||||||
returnValue = decorator.print(input);
|
|
||||||
}
|
|
||||||
|
|
||||||
void outputMustBe(const char* expected)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected, buffer);
|
|
||||||
Assert::AreEqual(strlen(expected), returnValue);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,89 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "JsonPrettyPrint.h"
|
|
||||||
#include "StringBuilder.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
|
|
||||||
namespace JsonGeneratorTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(PrettyPrint_Object_Tests)
|
|
||||||
{
|
|
||||||
char buffer[1024];
|
|
||||||
size_t returnValue;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD(EmptyObject)
|
|
||||||
{
|
|
||||||
whenInputIs("{}");
|
|
||||||
outputMustBe("{}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneMember)
|
|
||||||
{
|
|
||||||
whenInputIs("{\"key\":\"value\"}");
|
|
||||||
outputMustBe(
|
|
||||||
"{\r\n"
|
|
||||||
" \"key\": \"value\"\r\n"
|
|
||||||
"}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TwoMembers)
|
|
||||||
{
|
|
||||||
whenInputIs("{\"key1\":\"value1\",\"key2\":\"value2\"}");
|
|
||||||
outputMustBe(
|
|
||||||
"{\r\n"
|
|
||||||
" \"key1\": \"value1\",\r\n"
|
|
||||||
" \"key2\": \"value2\"\r\n"
|
|
||||||
"}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(EmptyNestedObjects)
|
|
||||||
{
|
|
||||||
whenInputIs("{\"key1\":{},\"key2\":{}}");
|
|
||||||
outputMustBe(
|
|
||||||
"{\r\n"
|
|
||||||
" \"key1\": {},\r\n"
|
|
||||||
" \"key2\": {}\r\n"
|
|
||||||
"}");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(NestedObjects)
|
|
||||||
{
|
|
||||||
whenInputIs("{\"key1\":{\"a\":1},\"key2\":{\"b\":2}}");
|
|
||||||
outputMustBe(
|
|
||||||
"{\r\n"
|
|
||||||
" \"key1\": {\r\n"
|
|
||||||
" \"a\": 1\r\n"
|
|
||||||
" },\r\n"
|
|
||||||
" \"key2\": {\r\n"
|
|
||||||
" \"b\": 2\r\n"
|
|
||||||
" }\r\n"
|
|
||||||
"}");
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void whenInputIs(const char input[])
|
|
||||||
{
|
|
||||||
StringBuilder sb(buffer, sizeof(buffer));
|
|
||||||
IndentedPrint indentedPrint(sb);
|
|
||||||
JsonPrettyPrint decorator(indentedPrint);
|
|
||||||
|
|
||||||
returnValue = decorator.print(input);
|
|
||||||
}
|
|
||||||
|
|
||||||
void outputMustBe(const char* expected)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected, buffer);
|
|
||||||
Assert::AreEqual(strlen(expected), returnValue);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,76 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "JsonPrettyPrint.h"
|
|
||||||
#include "StringBuilder.h"
|
|
||||||
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
using namespace ArduinoJson::Generator;
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
|
|
||||||
namespace JsonGeneratorTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(PrettyPrint_String_Tests)
|
|
||||||
{
|
|
||||||
char buffer[1024];
|
|
||||||
size_t returnValue;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD(EmptyString)
|
|
||||||
{
|
|
||||||
whenInputIs("");
|
|
||||||
outputMustBe("");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TrickyCharacters)
|
|
||||||
{
|
|
||||||
whenInputIs ("\":\\\"',\"");
|
|
||||||
outputMustBe("\":\\\"',\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OpeningCurlyBrace)
|
|
||||||
{
|
|
||||||
whenInputIs ("\"{\"");
|
|
||||||
outputMustBe("\"{\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OpeningSquareBrace)
|
|
||||||
{
|
|
||||||
whenInputIs("\"[\"");
|
|
||||||
outputMustBe("\"[\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(ClosingCurlyBrace)
|
|
||||||
{
|
|
||||||
whenInputIs("\"}\"");
|
|
||||||
outputMustBe("\"}\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(ClosingSquareBrace)
|
|
||||||
{
|
|
||||||
whenInputIs("\"]\"");
|
|
||||||
outputMustBe("\"]\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void whenInputIs(const char input[])
|
|
||||||
{
|
|
||||||
StringBuilder sb(buffer, sizeof(buffer));
|
|
||||||
IndentedPrint indentedPrint(sb);
|
|
||||||
JsonPrettyPrint decorator(indentedPrint);
|
|
||||||
|
|
||||||
returnValue = decorator.print(input);
|
|
||||||
}
|
|
||||||
|
|
||||||
void outputMustBe(const char* expected)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected, buffer);
|
|
||||||
Assert::AreEqual(strlen(expected), returnValue);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,85 +0,0 @@
|
|||||||
/*
|
|
||||||
* Arduino JSON library
|
|
||||||
* Benoit Blanchon 2014 - MIT License
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CppUnitTest.h"
|
|
||||||
#include "StringBuilder.h"
|
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace ArduinoJson::Internals;
|
|
||||||
|
|
||||||
namespace JsonGeneratorTests
|
|
||||||
{
|
|
||||||
TEST_CLASS(StringBuilderTests)
|
|
||||||
{
|
|
||||||
char buffer[20];
|
|
||||||
Print* sb;
|
|
||||||
size_t returnValue;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
TEST_METHOD_INITIALIZE(Initialize)
|
|
||||||
{
|
|
||||||
sb = new StringBuilder(buffer, sizeof(buffer));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(InitialState)
|
|
||||||
{
|
|
||||||
outputMustBe("");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OverCapacity)
|
|
||||||
{
|
|
||||||
print("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
|
|
||||||
resultMustBe(19);
|
|
||||||
|
|
||||||
print("ABC");
|
|
||||||
resultMustBe(0);
|
|
||||||
|
|
||||||
outputMustBe("ABCDEFGHIJKLMNOPQRS");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(EmptyString)
|
|
||||||
{
|
|
||||||
print("");
|
|
||||||
resultMustBe(0);
|
|
||||||
outputMustBe("");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(OneString)
|
|
||||||
{
|
|
||||||
print("ABCD");
|
|
||||||
resultMustBe(4);
|
|
||||||
outputMustBe("ABCD");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(TwoStrings)
|
|
||||||
{
|
|
||||||
print("ABCD");
|
|
||||||
resultMustBe(4);
|
|
||||||
|
|
||||||
print("EFGH");
|
|
||||||
resultMustBe(4);
|
|
||||||
|
|
||||||
outputMustBe("ABCDEFGH");
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void print(const char* value)
|
|
||||||
{
|
|
||||||
returnValue = sb->print(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void outputMustBe(const char* expected)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected, buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
void resultMustBe(size_t expected)
|
|
||||||
{
|
|
||||||
Assert::AreEqual(expected, returnValue);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
Reference in New Issue
Block a user