TypeTraits.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // ArduinoJson - arduinojson.org
  2. // Copyright Benoit Blanchon 2014-2020
  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<bool>::value == true);
  29. CHECK(is_integral<char>::value == true);
  30. CHECK(is_integral<signed char>::value == true);
  31. CHECK(is_integral<signed int>::value == true);
  32. CHECK(is_integral<signed long>::value == true);
  33. CHECK(is_integral<signed short>::value == true);
  34. CHECK(is_integral<unsigned char>::value == true);
  35. CHECK(is_integral<unsigned int>::value == true);
  36. CHECK(is_integral<unsigned long>::value == true);
  37. CHECK(is_integral<unsigned short>::value == true);
  38. CHECK(is_integral<UInt>::value == true);
  39. }
  40. SECTION("is_signed") {
  41. CHECK(is_signed<char>::value == true);
  42. CHECK(is_signed<signed char>::value == true);
  43. CHECK(is_signed<signed int>::value == true);
  44. CHECK(is_signed<signed short>::value == true);
  45. CHECK(is_signed<signed long>::value == true);
  46. CHECK(is_signed<float>::value == true);
  47. CHECK(is_signed<double>::value == true);
  48. CHECK(is_signed<bool>::value == false);
  49. }
  50. SECTION("is_unsigned") {
  51. CHECK(is_unsigned<unsigned char>::value == true);
  52. CHECK(is_unsigned<unsigned int>::value == true);
  53. CHECK(is_unsigned<unsigned short>::value == true);
  54. CHECK(is_unsigned<unsigned long>::value == true);
  55. CHECK(is_unsigned<bool>::value == true);
  56. CHECK(is_unsigned<char>::value == false);
  57. CHECK(is_unsigned<float>::value == false);
  58. CHECK(is_unsigned<double>::value == false);
  59. }
  60. SECTION("is_convertible") {
  61. CHECK((is_convertible<short, int>::value == true));
  62. CHECK((is_convertible<int, int>::value == true));
  63. CHECK((is_convertible<EmptyEnum, int>::value == true));
  64. CHECK((is_convertible<int*, int>::value == false));
  65. CHECK((is_convertible<EmptyClass, int>::value == false));
  66. }
  67. SECTION("is_class") {
  68. CHECK((is_class<int>::value == false));
  69. CHECK((is_class<EmptyEnum>::value == false));
  70. CHECK((is_class<int*>::value == false));
  71. CHECK((is_class<EmptyClass>::value == true));
  72. }
  73. SECTION("is_enum") {
  74. CHECK(is_enum<int>::value == false);
  75. CHECK(is_enum<EmptyEnum>::value == true);
  76. CHECK(is_enum<int*>::value == false);
  77. CHECK(is_enum<EmptyClass>::value == false);
  78. CHECK(is_enum<bool>::value == false);
  79. CHECK(is_enum<double>::value == false);
  80. }
  81. SECTION("IsVisitable") {
  82. CHECK(IsVisitable<DeserializationError>::value == false);
  83. CHECK(IsVisitable<JsonPair>::value == false);
  84. CHECK(IsVisitable<VariantRef>::value == true);
  85. CHECK(IsVisitable<VariantConstRef>::value == true);
  86. CHECK(IsVisitable<ArrayRef>::value == true);
  87. CHECK(IsVisitable<ElementProxy<ArrayRef> >::value == true);
  88. CHECK(IsVisitable<ArrayConstRef>::value == true);
  89. CHECK(IsVisitable<ObjectRef>::value == true);
  90. CHECK((IsVisitable<MemberProxy<ObjectRef, const char*> >::value == true));
  91. CHECK(IsVisitable<ObjectConstRef>::value == true);
  92. CHECK(IsVisitable<DynamicJsonDocument>::value == true);
  93. CHECK(IsVisitable<StaticJsonDocument<10> >::value == true);
  94. }
  95. }