compare.cpp 6.0 KB

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