X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=tests%2Fvariant.cpp;fp=tests%2Fvariant.cpp;h=99cacdf29eb3ff550f509aa575ba54b491ac45dc;hp=0000000000000000000000000000000000000000;hb=120023d8da0aabcb803a87111608ce84c94661f8;hpb=79482ba7aea1b79c7a310c940cc0292532ef3bcb diff --git a/tests/variant.cpp b/tests/variant.cpp new file mode 100644 index 0000000..99cacdf --- /dev/null +++ b/tests/variant.cpp @@ -0,0 +1,113 @@ +#include +#include + +using namespace std; +using namespace Msp; + +class VariantTests: public Test::RegisteredTest +{ +public: + VariantTests(); + + static const char *get_name() { return "Variant"; } + +private: + void integer(); + void stdstring(); + void pointer(); + void ref_into(); + void copying(); + void destruction(); + void types(); + void mismatch(); +}; + +class Counter +{ +private: + int &count; + +public: + Counter(int &c): count(c) { ++count; } + Counter(const Counter &c): count(c.count) { ++count; } + ~Counter() { --count; } +}; + +VariantTests::VariantTests() +{ + add(&VariantTests::integer, "Integer"); + add(&VariantTests::stdstring, "std::string"); + add(&VariantTests::pointer, "Pointer"); + add(&VariantTests::ref_into, "Reference into"); + add(&VariantTests::copying, "Copying"); + add(&VariantTests::destruction, "Destruction"); + add(&VariantTests::types, "Type checks"); + add(&VariantTests::mismatch, "Mismatch").expect_throw(); +} + +void VariantTests::integer() +{ + Variant var = 42; + EXPECT_EQUAL(var.value(), 42); +} + +void VariantTests::stdstring() +{ + Variant var = string("foobar"); + EXPECT_EQUAL(var.value(), "foobar"); +} + +void VariantTests::pointer() +{ + int i = 7; + Variant var = &i; + *var.value() = 42; + EXPECT_EQUAL(i, 42); +} + +void VariantTests::ref_into() +{ + Variant var = 7; + int &r = var.value(); + r = 42; + EXPECT_EQUAL(var.value(), 42); +} + +void VariantTests::copying() +{ + Variant var = 42; + Variant var2 = var; + EXPECT_EQUAL(var2.value(), 42); +} + +void VariantTests::destruction() +{ + int count = 0; + { + Variant var = Counter(count); + Variant var2 = var; + EXPECT_EQUAL(count, 2); + Variant var3; + var3 = var; + EXPECT_EQUAL(count, 3); + var2 = Variant(); + EXPECT_EQUAL(count, 2); + } + EXPECT_EQUAL(count, 0); +} + +void VariantTests::types() +{ + Variant var = 42U; + EXPECT(!var.check_type()); + EXPECT(var.check_type()); + EXPECT(!var.check_type()); + EXPECT(!var.check_type()); + EXPECT(!var.check_type()); +} + +void VariantTests::mismatch() +{ + Variant var = 1; + var.value(); +}