cpptrace/test/unit/lib/nullable.cpp
2025-02-01 19:10:19 -06:00

67 lines
1.7 KiB
C++

#include <cpptrace/basic.hpp>
#include <gtest/gtest.h>
#include <gtest/gtest-matchers.h>
#include <gmock/gmock.h>
#include <gmock/gmock-matchers.h>
using cpptrace::nullable;
namespace {
TEST(NullableTest, Basic) {
nullable<std::uint32_t> a{12};
EXPECT_EQ(a.value(), 12);
EXPECT_EQ(a.raw_value, 12);
nullable<std::uint32_t> b = 20;
EXPECT_EQ(b.value(), 20);
}
TEST(NullableTest, Null) {
auto a = nullable<std::uint32_t>::null();
EXPECT_FALSE(a.has_value());
EXPECT_EQ(a.raw_value, (std::numeric_limits<std::uint32_t>::max)());
nullable<std::uint32_t> b;
EXPECT_FALSE(b.has_value());
EXPECT_EQ(b.raw_value, nullable<std::uint32_t>::null_value());
}
TEST(NullableTest, Assignment) {
nullable<std::uint32_t> a;
a = 12;
EXPECT_EQ(a.value(), 12);
nullable<std::uint32_t> b = 20;
a = b;
EXPECT_EQ(a.value(), 20);
}
TEST(NullableTest, Reset) {
nullable<std::uint32_t> a{12};
a.reset();
EXPECT_FALSE(a.has_value());
}
TEST(NullableTest, ValueOr) {
auto a = nullable<std::uint32_t>::null();
EXPECT_EQ(a.value_or(20), 20);
}
TEST(NullableTest, Comparison) {
EXPECT_EQ(nullable<std::uint32_t>{12}, nullable<std::uint32_t>{12});
EXPECT_NE(nullable<std::uint32_t>{12}, nullable<std::uint32_t>{20});
EXPECT_NE(nullable<std::uint32_t>{12}, nullable<std::uint32_t>::null());
EXPECT_EQ(nullable<std::uint32_t>::null(), nullable<std::uint32_t>::null());
}
TEST(NullableTest, Swap) {
auto a = nullable<std::uint32_t>::null();
nullable<std::uint32_t> 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);
}
}