deserializeStaticVariant.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. // ArduinoJson - arduinojson.org
  2. // Copyright Benoit Blanchon 2014-2018
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. static const size_t epsilon = sizeof(void*);
  7. template <size_t Capacity>
  8. static void check(const char* input, DeserializationError expected) {
  9. StaticJsonDocument<Capacity> variant;
  10. DeserializationError error = deserializeMsgPack(variant, input);
  11. REQUIRE(error == expected);
  12. }
  13. TEST_CASE("deserializeMsgPack(StaticJsonDocument&)") {
  14. SECTION("single values always fit") {
  15. check<0>("\xc0", DeserializationError::Ok); // nil
  16. check<0>("\xc2", DeserializationError::Ok); // false
  17. check<0>("\xc3", DeserializationError::Ok); // true
  18. check<0>("\xcc\x00", DeserializationError::Ok); // uint 8
  19. check<0>("\xcd\x30\x39", DeserializationError::Ok); // uint 16
  20. check<0>("\xCE\x12\x34\x56\x78", DeserializationError::Ok); // uint 32
  21. }
  22. SECTION("fixstr") {
  23. check<0>("\xA0", DeserializationError::Ok);
  24. check<0>("\xA1H", DeserializationError::NoMemory);
  25. check<4>("\xA1H", DeserializationError::Ok);
  26. check<4>("\xA5Hello", DeserializationError::NoMemory);
  27. }
  28. SECTION("str 8") {
  29. check<0>("\xD9\x00", DeserializationError::Ok);
  30. check<0>("\xD9\x01H", DeserializationError::NoMemory);
  31. check<4>("\xD9\x01H", DeserializationError::Ok);
  32. check<4>("\xD9\x05Hello", DeserializationError::NoMemory);
  33. }
  34. SECTION("str 16") {
  35. check<0>("\xDA\x00\x00", DeserializationError::Ok);
  36. check<0>("\xDA\x00\x01H", DeserializationError::NoMemory);
  37. check<4>("\xDA\x00\x01H", DeserializationError::Ok);
  38. check<4>("\xDA\x00\x05Hello", DeserializationError::NoMemory);
  39. }
  40. SECTION("str 32") {
  41. check<0>("\xDB\x00\x00\x00\x00", DeserializationError::Ok);
  42. check<0>("\xDB\x00\x00\x00\x01H", DeserializationError::NoMemory);
  43. check<4>("\xDB\x00\x00\x00\x01H", DeserializationError::Ok);
  44. check<4>("\xDB\x00\x00\x00\x05Hello", DeserializationError::NoMemory);
  45. }
  46. SECTION("fixarray") {
  47. check<JSON_ARRAY_SIZE(0)>("\x90", DeserializationError::Ok); // []
  48. check<JSON_ARRAY_SIZE(0)>("\x91\x01",
  49. DeserializationError::NoMemory); // [1]
  50. check<JSON_ARRAY_SIZE(1)>("\x91\x01", DeserializationError::Ok); // [1]
  51. check<JSON_ARRAY_SIZE(1)>("\x92\x01\x02",
  52. DeserializationError::NoMemory); // [1,2]
  53. }
  54. SECTION("array 16") {
  55. check<JSON_ARRAY_SIZE(0)>("\xDC\x00\x00", DeserializationError::Ok);
  56. check<JSON_ARRAY_SIZE(0)>("\xDC\x00\x01\x01",
  57. DeserializationError::NoMemory);
  58. check<JSON_ARRAY_SIZE(1)>("\xDC\x00\x01\x01", DeserializationError::Ok);
  59. check<JSON_ARRAY_SIZE(1)>("\xDC\x00\x02\x01\x02",
  60. DeserializationError::NoMemory);
  61. }
  62. SECTION("array 32") {
  63. check<JSON_ARRAY_SIZE(0)>("\xDD\x00\x00\x00\x00", DeserializationError::Ok);
  64. check<JSON_ARRAY_SIZE(0)>("\xDD\x00\x00\x00\x01\x01",
  65. DeserializationError::NoMemory);
  66. check<JSON_ARRAY_SIZE(1)>("\xDD\x00\x00\x00\x01\x01",
  67. DeserializationError::Ok);
  68. check<JSON_ARRAY_SIZE(1)>("\xDD\x00\x00\x00\x02\x01\x02",
  69. DeserializationError::NoMemory);
  70. }
  71. SECTION("fixmap") {
  72. SECTION("{}") {
  73. check<JSON_OBJECT_SIZE(0)>("\x80", DeserializationError::Ok);
  74. }
  75. SECTION("{H:1}") {
  76. check<JSON_OBJECT_SIZE(0)>("\x81\xA1H\x01",
  77. DeserializationError::NoMemory);
  78. check<JSON_OBJECT_SIZE(1) + epsilon>("\x81\xA1H\x01",
  79. DeserializationError::Ok);
  80. }
  81. SECTION("{H:1,W:2}") {
  82. check<JSON_OBJECT_SIZE(1) + epsilon>("\x82\xA1H\x01\xA1W\x02",
  83. DeserializationError::NoMemory);
  84. check<JSON_OBJECT_SIZE(2) + 2 * epsilon>("\x82\xA1H\x01\xA1W\x02",
  85. DeserializationError::Ok);
  86. }
  87. }
  88. SECTION("map 16") {
  89. SECTION("{}") {
  90. check<JSON_OBJECT_SIZE(0)>("\xDE\x00\x00", DeserializationError::Ok);
  91. }
  92. SECTION("{H:1}") {
  93. check<JSON_OBJECT_SIZE(0)>("\xDE\x00\x01\xA1H\x01",
  94. DeserializationError::NoMemory);
  95. check<JSON_OBJECT_SIZE(1) + epsilon>("\xDE\x00\x01\xA1H\x01",
  96. DeserializationError::Ok);
  97. }
  98. SECTION("{H:1,W:2}") {
  99. check<JSON_OBJECT_SIZE(1) + epsilon>("\xDE\x00\x02\xA1H\x01\xA1W\x02",
  100. DeserializationError::NoMemory);
  101. check<JSON_OBJECT_SIZE(2) + 2 * epsilon>("\xDE\x00\x02\xA1H\x01\xA1W\x02",
  102. DeserializationError::Ok);
  103. }
  104. }
  105. SECTION("map 32") {
  106. SECTION("{}") {
  107. check<JSON_OBJECT_SIZE(0)>("\xDF\x00\x00\x00\x00",
  108. DeserializationError::Ok);
  109. }
  110. SECTION("{H:1}") {
  111. check<JSON_OBJECT_SIZE(0)>("\xDF\x00\x00\x00\x01\xA1H\x01",
  112. DeserializationError::NoMemory);
  113. check<JSON_OBJECT_SIZE(1) + epsilon>("\xDF\x00\x00\x00\x01\xA1H\x01",
  114. DeserializationError::Ok);
  115. }
  116. SECTION("{H:1,W:2}") {
  117. check<JSON_OBJECT_SIZE(1) + epsilon>(
  118. "\xDF\x00\x00\x00\x02\xA1H\x01\xA1W\x02",
  119. DeserializationError::NoMemory);
  120. check<JSON_OBJECT_SIZE(2) + 2 * epsilon>(
  121. "\xDF\x00\x00\x00\x02\xA1H\x01\xA1W\x02", DeserializationError::Ok);
  122. }
  123. }
  124. }