nestingLimit.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2023, Benoit BLANCHON
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. #include <sstream>
  7. #define SHOULD_WORK(expression) REQUIRE(DeserializationError::Ok == expression);
  8. #define SHOULD_FAIL(expression) \
  9. REQUIRE(DeserializationError::TooDeep == expression);
  10. TEST_CASE("JsonDeserializer nesting") {
  11. DynamicJsonDocument doc(4096);
  12. SECTION("Input = const char*") {
  13. SECTION("limit = 0") {
  14. DeserializationOption::NestingLimit nesting(0);
  15. SHOULD_WORK(deserializeJson(doc, "\"toto\"", nesting));
  16. SHOULD_WORK(deserializeJson(doc, "123", nesting));
  17. SHOULD_WORK(deserializeJson(doc, "true", nesting));
  18. SHOULD_FAIL(deserializeJson(doc, "[]", nesting));
  19. SHOULD_FAIL(deserializeJson(doc, "{}", nesting));
  20. SHOULD_FAIL(deserializeJson(doc, "[\"toto\"]", nesting));
  21. SHOULD_FAIL(deserializeJson(doc, "{\"toto\":1}", nesting));
  22. }
  23. SECTION("limit = 1") {
  24. DeserializationOption::NestingLimit nesting(1);
  25. SHOULD_WORK(deserializeJson(doc, "[\"toto\"]", nesting));
  26. SHOULD_WORK(deserializeJson(doc, "{\"toto\":1}", nesting));
  27. SHOULD_FAIL(deserializeJson(doc, "{\"toto\":{}}", nesting));
  28. SHOULD_FAIL(deserializeJson(doc, "{\"toto\":[]}", nesting));
  29. SHOULD_FAIL(deserializeJson(doc, "[[\"toto\"]]", nesting));
  30. SHOULD_FAIL(deserializeJson(doc, "[{\"toto\":1}]", nesting));
  31. }
  32. }
  33. SECTION("char* and size_t") {
  34. SECTION("limit = 0") {
  35. DeserializationOption::NestingLimit nesting(0);
  36. SHOULD_WORK(deserializeJson(doc, "\"toto\"", 6, nesting));
  37. SHOULD_WORK(deserializeJson(doc, "123", 3, nesting));
  38. SHOULD_WORK(deserializeJson(doc, "true", 4, nesting));
  39. SHOULD_FAIL(deserializeJson(doc, "[]", 2, nesting));
  40. SHOULD_FAIL(deserializeJson(doc, "{}", 2, nesting));
  41. SHOULD_FAIL(deserializeJson(doc, "[\"toto\"]", 8, nesting));
  42. SHOULD_FAIL(deserializeJson(doc, "{\"toto\":1}", 10, nesting));
  43. }
  44. SECTION("limit = 1") {
  45. DeserializationOption::NestingLimit nesting(1);
  46. SHOULD_WORK(deserializeJson(doc, "[\"toto\"]", 8, nesting));
  47. SHOULD_WORK(deserializeJson(doc, "{\"toto\":1}", 10, nesting));
  48. SHOULD_FAIL(deserializeJson(doc, "{\"toto\":{}}", 11, nesting));
  49. SHOULD_FAIL(deserializeJson(doc, "{\"toto\":[]}", 11, nesting));
  50. SHOULD_FAIL(deserializeJson(doc, "[[\"toto\"]]", 10, nesting));
  51. SHOULD_FAIL(deserializeJson(doc, "[{\"toto\":1}]", 12, nesting));
  52. }
  53. }
  54. SECTION("Input = std::string") {
  55. SECTION("limit = 0") {
  56. DeserializationOption::NestingLimit nesting(0);
  57. SHOULD_WORK(deserializeJson(doc, std::string("\"toto\""), nesting));
  58. SHOULD_WORK(deserializeJson(doc, std::string("123"), nesting));
  59. SHOULD_WORK(deserializeJson(doc, std::string("true"), nesting));
  60. SHOULD_FAIL(deserializeJson(doc, std::string("[]"), nesting));
  61. SHOULD_FAIL(deserializeJson(doc, std::string("{}"), nesting));
  62. SHOULD_FAIL(deserializeJson(doc, std::string("[\"toto\"]"), nesting));
  63. SHOULD_FAIL(deserializeJson(doc, std::string("{\"toto\":1}"), nesting));
  64. }
  65. SECTION("limit = 1") {
  66. DeserializationOption::NestingLimit nesting(1);
  67. SHOULD_WORK(deserializeJson(doc, std::string("[\"toto\"]"), nesting));
  68. SHOULD_WORK(deserializeJson(doc, std::string("{\"toto\":1}"), nesting));
  69. SHOULD_FAIL(deserializeJson(doc, std::string("{\"toto\":{}}"), nesting));
  70. SHOULD_FAIL(deserializeJson(doc, std::string("{\"toto\":[]}"), nesting));
  71. SHOULD_FAIL(deserializeJson(doc, std::string("[[\"toto\"]]"), nesting));
  72. SHOULD_FAIL(deserializeJson(doc, std::string("[{\"toto\":1}]"), nesting));
  73. }
  74. }
  75. SECTION("Input = std::istream") {
  76. SECTION("limit = 0") {
  77. DeserializationOption::NestingLimit nesting(0);
  78. std::istringstream good("true");
  79. std::istringstream bad("[]");
  80. SHOULD_WORK(deserializeJson(doc, good, nesting));
  81. SHOULD_FAIL(deserializeJson(doc, bad, nesting));
  82. }
  83. SECTION("limit = 1") {
  84. DeserializationOption::NestingLimit nesting(1);
  85. std::istringstream good("[\"toto\"]");
  86. std::istringstream bad("{\"toto\":{}}");
  87. SHOULD_WORK(deserializeJson(doc, good, nesting));
  88. SHOULD_FAIL(deserializeJson(doc, bad, nesting));
  89. }
  90. }
  91. }