add.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2025, Benoit BLANCHON
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <stdint.h>
  6. #include <catch.hpp>
  7. #include "Allocators.hpp"
  8. #include "Literals.hpp"
  9. TEST_CASE("JsonVariant::add(T)") {
  10. JsonDocument doc;
  11. JsonVariant var = doc.to<JsonVariant>();
  12. SECTION("add integer to new variant") {
  13. var.add(42);
  14. REQUIRE(var.as<std::string>() == "[42]");
  15. }
  16. SECTION("add const char* to new variant") {
  17. var.add("hello");
  18. REQUIRE(var.as<std::string>() == "[\"hello\"]");
  19. }
  20. SECTION("add std::string to new variant") {
  21. var.add("hello"_s);
  22. REQUIRE(var.as<std::string>() == "[\"hello\"]");
  23. }
  24. SECTION("add integer to integer") {
  25. var.set(123);
  26. var.add(456); // no-op
  27. REQUIRE(var.as<std::string>() == "123");
  28. }
  29. SECTION("add integer to object") {
  30. var["val"] = 123;
  31. var.add(456); // no-op
  32. REQUIRE(var.as<std::string>() == "{\"val\":123}");
  33. }
  34. #ifdef HAS_VARIABLE_LENGTH_ARRAY
  35. SECTION("supports VLAs") {
  36. size_t i = 16;
  37. char vla[i];
  38. strcpy(vla, "hello");
  39. var.add(vla);
  40. REQUIRE(var.as<std::string>() == "[\"hello\"]");
  41. }
  42. #endif
  43. }
  44. TEST_CASE("JsonVariant::add<T>()") {
  45. JsonDocument doc;
  46. JsonVariant var = doc.to<JsonVariant>();
  47. SECTION("JsonArray") {
  48. JsonArray array = var.add<JsonArray>();
  49. array.add(1);
  50. array.add(2);
  51. REQUIRE(doc.as<std::string>() == "[[1,2]]");
  52. }
  53. SECTION("JsonVariant") {
  54. JsonVariant variant = var.add<JsonVariant>();
  55. variant.set(42);
  56. REQUIRE(doc.as<std::string>() == "[42]");
  57. }
  58. }
  59. TEST_CASE("JsonObject::add(JsonObject) ") {
  60. JsonDocument doc1;
  61. doc1["hello"_s] = "world"_s;
  62. TimebombAllocator allocator(10);
  63. SpyingAllocator spy(&allocator);
  64. JsonDocument doc2(&spy);
  65. JsonVariant variant = doc2.to<JsonVariant>();
  66. SECTION("success") {
  67. bool result = variant.add(doc1.as<JsonObject>());
  68. REQUIRE(result == true);
  69. REQUIRE(doc2.as<std::string>() == "[{\"hello\":\"world\"}]");
  70. REQUIRE(spy.log() == AllocatorLog{
  71. Allocate(sizeofPool()),
  72. Allocate(sizeofString("hello")),
  73. Allocate(sizeofString("world")),
  74. });
  75. }
  76. SECTION("partial failure") { // issue #2081
  77. allocator.setCountdown(2);
  78. bool result = variant.add(doc1.as<JsonObject>());
  79. REQUIRE(result == false);
  80. REQUIRE(doc2.as<std::string>() == "[]");
  81. REQUIRE(spy.log() == AllocatorLog{
  82. Allocate(sizeofPool()),
  83. Allocate(sizeofString("hello")),
  84. AllocateFail(sizeofString("world")),
  85. Deallocate(sizeofString("hello")),
  86. });
  87. }
  88. SECTION("complete failure") {
  89. allocator.setCountdown(0);
  90. bool result = variant.add(doc1.as<JsonObject>());
  91. REQUIRE(result == false);
  92. REQUIRE(doc2.as<std::string>() == "[]");
  93. REQUIRE(spy.log() == AllocatorLog{
  94. AllocateFail(sizeofPool()),
  95. });
  96. }
  97. }