#include "optional.h" #include "catch.hpp" TEST_CASE("Empty") { Optional_Integer o; REQUIRE_FALSE(o.has_value()); REQUIRE_THROWS_AS(o.value(), invalid_optional_access); } TEST_CASE("initial and get value") { Optional_Integer o{5}; CHECK(o.has_value()); CHECK(o.value() == 5); } TEST_CASE("reset and swap") { Optional_Integer o{5}; SECTION("reset") { o.reset(); CHECK_FALSE(o.has_value()); } SECTION("swap with empty") { Optional_Integer e; o.swap(e); CHECK_FALSE(o.has_value()); CHECK(e.has_value()); CHECK(e.value() == 5); } SECTION("swap with set") { Optional_Integer r {3}; r.swap(o); CHECK(o.value() == 3); CHECK(r.value() == 5); } } TEST_CASE("assignment") { SECTION("empty") { Optional_Integer o; o = 5; CHECK(o.value() == 5); } SECTION("had value") { Optional_Integer o{5}; o = 6; CHECK(o.value() == 6); } SECTION("copy existing") { Optional_Integer o1 {2}; Optional_Integer o2; o2 = o1; CHECK(o2.value() == 2); CHECK(o1.value() == 2); o1 = 4; CHECK(o2.value() == 2); CHECK(o1.value() == 4); } } Optional_Integer fun(bool returns) { if ( returns ) return Optional_Integer{5}; return {}; } TEST_CASE("call fun") { Optional_Integer o; SECTION("set") { o = fun(true); CHECK(o.value() == 5); } SECTION("not set") { o = fun(false); CHECK_FALSE(o.has_value()); } }