// // AnyTest.cpp // // Copyright (c) 2006, Applied Informatics Software Engineering GmbH. // and Contributors. // // SPDX-License-Identifier: BSL-1.0 // #include "AnyTest.h" #include "CppUnit/TestCaller.h" #include "CppUnit/TestSuite.h" #include "Poco/Exception.h" #include "Poco/Any.h" #include "Poco/Bugcheck.h" #include #if defined(_MSC_VER) && _MSC_VER < 1400 #pragma warning(disable:4800)//forcing value to bool 'true' or 'false' #endif using namespace Poco; class SomeClass { public: int i; std::string str; SomeClass(int h, std::string s): i (h), str(s) { }; bool operator==(const SomeClass& other) const { return i == other.i && str == other.str; } }; AnyTest::AnyTest(const std::string& name): CppUnit::TestCase(name) { } AnyTest::~AnyTest() { } void AnyTest::testDefaultCtor() { const Any value; assertTrue (value.empty()); assertTrue (0 == AnyCast(&value)); assertTrue (value.type() == typeid(void)); } void AnyTest::testConvertingCtor() { std::string text = "test message"; Any value = text; assertTrue (!value.empty()); assertTrue (value.type() == typeid(std::string)); assertTrue (0 == AnyCast(&value)); assertTrue (0 != AnyCast(&value)); assertTrue (AnyCast(value) == text); assertTrue (AnyCast(&value) != &text); } void AnyTest::testCopyCtor() { std::string text = "test message"; Any original = text, copy = original; assertTrue (!copy.empty()); assertTrue (original.type() == copy.type()); assertTrue (AnyCast(original) == AnyCast(copy)); assertTrue (text == AnyCast(copy)); assertTrue (AnyCast(&original) != AnyCast(©)); } void AnyTest::testCopyAssign() { std::string text = "test message"; Any original = text, copy; Any* assignResult = &(copy = original); assertTrue (!copy.empty()); assertTrue (original.type() == copy.type()); assertTrue (AnyCast(original) == AnyCast(copy)); assertTrue (text == AnyCast(copy)); assertTrue (AnyCast(&original) != AnyCast(©)); assertTrue (assignResult == ©); // test self assignment Any& ref = original; original = ref; assertTrue (AnyCast(original) == AnyCast(copy)); original = original; assertTrue (AnyCast(original) == AnyCast(copy)); } void AnyTest::testConvertingAssign() { std::string text = "test message"; Any value; Any* assignResult = &(value = text); assertTrue (!value.empty()); assertTrue (value.type() == typeid(std::string)); assertTrue (0 == AnyCast(&value)); assertTrue (0 != AnyCast(&value)); assertTrue (AnyCast(value) == text); assertTrue (AnyCast(&value) != &text); assertTrue (assignResult == &value); } void AnyTest::testCastToReference() { Any a(137); const Any b(a); int& ra = AnyCast(a); int const& ra_c = AnyCast(a); int volatile& ra_v = AnyCast(a); int const volatile& ra_cv = AnyCast(a); // cv references to same obj assertTrue (&ra == &ra_c && &ra == &ra_v && &ra == &ra_cv); int const & rb_c = AnyCast(b); int const volatile & rb_cv = AnyCast(b); assertTrue (&rb_c == &rb_cv); // cv references to copied const obj assertTrue (&ra != &rb_c); // copies hold different objects ++ra; int incremented = AnyCast(a); assertTrue (incremented == 138); // increment by reference changes value try { AnyCast(a); failmsg ("AnyCast to incorrect reference type"); } catch (BadCastException&) { } try { AnyCast(b), failmsg ("AnyCast to incorrect const reference type"); } catch (BadCastException&) { } } void AnyTest::testBadCast() { std::string text = "test message"; Any value = text; try { AnyCast(value); fail ("must throw"); } catch (BadCastException&) { } } void AnyTest::testSwap() { std::string text = "test message"; Any original = text, swapped; std::string* originalPtr = AnyCast(&original); Any* swapResult = &original.swap(swapped); assertTrue (original.empty()); assertTrue (!swapped.empty()); assertTrue (swapped.type() == typeid(std::string)); assertTrue (text == AnyCast(swapped)); assertTrue (0 != originalPtr); #ifdef POCO_NO_SOO // pointers only match when heap-allocated assertTrue (originalPtr == AnyCast(&swapped)); #endif assertTrue (swapResult == &original); } void AnyTest::testEmptyCopy() { const Any null; Any copied = null, assigned; assigned = null; assertTrue (null.empty()); assertTrue (copied.empty()); assertTrue (assigned.empty()); } void AnyTest::testInt() { Any e; assertTrue (e.empty()); Any a = 13; assertTrue (a.type() == typeid(int)); int* i = AnyCast(&a); assertTrue (*i == 13); Any b = a; assertTrue (b.type() == typeid(int)); int *cpyI = AnyCast(&b); assertTrue (*cpyI == *i); *cpyI = 20; assertTrue (*cpyI != *i); std::string* s = AnyCast(&a); assertTrue (s == NULL); int POCO_UNUSED tmp = AnyCast(a); const Any c = a; tmp = AnyCast(a); } void AnyTest::testComplexType() { SomeClass str(13,std::string("hello")); Any a = str; Any b = a; assertTrue (a.type() == typeid(SomeClass)); assertTrue (b.type() == typeid(SomeClass)); SomeClass str2 = AnyCast(a); assertTrue (str == str2); const SomeClass& strCRef = RefAnyCast(a); assertTrue (str == strCRef); SomeClass& strRef = RefAnyCast(a); assertTrue (str == strRef); } void AnyTest::testVector() { std::vector tmp; tmp.push_back(1); tmp.push_back(2); tmp.push_back(3); Any a = tmp; assertTrue (a.type() == typeid(std::vector)); std::vector tmp2 = AnyCast >(a); assertTrue (tmp2.size() == 3); const std::vector& vecCRef = RefAnyCast >(a); std::vector& vecRef = RefAnyCast >(a); assertTrue (vecRef[0] == 1); assertTrue (vecRef[1] == 2); assertTrue (vecRef[2] == 3); vecRef[0] = 0; assertTrue (vecRef[0] == vecCRef[0]); } void AnyTest::setUp() { } void AnyTest::tearDown() { } CppUnit::Test* AnyTest::suite() { CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("AnyTest"); CppUnit_addTest(pSuite, AnyTest, testConvertingCtor); CppUnit_addTest(pSuite, AnyTest, testDefaultCtor); CppUnit_addTest(pSuite, AnyTest, testCopyCtor); CppUnit_addTest(pSuite, AnyTest, testCopyAssign); CppUnit_addTest(pSuite, AnyTest, testConvertingAssign); CppUnit_addTest(pSuite, AnyTest, testBadCast); CppUnit_addTest(pSuite, AnyTest, testSwap); CppUnit_addTest(pSuite, AnyTest, testEmptyCopy); CppUnit_addTest(pSuite, AnyTest, testCastToReference); CppUnit_addTest(pSuite, AnyTest, testInt); CppUnit_addTest(pSuite, AnyTest, testComplexType); CppUnit_addTest(pSuite, AnyTest, testVector); return pSuite; }