diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b2e95172..01c7cc98f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Arduino JSON: change log ======================== +v4.4 +---- + +* Added `JsonArray::measureLength()` and `JsonObject::measureLength()` (issue #75) + v4.3 ---- diff --git a/include/ArduinoJson/Internals/DummyPrint.hpp b/include/ArduinoJson/Internals/DummyPrint.hpp new file mode 100644 index 000000000..6def4eea3 --- /dev/null +++ b/include/ArduinoJson/Internals/DummyPrint.hpp @@ -0,0 +1,20 @@ +// Copyright Benoit Blanchon 2014-2015 +// MIT License +// +// Arduino JSON library +// https://github.com/bblanchon/ArduinoJson + +#pragma once + +#include "../Arduino/Print.hpp" + +namespace ArduinoJson { +namespace Internals { + +// A dummy Print implementation used in JsonPrintable::measureLength() +class DummyPrint : public Print { + public: + virtual size_t write(uint8_t) { return 1; } +}; +} +} diff --git a/include/ArduinoJson/Internals/JsonPrintable.hpp b/include/ArduinoJson/Internals/JsonPrintable.hpp index f5c52b062..9c51105e6 100644 --- a/include/ArduinoJson/Internals/JsonPrintable.hpp +++ b/include/ArduinoJson/Internals/JsonPrintable.hpp @@ -6,6 +6,7 @@ #pragma once +#include "DummyPrint.hpp" #include "IndentedPrint.hpp" #include "JsonWriter.hpp" #include "Prettyfier.hpp" @@ -47,6 +48,16 @@ class JsonPrintable { return prettyPrintTo(indentedPrint); } + size_t measureLength() const { + DummyPrint dp; + return printTo(dp); + } + + size_t measurePrettyLength() const { + DummyPrint dp; + return prettyPrintTo(dp); + } + private: const T &downcast() const { return *static_cast(this); } }; diff --git a/scripts/create-build-envs.sh b/scripts/create-build-envs.sh index 41e249c7a..9617a04df 100755 --- a/scripts/create-build-envs.sh +++ b/scripts/create-build-envs.sh @@ -20,10 +20,10 @@ build-env() if [[ $(uname) == MINGW* ]] then build-env "Make" "MinGW Makefiles" - build-env "SublimeText" "Sublime Text 2 - MinGW Makefiles" + build-env "SublimeText" "Sublime Text 2 - Ninja" build-env "VisualStudio" "Visual Studio 12 2013" else - build-env "SublimeText" "Sublime Text 2 - Unix Makefiles" + build-env "SublimeText" "Sublime Text 2 - Ninja" build-env "Make" "Unix Makefiles" build-env "Xcode" "Xcode" fi \ No newline at end of file diff --git a/test/JsonArray_PrettyPrintTo_Tests.cpp b/test/JsonArray_PrettyPrintTo_Tests.cpp index 6446f172d..05fd4809c 100644 --- a/test/JsonArray_PrettyPrintTo_Tests.cpp +++ b/test/JsonArray_PrettyPrintTo_Tests.cpp @@ -16,13 +16,15 @@ class JsonArray_PrettyPrintTo_Tests : public testing::Test { JsonArray& array; void outputMustBe(const char* expected) { - size_t n = array.prettyPrintTo(_buffer, sizeof(_buffer)); - EXPECT_STREQ(expected, _buffer); - EXPECT_EQ(strlen(expected), n); - } + char actual[256]; + + size_t actualLen = array.prettyPrintTo(actual, sizeof(actual)); + size_t measuredLen = array.measurePrettyLength(); - private: - char _buffer[256]; + EXPECT_STREQ(expected, actual); + EXPECT_EQ(strlen(expected), actualLen); + EXPECT_EQ(strlen(expected), measuredLen); + } }; TEST_F(JsonArray_PrettyPrintTo_Tests, Empty) { outputMustBe("[]"); } diff --git a/test/JsonArray_PrintTo_Tests.cpp b/test/JsonArray_PrintTo_Tests.cpp index 546619182..16715b4e3 100644 --- a/test/JsonArray_PrintTo_Tests.cpp +++ b/test/JsonArray_PrintTo_Tests.cpp @@ -16,9 +16,12 @@ class JsonArray_PrintTo_Tests : public testing::Test { JsonArray &array; void outputMustBe(const char *expected) { - size_t n = array.printTo(buffer, sizeof(buffer)); + size_t actualLen = array.printTo(buffer, sizeof(buffer)); + size_t measuredLen = array.measureLength(); + EXPECT_STREQ(expected, buffer); - EXPECT_EQ(strlen(expected), n); + EXPECT_EQ(strlen(expected), actualLen); + EXPECT_EQ(strlen(expected), measuredLen); } private: diff --git a/test/JsonObject_PrettyPrintTo_Tests.cpp b/test/JsonObject_PrettyPrintTo_Tests.cpp index 7b8801509..c02efcf23 100644 --- a/test/JsonObject_PrettyPrintTo_Tests.cpp +++ b/test/JsonObject_PrettyPrintTo_Tests.cpp @@ -16,13 +16,15 @@ class JsonObject_PrettyPrintTo_Tests : public testing::Test { JsonObject &_object; void outputMustBe(const char *expected) { - size_t n = _object.prettyPrintTo(buffer, sizeof(buffer)); + char buffer[256]; + + size_t actualLen = _object.prettyPrintTo(buffer, sizeof(buffer)); + size_t measuredLen = _object.measurePrettyLength(); + EXPECT_STREQ(expected, buffer); - EXPECT_EQ(strlen(expected), n); + EXPECT_EQ(strlen(expected), actualLen); + EXPECT_EQ(strlen(expected), measuredLen); } - - private: - char buffer[256]; }; TEST_F(JsonObject_PrettyPrintTo_Tests, EmptyObject) { outputMustBe("{}"); } diff --git a/test/JsonObject_PrintTo_Tests.cpp b/test/JsonObject_PrintTo_Tests.cpp index 8466732ff..9c5a994c7 100644 --- a/test/JsonObject_PrintTo_Tests.cpp +++ b/test/JsonObject_PrintTo_Tests.cpp @@ -16,10 +16,12 @@ class JsonObject_PrintTo_Tests : public testing::Test { protected: void outputMustBe(const char *expected) { char actual[256]; - int result = object.printTo(actual, sizeof(actual)); + size_t actualLen = object.printTo(actual, sizeof(actual)); + size_t measuredLen = object.measureLength(); EXPECT_STREQ(expected, actual); - EXPECT_EQ(strlen(expected), result); + EXPECT_EQ(strlen(expected), actualLen); + EXPECT_EQ(strlen(expected), measuredLen); } StaticJsonBuffer json;