variant_test.cxx 6.2 KB

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