// g++ --std=c++11 test.cpp #include "test.h" #include "fl/ui.h" #include "fl/variant.h" #include "fl/optional.h" #include "fl/str.h" using namespace fl; TEST_CASE("Variant tests") { // 1) Default is empty Variant v; REQUIRE(v.empty()); REQUIRE(!v.is()); REQUIRE(!v.is()); // 2) Emplace a T v = 123; REQUIRE(v.is()); REQUIRE(!v.is()); REQUIRE_EQ(*v.ptr(), 123); // 3) Reset back to empty v.reset(); REQUIRE(v.empty()); // 4) Emplace a U v = fl::Str("hello"); REQUIRE(v.is()); REQUIRE(!v.is()); REQUIRE(v.equals(fl::Str("hello"))); // 5) Copy‐construct preserves the U Variant v2(v); REQUIRE(v2.is()); fl::Str* str_ptr = v2.ptr(); REQUIRE_NE(str_ptr, nullptr); REQUIRE_EQ(*str_ptr, fl::Str("hello")); const bool is_str = v2.is(); const bool is_int = v2.is(); CHECK(is_str); CHECK(!is_int); #if 0 // 6) Move‐construct leaves source empty Variant v3(std::move(v2)); REQUIRE(v3.is()); REQUIRE_EQ(v3.getU(), fl::Str("hello")); REQUIRE(v2.isEmpty()); // 7) Copy‐assign Variant v4; v4 = v3; REQUIRE(v4.is()); REQUIRE_EQ(v4.getU(), fl::Str("hello")); // 8) Swap two variants v4.emplaceT(7); v3.swap(v4); REQUIRE(v3.is()); REQUIRE_EQ(v3.getT(), 7); REQUIRE(v4.is()); REQUIRE_EQ(v4.getU(), fl::Str("hello")); #endif } TEST_CASE("Variant") { // 1) Default is empty Variant v; REQUIRE(v.empty()); REQUIRE(!v.is()); REQUIRE(!v.is()); REQUIRE(!v.is()); // 2) Construct with a value Variant v1(123); REQUIRE(v1.is()); REQUIRE(!v1.is()); REQUIRE(!v1.is()); REQUIRE_EQ(*v1.ptr(), 123); // 3) Construct with a different type Variant v2(fl::Str("hello")); REQUIRE(!v2.is()); REQUIRE(v2.is()); REQUIRE(!v2.is()); REQUIRE_EQ(*v2.ptr(), fl::Str("hello")); // 4) Copy construction Variant v3(v2); REQUIRE(v3.is()); REQUIRE(v3.equals(fl::Str("hello"))); // 5) Assignment v = v1; REQUIRE(v.is()); REQUIRE_EQ(*v.ptr(), 123); // 6) Reset v.reset(); REQUIRE(v.empty()); // 7) Assignment of a value v = 3.14; REQUIRE(v.is()); // REQUIRE_EQ(v.get(), 3.14); REQUIRE_EQ(*v.ptr(), 3.14); // 8) Visitor pattern struct TestVisitor { int result = 0; void accept(int value) { result = value; } void accept(const fl::Str& value) { result = value.length(); } void accept(double value) { result = static_cast(value); } }; TestVisitor visitor; v.visit(visitor); REQUIRE_EQ(visitor.result, 3); // 3.14 truncated to 3 v = fl::Str("hello world"); v.visit(visitor); REQUIRE_EQ(visitor.result, 11); // length of "hello world" v = 42; v.visit(visitor); REQUIRE_EQ(visitor.result, 42); } // TEST_CASE("Optional") { // Optional opt; // REQUIRE(opt.empty()); // opt = 42; // REQUIRE(!opt.empty()); // REQUIRE_EQ(*opt.ptr(), 42); // Optional opt2 = opt; // REQUIRE(!opt2.empty()); // REQUIRE_EQ(*opt2.ptr(), 42); // opt2 = 100; // REQUIRE_EQ(*opt2.ptr(), 100); // }