#include #include #include #include #include using cpptrace::nullable; namespace { TEST(NullableTest, Basic) { nullable a{12}; EXPECT_EQ(a.value(), 12); EXPECT_EQ(a.raw_value, 12); nullable b = 20; EXPECT_EQ(b.value(), 20); } TEST(NullableTest, Null) { auto a = nullable::null(); EXPECT_FALSE(a.has_value()); EXPECT_EQ(a.raw_value, (std::numeric_limits::max)()); nullable b; EXPECT_FALSE(b.has_value()); EXPECT_EQ(b.raw_value, nullable::null_value()); } TEST(NullableTest, Assignment) { nullable a; a = 12; EXPECT_EQ(a.value(), 12); nullable b = 20; a = b; EXPECT_EQ(a.value(), 20); } TEST(NullableTest, Reset) { nullable a{12}; a.reset(); EXPECT_FALSE(a.has_value()); } TEST(NullableTest, ValueOr) { auto a = nullable::null(); EXPECT_EQ(a.value_or(20), 20); } TEST(NullableTest, Comparison) { EXPECT_EQ(nullable{12}, nullable{12}); EXPECT_NE(nullable{12}, nullable{20}); EXPECT_NE(nullable{12}, nullable::null()); EXPECT_EQ(nullable::null(), nullable::null()); } TEST(NullableTest, Swap) { auto a = nullable::null(); nullable b = 12; EXPECT_FALSE(a.has_value()); EXPECT_EQ(b.value(), 12); a.swap(b); EXPECT_FALSE(b.has_value()); EXPECT_EQ(a.value(), 12); } }