[dali_1.1.39] Merge branch 'devel/master'
[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   value = map.Find( "world" );
203   DALI_TEST_CHECK( value );
204   DALI_TEST_CHECK( value->Get<int>() == 2 );
205
206   value = map.Find( 100 );
207   DALI_TEST_CHECK( value );
208   DALI_TEST_CHECK( value->Get<int>() == 9 );
209
210   value = map.Find( 10 );
211   DALI_TEST_CHECK( value );
212   DALI_TEST_EQUALS( "DALi", value->Get<std::string>(), TEST_LOCATION );
213
214   value = map.Find( "invalidKey" );
215   DALI_TEST_CHECK( !value );
216
217   END_TEST;
218 }
219
220 int UtcDaliPropertyMapInsertP(void)
221 {
222   Property::Map map;
223   DALI_TEST_EQUALS( 0u, map.Count(), TEST_LOCATION );
224   map.Insert( "foo", "bar");
225   DALI_TEST_EQUALS( 1u, map.Count(), TEST_LOCATION );
226   Property::Value* value = map.Find( "foo" );
227   DALI_TEST_CHECK( value );
228   DALI_TEST_EQUALS( "bar", value->Get<std::string>(), TEST_LOCATION );
229
230   map.Insert( std::string("foo2"), "testing" );
231   DALI_TEST_EQUALS( 2u, map.Count(), TEST_LOCATION );
232   value = map.Find( "foo2" );
233   DALI_TEST_CHECK( value );
234   DALI_TEST_EQUALS( "testing", value->Get<std::string>(), TEST_LOCATION );
235
236   map.Insert( 10, "DALi" );
237   DALI_TEST_EQUALS( 3u, map.Count(), TEST_LOCATION );
238   value = map.Find( 10 );
239   DALI_TEST_CHECK( value );
240   DALI_TEST_EQUALS( "DALi", value->Get<std::string>(), TEST_LOCATION );
241
242   map.Insert( 100, 9 );
243   DALI_TEST_EQUALS( 4u, map.Count(), TEST_LOCATION );
244   value = map.Find( 100 );
245   DALI_TEST_CHECK( value );
246   DALI_TEST_CHECK( value->Get<int>() == 9 );
247
248   END_TEST;
249 }
250
251 int UtcDaliPropertyMapMerge(void)
252 {
253   Property::Map map;
254   map[ "hello" ] = 1;
255   map[ 10 ] = "DALi";
256   map[ "world" ] = 2;
257
258   DALI_TEST_CHECK( map.Count() == 3 );
259
260   // Create another map with the same keys but different values
261   Property::Map map2;
262   map2[ "hello" ] = 3;
263   map2[ "world" ] = 4;
264   map[ 10 ] = "3DEngine";
265
266   // Merge map2 into map1, count should still be 2, map values should be from map2
267   map.Merge( map2 );
268   DALI_TEST_CHECK( map.Count() == 3 );
269   DALI_TEST_CHECK( map[ "hello" ].Get< int >() == 3 );
270   DALI_TEST_CHECK( map[ "world"].Get< int >() == 4 );
271   DALI_TEST_EQUALS( "3DEngine", map[ 10 ].Get<std::string>(), TEST_LOCATION );
272
273   // Create another map with different keys
274   Property::Map map3;
275   map3[ "foo" ] = 5;
276   map3[ 100 ] = 6;
277
278   // Merge map3 into map1, count should increase, existing values should match previous and new values should match map3
279   map.Merge( map3 );
280   DALI_TEST_CHECK( map.Count() == 5 );
281   DALI_TEST_CHECK( map[ "hello" ].Get< int >() == 3 );
282   DALI_TEST_CHECK( map[ "world"].Get< int >() == 4 );
283   DALI_TEST_CHECK( map[ "foo"].Get< int >() == 5 );
284   DALI_TEST_EQUALS( "3DEngine", map[ 10 ].Get<std::string>(), TEST_LOCATION );
285   DALI_TEST_CHECK( map[ 100].Get< int >() == 6 );
286
287   // Create an empty map and attempt to merge, should be successful, nothing should change
288   Property::Map map4;
289   DALI_TEST_CHECK( map4.Empty() );
290   map.Merge( map4 );
291   DALI_TEST_CHECK( map4.Empty() );
292   DALI_TEST_CHECK( map.Count() == 5 );
293   DALI_TEST_CHECK( map[ "hello" ].Get< int >() == 3 );
294   DALI_TEST_CHECK( map[ "world"].Get< int >() == 4 );
295   DALI_TEST_CHECK( map[ "foo"].Get< int >() == 5 );
296   DALI_TEST_EQUALS( "3DEngine", map[ 10 ].Get<std::string>(), TEST_LOCATION );
297   DALI_TEST_CHECK( map[ 100 ].Get< int >() == 6 );
298
299   // Merge map into map4, map4 should be the same as map now.
300   map4.Merge( map );
301   DALI_TEST_CHECK( map4.Count() == 5 );
302   DALI_TEST_CHECK( map4[ "hello" ].Get< int >() == 3 );
303   DALI_TEST_CHECK( map4[ "world"].Get< int >() == 4 );
304   DALI_TEST_CHECK( map4[ "foo"].Get< int >() == 5 );
305   DALI_TEST_EQUALS( "3DEngine", map[ 10 ].Get<std::string>(), TEST_LOCATION );
306   DALI_TEST_CHECK( map4[ 100 ].Get< int >() == 6 );
307
308   // Attempt to merge into itself, should be successful, nothing should change
309   map.Merge( map );
310   DALI_TEST_CHECK( map.Count() == 5 );
311   DALI_TEST_CHECK( map[ "hello" ].Get< int >() == 3 );
312   DALI_TEST_CHECK( map[ "world"].Get< int >() == 4 );
313   DALI_TEST_CHECK( map[ "foo"].Get< int >() == 5 );
314   DALI_TEST_EQUALS( "3DEngine", map[ 10 ].Get<std::string>(), TEST_LOCATION );
315   DALI_TEST_CHECK( map[ 100 ].Get< int >() == 6 );
316
317   END_TEST;
318 }
319
320 int UtcDaliPropertyMapOstream01(void)
321 {
322   Property::Map map;
323
324   map.Insert("duration", 5.0f);
325   map.Insert( 10, "DALi" );
326   map.Insert("delay", 1.0f);
327   map.Insert( 100, 9 );
328   map.Insert("value", 100);
329
330   std::ostringstream oss;
331   oss << map;
332
333   tet_printf("Testing ouput of map: %s\n", oss.str().c_str());
334
335   // string-value pairs first, then index-value pairs
336   DALI_TEST_EQUALS( oss.str().compare("Map(5) = {duration:5, delay:1, value:100, 10:DALi, 100:9}"), 0, TEST_LOCATION );
337
338   END_TEST;
339 }
340
341
342 int UtcDaliPropertyMapOstream02(void)
343 {
344   Property::Map map, map2;
345
346   map2.Insert("duration", 5.0f);
347   map2.Insert("delay", 1.0f);
348   map2.Insert( 10, "DALi" );
349   map.Insert("timePeriod", map2);
350   map.Insert( 100, 9 );
351   map.Insert("value", 100);
352
353   std::ostringstream oss;
354   oss << map;
355
356   tet_printf("Testing ouput of map: %s\n", oss.str().c_str());
357
358   // string-value pairs first, then index-value pairs
359   DALI_TEST_EQUALS( oss.str().compare("Map(3) = {timePeriod:Map(3) = {duration:5, delay:1, 10:DALi}, value:100, 100:9}"), 0, TEST_LOCATION );
360
361   END_TEST;
362 }