Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

156 Zeilen
3.4 KiB

  1. #include <gtest/gtest.h>
  2. #include <cpputils/container/nullable.h>
  3. struct test_data
  4. {
  5. static int ctorCount;
  6. static int dtorCount;
  7. test_data()
  8. { ++ctorCount; }
  9. ~test_data()
  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 = utl::nullable<int>;
  24. using NullableIntRef = utl::nullable<int&>;
  25. using NullableString = utl::nullable<std::string>;
  26. using NullableTestData = utl::nullable<test_data>;
  27. using NullableNonCopyableTestData = utl::nullable<NonCopyableTestData>;
  28. int test_data::ctorCount = 0;
  29. int test_data::dtorCount = 0;
  30. using namespace ::utl;
  31. using namespace ::testing;
  32. TEST(NullableTest, 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(NullableTest, 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(NullableTest, 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(NullableTest, 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(NullableTest, 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(NullableTest, 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(NullableTest, 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(NullableTest, reset)
  95. {
  96. NullableTestData n(test_data{});
  97. EXPECT_TRUE (n.has_value());
  98. int tmp = test_data::dtorCount;
  99. n.reset();
  100. EXPECT_FALSE(n.has_value());
  101. EXPECT_EQ (tmp + 1, test_data::dtorCount);
  102. }
  103. TEST(NullableTest, 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(NullableTest, equalityCompareOperator)
  113. {
  114. NullableInt n1(5);
  115. NullableInt n2(7);
  116. NullableInt n3(5);
  117. NullableInt n4;
  118. EXPECT_FALSE(n2 == n1);
  119. EXPECT_TRUE (n3 == n1);
  120. EXPECT_FALSE(n4 == n1);
  121. EXPECT_FALSE(n1 == n2);
  122. EXPECT_FALSE(n3 == n2);
  123. EXPECT_FALSE(n4 == n2);
  124. EXPECT_TRUE (n1 == n3);
  125. EXPECT_FALSE(n2 == n3);
  126. EXPECT_FALSE(n4 == n3);
  127. EXPECT_FALSE(n1 == n4);
  128. EXPECT_FALSE(n2 == n4);
  129. EXPECT_FALSE(n3 == n4);
  130. }