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