cast_test.cxx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. //
  2. // cast_test.cxx
  3. // string_utils-test
  4. //
  5. // Created by Sam Jaffe on 2/14/21.
  6. // Copyright © 2021 Sam Jaffe. All rights reserved.
  7. //
  8. #include "string_utils/cast.h"
  9. #include "xcode_gtest_helper.h"
  10. using testing::FieldsAre;
  11. using testing::Pair;
  12. using namespace string_utils;
  13. TEST(CastIntegerTest, CastsWithBase10) {
  14. auto [value, success] = cast<int>("10");
  15. EXPECT_TRUE(success);
  16. EXPECT_THAT(value, 10);
  17. }
  18. TEST(CastIntegerTest, DoesNotCastBase8) {
  19. auto [value, success] = cast<int>("010");
  20. EXPECT_TRUE(success);
  21. EXPECT_THAT(value, 10);
  22. }
  23. TEST(CastIntegerTest, DoesNotCastHex) {
  24. auto [value, success] = cast<int>("0x10");
  25. EXPECT_FALSE(success);
  26. EXPECT_THAT(value, 0);
  27. }
  28. TEST(CastIntegerTest, FailsOnBadData) {
  29. auto [value, success] = cast<int>("x");
  30. EXPECT_FALSE(success);
  31. EXPECT_THAT(value, 0);
  32. }
  33. TEST(CastIntegerTest, FailsOnBadSuffix) {
  34. auto [value, success] = cast<int>("10x");
  35. EXPECT_FALSE(success);
  36. EXPECT_THAT(value, 10);
  37. }
  38. TEST(CastIntegerTest, FailsOnOutOfBounds) {
  39. auto [_, success] = cast<int>("2147483648");
  40. EXPECT_FALSE(success);
  41. }
  42. TEST(CastBooleanTest, CastsVariousTrueValues) {
  43. EXPECT_THAT(cast<bool>("true"), Pair(true, true));
  44. EXPECT_THAT(cast<bool>("TRUE"), Pair(true, true));
  45. EXPECT_THAT(cast<bool>("YES"), Pair(true, true));
  46. EXPECT_THAT(cast<bool>("1"), Pair(true, true));
  47. }
  48. TEST(CastBooleanTest, CastsVariousFalseValues) {
  49. EXPECT_THAT(cast<bool>("false"), Pair(false, true));
  50. EXPECT_THAT(cast<bool>("FALSE"), Pair(false, true));
  51. EXPECT_THAT(cast<bool>("NO"), Pair(false, true));
  52. EXPECT_THAT(cast<bool>("0"), Pair(false, true));
  53. }
  54. TEST(CastBooleanTest, DoesNotCastAllIntegers) {
  55. auto [_, success] = cast<bool>("2");
  56. EXPECT_FALSE(success);
  57. }
  58. MATCHER_P(HoldsAlternative, typearg,
  59. std::string("holds a value of type ") + typeid(typearg).name()) {
  60. using T = std::remove_const_t<std::decay_t<decltype(typearg)>>;
  61. return std::holds_alternative<T>(arg);
  62. }
  63. template <typename T> auto HoldsAlternative() { return HoldsAlternative(T()); }
  64. TEST(CastVariantTest, StringVariantWillAlwaysMatchWhenEncountered) {
  65. auto [value, success] = cast<std::variant<std::string, int>>("2");
  66. EXPECT_THAT(value, HoldsAlternative<std::string>());
  67. }
  68. TEST(CastVariantTest, EvaluatesTypesLeftToRight) {
  69. auto [value, success] = cast<std::variant<int, std::string>>("2");
  70. EXPECT_THAT(value, HoldsAlternative<int>());
  71. }
  72. using pair_t = std::pair<std::string, std::string>;
  73. using tuple_t = std::tuple<int, int, std::string>;
  74. TEST(CastKeyValTest, FailsOnTooFewTokens) {
  75. auto [value, success] = cast<pair_t>(std::vector{"key"});
  76. EXPECT_FALSE(success);
  77. }
  78. TEST(CastKeyValTest, ParsesTokens) {
  79. auto [value, success] = cast<pair_t>(std::vector{"key","value"});
  80. EXPECT_TRUE(success);
  81. EXPECT_THAT(value, Pair("key", "value"));
  82. }
  83. TEST(CastKeyValTest, FailsOnTooManyTokens) {
  84. auto [value, success] = cast<pair_t>(std::vector{"key","value","mapping"});
  85. EXPECT_FALSE(success);
  86. }
  87. TEST(CastTupleTest, FailsOnTooFewTokens) {
  88. auto [value, success] = cast<tuple_t>(std::vector{"0","A"});
  89. EXPECT_FALSE(success);
  90. }
  91. TEST(CastTupleTest, FailsOnTooManyTokens) {
  92. auto [value, success] = cast<tuple_t>(std::vector{"0","1","A","B"});
  93. EXPECT_FALSE(success);
  94. }
  95. TEST(CastTupleTest, ParsesIfAllGood) {
  96. auto [value, success] = cast<tuple_t>(std::vector{"0","1","A"});
  97. EXPECT_TRUE(success);
  98. EXPECT_THAT(value, FieldsAre(0, 1, "A"));
  99. }
  100. TEST(CastTupleTest, FailsOnAnyParseError) {
  101. auto [value, success] = cast<tuple_t>(std::vector{"0","Q","A"});
  102. EXPECT_FALSE(success);
  103. }