add.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2024, 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. }
  35. TEST_CASE("JsonVariant::add<T>()") {
  36. JsonDocument doc;
  37. JsonVariant var = doc.to<JsonVariant>();
  38. SECTION("JsonArray") {
  39. JsonArray array = var.add<JsonArray>();
  40. array.add(1);
  41. array.add(2);
  42. REQUIRE(doc.as<std::string>() == "[[1,2]]");
  43. }
  44. SECTION("JsonVariant") {
  45. JsonVariant variant = var.add<JsonVariant>();
  46. variant.set(42);
  47. REQUIRE(doc.as<std::string>() == "[42]");
  48. }
  49. }
  50. TEST_CASE("JsonObject::add(JsonObject) ") {
  51. JsonDocument doc1;
  52. doc1["hello"_s] = "world"_s;
  53. TimebombAllocator allocator(10);
  54. SpyingAllocator spy(&allocator);
  55. JsonDocument doc2(&spy);
  56. JsonVariant variant = doc2.to<JsonVariant>();
  57. SECTION("success") {
  58. bool result = variant.add(doc1.as<JsonObject>());
  59. REQUIRE(result == true);
  60. REQUIRE(doc2.as<std::string>() == "[{\"hello\":\"world\"}]");
  61. REQUIRE(spy.log() == AllocatorLog{
  62. Allocate(sizeofPool()),
  63. Allocate(sizeofString("hello")),
  64. Allocate(sizeofString("world")),
  65. });
  66. }
  67. SECTION("partial failure") { // issue #2081
  68. allocator.setCountdown(2);
  69. bool result = variant.add(doc1.as<JsonObject>());
  70. REQUIRE(result == false);
  71. REQUIRE(doc2.as<std::string>() == "[]");
  72. REQUIRE(spy.log() == AllocatorLog{
  73. Allocate(sizeofPool()),
  74. Allocate(sizeofString("hello")),
  75. AllocateFail(sizeofString("world")),
  76. Deallocate(sizeofString("hello")),
  77. });
  78. }
  79. SECTION("complete failure") {
  80. allocator.setCountdown(0);
  81. bool result = variant.add(doc1.as<JsonObject>());
  82. REQUIRE(result == false);
  83. REQUIRE(doc2.as<std::string>() == "[]");
  84. REQUIRE(spy.log() == AllocatorLog{
  85. AllocateFail(sizeofPool()),
  86. });
  87. }
  88. }