compare.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. // ArduinoJson - arduinojson.org
  2. // Copyright Benoit Blanchon 2014-2018
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. static const char* null = 0;
  7. template <typename T>
  8. void checkEquals(T a, T b) {
  9. DynamicJsonDocument doc;
  10. JsonVariant variant = doc.to<JsonVariant>();
  11. variant.set(a);
  12. REQUIRE(b == variant);
  13. REQUIRE(variant == b);
  14. REQUIRE(b <= variant);
  15. REQUIRE(variant <= b);
  16. REQUIRE(b >= variant);
  17. REQUIRE(variant >= b);
  18. REQUIRE_FALSE(b != variant);
  19. REQUIRE_FALSE(variant != b);
  20. REQUIRE_FALSE(b > variant);
  21. REQUIRE_FALSE(variant > b);
  22. REQUIRE_FALSE(b < variant);
  23. REQUIRE_FALSE(variant < b);
  24. }
  25. template <typename T>
  26. void checkGreater(T a, T b) {
  27. DynamicJsonDocument doc;
  28. JsonVariant variant = doc.to<JsonVariant>();
  29. variant.set(a);
  30. REQUIRE(variant > b);
  31. REQUIRE(b < variant);
  32. REQUIRE(variant != b);
  33. REQUIRE(b != variant);
  34. REQUIRE_FALSE(variant < b);
  35. REQUIRE_FALSE(b > variant);
  36. REQUIRE_FALSE(variant == b);
  37. REQUIRE_FALSE(b == variant);
  38. }
  39. template <typename T>
  40. void checkLower(T a, T b) {
  41. DynamicJsonDocument doc;
  42. JsonVariant variant = doc.to<JsonVariant>();
  43. variant.set(a);
  44. REQUIRE(variant < b);
  45. REQUIRE(b > variant);
  46. REQUIRE(variant != b);
  47. REQUIRE(b != variant);
  48. REQUIRE_FALSE(variant > b);
  49. REQUIRE_FALSE(b < variant);
  50. REQUIRE_FALSE(variant == b);
  51. REQUIRE_FALSE(b == variant);
  52. }
  53. template <typename T>
  54. void checkComparisons(T low, T mid, T high) {
  55. checkEquals(mid, mid);
  56. checkGreater(mid, low);
  57. checkLower(mid, high);
  58. }
  59. TEST_CASE("JsonVariant comparisons") {
  60. SECTION("Double") {
  61. checkComparisons<double>(123.44, 123.45, 123.46);
  62. }
  63. SECTION("Float") {
  64. checkComparisons<float>(123.44f, 123.45f, 123.46f);
  65. }
  66. SECTION("SChar") {
  67. checkComparisons<signed char>(122, 123, 124);
  68. }
  69. SECTION("SInt") {
  70. checkComparisons<signed int>(122, 123, 124);
  71. }
  72. SECTION("SLong") {
  73. checkComparisons<signed long>(122L, 123L, 124L);
  74. }
  75. SECTION("SShort") {
  76. checkComparisons<signed short>(122, 123, 124);
  77. }
  78. SECTION("UChar") {
  79. checkComparisons<unsigned char>(122, 123, 124);
  80. }
  81. SECTION("UInt") {
  82. checkComparisons<unsigned int>(122, 123, 124);
  83. }
  84. SECTION("ULong") {
  85. checkComparisons<unsigned long>(122L, 123L, 124L);
  86. }
  87. SECTION("UShort") {
  88. checkComparisons<unsigned short>(122, 123, 124);
  89. }
  90. SECTION("null") {
  91. DynamicJsonDocument doc;
  92. JsonVariant variant = doc.to<JsonVariant>();
  93. variant.set(null);
  94. REQUIRE(variant == variant);
  95. REQUIRE_FALSE(variant != variant);
  96. REQUIRE(variant == null);
  97. REQUIRE_FALSE(variant != null);
  98. REQUIRE(variant != "null");
  99. REQUIRE_FALSE(variant == "null");
  100. }
  101. SECTION("StringLiteral") {
  102. DynamicJsonDocument doc;
  103. deserializeJson(doc, "\"hello\"");
  104. JsonVariant variant = doc.as<JsonVariant>();
  105. REQUIRE(variant == variant);
  106. REQUIRE_FALSE(variant != variant);
  107. REQUIRE(variant == "hello");
  108. REQUIRE_FALSE(variant != "hello");
  109. REQUIRE(variant != "world");
  110. REQUIRE_FALSE(variant == "world");
  111. REQUIRE(variant != null);
  112. REQUIRE_FALSE(variant == null);
  113. REQUIRE("hello" == variant);
  114. REQUIRE_FALSE("hello" != variant);
  115. REQUIRE("world" != variant);
  116. REQUIRE_FALSE("world" == variant);
  117. REQUIRE(null != variant);
  118. REQUIRE_FALSE(null == variant);
  119. }
  120. SECTION("String") {
  121. DynamicJsonDocument doc;
  122. JsonVariant variant = doc.to<JsonVariant>();
  123. variant.set("hello");
  124. REQUIRE(variant == variant);
  125. REQUIRE_FALSE(variant != variant);
  126. REQUIRE(variant == std::string("hello"));
  127. REQUIRE_FALSE(variant != std::string("hello"));
  128. REQUIRE(variant != std::string("world"));
  129. REQUIRE_FALSE(variant == std::string("world"));
  130. REQUIRE(variant != null);
  131. REQUIRE_FALSE(variant == null);
  132. REQUIRE(std::string("hello") == variant);
  133. REQUIRE_FALSE(std::string("hello") != variant);
  134. REQUIRE(std::string("world") != variant);
  135. REQUIRE_FALSE(std::string("world") == variant);
  136. REQUIRE(null != variant);
  137. REQUIRE_FALSE(null == variant);
  138. }
  139. #ifdef HAS_VARIABLE_LENGTH_ARRAY
  140. SECTION("VLA equals") {
  141. int i = 16;
  142. char vla[i];
  143. strcpy(vla, "hello");
  144. DynamicJsonDocument doc;
  145. JsonVariant variant = doc.to<JsonVariant>();
  146. variant.set("hello");
  147. REQUIRE((vla == variant));
  148. REQUIRE((variant == vla));
  149. REQUIRE_FALSE((vla != variant));
  150. REQUIRE_FALSE((variant != vla));
  151. }
  152. SECTION("VLA differs") {
  153. int i = 16;
  154. char vla[i];
  155. strcpy(vla, "hello");
  156. DynamicJsonDocument doc;
  157. JsonVariant variant = doc.to<JsonVariant>();
  158. variant.set("world");
  159. REQUIRE((vla != variant));
  160. REQUIRE((variant != vla));
  161. REQUIRE_FALSE((vla == variant));
  162. REQUIRE_FALSE((variant == vla));
  163. }
  164. #endif
  165. DynamicJsonDocument doc1, doc2, doc3;
  166. JsonVariant variant1 = doc1.to<JsonVariant>();
  167. JsonVariant variant2 = doc2.to<JsonVariant>();
  168. JsonVariant variant3 = doc3.to<JsonVariant>();
  169. SECTION("IntegerInVariant") {
  170. variant1.set(42);
  171. variant2.set(42);
  172. variant3.set(666);
  173. REQUIRE(variant1 == variant2);
  174. REQUIRE_FALSE(variant1 != variant2);
  175. REQUIRE(variant1 != variant3);
  176. REQUIRE_FALSE(variant1 == variant3);
  177. }
  178. SECTION("StringInVariant") {
  179. variant1.set("0hello" + 1); // make sure they have
  180. variant2.set("1hello" + 1); // different addresses
  181. variant3.set("world");
  182. REQUIRE(variant1 == variant2);
  183. REQUIRE_FALSE(variant1 != variant2);
  184. REQUIRE(variant1 != variant3);
  185. REQUIRE_FALSE(variant1 == variant3);
  186. }
  187. SECTION("DoubleInVariant") {
  188. variant1.set(42.0);
  189. variant2.set(42.0);
  190. variant3.set(666.0);
  191. REQUIRE(variant1 == variant2);
  192. REQUIRE_FALSE(variant1 != variant2);
  193. REQUIRE(variant1 != variant3);
  194. REQUIRE_FALSE(variant1 == variant3);
  195. }
  196. SECTION("BoolInVariant") {
  197. variant1.set(true);
  198. variant2.set(true);
  199. variant3.set(false);
  200. REQUIRE(variant1 == variant2);
  201. REQUIRE_FALSE(variant1 != variant2);
  202. REQUIRE(variant1 != variant3);
  203. REQUIRE_FALSE(variant1 == variant3);
  204. }
  205. SECTION("ArrayInVariant") {
  206. DynamicJsonDocument docArr1, docArr2;
  207. JsonArray array1 = docArr1.to<JsonArray>();
  208. JsonArray array2 = docArr2.to<JsonArray>();
  209. variant1.set(array1);
  210. variant2.set(array1);
  211. variant3.set(array2);
  212. REQUIRE(variant1 == variant2);
  213. REQUIRE_FALSE(variant1 != variant2);
  214. REQUIRE(variant1 != variant3);
  215. REQUIRE_FALSE(variant1 == variant3);
  216. }
  217. SECTION("ObjectInVariant") {
  218. DynamicJsonDocument docObj1, docObj2;
  219. JsonObject obj1 = docObj1.to<JsonObject>();
  220. JsonObject obj2 = docObj2.to<JsonObject>();
  221. variant1.set(obj1);
  222. variant2.set(obj1);
  223. variant3.set(obj2);
  224. REQUIRE(variant1 == variant2);
  225. REQUIRE_FALSE(variant1 != variant2);
  226. REQUIRE(variant1 != variant3);
  227. REQUIRE_FALSE(variant1 == variant3);
  228. }
  229. // SECTION("VariantsOfDifferentTypes") {
  230. // DynamicJsonDocument doc1;
  231. // JsonObject obj = doc1.to<JsonObject>();
  232. // DynamicJsonDocument doc2;
  233. // JsonArray arr = doc2.to<JsonArray>();
  234. // JsonVariant variants[] = {
  235. // true, 42, 666.667, "hello", arr, obj,
  236. // };
  237. // size_t n = sizeof(variants) / sizeof(variants[0]);
  238. // for (size_t i = 0; i < n; i++) {
  239. // for (size_t j = i + 1; j < n; j++) {
  240. // REQUIRE(variants[i] != variants[j]);
  241. // REQUIRE_FALSE(variants[i] == variants[j]);
  242. // }
  243. // }
  244. // }
  245. }