bb17787d5fc54d53204cff29f4f63c2db9b7ad6d
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-PropertyMap.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 #include <iostream>
19 #include <string>
20 #include <stdlib.h>
21 #include <dali/public-api/dali-core.h>
22 #include <dali-test-suite-utils.h>
23
24 using namespace Dali;
25
26 void utc_dali_property_map_startup(void)
27 {
28   test_return_value = TET_UNDEF;
29 }
30
31 void utc_dali_property_map_cleanup(void)
32 {
33   test_return_value = TET_PASS;
34 }
35
36 int UtcDaliPropertyMapPopulate(void)
37 {
38   Property::Map map;
39   DALI_TEST_CHECK( map.Empty() );
40
41   map[ "hello" ] = 1;
42   map[ 10 ] = "DALi";
43   map[ "world" ] = "world";
44   map[ 100 ] = 9;
45   map[ "world" ] = 3; // same item as line above
46   DALI_TEST_CHECK( !map.Empty() ); // Should no longer be empty
47   DALI_TEST_CHECK( map.Count() == 4 ); // Should only have four items, not five!!
48   DALI_TEST_CHECK( map["hello"].Get<int>() == 1 );
49   DALI_TEST_CHECK( map["world"].Get<int>() == 3 );
50   DALI_TEST_EQUALS( "DALi", map[ 10 ].Get<std::string>(), TEST_LOCATION );
51   DALI_TEST_CHECK( map[100].Get<int>() == 9 );
52
53   map.Clear();
54   DALI_TEST_CHECK( map.Empty() );
55   END_TEST;
56 }
57
58 int UtcDaliPropertyMapCopyAndAssignment(void)
59 {
60   Property::Map map;
61   map[ "hello" ] = 1;
62   map[ "world" ] = 2;
63   map[ 10 ] = "DALi";
64
65   Property::Map assignedMap;
66   assignedMap[ "foo" ] = 3;
67   assignedMap[ 100 ] = 9;
68   DALI_TEST_CHECK( assignedMap.Count() == 2 );
69   assignedMap = map;
70   DALI_TEST_CHECK( assignedMap.Count() == 3 );
71
72   Property::Map copiedMap( map );
73   DALI_TEST_CHECK( copiedMap.Count() == 3 );
74
75   // Self assignment
76   DALI_TEST_CHECK( map.Count() == 3 );
77   map = map;
78   DALI_TEST_CHECK( map.Count() == 3 );
79
80   END_TEST;
81 }
82
83 int UtcDaliPropertyMapConstOperator(void)
84 {
85   Property::Map map;
86   map[ "hello" ] = 1;
87   map[ 10 ] = "DALi";
88   map[ "world" ] = 2;
89   DALI_TEST_CHECK( map.Count() == 3 );
90
91   const Property::Map& constMap( map );
92   DALI_TEST_CHECK( constMap[ "world" ].Get<int>() == 2 );
93   DALI_TEST_CHECK( constMap.Count() == 3 ); // Ensure count hasn't gone up
94
95   DALI_TEST_EQUALS( "DALi", map[ 10 ].Get<std::string>(), TEST_LOCATION );
96   DALI_TEST_CHECK( constMap.Count() == 3 ); // Ensure count hasn't gone up
97
98   // Invalid Key
99   try
100   {
101     constMap[ "invalidKey" ];
102     tet_result( TET_FAIL );
103   }
104   catch ( DaliException& e )
105   {
106     DALI_TEST_ASSERT( e, "! \"Invalid Key\"", TEST_LOCATION );
107   }
108
109   END_TEST;
110 }
111
112 // deprecated API, only retrieve the value from string-value pairs
113 int UtcDaliPropertyMapGetValue(void)
114 {
115   Property::Map map;
116   map[ "hello" ] = 1;
117   map[ "world" ] = 2;
118
119   Property::Value& value = map.GetValue( 0 );
120   DALI_TEST_CHECK( value.Get<int>() == 1 );
121   value = 10; // Allows the actual changing of the value as we have a ref
122   DALI_TEST_CHECK( map[ "hello" ].Get<int>() == 10 );
123
124   // Out of bounds
125   try
126   {
127     map.GetValue( 2 );
128     tet_result( TET_FAIL );
129   }
130   catch ( DaliException& e )
131   {
132     DALI_TEST_ASSERT( e, "position", TEST_LOCATION );
133   }
134
135   END_TEST;
136 }
137
138 // deprecated API, only retrieve the key from the string-value pairs
139 int UtcDaliPropertyMapGetKey(void)
140 {
141   Property::Map map;
142   map[ "hello" ] = 1;
143   map[ "world" ] = 2;
144
145   DALI_TEST_CHECK( map.GetKey( 0 ) == "hello" );
146   DALI_TEST_CHECK( map.GetKey( 1 ) == "world" );
147
148   // Out of bounds
149   try
150   {
151     map.GetKey( 2 );
152     tet_result( TET_FAIL );
153   }
154   catch ( DaliException& e )
155   {
156     DALI_TEST_ASSERT( e, "position", TEST_LOCATION );
157   }
158
159   END_TEST;
160 }
161
162 // deprecated API, only retrieve the string-value pairs
163 int UtcDaliPropertyMapGetPair(void)
164 {
165   Property::Map map;
166   map[ "hello" ] = 1;
167   map[ "world" ] = 2;
168
169   DALI_TEST_CHECK( map.GetPair( 0 ).first == "hello" );
170   DALI_TEST_CHECK( map.GetPair( 0 ).second.Get< int >() == 1 );
171   DALI_TEST_CHECK( map.GetPair( 1 ).first == "world" );
172   DALI_TEST_CHECK( map.GetPair( 1 ).second.Get< int >() == 2 );
173
174   // Out of bounds
175   try
176   {
177     map.GetPair( 2 );
178     tet_result( TET_FAIL );
179   }
180   catch ( DaliException& e )
181   {
182     DALI_TEST_ASSERT( e, "position", TEST_LOCATION );
183   }
184
185   END_TEST;
186 }
187
188 int UtcDaliPropertyMapFind(void)
189 {
190   Property::Map map;
191   map[ "hello" ] = 1;
192   map[ 10 ] = "DALi";
193   map[ "world" ] = 2;
194   map[ 100 ] = 9;
195
196   Property::Value* value = NULL;
197
198   value = map.Find( "hello" );
199   DALI_TEST_CHECK( value );
200   DALI_TEST_CHECK( value->Get<int>() == 1 );
201
202   const std::string world("world");
203   value = map.Find( world );
204   DALI_TEST_CHECK( value );
205   DALI_TEST_CHECK( value->Get<int>() == 2 );
206
207   value = map.Find( 100 );
208   DALI_TEST_CHECK( value );
209   DALI_TEST_CHECK( value->Get<int>() == 9 );
210
211   value = map.Find( 10, Property::STRING );
212   DALI_TEST_CHECK( value );
213   DALI_TEST_EQUALS( "DALi", value->Get<std::string>(), TEST_LOCATION );
214
215   value = map.Find( 10, Property::INTEGER );
216   DALI_TEST_CHECK( value == NULL );
217
218   value = map.Find( "invalidKey" );
219   DALI_TEST_CHECK( !value );
220
221   END_TEST;
222 }
223
224
225 int UtcDaliPropertyMapOperatorIndex(void)
226 {
227   Property::Map map;
228   map[ "hello" ] = 1;
229   map[ 10 ] = "DALi";
230   map[ "world" ] = 2;
231   map[ 100 ] = 9;
232
233   const Property::Map map2 = map;
234   const Property::Value& value10 = map2[10];
235   DALI_TEST_EQUALS( value10.Get<std::string>(), "DALi", TEST_LOCATION );
236
237   const Property::Value& value100 = map2[100];
238   DALI_TEST_EQUALS( value100.Get<int>(), 9, TEST_LOCATION );
239
240   const Property::Value& valueHello = map2["hello"];
241   DALI_TEST_EQUALS( valueHello.Get<int>(), 1, TEST_LOCATION );
242
243   END_TEST;
244 }
245
246 int UtcDaliPropertyMapInsertP(void)
247 {
248   Property::Map map;
249   DALI_TEST_EQUALS( 0u, map.Count(), TEST_LOCATION );
250   map.Insert( "foo", "bar");
251   DALI_TEST_EQUALS( 1u, map.Count(), TEST_LOCATION );
252   Property::Value* value = map.Find( "foo" );
253   DALI_TEST_CHECK( value );
254   DALI_TEST_EQUALS( "bar", value->Get<std::string>(), TEST_LOCATION );
255
256   map.Insert( std::string("foo2"), "testing" );
257   DALI_TEST_EQUALS( 2u, map.Count(), TEST_LOCATION );
258   value = map.Find( "foo2" );
259   DALI_TEST_CHECK( value );
260   DALI_TEST_EQUALS( "testing", value->Get<std::string>(), TEST_LOCATION );
261
262   map.Insert( 10, "DALi" );
263   DALI_TEST_EQUALS( 3u, map.Count(), TEST_LOCATION );
264   value = map.Find( 10 );
265   DALI_TEST_CHECK( value );
266   DALI_TEST_EQUALS( "DALi", value->Get<std::string>(), TEST_LOCATION );
267
268   map.Insert( 100, 9 );
269   DALI_TEST_EQUALS( 4u, map.Count(), TEST_LOCATION );
270   value = map.Find( 100 );
271   DALI_TEST_CHECK( value );
272   DALI_TEST_CHECK( value->Get<int>() == 9 );
273
274   END_TEST;
275 }
276
277 int UtcDaliPropertyMapMerge(void)
278 {
279   Property::Map map;
280   map[ "hello" ] = 1;
281   map[ 10 ] = "DALi";
282   map[ "world" ] = 2;
283
284   DALI_TEST_CHECK( map.Count() == 3 );
285
286   // Create another map with the same keys but different values
287   Property::Map map2;
288   map2[ "hello" ] = 3;
289   map2[ "world" ] = 4;
290   map[ 10 ] = "3DEngine";
291
292   // Merge map2 into map1, count should still be 2, map values should be from map2
293   map.Merge( map2 );
294   DALI_TEST_CHECK( map.Count() == 3 );
295   DALI_TEST_CHECK( map[ "hello" ].Get< int >() == 3 );
296   DALI_TEST_CHECK( map[ "world"].Get< int >() == 4 );
297   DALI_TEST_EQUALS( "3DEngine", map[ 10 ].Get<std::string>(), TEST_LOCATION );
298
299   // Create another map with different keys
300   Property::Map map3;
301   map3[ "foo" ] = 5;
302   map3[ 100 ] = 6;
303
304   // Merge map3 into map1, count should increase, existing values should match previous and new values should match map3
305   map.Merge( map3 );
306   DALI_TEST_CHECK( map.Count() == 5 );
307   DALI_TEST_CHECK( map[ "hello" ].Get< int >() == 3 );
308   DALI_TEST_CHECK( map[ "world"].Get< int >() == 4 );
309   DALI_TEST_CHECK( map[ "foo"].Get< int >() == 5 );
310   DALI_TEST_EQUALS( "3DEngine", map[ 10 ].Get<std::string>(), TEST_LOCATION );
311   DALI_TEST_CHECK( map[ 100].Get< int >() == 6 );
312
313   // Create an empty map and attempt to merge, should be successful, nothing should change
314   Property::Map map4;
315   DALI_TEST_CHECK( map4.Empty() );
316   map.Merge( map4 );
317   DALI_TEST_CHECK( map4.Empty() );
318   DALI_TEST_CHECK( map.Count() == 5 );
319   DALI_TEST_CHECK( map[ "hello" ].Get< int >() == 3 );
320   DALI_TEST_CHECK( map[ "world"].Get< int >() == 4 );
321   DALI_TEST_CHECK( map[ "foo"].Get< int >() == 5 );
322   DALI_TEST_EQUALS( "3DEngine", map[ 10 ].Get<std::string>(), TEST_LOCATION );
323   DALI_TEST_CHECK( map[ 100 ].Get< int >() == 6 );
324
325   // Merge map into map4, map4 should be the same as map now.
326   map4.Merge( map );
327   DALI_TEST_CHECK( map4.Count() == 5 );
328   DALI_TEST_CHECK( map4[ "hello" ].Get< int >() == 3 );
329   DALI_TEST_CHECK( map4[ "world"].Get< int >() == 4 );
330   DALI_TEST_CHECK( map4[ "foo"].Get< int >() == 5 );
331   DALI_TEST_EQUALS( "3DEngine", map[ 10 ].Get<std::string>(), TEST_LOCATION );
332   DALI_TEST_CHECK( map4[ 100 ].Get< int >() == 6 );
333
334   // Attempt to merge into itself, should be successful, nothing should change
335   map.Merge( map );
336   DALI_TEST_CHECK( map.Count() == 5 );
337   DALI_TEST_CHECK( map[ "hello" ].Get< int >() == 3 );
338   DALI_TEST_CHECK( map[ "world"].Get< int >() == 4 );
339   DALI_TEST_CHECK( map[ "foo"].Get< int >() == 5 );
340   DALI_TEST_EQUALS( "3DEngine", map[ 10 ].Get<std::string>(), TEST_LOCATION );
341   DALI_TEST_CHECK( map[ 100 ].Get< int >() == 6 );
342
343   END_TEST;
344 }
345
346 int UtcDaliPropertyMapOstream01(void)
347 {
348   Property::Map map;
349
350   map.Insert("duration", 5.0f);
351   map.Insert( 10, "DALi" );
352   map.Insert("delay", 1.0f);
353   map.Insert( 100, 9 );
354   map.Insert("value", 100);
355
356   std::ostringstream oss;
357   oss << map;
358
359   tet_printf("Testing ouput of map: %s\n", oss.str().c_str());
360
361   // string-value pairs first, then index-value pairs
362   DALI_TEST_EQUALS( oss.str().compare("Map(5) = {duration:5, delay:1, value:100, 10:DALi, 100:9}"), 0, TEST_LOCATION );
363
364   END_TEST;
365 }
366
367
368 int UtcDaliPropertyMapOstream02(void)
369 {
370   Property::Map map, map2;
371
372   map2.Insert("duration", 5.0f);
373   map2.Insert("delay", 1.0f);
374   map2.Insert( 10, "DALi" );
375   map.Insert("timePeriod", map2);
376   map.Insert( 100, 9 );
377   map.Insert("value", 100);
378
379   std::ostringstream oss;
380   oss << map;
381
382   tet_printf("Testing ouput of map: %s\n", oss.str().c_str());
383
384   // string-value pairs first, then index-value pairs
385   DALI_TEST_EQUALS( oss.str().compare("Map(3) = {timePeriod:Map(3) = {duration:5, delay:1, 10:DALi}, value:100, 100:9}"), 0, TEST_LOCATION );
386
387   END_TEST;
388 }