1 // 2 // VarTest.h 3 // 4 // Tests for Any types 5 // 6 // Copyright (c) 2006, Applied Informatics Software Engineering GmbH. 7 // and Contributors. 8 // 9 // SPDX-License-Identifier: BSL-1.0 10 // 11 12 #ifndef VarTest_INCLUDED 13 #define VarTest_INCLUDED 14 15 16 #include "Poco/Foundation.h" 17 #include "Poco/Dynamic/Var.h" 18 #include "Poco/Dynamic/VarIterator.h" 19 #include "Poco/Exception.h" 20 #include "CppUnit/TestCase.h" 21 22 23 class VarTest: public CppUnit::TestCase 24 { 25 public: 26 VarTest(const std::string& name); 27 ~VarTest(); 28 29 void testInt8(); 30 void testInt16(); 31 void testInt32(); 32 void testInt64(); 33 void testUInt8(); 34 void testUInt16(); 35 void testUInt32(); 36 void testUInt64(); 37 void testBool(); 38 void testChar(); 39 void testFloat(); 40 void testDouble(); 41 void testLong(); 42 void testULong(); 43 void testLongLong(); 44 void testULongLong(); 45 void testString(); 46 void testUDT(); 47 void testConversionOperator(); 48 void testComparisonOperators(); 49 void testArithmeticOperators(); 50 void testLimitsInt(); 51 void testLimitsFloat(); 52 void testCtor(); 53 void testIsStruct(); 54 void testIsArray(); 55 void testArrayIdxOperator(); 56 void testDynamicPair(); 57 void testDynamicStructBasics(); 58 void testOrderedDynamicStructBasics(); 59 void testDynamicStructString(); 60 void testOrderedDynamicStructString(); 61 void testDynamicStructInt(); 62 void testOrderedDynamicStructInt(); 63 void testArrayToString(); 64 void testArrayToStringEscape(); 65 void testStructToString(); 66 void testOrderedStructToString(); 67 void testStructToStringEscape(); 68 void testArrayOfStructsToString(); 69 void testStructWithArraysToString(); 70 void testJSONDeserializeString(); 71 void testJSONDeserializePrimitives(); 72 void testJSONDeserializeArray(); 73 void testJSONDeserializeStruct(); 74 void testJSONRoundtripStruct(); 75 void testJSONDeserializeComplex(); 76 void testDate(); 77 void testEmpty(); 78 void testIterator(); 79 80 81 void setUp(); 82 void tearDown(); 83 static CppUnit::Test* suite(); 84 85 private: 86 void testGetIdxMustThrow(Poco::Dynamic::Var& a1, std::vector<Poco::Dynamic::Var>::size_type n); 87 void testGetIdxNoThrow(Poco::Dynamic::Var& a1, std::vector<Poco::Dynamic::Var>::size_type n); 88 template<typename T> testGetIdx(const Poco::Dynamic::Var & a1,std::vector<Poco::Dynamic::Var>::size_type n,const T & expectedResult)89 void testGetIdx(const Poco::Dynamic::Var& a1, std::vector<Poco::Dynamic::Var>::size_type n, const T& expectedResult) 90 { 91 Poco::Dynamic::Var val1 = a1[n]; 92 assertTrue (val1 == expectedResult); 93 94 const Poco::Dynamic::Var c1 = a1; 95 assertTrue (a1 == c1); // silence the compiler 96 const Poco::Dynamic::Var cval1 = a1[n]; 97 assertTrue (cval1 == expectedResult); 98 } 99 100 101 template<typename TL, typename TS> testLimitsSigned()102 void testLimitsSigned() 103 { 104 TL iMin = std::numeric_limits<TS>::min(); 105 Poco::Dynamic::Var da = iMin - 1; 106 try { TS POCO_UNUSED i; i = da.convert<TS>(); fail("must fail"); } 107 catch (Poco::RangeException&) {} 108 109 TL iMax = std::numeric_limits<TS>::max(); 110 da = iMax + 1; 111 try { TS POCO_UNUSED i; i = da.convert<TS>(); fail("must fail"); } 112 catch (Poco::RangeException&) {} 113 } 114 115 template<typename TL, typename TS> testLimitsFloatToInt()116 void testLimitsFloatToInt() 117 { 118 Poco::Dynamic::Var da; 119 120 if (std::numeric_limits<TS>::is_signed) 121 { 122 TL iMin = static_cast<TL>(std::numeric_limits<TS>::min()); 123 da = iMin * 10; 124 try { TS POCO_UNUSED i; i = da.convert<TS>(); fail("must fail"); } 125 catch (Poco::RangeException&) {} 126 } 127 128 TL iMax = static_cast<TL>(std::numeric_limits<TS>::max()); 129 da = iMax * 10; 130 try { TS POCO_UNUSED i; i = da.convert<TS>(); fail("must fail"); } 131 catch (Poco::RangeException&) {} 132 } 133 134 template<typename TS, typename TU> testLimitsSignedUnsigned()135 void testLimitsSignedUnsigned() 136 { 137 assertTrue (std::numeric_limits<TS>::is_signed); 138 assertTrue (!std::numeric_limits<TU>::is_signed); 139 140 TS iMin = std::numeric_limits<TS>::min(); 141 Poco::Dynamic::Var dMin = iMin; 142 try { TU POCO_UNUSED i; i = dMin.convert<TU>(); fail("must fail"); } 143 catch (Poco::RangeException&) {} 144 145 if(sizeof(TS) == sizeof(TU)) 146 { 147 TU iMax = std::numeric_limits<TU>::max(); 148 Poco::Dynamic::Var dMax = iMax; 149 try { TS POCO_UNUSED i; i = dMax.convert<TS>(); fail("must fail"); } 150 catch (Poco::RangeException&) {} 151 } 152 } 153 154 template<typename TL, typename TS> testLimitsUnsigned()155 void testLimitsUnsigned() 156 { 157 TL iMax = std::numeric_limits<TS>::max(); 158 Poco::Dynamic::Var da = iMax + 1; 159 try { TS POCO_UNUSED i; i = da.convert<TS>(); fail("must fail"); } 160 catch (Poco::RangeException&) {} 161 } 162 163 template <typename T> testEmptyComparisons()164 void testEmptyComparisons() 165 { 166 Poco::Dynamic::Var da; 167 T val = 0; 168 169 assertTrue (da != val); 170 assertTrue (val != da); 171 assertTrue (!(val == da)); 172 assertTrue (!(da == val)); 173 assertTrue (!(da < val)); 174 assertTrue (!(val < da)); 175 assertTrue (!(da > val)); 176 assertTrue (!(val > da)); 177 assertTrue (!(da <= val)); 178 assertTrue (!(val <= da)); 179 assertTrue (!(da >= val)); 180 assertTrue (!(val >= da)); 181 } 182 183 template <typename C> testContainerIterator()184 void testContainerIterator() 185 { 186 C cont; 187 cont.push_back(1); 188 cont.push_back("2"); 189 cont.push_back(3.5); 190 Poco::Dynamic::Var arr(cont); 191 assertTrue (arr.size() == 3); 192 Poco::Dynamic::Var::Iterator it = arr.begin(); 193 Poco::Dynamic::Var::Iterator end = arr.end(); 194 int counter = 0; 195 for (; it != end; ++it) 196 { 197 switch (++counter) 198 { 199 case 1: 200 assertTrue (*it == 1); 201 break; 202 case 2: 203 assertTrue (*it == 2); 204 break; 205 case 3: 206 assertTrue (*it == 3.5); 207 break; 208 default: 209 fail ("must fail - wrong size"); 210 } 211 } 212 } 213 }; 214 215 216 #endif // VarTest_INCLUDED 217