compare.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  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. DynamicJsonDocument doc1, doc2, doc3;
  140. JsonVariant variant1 = doc1.to<JsonVariant>();
  141. JsonVariant variant2 = doc2.to<JsonVariant>();
  142. JsonVariant variant3 = doc3.to<JsonVariant>();
  143. SECTION("IntegerInVariant") {
  144. variant1.set(42);
  145. variant2.set(42);
  146. variant3.set(666);
  147. REQUIRE(variant1 == variant2);
  148. REQUIRE_FALSE(variant1 != variant2);
  149. REQUIRE(variant1 != variant3);
  150. REQUIRE_FALSE(variant1 == variant3);
  151. }
  152. SECTION("StringInVariant") {
  153. variant1.set("0hello" + 1); // make sure they have
  154. variant2.set("1hello" + 1); // different addresses
  155. variant3.set("world");
  156. REQUIRE(variant1 == variant2);
  157. REQUIRE_FALSE(variant1 != variant2);
  158. REQUIRE(variant1 != variant3);
  159. REQUIRE_FALSE(variant1 == variant3);
  160. }
  161. SECTION("DoubleInVariant") {
  162. variant1.set(42.0);
  163. variant2.set(42.0);
  164. variant3.set(666.0);
  165. REQUIRE(variant1 == variant2);
  166. REQUIRE_FALSE(variant1 != variant2);
  167. REQUIRE(variant1 != variant3);
  168. REQUIRE_FALSE(variant1 == variant3);
  169. }
  170. SECTION("BoolInVariant") {
  171. variant1.set(true);
  172. variant2.set(true);
  173. variant3.set(false);
  174. REQUIRE(variant1 == variant2);
  175. REQUIRE_FALSE(variant1 != variant2);
  176. REQUIRE(variant1 != variant3);
  177. REQUIRE_FALSE(variant1 == variant3);
  178. }
  179. SECTION("ArrayInVariant") {
  180. DynamicJsonDocument docArr1, docArr2;
  181. JsonArray array1 = docArr1.to<JsonArray>();
  182. JsonArray array2 = docArr2.to<JsonArray>();
  183. variant1.set(array1);
  184. variant2.set(array1);
  185. variant3.set(array2);
  186. REQUIRE(variant1 == variant2);
  187. REQUIRE_FALSE(variant1 != variant2);
  188. REQUIRE(variant1 != variant3);
  189. REQUIRE_FALSE(variant1 == variant3);
  190. }
  191. SECTION("ObjectInVariant") {
  192. DynamicJsonDocument docObj1, docObj2;
  193. JsonObject obj1 = docObj1.to<JsonObject>();
  194. JsonObject obj2 = docObj2.to<JsonObject>();
  195. variant1.set(obj1);
  196. variant2.set(obj1);
  197. variant3.set(obj2);
  198. REQUIRE(variant1 == variant2);
  199. REQUIRE_FALSE(variant1 != variant2);
  200. REQUIRE(variant1 != variant3);
  201. REQUIRE_FALSE(variant1 == variant3);
  202. }
  203. // SECTION("VariantsOfDifferentTypes") {
  204. // DynamicJsonDocument doc1;
  205. // JsonObject obj = doc1.to<JsonObject>();
  206. // DynamicJsonDocument doc2;
  207. // JsonArray arr = doc2.to<JsonArray>();
  208. // JsonVariant variants[] = {
  209. // true, 42, 666.667, "hello", arr, obj,
  210. // };
  211. // size_t n = sizeof(variants) / sizeof(variants[0]);
  212. // for (size_t i = 0; i < n; i++) {
  213. // for (size_t j = i + 1; j < n; j++) {
  214. // REQUIRE(variants[i] != variants[j]);
  215. // REQUIRE_FALSE(variants[i] == variants[j]);
  216. // }
  217. // }
  218. // }
  219. }