TypeTraits.cpp 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2022, Benoit BLANCHON
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. using namespace ARDUINOJSON_NAMESPACE;
  7. class EmptyClass {};
  8. enum EmptyEnum {};
  9. TEST_CASE("Polyfills/type_traits") {
  10. SECTION("is_base_of") {
  11. REQUIRE_FALSE(
  12. static_cast<bool>(is_base_of<std::istream, std::ostringstream>::value));
  13. REQUIRE(
  14. static_cast<bool>(is_base_of<std::istream, std::istringstream>::value));
  15. }
  16. SECTION("is_array") {
  17. REQUIRE_FALSE((is_array<const char*>::value));
  18. REQUIRE((is_array<const char[]>::value));
  19. REQUIRE((is_array<const char[10]>::value));
  20. }
  21. SECTION("is_const") {
  22. CHECK(is_const<char>::value == false);
  23. CHECK(is_const<const char>::value == true);
  24. }
  25. SECTION("is_integral") {
  26. CHECK(is_integral<double>::value == false);
  27. CHECK(is_integral<float>::value == false);
  28. CHECK(is_integral<const double>::value == false);
  29. CHECK(is_integral<const float>::value == false);
  30. CHECK(is_integral<volatile double>::value == false);
  31. CHECK(is_integral<volatile float>::value == false);
  32. CHECK(is_integral<const volatile double>::value == false);
  33. CHECK(is_integral<const volatile float>::value == false);
  34. CHECK(is_integral<bool>::value == true);
  35. CHECK(is_integral<char>::value == true);
  36. CHECK(is_integral<signed char>::value == true);
  37. CHECK(is_integral<signed int>::value == true);
  38. CHECK(is_integral<signed long>::value == true);
  39. CHECK(is_integral<signed short>::value == true);
  40. CHECK(is_integral<unsigned char>::value == true);
  41. CHECK(is_integral<unsigned int>::value == true);
  42. CHECK(is_integral<unsigned long>::value == true);
  43. CHECK(is_integral<unsigned short>::value == true);
  44. CHECK(is_integral<const bool>::value == true);
  45. CHECK(is_integral<const char>::value == true);
  46. CHECK(is_integral<const signed char>::value == true);
  47. CHECK(is_integral<const signed int>::value == true);
  48. CHECK(is_integral<const signed long>::value == true);
  49. CHECK(is_integral<const signed short>::value == true);
  50. CHECK(is_integral<const unsigned char>::value == true);
  51. CHECK(is_integral<const unsigned int>::value == true);
  52. CHECK(is_integral<const unsigned long>::value == true);
  53. CHECK(is_integral<const unsigned short>::value == true);
  54. CHECK(is_integral<volatile bool>::value == true);
  55. CHECK(is_integral<volatile char>::value == true);
  56. CHECK(is_integral<volatile signed char>::value == true);
  57. CHECK(is_integral<volatile signed int>::value == true);
  58. CHECK(is_integral<volatile signed long>::value == true);
  59. CHECK(is_integral<volatile signed short>::value == true);
  60. CHECK(is_integral<volatile unsigned char>::value == true);
  61. CHECK(is_integral<volatile unsigned int>::value == true);
  62. CHECK(is_integral<volatile unsigned long>::value == true);
  63. CHECK(is_integral<volatile unsigned short>::value == true);
  64. CHECK(is_integral<const volatile bool>::value == true);
  65. CHECK(is_integral<const volatile char>::value == true);
  66. CHECK(is_integral<const volatile signed char>::value == true);
  67. CHECK(is_integral<const volatile signed int>::value == true);
  68. CHECK(is_integral<const volatile signed long>::value == true);
  69. CHECK(is_integral<const volatile signed short>::value == true);
  70. CHECK(is_integral<const volatile unsigned char>::value == true);
  71. CHECK(is_integral<const volatile unsigned int>::value == true);
  72. CHECK(is_integral<const volatile unsigned long>::value == true);
  73. CHECK(is_integral<const volatile unsigned short>::value == true);
  74. CHECK(is_integral<JsonUInt>::value == true);
  75. }
  76. SECTION("is_signed") {
  77. CHECK(is_signed<char>::value == true);
  78. CHECK(is_signed<signed char>::value == true);
  79. CHECK(is_signed<signed int>::value == true);
  80. CHECK(is_signed<signed short>::value == true);
  81. CHECK(is_signed<signed long>::value == true);
  82. CHECK(is_signed<float>::value == true);
  83. CHECK(is_signed<double>::value == true);
  84. CHECK(is_signed<bool>::value == false);
  85. CHECK(is_signed<const char>::value == true);
  86. CHECK(is_signed<const signed char>::value == true);
  87. CHECK(is_signed<const signed int>::value == true);
  88. CHECK(is_signed<const signed short>::value == true);
  89. CHECK(is_signed<const signed long>::value == true);
  90. CHECK(is_signed<const float>::value == true);
  91. CHECK(is_signed<const double>::value == true);
  92. CHECK(is_signed<const bool>::value == false);
  93. CHECK(is_signed<volatile char>::value == true);
  94. CHECK(is_signed<volatile signed char>::value == true);
  95. CHECK(is_signed<volatile signed int>::value == true);
  96. CHECK(is_signed<volatile signed short>::value == true);
  97. CHECK(is_signed<volatile signed long>::value == true);
  98. CHECK(is_signed<volatile float>::value == true);
  99. CHECK(is_signed<volatile double>::value == true);
  100. CHECK(is_signed<volatile bool>::value == false);
  101. CHECK(is_signed<const volatile char>::value == true);
  102. CHECK(is_signed<const volatile signed char>::value == true);
  103. CHECK(is_signed<const volatile signed int>::value == true);
  104. CHECK(is_signed<const volatile signed short>::value == true);
  105. CHECK(is_signed<const volatile signed long>::value == true);
  106. CHECK(is_signed<const volatile float>::value == true);
  107. CHECK(is_signed<const volatile double>::value == true);
  108. CHECK(is_signed<const volatile bool>::value == false);
  109. }
  110. SECTION("is_unsigned") {
  111. CHECK(is_unsigned<unsigned char>::value == true);
  112. CHECK(is_unsigned<unsigned int>::value == true);
  113. CHECK(is_unsigned<unsigned short>::value == true);
  114. CHECK(is_unsigned<unsigned long>::value == true);
  115. CHECK(is_unsigned<bool>::value == true);
  116. CHECK(is_unsigned<char>::value == false);
  117. CHECK(is_unsigned<float>::value == false);
  118. CHECK(is_unsigned<double>::value == false);
  119. CHECK(is_unsigned<const unsigned char>::value == true);
  120. CHECK(is_unsigned<const unsigned int>::value == true);
  121. CHECK(is_unsigned<const unsigned short>::value == true);
  122. CHECK(is_unsigned<const unsigned long>::value == true);
  123. CHECK(is_unsigned<const bool>::value == true);
  124. CHECK(is_unsigned<const char>::value == false);
  125. CHECK(is_unsigned<const float>::value == false);
  126. CHECK(is_unsigned<const double>::value == false);
  127. CHECK(is_unsigned<volatile unsigned char>::value == true);
  128. CHECK(is_unsigned<volatile unsigned int>::value == true);
  129. CHECK(is_unsigned<volatile unsigned short>::value == true);
  130. CHECK(is_unsigned<volatile unsigned long>::value == true);
  131. CHECK(is_unsigned<volatile bool>::value == true);
  132. CHECK(is_unsigned<volatile char>::value == false);
  133. CHECK(is_unsigned<volatile float>::value == false);
  134. CHECK(is_unsigned<volatile double>::value == false);
  135. CHECK(is_unsigned<const volatile unsigned char>::value == true);
  136. CHECK(is_unsigned<const volatile unsigned int>::value == true);
  137. CHECK(is_unsigned<const volatile unsigned short>::value == true);
  138. CHECK(is_unsigned<const volatile unsigned long>::value == true);
  139. CHECK(is_unsigned<const volatile bool>::value == true);
  140. CHECK(is_unsigned<const volatile char>::value == false);
  141. CHECK(is_unsigned<const volatile float>::value == false);
  142. CHECK(is_unsigned<const volatile double>::value == false);
  143. }
  144. SECTION("is_floating_point") {
  145. CHECK(is_floating_point<int>::value == false);
  146. CHECK(is_floating_point<float>::value == true);
  147. CHECK(is_floating_point<double>::value == true);
  148. CHECK(is_floating_point<const float>::value == true);
  149. CHECK(is_floating_point<const double>::value == true);
  150. CHECK(is_floating_point<volatile float>::value == true);
  151. CHECK(is_floating_point<volatile double>::value == true);
  152. CHECK(is_floating_point<const volatile float>::value == true);
  153. CHECK(is_floating_point<const volatile double>::value == true);
  154. }
  155. SECTION("is_convertible") {
  156. CHECK((is_convertible<short, int>::value == true));
  157. CHECK((is_convertible<int, int>::value == true));
  158. CHECK((is_convertible<EmptyEnum, int>::value == true));
  159. CHECK((is_convertible<int*, int>::value == false));
  160. CHECK((is_convertible<EmptyClass, int>::value == false));
  161. CHECK((is_convertible<DeserializationError, JsonVariantConst>::value ==
  162. false));
  163. CHECK((is_convertible<JsonPair, JsonVariantConst>::value == false));
  164. CHECK((is_convertible<JsonVariant, JsonVariantConst>::value == true));
  165. CHECK((is_convertible<JsonVariantConst, JsonVariantConst>::value == true));
  166. CHECK((is_convertible<JsonArray, JsonVariantConst>::value == true));
  167. CHECK((is_convertible<ElementProxy<JsonArray>, JsonVariantConst>::value ==
  168. true));
  169. CHECK((is_convertible<JsonArrayConst, JsonVariantConst>::value == true));
  170. CHECK((is_convertible<JsonObject, JsonVariantConst>::value == true));
  171. CHECK((is_convertible<MemberProxy<JsonObject, const char*>,
  172. JsonVariantConst>::value == true));
  173. CHECK((is_convertible<JsonObjectConst, JsonVariantConst>::value == true));
  174. CHECK(
  175. (is_convertible<DynamicJsonDocument, JsonVariantConst>::value == true));
  176. CHECK((is_convertible<StaticJsonDocument<10>, JsonVariantConst>::value ==
  177. true));
  178. }
  179. SECTION("is_class") {
  180. CHECK((is_class<int>::value == false));
  181. CHECK((is_class<EmptyEnum>::value == false));
  182. CHECK((is_class<int*>::value == false));
  183. CHECK((is_class<EmptyClass>::value == true));
  184. }
  185. SECTION("is_enum") {
  186. CHECK(is_enum<int>::value == false);
  187. CHECK(is_enum<EmptyEnum>::value == true);
  188. CHECK(is_enum<int*>::value == false);
  189. CHECK(is_enum<EmptyClass>::value == false);
  190. CHECK(is_enum<bool>::value == false);
  191. CHECK(is_enum<double>::value == false);
  192. }
  193. }