diff --git a/CHANGELOG.md b/CHANGELOG.md index a3272e1e..aa670e66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ HEAD * Added `measureJson`, `measureJsonPretty`, and `measureMsgPack` to `keywords.txt` (This file is used for syntax highlighting in the Arduino IDE) * Fixed `variant.is()` +* Fixed value returned by `serializeJson()`, `serializeJsonPretty()`, and `serializeMsgPack()` when writing to a `String` > ### BREAKING CHANGES > diff --git a/extras/tests/Helpers/WString.h b/extras/tests/Helpers/WString.h new file mode 100644 index 00000000..db66e892 --- /dev/null +++ b/extras/tests/Helpers/WString.h @@ -0,0 +1,39 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2020 +// MIT License + +#pragma once + +#include + +// Reproduces Arduino's String class +class String { + public: + String& operator+=(char c) { + _str += c; + return *this; + } + String& operator+=(int); // no used, just to add ambiguity + + unsigned char reserve(size_t capacity) { + _str.reserve(capacity); + return 1; + } + + size_t length() const { + return _str.size(); + } + + const char* c_str() const { + return _str.c_str(); + } + + private: + std::string _str; +}; + +class StringSumHelper; + +bool operator==(const std::string& lhs, const ::String& rhs) { + return lhs == rhs.c_str(); +} diff --git a/extras/tests/Misc/StringWriter.cpp b/extras/tests/Misc/StringWriter.cpp index 1f53d24a..4c2fc239 100644 --- a/extras/tests/Misc/StringWriter.cpp +++ b/extras/tests/Misc/StringWriter.cpp @@ -2,6 +2,7 @@ // Copyright Benoit Blanchon 2014-2020 // MIT License +#define ARDUINOJSON_ENABLE_ARDUINO_STRING 1 #include #include #include "custom_string.hpp" @@ -55,6 +56,12 @@ TEST_CASE("Writer") { common_tests(sb, output); } +TEST_CASE("Writer") { + ::String output; + Writer< ::String> sb(output); + common_tests(sb, output); +} + TEST_CASE("Writer") { custom_string output; Writer sb(output); diff --git a/src/ArduinoJson/Serialization/Writers/ArduinoStringWriter.hpp b/src/ArduinoJson/Serialization/Writers/ArduinoStringWriter.hpp index 8e36342d..d0efeec2 100644 --- a/src/ArduinoJson/Serialization/Writers/ArduinoStringWriter.hpp +++ b/src/ArduinoJson/Serialization/Writers/ArduinoStringWriter.hpp @@ -22,9 +22,8 @@ class Writer< ::String, void> { // CAUTION: Arduino String doesn't have append() // and old version doesn't have size() either _str->reserve(_str->length() + n); - while (n > 0) { + for (size_t i = 0; i < n; i++) { _str->operator+=(static_cast(*s++)); - n--; } return n; }