diff --git a/src/any_test.cpp b/src/any_test.cpp index 2028d8c..ab1ebb7 100644 --- a/src/any_test.cpp +++ b/src/any_test.cpp @@ -31,8 +31,52 @@ DAP_STRUCT_TYPEINFO(AnyTestObject, DAP_FIELD(i, "i"), DAP_FIELD(n, "n")); +inline bool operator==(const AnyTestObject& a, const AnyTestObject& b) { + return a.i == b.i && a.n == b.n; +} + } // namespace dap +namespace { + +template +struct TestValue {}; + +template <> +struct TestValue { + static const dap::integer value; +}; +template <> +struct TestValue { + static const dap::boolean value; +}; +template <> +struct TestValue { + static const dap::number value; +}; +template <> +struct TestValue { + static const dap::string value; +}; +template <> +struct TestValue> { + static const dap::array value; +}; +template <> +struct TestValue { + static const dap::AnyTestObject value; +}; + +const dap::integer TestValue::value = 20; +const dap::boolean TestValue::value = true; +const dap::number TestValue::value = 123.45; +const dap::string TestValue::value = "hello world"; +const dap::array TestValue>::value = { + "one", "two", "three"}; +const dap::AnyTestObject TestValue::value = {10, 20.30}; + +} // namespace + TEST(Any, EmptyConstruct) { dap::any any; ASSERT_TRUE(any.is()); @@ -105,32 +149,84 @@ TEST(Any, TestObject) { ASSERT_EQ(any.get().n, 3.0); } -TEST(Any, Assign) { - dap::any any; - any = dap::integer(10); - ASSERT_TRUE(any.is()); - ASSERT_FALSE(any.is()); - ASSERT_FALSE(any.is()); - ASSERT_EQ(any.get(), dap::integer(10)); - any = dap::boolean(true); - ASSERT_FALSE(any.is()); - ASSERT_TRUE(any.is()); - ASSERT_FALSE(any.is()); - ASSERT_EQ(any.get(), dap::boolean(true)); - any = dap::AnyTestObject{5, 3.0}; - ASSERT_FALSE(any.is()); - ASSERT_FALSE(any.is()); - ASSERT_TRUE(any.is()); - ASSERT_EQ(any.get().i, 5); - ASSERT_EQ(any.get().n, 3.0); - any = dap::string("hello world"); - ASSERT_FALSE(any.is()); - ASSERT_FALSE(any.is()); - ASSERT_FALSE(any.is()); - ASSERT_TRUE(any.is()); - ASSERT_EQ(any.get(), dap::string("hello world")); +template +class AnyT : public ::testing::Test { + protected: + void check(const dap::any& any, const T& expect) { + ASSERT_EQ(any.is(), (std::is_same::value)); + ASSERT_EQ(any.is(), (std::is_same::value)); + ASSERT_EQ(any.is(), (std::is_same::value)); + ASSERT_EQ(any.is(), (std::is_same::value)); + ASSERT_EQ(any.is>(), + (std::is_same>::value)); + ASSERT_EQ(any.is(), + (std::is_same::value)); + + ASSERT_EQ(any.get(), expect); + } +}; +TYPED_TEST_SUITE_P(AnyT); + +TYPED_TEST_P(AnyT, CopyConstruct) { + auto val = TestValue::value; + dap::any any(val); + this->check(any, val); } +TYPED_TEST_P(AnyT, MoveConstruct) { + auto val = TestValue::value; + dap::any any(std::move(val)); + this->check(any, val); +} + +TYPED_TEST_P(AnyT, Assign) { + auto val = TestValue::value; + dap::any any; + any = val; + this->check(any, val); +} + +TYPED_TEST_P(AnyT, MoveAssign) { + auto val = TestValue::value; + dap::any any; + any = std::move(val); + this->check(any, val); +} + +TYPED_TEST_P(AnyT, RepeatedAssign) { + dap::string str = "hello world"; + auto val = TestValue::value; + dap::any any; + any = str; + any = val; + this->check(any, val); +} + +TYPED_TEST_P(AnyT, RepeatedMoveAssign) { + dap::string str = "hello world"; + auto val = TestValue::value; + dap::any any; + any = std::move(str); + any = std::move(val); + this->check(any, val); +} + +REGISTER_TYPED_TEST_SUITE_P(AnyT, + CopyConstruct, + MoveConstruct, + Assign, + MoveAssign, + RepeatedAssign, + RepeatedMoveAssign); + +using AnyTypes = ::testing::Types, + dap::AnyTestObject>; +INSTANTIATE_TYPED_TEST_SUITE_P(T, AnyT, AnyTypes); + TEST(Any, Reset) { dap::any any(dap::integer(10)); ASSERT_TRUE(any.is());