Selaa lähdekoodia

Tests: replace constants with `sizeofString(n)`

Benoit Blanchon 2 vuotta sitten
vanhempi
sitoutus
e9850152a7

+ 7 - 4
extras/tests/Cpp17/string_view.cpp

@@ -8,6 +8,7 @@
 #endif
 
 using ArduinoJson::detail::sizeofArray;
+using ArduinoJson::detail::sizeofString;
 
 TEST_CASE("string_view") {
   JsonDocument doc(256);
@@ -55,16 +56,18 @@ TEST_CASE("string_view") {
 
   SECTION("String deduplication") {
     doc.add(std::string_view("example one", 7));
-    REQUIRE(doc.memoryUsage() == sizeofArray(1) + 8);
+    REQUIRE(doc.memoryUsage() == sizeofArray(1) + sizeofString(7));
 
     doc.add(std::string_view("example two", 7));
-    REQUIRE(doc.memoryUsage() == sizeofArray(2) + 8);
+    REQUIRE(doc.memoryUsage() == sizeofArray(2) + sizeofString(7));
 
     doc.add(std::string_view("example\0tree", 12));
-    REQUIRE(doc.memoryUsage() == sizeofArray(3) + 21);
+    REQUIRE(doc.memoryUsage() ==
+            sizeofArray(3) + sizeofString(7) + sizeofString(12));
 
     doc.add(std::string_view("example\0tree and a half", 12));
-    REQUIRE(doc.memoryUsage() == sizeofArray(4) + 21);
+    REQUIRE(doc.memoryUsage() ==
+            sizeofArray(4) + sizeofString(7) + sizeofString(12));
   }
 
   SECTION("as<std::string_view>()") {

+ 2 - 1
extras/tests/JsonArray/memoryUsage.cpp

@@ -7,6 +7,7 @@
 
 using ArduinoJson::detail::sizeofArray;
 using ArduinoJson::detail::sizeofObject;
+using ArduinoJson::detail::sizeofString;
 
 TEST_CASE("JsonArray::memoryUsage()") {
   JsonDocument doc(4096);
@@ -28,7 +29,7 @@ TEST_CASE("JsonArray::memoryUsage()") {
 
   SECTION("includes the size of the string") {
     arr.add(std::string("hello"));
-    REQUIRE(arr.memoryUsage() == sizeofArray(1) + 6);
+    REQUIRE(arr.memoryUsage() == sizeofArray(1) + sizeofString(5));
   }
 
   SECTION("includes the size of the nested array") {

+ 23 - 22
extras/tests/JsonDeserializer/filter.cpp

@@ -11,6 +11,7 @@
 
 using ArduinoJson::detail::sizeofArray;
 using ArduinoJson::detail::sizeofObject;
+using ArduinoJson::detail::sizeofString;
 
 TEST_CASE("Filtering") {
   struct TestCase {
@@ -46,7 +47,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"abcdefg\":\"hijklmn\"}",
-      sizeofObject(1) + 16
+      sizeofObject(1) + 2*sizeofString(7)
     },
     {
       "{\"hello\":\"world\"}",
@@ -72,7 +73,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":null}",
-      sizeofObject(1) + 8
+      sizeofObject(1) + sizeofString(7)
     },
     {
       // Member is a number, but filter wants an array
@@ -81,7 +82,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":null}",
-      sizeofObject(1) + 8
+      sizeofObject(1) + sizeofString(7)
     },
     {
       // Input is an array, but filter wants an object
@@ -117,7 +118,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":42}",
-      sizeofObject(1) + 8
+      sizeofObject(1) + sizeofString(7)
     },
     {
       // skip a float
@@ -126,7 +127,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":42}",
-      sizeofObject(1) + 8
+      sizeofObject(1) + sizeofString(7)
     },
     {
       // skip false
@@ -135,7 +136,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":42}",
-      sizeofObject(1) + 8
+      sizeofObject(1) + sizeofString(7)
     },
     {
       // skip true
@@ -144,7 +145,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":42}",
-      sizeofObject(1) + 8
+      sizeofObject(1) + sizeofString(7)
     },
     {
       // skip null
@@ -153,7 +154,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":42}",
-      sizeofObject(1) + 8
+      sizeofObject(1) + sizeofString(7)
     },
     {
       // can skip a double-quoted string
@@ -162,7 +163,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":42}",
-      sizeofObject(1) + 8
+      sizeofObject(1) + sizeofString(7)
     },
     {
       // can skip a single-quoted string
@@ -171,7 +172,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":42}",
-      sizeofObject(1) + 8
+      sizeofObject(1) + sizeofString(7)
     },
     {
       // can skip an empty array
@@ -180,7 +181,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":42}",
-      sizeofObject(1) + 8
+      sizeofObject(1) + sizeofString(7)
     },
     {
       // can skip an empty array with spaces in it
@@ -189,7 +190,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":42}",
-      sizeofObject(1) + 8
+      sizeofObject(1) + sizeofString(7)
     },
     {
       // can skip an array
@@ -198,7 +199,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":42}",
-      sizeofObject(1) + 8
+      sizeofObject(1) + sizeofString(7)
     },
     {
       // can skip an array with spaces in it
@@ -207,7 +208,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":42}",
-      sizeofObject(1) + 8
+      sizeofObject(1) + sizeofString(7)
     },
     {
       // can skip an empty object
@@ -216,7 +217,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":42}",
-      sizeofObject(1) + 8
+      sizeofObject(1) + sizeofString(7)
     },
     {
       // can skip an empty object with spaces in it
@@ -225,7 +226,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":42}",
-      sizeofObject(1) + 8
+      sizeofObject(1) + sizeofString(7)
     },
     {
       // can skip an object
@@ -234,7 +235,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":42}",
-      sizeofObject(1) + 8
+      sizeofObject(1) + sizeofString(7)
     },
     {
       // skip an object with spaces in it
@@ -243,7 +244,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":42}",
-      sizeofObject(1) + 8
+      sizeofObject(1) + sizeofString(7)
     },
     {
       "{\"an_integer\": 0,\"example\":{\"type\":\"int\",\"outcome\":42}}",
@@ -251,7 +252,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":{\"outcome\":42}}",
-      2 * sizeofObject(1) + 16
+      2 * sizeofObject(1) + 2*sizeofString(7)
     },
     {
       // wildcard
@@ -260,7 +261,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":{\"outcome\":42}}",
-      2 * sizeofObject(1) + 16
+      2 * sizeofObject(1) + 2*sizeofString(7)
     },
     {
       // exclusion filter (issue #1628)
@@ -269,7 +270,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "{\"example\":1}",
-      sizeofObject(1) + 8
+      sizeofObject(1) + sizeofString(7)
     },
     {
       // only the first element of array counts
@@ -296,7 +297,7 @@ TEST_CASE("Filtering") {
       10,
       DeserializationError::Ok,
       "[{\"example\":1},{\"example\":3}]",
-      sizeofArray(2) + 2 * sizeofObject(1) + 8
+      sizeofArray(2) + 2 * sizeofObject(1) + sizeofString(7)
     },
     {
       "[',2,3]",

+ 4 - 3
extras/tests/JsonDeserializer/string.cpp

@@ -97,7 +97,7 @@ TEST_CASE("Invalid JSON string") {
 }
 
 TEST_CASE("Not enough room to save the key") {
-  JsonDocument doc(sizeofObject(1) + 8);
+  JsonDocument doc(sizeofObject(1) + sizeofString(7));
 
   SECTION("Quoted string") {
     REQUIRE(deserializeJson(doc, "{\"example\":1}") ==
@@ -139,7 +139,7 @@ TEST_CASE("Deduplicate values") {
   JsonDocument doc(1024);
   deserializeJson(doc, "[\"example\",\"example\"]");
 
-  CHECK(doc.memoryUsage() == sizeofArray(2) + 8);
+  CHECK(doc.memoryUsage() == sizeofArray(2) + sizeofString(7));
   CHECK(doc[0].as<const char*>() == doc[1].as<const char*>());
 }
 
@@ -147,7 +147,8 @@ TEST_CASE("Deduplicate keys") {
   JsonDocument doc(1024);
   deserializeJson(doc, "[{\"example\":1},{\"example\":2}]");
 
-  CHECK(doc.memoryUsage() == 2 * sizeofObject(1) + sizeofArray(2) + 8);
+  CHECK(doc.memoryUsage() ==
+        2 * sizeofObject(1) + sizeofArray(2) + sizeofString(7));
 
   const char* key1 = doc[0].as<JsonObject>().begin()->key().c_str();
   const char* key2 = doc[1].as<JsonObject>().begin()->key().c_str();

+ 2 - 1
extras/tests/JsonDocument/ElementProxy.cpp

@@ -6,6 +6,7 @@
 #include <catch.hpp>
 
 typedef ArduinoJson::detail::ElementProxy<JsonDocument&> ElementProxy;
+using ArduinoJson::detail::sizeofString;
 
 TEST_CASE("ElementProxy::add()") {
   JsonDocument doc(4096);
@@ -199,7 +200,7 @@ TEST_CASE("ElementProxy::memoryUsage()") {
 
   SECTION("returns size for string") {
     ep.set(std::string("hello"));
-    REQUIRE(ep.memoryUsage() == 6);
+    REQUIRE(ep.memoryUsage() == sizeofString(5));
   }
 }
 

+ 10 - 5
extras/tests/JsonDocument/MemberProxy.cpp

@@ -12,6 +12,7 @@
 
 using ArduinoJson::detail::sizeofArray;
 using ArduinoJson::detail::sizeofObject;
+using ArduinoJson::detail::sizeofString;
 
 typedef ArduinoJson::detail::MemberProxy<JsonDocument&, const char*>
     MemberProxy;
@@ -248,7 +249,7 @@ TEST_CASE("MemberProxy::memoryUsage()") {
 
   SECTION("return the size for a string") {
     mp.set(std::string("hello"));
-    REQUIRE(mp.memoryUsage() == 6);
+    REQUIRE(mp.memoryUsage() == sizeofString(5));
   }
 }
 
@@ -342,7 +343,8 @@ TEST_CASE("Deduplicate keys") {
     doc[0][std::string("example")] = 1;
     doc[1][std::string("example")] = 2;
 
-    CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 8);
+    CHECK(doc.memoryUsage() ==
+          sizeofArray(2) + 2 * sizeofObject(1) + sizeofString(7));
 
     const char* key1 = doc[0].as<JsonObject>().begin()->key().c_str();
     const char* key2 = doc[1].as<JsonObject>().begin()->key().c_str();
@@ -354,7 +356,8 @@ TEST_CASE("Deduplicate keys") {
     doc[0][key] = 1;
     doc[1][key] = 2;
 
-    CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 8);
+    CHECK(doc.memoryUsage() ==
+          sizeofArray(2) + 2 * sizeofObject(1) + sizeofString(7));
 
     const char* key1 = doc[0].as<JsonObject>().begin()->key().c_str();
     const char* key2 = doc[1].as<JsonObject>().begin()->key().c_str();
@@ -365,7 +368,8 @@ TEST_CASE("Deduplicate keys") {
     doc[0][String("example")] = 1;
     doc[1][String("example")] = 2;
 
-    CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 8);
+    CHECK(doc.memoryUsage() ==
+          sizeofArray(2) + 2 * sizeofObject(1) + sizeofString(7));
 
     const char* key1 = doc[0].as<JsonObject>().begin()->key().c_str();
     const char* key2 = doc[1].as<JsonObject>().begin()->key().c_str();
@@ -376,7 +380,8 @@ TEST_CASE("Deduplicate keys") {
     doc[0][F("example")] = 1;
     doc[1][F("example")] = 2;
 
-    CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 8);
+    CHECK(doc.memoryUsage() ==
+          sizeofArray(2) + 2 * sizeofObject(1) + sizeofString(7));
 
     const char* key1 = doc[0].as<JsonObject>().begin()->key().c_str();
     const char* key2 = doc[1].as<JsonObject>().begin()->key().c_str();

+ 5 - 4
extras/tests/JsonDocument/add.cpp

@@ -11,6 +11,7 @@
 #include <catch.hpp>
 
 using ArduinoJson::detail::sizeofArray;
+using ArduinoJson::detail::sizeofString;
 
 TEST_CASE("JsonDocument::add()") {
   JsonDocument doc(4096);
@@ -31,7 +32,7 @@ TEST_CASE("JsonDocument::add()") {
     doc.add(std::string("example"));
     doc.add(std::string("example"));
 
-    CHECK(doc.memoryUsage() == sizeofArray(2) + 8);
+    CHECK(doc.memoryUsage() == sizeofArray(2) + sizeofString(7));
     CHECK(doc[0].as<const char*>() == doc[1].as<const char*>());
   }
 
@@ -40,7 +41,7 @@ TEST_CASE("JsonDocument::add()") {
     doc.add(value);
     doc.add(value);
 
-    CHECK(doc.memoryUsage() == sizeofArray(2) + 8);
+    CHECK(doc.memoryUsage() == sizeofArray(2) + sizeofString(7));
     CHECK(doc[0].as<const char*>() == doc[1].as<const char*>());
   }
 
@@ -48,7 +49,7 @@ TEST_CASE("JsonDocument::add()") {
     doc.add(String("example"));
     doc.add(String("example"));
 
-    CHECK(doc.memoryUsage() == sizeofArray(2) + 8);
+    CHECK(doc.memoryUsage() == sizeofArray(2) + sizeofString(7));
     CHECK(doc[0].as<const char*>() == doc[1].as<const char*>());
   }
 
@@ -56,7 +57,7 @@ TEST_CASE("JsonDocument::add()") {
     doc.add(F("example"));
     doc.add(F("example"));
 
-    CHECK(doc.memoryUsage() == sizeofArray(2) + 8);
+    CHECK(doc.memoryUsage() == sizeofArray(2) + sizeofString(7));
     CHECK(doc[0].as<const char*>() == doc[1].as<const char*>());
   }
 }

+ 5 - 4
extras/tests/JsonDocument/garbageCollect.cpp

@@ -10,6 +10,7 @@
 #include "Allocators.hpp"
 
 using ArduinoJson::detail::sizeofObject;
+using ArduinoJson::detail::sizeofString;
 
 TEST_CASE("JsonDocument::garbageCollect()") {
   ControllableAllocator controllableAllocator;
@@ -18,13 +19,13 @@ TEST_CASE("JsonDocument::garbageCollect()") {
 
   SECTION("when allocation succeeds") {
     deserializeJson(doc, "{\"blanket\":1,\"dancing\":2}");
-    REQUIRE(doc.memoryUsage() == sizeofObject(2) + 16);
+    REQUIRE(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     doc.remove("blanket");
 
     bool result = doc.garbageCollect();
 
     REQUIRE(result == true);
-    REQUIRE(doc.memoryUsage() == sizeofObject(1) + 8);
+    REQUIRE(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
     REQUIRE(doc.as<std::string>() == "{\"dancing\":2}");
     REQUIRE(spyingAllocator.log() == AllocatorLog()
                                          << AllocatorLog::Allocate(4096)
@@ -34,14 +35,14 @@ TEST_CASE("JsonDocument::garbageCollect()") {
 
   SECTION("when allocation fails") {
     deserializeJson(doc, "{\"blanket\":1,\"dancing\":2}");
-    REQUIRE(doc.memoryUsage() == sizeofObject(2) + 16);
+    REQUIRE(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     doc.remove("blanket");
     controllableAllocator.disable();
 
     bool result = doc.garbageCollect();
 
     REQUIRE(result == false);
-    REQUIRE(doc.memoryUsage() == sizeofObject(2) + 16);
+    REQUIRE(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     REQUIRE(doc.as<std::string>() == "{\"dancing\":2}");
 
     REQUIRE(spyingAllocator.log() == AllocatorLog()

+ 3 - 2
extras/tests/JsonDocument/overflowed.cpp

@@ -6,6 +6,7 @@
 #include <catch.hpp>
 
 using ArduinoJson::detail::sizeofArray;
+using ArduinoJson::detail::sizeofString;
 
 TEST_CASE("JsonDocument::overflowed()") {
   SECTION("returns false on a fresh object") {
@@ -32,7 +33,7 @@ TEST_CASE("JsonDocument::overflowed()") {
   }
 
   SECTION("returns false after a successful string copy") {
-    JsonDocument doc(sizeofArray(1) + 8);
+    JsonDocument doc(sizeofArray(1) + sizeofString(7));
     doc.add(std::string("example"));
     CHECK(doc.overflowed() == false);
   }
@@ -50,7 +51,7 @@ TEST_CASE("JsonDocument::overflowed()") {
   }
 
   SECTION("returns false after a successful deserialization") {
-    JsonDocument doc(sizeofArray(1) + 8);
+    JsonDocument doc(sizeofArray(1) + sizeofString(7));
     deserializeJson(doc, "[\"example\"]");
     CHECK(doc.overflowed() == false);
   }

+ 1 - 1
extras/tests/JsonDocument/shrinkToFit.cpp

@@ -200,7 +200,7 @@ TEST_CASE("JsonDocument::shrinkToFit()") {
 
   SECTION("unaligned") {
     doc.add(std::string("?"));  // two bytes in the string pool
-    REQUIRE(doc.memoryUsage() == sizeofObject(1) + 2);
+    REQUIRE(doc.memoryUsage() == sizeofObject(1) + sizeofString(1));
 
     doc.shrinkToFit();
 

+ 2 - 1
extras/tests/JsonObject/memoryUsage.cpp

@@ -8,6 +8,7 @@
 
 using ArduinoJson::detail::sizeofArray;
 using ArduinoJson::detail::sizeofObject;
+using ArduinoJson::detail::sizeofString;
 
 TEST_CASE("JsonObject::memoryUsage()") {
   JsonDocument doc(4096);
@@ -29,7 +30,7 @@ TEST_CASE("JsonObject::memoryUsage()") {
 
   SECTION("includes the size of the key") {
     obj[std::string("hello")] = 42;
-    REQUIRE(obj.memoryUsage() == sizeofObject(1) + 6);
+    REQUIRE(obj.memoryUsage() == sizeofObject(1) + sizeofString(5));
   }
 
   SECTION("includes the size of the nested array") {

+ 3 - 1
extras/tests/JsonSerializer/std_string.cpp

@@ -5,6 +5,8 @@
 #include <ArduinoJson.h>
 #include <catch.hpp>
 
+using ArduinoJson::detail::sizeofString;
+
 TEST_CASE("serialize JsonArray to std::string") {
   JsonDocument doc(4096);
   JsonArray array = doc.to<JsonArray>();
@@ -49,7 +51,7 @@ TEST_CASE("serialize JsonObject to std::string") {
 TEST_CASE("serialize an std::string containing a NUL") {
   JsonDocument doc(256);
   doc.set(std::string("hello\0world", 11));
-  CHECK(doc.memoryUsage() == 12);
+  CHECK(doc.memoryUsage() == sizeofString(11));
 
   std::string json;
   serializeJson(doc, json);

+ 3 - 2
extras/tests/JsonVariant/memoryUsage.cpp

@@ -8,6 +8,7 @@
 
 using ArduinoJson::detail::sizeofArray;
 using ArduinoJson::detail::sizeofObject;
+using ArduinoJson::detail::sizeofString;
 
 TEST_CASE("JsonVariant::memoryUsage()") {
   JsonDocument doc(4096);
@@ -32,13 +33,13 @@ TEST_CASE("JsonVariant::memoryUsage()") {
 
   SECTION("returns size of owned string") {
     var.set(std::string("hello"));
-    REQUIRE(var.memoryUsage() == 6);
+    REQUIRE(var.memoryUsage() == sizeofString(5));
     REQUIRE(var.memoryUsage() == doc.memoryUsage());
   }
 
   SECTION("returns size of owned raw") {
     var.set(serialized(std::string("hello")));
-    REQUIRE(var.memoryUsage() == 6);
+    REQUIRE(var.memoryUsage() == sizeofString(5));
     REQUIRE(var.memoryUsage() == doc.memoryUsage());
   }
 }

+ 3 - 3
extras/tests/MemoryPool/StringCopier.cpp

@@ -69,7 +69,7 @@ TEST_CASE("StringCopier::save() deduplicates strings") {
 
     REQUIRE(s1 == s3);
     REQUIRE(s2 != s3);
-    REQUIRE(pool.size() == 12);
+    REQUIRE(pool.size() == 2 * sizeofString(5));
   }
 
   SECTION("Requires terminator") {
@@ -77,7 +77,7 @@ TEST_CASE("StringCopier::save() deduplicates strings") {
     const char* s2 = addStringToPool(pool, "hello");
 
     REQUIRE(s2 != s1);
-    REQUIRE(pool.size() == 12 + 6);
+    REQUIRE(pool.size() == sizeofString(11) + sizeofString(5));
   }
 
   SECTION("Don't overrun") {
@@ -85,6 +85,6 @@ TEST_CASE("StringCopier::save() deduplicates strings") {
     const char* s2 = addStringToPool(pool, "wor");
 
     REQUIRE(s2 != s1);
-    REQUIRE(pool.size() == 12 + 4);
+    REQUIRE(pool.size() == sizeofString(11) + sizeofString(3));
   }
 }

+ 2 - 2
extras/tests/MemoryPool/clear.cpp

@@ -21,8 +21,8 @@ TEST_CASE("MemoryPool::clear()") {
   }
 
   SECTION("Discards allocated strings") {
-    pool.saveString(adaptString(const_cast<char*>("123456789")));
-    REQUIRE(pool.size() == 10);
+    pool.saveString(adaptString("123456789"));
+    REQUIRE(pool.size() == sizeofString(9));
 
     pool.clear();
 

+ 5 - 5
extras/tests/MemoryPool/saveString.cpp

@@ -11,7 +11,7 @@
 using namespace ArduinoJson::detail;
 
 static const char* saveString(MemoryPool& pool, const char* s) {
-  return pool.saveString(adaptString(const_cast<char*>(s)));
+  return pool.saveString(adaptString(s));
 }
 
 static const char* saveString(MemoryPool& pool, const char* s, size_t n) {
@@ -25,21 +25,20 @@ TEST_CASE("MemoryPool::saveString()") {
     const char* a = saveString(pool, "hello");
     const char* b = saveString(pool, "world");
     REQUIRE(a != b);
-    REQUIRE(pool.size() == 6 + 6);
+    REQUIRE(pool.size() == 2 * sizeofString(5));
   }
 
   SECTION("Deduplicates identical strings") {
     const char* a = saveString(pool, "hello");
     const char* b = saveString(pool, "hello");
     REQUIRE(a == b);
-    REQUIRE(pool.size() == 6);
+    REQUIRE(pool.size() == sizeofString(5));
   }
 
   SECTION("Deduplicates identical strings that contain NUL") {
     const char* a = saveString(pool, "hello\0world", 11);
     const char* b = saveString(pool, "hello\0world", 11);
     REQUIRE(a == b);
-    REQUIRE(pool.size() == 12);
   }
 
   SECTION("Reuse part of a string if it ends with NUL") {
@@ -47,13 +46,14 @@ TEST_CASE("MemoryPool::saveString()") {
     const char* b = saveString(pool, "hello");
     REQUIRE(a == b);
     REQUIRE(pool.size() == 12);
+    REQUIRE(pool.size() == sizeofString(11));
   }
 
   SECTION("Don't stop on first NUL") {
     const char* a = saveString(pool, "hello");
     const char* b = saveString(pool, "hello\0world", 11);
     REQUIRE(a != b);
-    REQUIRE(pool.size() == 18);
+    REQUIRE(pool.size() == sizeofString(5) + sizeofString(11));
   }
 
   SECTION("Returns NULL when full") {

+ 6 - 5
extras/tests/Misc/printable.cpp

@@ -9,6 +9,7 @@
 #include <ArduinoJson.h>
 
 using ArduinoJson::detail::sizeofArray;
+using ArduinoJson::detail::sizeofString;
 
 struct PrintOneCharacterAtATime {
   static size_t printStringTo(const std::string& s, Print& p) {
@@ -61,8 +62,8 @@ TEST_CASE("Printable") {
       CHECK(doc.as<std::string>() == value);
       CHECK(printable.totalBytesWritten() == 7);
       CHECK(doc.overflowed() == false);
-      CHECK(doc.memoryUsage() == 8);
-      CHECK(doc.as<JsonVariant>().memoryUsage() == 8);
+      CHECK(doc.memoryUsage() == sizeofString(7));
+      CHECK(doc.as<JsonVariant>().memoryUsage() == sizeofString(7));
     }
 
     SECTION("Via Print::write(const char* size_t)") {
@@ -71,8 +72,8 @@ TEST_CASE("Printable") {
       CHECK(doc.as<std::string>() == value);
       CHECK(printable.totalBytesWritten() == 7);
       CHECK(doc.overflowed() == false);
-      CHECK(doc.memoryUsage() == 8);
-      CHECK(doc.as<JsonVariant>().memoryUsage() == 8);
+      CHECK(doc.memoryUsage() == sizeofString(7));
+      CHECK(doc.as<JsonVariant>().memoryUsage() == sizeofString(7));
     }
   }
 
@@ -141,6 +142,6 @@ TEST_CASE("Printable") {
     REQUIRE(doc.size() == 2);
     CHECK(doc[0] == "Hello World!");
     CHECK(doc[1] == "Hello World!");
-    CHECK(doc.memoryUsage() == sizeofArray(2) + 13);
+    CHECK(doc.memoryUsage() == sizeofArray(2) + sizeofString(12));
   }
 }

+ 88 - 82
extras/tests/MsgPackDeserializer/filter.cpp

@@ -60,7 +60,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("reject 0xc1") {
@@ -76,7 +76,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip true") {
@@ -85,7 +85,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip positive fixint") {
@@ -94,7 +94,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip negative fixint") {
@@ -103,7 +103,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip uint 8") {
@@ -112,7 +112,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip int 8") {
@@ -121,7 +121,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip uint 16") {
@@ -130,7 +130,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip int 16") {
@@ -139,7 +139,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip uint 32") {
@@ -149,7 +149,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip int 32") {
@@ -159,7 +159,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip uint 64") {
@@ -170,7 +170,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip int 64") {
@@ -181,7 +181,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip float 32") {
@@ -191,7 +191,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip float 64") {
@@ -202,7 +202,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip fixstr") {
@@ -211,7 +211,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip str 8") {
@@ -220,7 +220,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip str 16") {
@@ -229,7 +229,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip str 32") {
@@ -239,7 +239,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip bin 8") {
@@ -248,7 +248,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip bin 16") {
@@ -257,7 +257,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip bin 32") {
@@ -267,7 +267,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip fixarray") {
@@ -276,7 +276,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip array 16") {
@@ -286,7 +286,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip array 32") {
@@ -299,7 +299,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip fixmap") {
@@ -309,7 +309,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip map 16") {
@@ -321,7 +321,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip map 32") {
@@ -335,7 +335,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip fixext 1") {
@@ -347,7 +347,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip fixext 2") {
@@ -359,7 +359,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip fixext 4") {
@@ -371,7 +371,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip fixext 8") {
@@ -383,7 +383,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip fixext 16") {
@@ -397,7 +397,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip ext 8") {
@@ -409,7 +409,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip ext 16") {
@@ -421,7 +421,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
 
       SECTION("skip ext 32") {
@@ -433,7 +433,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
+        CHECK(doc.memoryUsage() == sizeofObject(1) + sizeofString(7));
       }
     }
 
@@ -454,7 +454,8 @@ TEST_CASE("deserializeMsgPack() filter") {
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() ==
               "{\"onlyarr\":[{\"measure\":2},{\"measure\":4}],\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(2) + 24);
+        CHECK(doc.memoryUsage() ==
+              sizeofArray(2) + 2 * sizeofObject(2) + 3 * sizeofString(7));
       }
 
       SECTION("include array 16") {
@@ -469,7 +470,8 @@ TEST_CASE("deserializeMsgPack() filter") {
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() ==
               "{\"onlyarr\":[{\"measure\":2},{\"measure\":4}],\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(2) + 24);
+        CHECK(doc.memoryUsage() ==
+              sizeofArray(2) + 2 * sizeofObject(2) + 3 * sizeofString(7));
       }
 
       SECTION("include array 32") {
@@ -484,7 +486,8 @@ TEST_CASE("deserializeMsgPack() filter") {
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() ==
               "{\"onlyarr\":[{\"measure\":2},{\"measure\":4}],\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(2) + 24);
+        CHECK(doc.memoryUsage() ==
+              sizeofArray(2) + 2 * sizeofObject(2) + 3 * sizeofString(7));
       }
 
       SECTION("skip null") {
@@ -493,7 +496,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip false") {
@@ -502,7 +505,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip true") {
@@ -511,7 +514,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip positive fixint") {
@@ -520,7 +523,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip negative fixint") {
@@ -529,7 +532,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip uint 8") {
@@ -538,7 +541,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip uint 16") {
@@ -547,7 +550,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip uint 32") {
@@ -557,7 +560,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip uint 64") {
@@ -568,7 +571,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip int 8") {
@@ -577,7 +580,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip int 16") {
@@ -586,7 +589,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip int 32") {
@@ -596,7 +599,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip int 64") {
@@ -607,7 +610,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip float 32") {
@@ -617,7 +620,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip float 64") {
@@ -628,7 +631,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip fixstr") {
@@ -637,7 +640,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip str 8") {
@@ -659,7 +662,7 @@ TEST_CASE("deserializeMsgPack() filter") {
             doc, "\x82\xA7onlyarr\xdb\x00\x00\x00\x05hello\xA7include\x2A",
             filterOpt);
 
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip fixmap") {
@@ -669,7 +672,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip map 16") {
@@ -681,7 +684,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
 
       SECTION("skip map 32") {
@@ -695,7 +698,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
         CHECK(error == DeserializationError::Ok);
         CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
-        CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+        CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
       }
     }
   }
@@ -744,7 +747,8 @@ TEST_CASE("deserializeMsgPack() filter") {
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() ==
             "{\"onlyobj\":{\"measure\":2},\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + sizeofObject(1) + 24);
+      CHECK(doc.memoryUsage() ==
+            sizeofObject(2) + sizeofObject(1) + 3 * sizeofString(7));
     }
 
     SECTION("include map 16") {
@@ -757,7 +761,8 @@ TEST_CASE("deserializeMsgPack() filter") {
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() ==
             "{\"onlyobj\":{\"measure\":2},\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + sizeofObject(1) + 24);
+      CHECK(doc.memoryUsage() ==
+            sizeofObject(2) + sizeofObject(1) + 3 * sizeofString(7));
     }
 
     SECTION("include map 32") {
@@ -771,7 +776,8 @@ TEST_CASE("deserializeMsgPack() filter") {
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() ==
             "{\"onlyobj\":{\"measure\":2},\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + sizeofObject(1) + 24);
+      CHECK(doc.memoryUsage() ==
+            sizeofObject(2) + sizeofObject(1) + 3 * sizeofString(7));
     }
 
     SECTION("skip null") {
@@ -780,7 +786,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip false") {
@@ -789,7 +795,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip true") {
@@ -798,7 +804,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip positive fixint") {
@@ -807,7 +813,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip negative fixint") {
@@ -816,7 +822,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip uint 8") {
@@ -825,7 +831,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip uint 16") {
@@ -834,7 +840,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip uint 32") {
@@ -843,7 +849,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip uint 64") {
@@ -854,7 +860,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip int 8") {
@@ -863,7 +869,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip int 16") {
@@ -872,7 +878,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip int 32") {
@@ -881,7 +887,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip int 64") {
@@ -892,7 +898,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip float 32") {
@@ -901,7 +907,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip float 64") {
@@ -912,7 +918,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip fixstr") {
@@ -921,7 +927,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip str 8") {
@@ -943,7 +949,7 @@ TEST_CASE("deserializeMsgPack() filter") {
           doc, "\x82\xA7onlyobj\xdb\x00\x00\x00\x05hello\xA7include\x2A",
           filterOpt);
 
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip fixarray") {
@@ -952,7 +958,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip array 16") {
@@ -963,7 +969,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
 
     SECTION("skip array 32") {
@@ -975,7 +981,7 @@ TEST_CASE("deserializeMsgPack() filter") {
 
       CHECK(error == DeserializationError::Ok);
       CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
-      CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
+      CHECK(doc.memoryUsage() == sizeofObject(2) + 2 * sizeofString(7));
     }
   }