variant_test.cxx 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. //
  2. // variant_test.cpp
  3. // variant-test
  4. //
  5. // Created by Sam Jaffe on 8/14/20.
  6. // Copyright © 2020 Sam Jaffe. All rights reserved.
  7. //
  8. #include "variant/variant.hpp"
  9. #include <map>
  10. #include <string>
  11. #include <utility>
  12. #include <gmock/gmock.h>
  13. #include "gtest_variant_matchers.h"
  14. #include "gtest_variant_printers.h"
  15. using test_variant =
  16. variant::variant<int, bool, std::string, std::map<int, int>>;
  17. TEST(VariantTest, DefaultVariantIsTypeless) {
  18. test_variant test;
  19. EXPECT_THAT(test, testing::Not(IsValid()));
  20. EXPECT_THAT(test.index(), 0xFFFFFFFF);
  21. }
  22. TEST(VariantTest, CanSetValue) {
  23. test_variant test;
  24. test.set<int>(0);
  25. EXPECT_THAT(test, IsValid());
  26. EXPECT_THAT(test, IsStoringType<int>());
  27. }
  28. TEST(VariantTest, CanConstructFromValue) {
  29. EXPECT_NO_THROW(test_variant{int(0)});
  30. }
  31. TEST(VariantTest, CanGetValueByTypeId) {
  32. test_variant test(int(0));
  33. EXPECT_NO_THROW(test.get<int>());
  34. EXPECT_THAT(test.get<int>(), 0);
  35. }
  36. TEST(VariantTest, CanGetValueByTypeIndex) {
  37. test_variant test(int(0));
  38. EXPECT_NO_THROW(test.get<0>());
  39. EXPECT_THAT(test.get<0>(), 0);
  40. }
  41. TEST(VariantTest, CanInvokeStdGet) {
  42. test_variant test(int(0));
  43. EXPECT_NO_THROW(std::get<0>(test));
  44. EXPECT_THAT(std::get<0>(test), 0);
  45. }
  46. TEST(VariantTest, WillThrowOnInvalidGetType) {
  47. test_variant test(int(0));
  48. EXPECT_THROW(test.get<bool>(), std::bad_cast);
  49. }
  50. TEST(VariantConstTest, CanGetValueByTypeId) {
  51. test_variant const test(int(0));
  52. EXPECT_NO_THROW(test.get<int>());
  53. EXPECT_THAT(test.get<int>(), 0);
  54. }
  55. TEST(VariantConstTest, CanGetValueByTypeIndex) {
  56. test_variant const test(int(0));
  57. EXPECT_NO_THROW(test.get<0>());
  58. EXPECT_THAT(test.get<0>(), 0);
  59. }
  60. TEST(VariantConstTest, CanInvokeStdGet) {
  61. test_variant const test(int(0));
  62. EXPECT_NO_THROW(std::get<0>(test));
  63. EXPECT_THAT(std::get<0>(test), 0);
  64. }
  65. TEST(VariantConstTest, WillThrowOnInvalidGetType) {
  66. test_variant const test(int(0));
  67. EXPECT_THROW(test.get<bool>(), std::bad_cast);
  68. }
  69. TEST(VariantCopyTest, CtorIsInvalidSafe) {
  70. test_variant const test;
  71. test_variant copy(test);
  72. EXPECT_THAT(test, testing::Not(IsValid()));
  73. EXPECT_THAT(copy, testing::Not(IsValid()));
  74. }
  75. TEST(VariantCopyTest, CtorIsPODSafe) {
  76. test_variant const test(int(0));
  77. test_variant copy(test);
  78. EXPECT_THAT(test, IsValid());
  79. EXPECT_THAT(copy, IsValid());
  80. EXPECT_THAT(copy, IsStoringType<int>());
  81. EXPECT_THAT(copy.get<int>(), 0);
  82. }
  83. TEST(VariantCopyTest, CtorIsObjectSafe) {
  84. test_variant const test(std::string("hello"));
  85. test_variant copy(test);
  86. EXPECT_THAT(test, IsValid());
  87. EXPECT_THAT(copy, IsValid());
  88. EXPECT_THAT(copy, IsStoringType<std::string>());
  89. EXPECT_THAT(copy.get<std::string>(), "hello");
  90. }
  91. TEST(VariantCopyTest, CtorIsSelfReferentialObjectSafe) {
  92. std::map<int, int> map{{1, 2}, {2, 3}};
  93. test_variant const test(map);
  94. test_variant copy(test);
  95. EXPECT_THAT(test, IsValid());
  96. EXPECT_THAT(copy, IsValid());
  97. EXPECT_THAT(copy, IsStoringType<decltype(map)>());
  98. EXPECT_THAT(copy.get<decltype(map)>(), map);
  99. }
  100. TEST(VariantCopyTest, AssignIsInvalidSafe) {
  101. test_variant const test;
  102. test_variant copy;
  103. copy = test;
  104. EXPECT_THAT(test, testing::Not(IsValid()));
  105. EXPECT_THAT(copy, testing::Not(IsValid()));
  106. }
  107. TEST(VariantCopyTest, AssignIsPODSafe) {
  108. test_variant const test(int(0));
  109. test_variant copy;
  110. copy = test;
  111. EXPECT_THAT(test, IsValid());
  112. EXPECT_THAT(copy, IsValid());
  113. EXPECT_THAT(copy, IsStoringType<int>());
  114. EXPECT_THAT(copy.get<int>(), 0);
  115. }
  116. TEST(VariantCopyTest, AssignIsObjectSafe) {
  117. test_variant const test(std::string("hello"));
  118. test_variant copy;
  119. copy = test;
  120. EXPECT_THAT(test, IsValid());
  121. EXPECT_THAT(copy, IsValid());
  122. EXPECT_THAT(copy, IsStoringType<std::string>());
  123. EXPECT_THAT(copy.get<std::string>(), "hello");
  124. }
  125. TEST(VariantCopyTest, AssignIsSelfReferentialObjectSafe) {
  126. std::map<int, int> map{{1, 2}, {2, 3}};
  127. test_variant const test(map);
  128. test_variant copy;
  129. copy = test;
  130. EXPECT_THAT(test, IsValid());
  131. EXPECT_THAT(copy, IsValid());
  132. EXPECT_THAT(copy, IsStoringType<decltype(map)>());
  133. EXPECT_THAT(copy.get<decltype(map)>(), map);
  134. }
  135. TEST(VariantMoveTest, CtorIsInvalidSafe) {
  136. test_variant test;
  137. test_variant copy(std::move(test));
  138. EXPECT_THAT(test, testing::Not(IsValid()));
  139. EXPECT_THAT(copy, testing::Not(IsValid()));
  140. }
  141. TEST(VariantMoveTest, CtorIsPODSafe) {
  142. test_variant test(int(0));
  143. test_variant copy(std::move(test));
  144. EXPECT_THAT(test, testing::Not(IsValid()));
  145. EXPECT_THAT(copy, IsValid());
  146. EXPECT_THAT(copy, IsStoringType<int>());
  147. EXPECT_THAT(copy.get<int>(), 0);
  148. }
  149. TEST(VariantMoveTest, CtorIsObjectSafe) {
  150. test_variant test(std::string("hello"));
  151. test_variant copy(std::move(test));
  152. EXPECT_THAT(test, testing::Not(IsValid()));
  153. EXPECT_THAT(copy, IsValid());
  154. EXPECT_THAT(copy, IsStoringType<std::string>());
  155. EXPECT_THAT(copy.get<std::string>(), "hello");
  156. }
  157. TEST(VariantMoveTest, CtorIsSelfReferentialObjectSafe) {
  158. std::map<int, int> map{{1, 2}, {2, 3}};
  159. test_variant test(map);
  160. test_variant copy(std::move(test));
  161. EXPECT_THAT(test, testing::Not(IsValid()));
  162. EXPECT_THAT(copy, IsValid());
  163. EXPECT_THAT(copy, IsStoringType<decltype(map)>());
  164. EXPECT_THAT(copy.get<decltype(map)>(), map);
  165. }
  166. TEST(VariantMoveTest, AssignIsInvalidSafe) {
  167. test_variant test;
  168. test_variant copy;
  169. copy = std::move(test);
  170. EXPECT_THAT(test, testing::Not(IsValid()));
  171. EXPECT_THAT(copy, testing::Not(IsValid()));
  172. }
  173. TEST(VariantMoveTest, AssignIsPODSafe) {
  174. test_variant test(int(0));
  175. test_variant copy;
  176. copy = std::move(test);
  177. EXPECT_THAT(test, testing::Not(IsValid()));
  178. EXPECT_THAT(copy, IsValid());
  179. EXPECT_THAT(copy, IsStoringType<int>());
  180. EXPECT_THAT(copy.get<int>(), 0);
  181. }
  182. TEST(VariantMoveTest, AssignIsObjectSafe) {
  183. test_variant test(std::string("hello"));
  184. test_variant copy;
  185. copy = std::move(test);
  186. EXPECT_THAT(test, testing::Not(IsValid()));
  187. EXPECT_THAT(copy, IsValid());
  188. EXPECT_THAT(copy, IsStoringType<std::string>());
  189. EXPECT_THAT(copy.get<std::string>(), "hello");
  190. }
  191. TEST(VariantMoveTest, AssignIsSelfReferentialObjectSafe) {
  192. std::map<int, int> map{{1, 2}, {2, 3}};
  193. test_variant test(map);
  194. test_variant copy;
  195. copy = std::move(test);
  196. EXPECT_THAT(test, testing::Not(IsValid()));
  197. EXPECT_THAT(copy, IsValid());
  198. EXPECT_THAT(copy, IsStoringType<decltype(map)>());
  199. EXPECT_THAT(copy.get<decltype(map)>(), map);
  200. }