You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

270 rivejä
5.7 KiB

  1. #include <gtest/gtest.h>
  2. #include <cppcore/misc/nullable.h>
  3. struct TestData
  4. {
  5. static int ctorCount;
  6. static int dtorCount;
  7. TestData()
  8. { ++ctorCount; }
  9. ~TestData()
  10. { ++dtorCount; }
  11. };
  12. struct NonCopyableTestData
  13. {
  14. int value;
  15. NonCopyableTestData(int v) :
  16. value(v)
  17. { }
  18. NonCopyableTestData(NonCopyableTestData&& other) :
  19. value(0)
  20. { std::swap(value, other.value); }
  21. NonCopyableTestData(const NonCopyableTestData&) = delete;
  22. };
  23. using NullableInt = ::cppcore::nullable<int>;
  24. using NullableIntRef = ::cppcore::nullable<int&>;
  25. using NullableString = ::cppcore::nullable<std::string>;
  26. using NullableTestData = ::cppcore::nullable<TestData>;
  27. using NullableNonCopyableTestData = ::cppcore::nullable<NonCopyableTestData>;
  28. int TestData::ctorCount = 0;
  29. int TestData::dtorCount = 0;
  30. using namespace ::cppcore;
  31. using namespace ::testing;
  32. TEST(nullable_tests, ctor_empty)
  33. {
  34. NullableInt n1;
  35. NullableIntRef n2;
  36. EXPECT_FALSE(static_cast<bool>(n1));
  37. EXPECT_FALSE(static_cast<bool>(n2));
  38. }
  39. TEST(nullable_tests, ctor_value)
  40. {
  41. int i = 5;
  42. NullableInt n1(i);
  43. NullableIntRef n2(i);
  44. EXPECT_TRUE(static_cast<bool>(n1));
  45. EXPECT_TRUE(static_cast<bool>(n2));
  46. EXPECT_EQ (5, n1());
  47. EXPECT_EQ (&i, &n2());
  48. }
  49. TEST(nullable_tests, ctor_copy)
  50. {
  51. int i = 5;
  52. NullableInt i1(i);
  53. NullableIntRef i2(i);
  54. NullableInt n1(i1);
  55. NullableIntRef n2(i2);
  56. EXPECT_TRUE(static_cast<bool>(n1));
  57. EXPECT_TRUE(static_cast<bool>(n2));
  58. EXPECT_EQ (5, n1());
  59. EXPECT_EQ (&i, &n2());
  60. }
  61. TEST(nullable_tests, ctor_move)
  62. {
  63. NullableString i1("test");
  64. NullableString n1(std::move(i1));
  65. EXPECT_FALSE(static_cast<bool>(i1));
  66. ASSERT_TRUE (static_cast<bool>(n1));
  67. EXPECT_EQ (std::string("test"), n1());
  68. }
  69. TEST(nullable_tests, move_assignment)
  70. {
  71. NullableString i1("test");
  72. NullableString n1;
  73. n1 = std::move(i1);
  74. EXPECT_FALSE(static_cast<bool>(i1));
  75. ASSERT_TRUE (static_cast<bool>(n1));
  76. EXPECT_EQ (std::string("test"), n1());
  77. }
  78. TEST(nullable_tests, movable_object)
  79. {
  80. NonCopyableTestData data(5);
  81. NullableNonCopyableTestData tmp;
  82. tmp = std::move(data);
  83. ASSERT_TRUE ( tmp.has_value() );
  84. ASSERT_EQ ( 5, tmp.value().value );
  85. ASSERT_EQ ( 0, data.value );
  86. }
  87. TEST(nullable_tests, hasValue_operatorBool)
  88. {
  89. EXPECT_FALSE(static_cast<bool>(NullableInt()));
  90. EXPECT_FALSE(NullableInt().has_value());
  91. EXPECT_TRUE (static_cast<bool>(NullableInt(5)));
  92. EXPECT_TRUE (NullableInt(5).has_value());
  93. }
  94. TEST(nullable_tests, reset)
  95. {
  96. NullableTestData n(TestData{});
  97. EXPECT_TRUE (n.has_value());
  98. int tmp = TestData::dtorCount;
  99. n.reset();
  100. EXPECT_FALSE(n.has_value());
  101. EXPECT_EQ (tmp + 1, TestData::dtorCount);
  102. }
  103. TEST(nullable_tests, value_functor)
  104. {
  105. NullableInt n1(5);
  106. NullableInt n2;
  107. EXPECT_EQ (5, n1());
  108. EXPECT_EQ (5, n1.value());
  109. EXPECT_ANY_THROW(n2());
  110. EXPECT_ANY_THROW(n2.value());
  111. }
  112. TEST(nullable_tests, equalityCompareOperator)
  113. {
  114. NullableInt n1(5);
  115. NullableInt n2(7);
  116. NullableInt n3;
  117. EXPECT_FALSE(n2 == n1);
  118. EXPECT_TRUE ( 5 == n1);
  119. EXPECT_FALSE(n3 == n1);
  120. EXPECT_FALSE(n1 == n2);
  121. EXPECT_FALSE( 5 == n2);
  122. EXPECT_FALSE(n3 == n2);
  123. EXPECT_TRUE (n1 == 5);
  124. EXPECT_FALSE(n2 == 5);
  125. EXPECT_FALSE(n3 == 5);
  126. EXPECT_FALSE(n1 == n3);
  127. EXPECT_FALSE(n2 == n3);
  128. EXPECT_FALSE( 5 == n3);
  129. }
  130. TEST(nullable_tests, unequalityCompareOperator)
  131. {
  132. NullableInt n1(5);
  133. NullableInt n2(7);
  134. NullableInt n3;
  135. EXPECT_TRUE (n2 != n1);
  136. EXPECT_FALSE( 5 != n1);
  137. EXPECT_FALSE(n3 != n1);
  138. EXPECT_TRUE (n1 != n2);
  139. EXPECT_TRUE ( 5 != n2);
  140. EXPECT_FALSE(n3 != n2);
  141. EXPECT_FALSE(n1 != 5);
  142. EXPECT_TRUE (n2 != 5);
  143. EXPECT_FALSE(n3 != 5);
  144. EXPECT_FALSE(n1 != n3);
  145. EXPECT_FALSE(n2 != n3);
  146. EXPECT_FALSE( 5 != n3);
  147. }
  148. TEST(nullable_tests, lessCompareOperator)
  149. {
  150. NullableInt n1(5);
  151. NullableInt n2(7);
  152. NullableInt n3;
  153. EXPECT_FALSE(n2 < n1);
  154. EXPECT_FALSE( 5 < n1);
  155. EXPECT_FALSE(n3 < n1);
  156. EXPECT_TRUE (n1 < n2);
  157. EXPECT_TRUE ( 5 < n2);
  158. EXPECT_FALSE(n3 < n2);
  159. EXPECT_FALSE(n1 < 5);
  160. EXPECT_FALSE(n2 < 5);
  161. EXPECT_FALSE(n3 < 5);
  162. EXPECT_FALSE(n1 < n3);
  163. EXPECT_FALSE(n2 < n3);
  164. EXPECT_FALSE( 5 < n3);
  165. }
  166. TEST(nullable_tests, lessEqualCompareOperator)
  167. {
  168. NullableInt n1(5);
  169. NullableInt n2(7);
  170. NullableInt n3;
  171. EXPECT_FALSE(n2 <= n1);
  172. EXPECT_TRUE ( 5 <= n1);
  173. EXPECT_FALSE(n3 <= n1);
  174. EXPECT_TRUE (n1 <= n2);
  175. EXPECT_TRUE ( 5 <= n2);
  176. EXPECT_FALSE(n3 <= n2);
  177. EXPECT_TRUE (n1 <= 5);
  178. EXPECT_FALSE(n2 <= 5);
  179. EXPECT_FALSE(n3 <= 5);
  180. EXPECT_FALSE(n1 <= n3);
  181. EXPECT_FALSE(n2 <= n3);
  182. EXPECT_FALSE( 5 <= n3);
  183. }
  184. TEST(nullable_tests, greaterCompareOperator)
  185. {
  186. NullableInt n1(5);
  187. NullableInt n2(7);
  188. NullableInt n3;
  189. EXPECT_TRUE (n2 > n1);
  190. EXPECT_FALSE( 5 > n1);
  191. EXPECT_FALSE(n3 > n1);
  192. EXPECT_FALSE(n1 > n2);
  193. EXPECT_FALSE( 5 > n2);
  194. EXPECT_FALSE(n3 > n2);
  195. EXPECT_FALSE(n1 > 5);
  196. EXPECT_TRUE (n2 > 5);
  197. EXPECT_FALSE(n3 > 5);
  198. EXPECT_FALSE(n1 > n3);
  199. EXPECT_FALSE(n2 > n3);
  200. EXPECT_FALSE( 5 > n3);
  201. }
  202. TEST(nullable_tests, greaterEqualCompareOperator)
  203. {
  204. NullableInt n1(5);
  205. NullableInt n2(7);
  206. NullableInt n3;
  207. EXPECT_TRUE (n2 >= n1);
  208. EXPECT_TRUE ( 5 >= n1);
  209. EXPECT_FALSE(n3 >= n1);
  210. EXPECT_FALSE(n1 >= n2);
  211. EXPECT_FALSE( 5 >= n2);
  212. EXPECT_FALSE(n3 >= n2);
  213. EXPECT_TRUE (n1 >= 5);
  214. EXPECT_TRUE (n2 >= 5);
  215. EXPECT_FALSE(n3 >= 5);
  216. EXPECT_FALSE(n1 >= n3);
  217. EXPECT_FALSE(n2 >= n3);
  218. EXPECT_FALSE( 5 >= n3);
  219. }