Update TestNullable.cpp

This commit is contained in:
Mateusz Karbowiak
2024-10-07 12:24:09 +02:00
parent f56207f1a4
commit eda4f433d0

View File

@@ -7,7 +7,7 @@ TEST_CASE("Nullable")
{
SECTION("Trivial Type")
{
Nullable<int> a;
Nullable<int> a;
REQUIRE(a.HasValue() == false);
REQUIRE(a.GetValueOr(2) == 2);
@@ -25,130 +25,139 @@ TEST_CASE("Nullable")
SECTION("Move-Only Type")
{
struct MoveOnly
{
MoveOnly() = default;
struct MoveOnly
{
MoveOnly() = default;
~MoveOnly() = default;
MoveOnly(const MoveOnly&) = delete;
MoveOnly(MoveOnly&&) = default;
MoveOnly(const MoveOnly&) = delete;
MoveOnly(MoveOnly&&) = default;
// MoveOnly& operator=(const MoveOnly&) = delete;
// MoveOnly& operator=(MoveOnly&&) = default;
};
MoveOnly& operator=(const MoveOnly&) = delete;
MoveOnly& operator=(MoveOnly&&) = default;
};
Nullable<MoveOnly> a;
Nullable<MoveOnly> a;
REQUIRE(a.HasValue() == false);
REQUIRE(a.HasValue() == false);
a = MoveOnly();
a = MoveOnly();
REQUIRE(a.HasValue() == true);
REQUIRE(a.HasValue() == true);
}
SECTION("Bool Type")
{
Nullable<bool> a;
Nullable<bool> a;
REQUIRE(a.HasValue() == false);
REQUIRE(a.GetValueOr(true) == true);
REQUIRE(a.HasValue() == false);
REQUIRE(a.GetValueOr(true) == true);
REQUIRE(a.IsTrue() == false);
REQUIRE(a.IsFalse() == false);
a = false;
a = false;
REQUIRE(a.HasValue() == true);
REQUIRE(a.GetValue() == false);
REQUIRE(a.GetValueOr(true) == false);
REQUIRE(a.HasValue() == true);
REQUIRE(a.GetValue() == false);
REQUIRE(a.GetValueOr(true) == false);
REQUIRE(a.IsTrue() == false);
REQUIRE(a.IsFalse() == true);
REQUIRE(a.IsTrue() == false);
REQUIRE(a.IsFalse() == true);
a = true;
REQUIRE(a.IsTrue() == true);
REQUIRE(a.IsFalse() == false);
a.Reset();
a.Reset();
REQUIRE(a.HasValue() == false);
REQUIRE(a.HasValue() == false);
}
SECTION("Lifetime (No Construction)")
{
struct DoNotConstruct
{
DoNotConstruct() { FAIL("DoNotConstruct must not be constructed."); }
};
struct DoNotConstruct
{
DoNotConstruct() { FAIL("DoNotConstruct must not be constructed."); }
};
Nullable<DoNotConstruct> a;
a.Reset();
}
SECTION("Lifetime")
{
int constructed = 0, destructed = 0;
{
struct Lifetime
{
int& constructed;
int& destructed;
{
int* _constructed;
int* _destructed;
Lifetime(int& constructed, int& destructed)
: constructed(constructed)
, destructed(destructed)
{
constructed++;
}
Lifetime(int* constructed, int* destructed)
: _constructed(constructed)
, _destructed(destructed)
{
++(*_constructed);
}
Lifetime(const Lifetime& other)
: constructed(other.constructed)
, destructed(other.destructed)
{
constructed++;
}
Lifetime(Lifetime&& other) noexcept
: _constructed(other._constructed)
, _destructed(other._destructed)
{
++(*_constructed);
}
~Lifetime()
{
destructed++;
}
};
Lifetime() = delete;
Lifetime& operator=(const Lifetime&) = delete;
Lifetime& operator=(Lifetime&&) = delete;
{
Nullable<Lifetime> a = Lifetime(constructed, destructed);
~Lifetime()
{
++(*_destructed);
}
};
REQUIRE(constructed == 1);
REQUIRE(destructed == 0);
int constructed = 0, destructed = 0;
REQUIRE(constructed == destructed);
a.Reset();
{
REQUIRE(constructed == 1);
REQUIRE(destructed == 1);
}
Nullable<Lifetime> a = Lifetime(&constructed, &destructed);
REQUIRE(a.HasValue());
REQUIRE(constructed == destructed + 1);
{
Nullable<Lifetime> a = Lifetime(constructed, destructed);
}
a.Reset();
REQUIRE(!a.HasValue());
REQUIRE(constructed == destructed);
}
REQUIRE(constructed == destructed);
REQUIRE(constructed == 2);
REQUIRE(destructed == 2);
}
{
Nullable<Lifetime> b = Lifetime(&constructed, &destructed);
REQUIRE(constructed == destructed + 1);
}
REQUIRE(constructed == destructed);
{
Nullable<Lifetime> c = Lifetime(&constructed, &destructed);
Nullable<Lifetime> d = MoveTemp(c);
REQUIRE(constructed == destructed + 1);
}
REQUIRE(constructed == destructed);
}
SECTION("Matching")
{
Nullable<int> a;
Nullable<int> b = 2;
Nullable<int> a;
Nullable<int> b = 2;
a.Match(
[](int value) { FAIL("Null nullable must not match value handler."); },
[]() {}
[](int) { FAIL("Null nullable must not match value handler."); },
[]() {}
);
b.Match(
[](int value) {},
[](int) {},
[]() { FAIL("Nullable with valid value must not match null handler."); }
);
);
}
};