[dali_1.9.31] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-FlexNode.cpp
1 /*
2  * Copyright (c) 2020 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 <stdlib.h>
20 #include <dali-toolkit-test-suite-utils.h>
21 #include <dali-toolkit/dali-toolkit.h>
22 #include <dali/devel-api/actors/actor-devel.h>
23 #include <dali-toolkit/devel-api/layouting/flex-node.h>
24
25 using namespace Dali;
26 using namespace Toolkit;
27
28 void dali_flexNodeContainer_startup(void)
29 {
30   test_return_value = TET_UNDEF;
31 }
32
33 void dali_flexNodeContainer_cleanup(void)
34 {
35   test_return_value = TET_PASS;
36 }
37
38 namespace
39 {
40
41 const Flex::SizeTuple ITEM_SIZE = Flex::SizeTuple{ 10.0f, 10.0f };
42 const Flex::SizeTuple ITEM_SIZE_CALLBACK_TEST = Flex::SizeTuple{ 15.0f, 15.0f };
43
44 void MeasureChild( Actor child, float width, int measureModeWidth, float height, int measureModeHeight, Flex::SizeTuple *childSize)
45 {
46   *childSize = ITEM_SIZE;
47   if (child.GetProperty< std::string >( Dali::Actor::Property::NAME ) == "callbackTest")
48   {
49     *childSize = ITEM_SIZE_CALLBACK_TEST;
50   }
51   tet_printf(" MeasureChild test callback executed (%f,%f)\n", childSize->width, childSize->height );
52 }
53
54 }
55
56 int UtcDaliToolkitFlexNodeConstructorP(void)
57 {
58   ToolkitTestApplication application;
59   tet_infoline(" UtcDaliToolkitFlexNodeNewP");
60   Flex::Node* flexNode = new Flex::Node();
61   DALI_TEST_CHECK( flexNode );
62   END_TEST;
63 }
64
65 int UtcDaliToolkitFlexNodeAddChildWithMarginP(void)
66 {
67   ToolkitTestApplication application;
68   tet_infoline(" UtcDaliToolkitFlexNodeAddChildWithMarginP");
69   Flex::Node* flexNode = new Flex::Node();
70   DALI_TEST_CHECK( flexNode );
71
72   // Position elements as a Row
73   flexNode->SetFlexDirection(Flex::FlexDirection::ROW);
74
75   // Create two actors and add them to the parent flex node
76   Actor actor = Actor::New();
77   DALI_TEST_CHECK( actor );
78
79   Extents margin( 5,5,5,5);
80   flexNode->AddChild(actor, margin, &MeasureChild, 0);
81
82   DALI_TEST_EQUALS( (int)flexNode->GetFlexDirection(), (int)Flex::FlexDirection::ROW, TEST_LOCATION );
83
84   flexNode->CalculateLayout(480, 800, false);
85
86   Vector4 actorFrame = flexNode->GetNodeFrame(0);
87
88   tet_printf("Actor frame(left:%f,top:%f,right:%f,bottom:%f)\n", actorFrame.x, actorFrame.y, actorFrame.z, actorFrame.w);
89
90   DALI_TEST_EQUALS( actorFrame, Vector4( 5.0f, 5.0f, ITEM_SIZE.width+5, ITEM_SIZE.height+5 ), TEST_LOCATION );
91
92   END_TEST;
93 }
94
95 int UtcDaliToolkitFlexNodeAddChildrenRowP(void)
96 {
97   ToolkitTestApplication application;
98   tet_infoline(" UtcDaliToolkitFlexNodeAddChildrenRowP");
99   Flex::Node* flexNode = new Flex::Node();
100   DALI_TEST_CHECK( flexNode );
101
102   // Position elements as a Row
103   flexNode->SetFlexDirection(Flex::FlexDirection::ROW);
104
105   // Create two actors and add them to the parent flex node
106   Actor actor1 = Actor::New();
107   Actor actor2 = Actor::New();
108   DALI_TEST_CHECK( actor1 );
109   DALI_TEST_CHECK( actor2 );
110
111   flexNode->AddChild(actor1, Extents(0,0,0,0), &MeasureChild, 0);
112   flexNode->AddChild(actor2, Extents(0,0,0,0), &MeasureChild, 1);
113
114   DALI_TEST_EQUALS( (int)flexNode->GetFlexDirection(), (int)Flex::FlexDirection::ROW, TEST_LOCATION );
115
116   flexNode->CalculateLayout(480, 800, false);
117
118   Vector4 actor1Frame = flexNode->GetNodeFrame(0);
119   Vector4 actor2Frame = flexNode->GetNodeFrame(1);
120
121   tet_printf("Actor 1 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor1Frame.x, actor1Frame.y, actor1Frame.z, actor1Frame.w);
122   tet_printf("Actor 2 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor2Frame.x, actor2Frame.y, actor2Frame.z, actor2Frame.w);
123
124   DALI_TEST_EQUALS( actor1Frame, Vector4( 0.0f, 0.0f, ITEM_SIZE.width, ITEM_SIZE.height ), TEST_LOCATION );
125   DALI_TEST_EQUALS( actor2Frame, Vector4( ITEM_SIZE.width, 0.0f, ITEM_SIZE.width * 2, ITEM_SIZE.height ), TEST_LOCATION );
126
127   END_TEST;
128 }
129
130 int UtcDaliToolkitFlexNodeAddChildrenColumnP(void)
131 {
132   ToolkitTestApplication application;
133   tet_infoline("UtcDaliToolkitFlexNodeAddChildrenColumnP");
134   Flex::Node* flexNode = new Flex::Node();
135   DALI_TEST_CHECK( flexNode );
136
137   // Position elements in a Column
138   flexNode->SetFlexDirection(Flex::FlexDirection::COLUMN);
139
140   // Create two actors and add them to the parent flex node
141   Actor actor1 = Actor::New();
142   Actor actor2 = Actor::New();
143   DALI_TEST_CHECK( actor1 );
144   DALI_TEST_CHECK( actor2 );
145
146   flexNode->AddChild(actor1, Extents(0,0,0,0), &MeasureChild, 0);
147   flexNode->AddChild(actor2, Extents(0,0,0,0), &MeasureChild, 1);
148
149   flexNode->CalculateLayout(480, 800, false);
150
151   Vector4 root = flexNode->GetNodeFrame(-1); // -1 is the root
152   Vector4 actor1Frame = flexNode->GetNodeFrame(0); // 0 is first child
153   Vector4 actor2Frame = flexNode->GetNodeFrame(1); // 1 is second child
154
155   tet_printf("Root frame(left:%f,top:%f,right:%f,bottom:%f)\n", root.x, root.y, root.z, root.w);
156
157   tet_printf("Actor 1 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor1Frame.x, actor1Frame.y, actor1Frame.z, actor1Frame.w);
158   tet_printf("Actor 2 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor2Frame.x, actor2Frame.y, actor2Frame.z, actor2Frame.w);
159
160   DALI_TEST_EQUALS( actor1Frame, Vector4( 0.0f, 0.0f, ITEM_SIZE.width, ITEM_SIZE.height ), TEST_LOCATION );
161   DALI_TEST_EQUALS( actor2Frame, Vector4( 0.0f, ITEM_SIZE.height, ITEM_SIZE.width, ITEM_SIZE.height *2 ), TEST_LOCATION );
162
163   END_TEST;
164 }
165
166
167 int UtcDaliToolkitFlexNodeAddChildrenColumnJustify(void)
168 {
169   ToolkitTestApplication application;
170   tet_infoline("UtcDaliToolkitFlexNodeAddChildrenColumnJustify");
171   Flex::Node* flexNode = new Flex::Node();
172   DALI_TEST_CHECK( flexNode );
173
174   // Position elements in a Column
175   flexNode->SetFlexDirection(Flex::FlexDirection::COLUMN);
176
177   tet_infoline("Justify to the Start, align to start, third item should be displayed at the top and the end");
178   flexNode->SetFlexJustification(Flex::Justification::FLEX_START);
179   flexNode->SetFlexItemsAlignment( Flex::Alignment::FLEX_START );
180
181   // Create three actors and add them to the parent flex node
182   Actor actor1 = Actor::New();
183   Actor actor2 = Actor::New();
184   Actor actor3 = Actor::New();
185   DALI_TEST_CHECK( actor1 );
186   DALI_TEST_CHECK( actor2 );
187   DALI_TEST_CHECK( actor3 );
188
189   DALI_TEST_EQUALS( (int)flexNode->GetFlexJustification(), (int)Flex::Justification::FLEX_START, TEST_LOCATION );
190   DALI_TEST_EQUALS( (int)flexNode->GetFlexItemsAlignment(), (int)Flex::Alignment::FLEX_START, TEST_LOCATION );
191
192   flexNode->AddChild(actor1, Extents(0,0,0,0), &MeasureChild, 0);
193   flexNode->AddChild(actor2, Extents(0,0,0,0), &MeasureChild, 1);
194   Flex::Node* actor3node = flexNode->AddChild(actor3, Extents(0,0,0,0), &MeasureChild, 2);
195   actor3node->SetFlexAlignmentSelf( Flex::Alignment::FLEX_END );
196
197   flexNode->CalculateLayout(480, 800, false);
198
199   Vector4 root = flexNode->GetNodeFrame(-1); // -1 is the root
200   Vector4 actor1Frame = flexNode->GetNodeFrame(0); // 0 is first child
201   Vector4 actor2Frame = flexNode->GetNodeFrame(1); // 1 is second child
202   Vector4 actor3Frame = flexNode->GetNodeFrame(2); // 2 is third child
203
204   tet_printf("Root frame(left:%f,top:%f,right:%f,bottom:%f)\n", root.x, root.y, root.z, root.w);
205
206   tet_printf("Actor 1 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor1Frame.x, actor1Frame.y, actor1Frame.z, actor1Frame.w);
207   tet_printf("Actor 2 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor2Frame.x, actor2Frame.y, actor2Frame.z, actor2Frame.w);
208   tet_printf("Actor 3 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor3Frame.x, actor3Frame.y, actor3Frame.z, actor3Frame.w);
209
210   /*
211     ---------
212     |1      |
213     |2      |
214     |      3|
215     |       |
216     |       |
217     ---------
218   */
219
220   DALI_TEST_EQUALS( actor1Frame, Vector4( 0.0f, 0.0f, ITEM_SIZE.width, ITEM_SIZE.height ), TEST_LOCATION );
221   DALI_TEST_EQUALS( actor2Frame, Vector4( 0.0f, ITEM_SIZE.height, ITEM_SIZE.width, ITEM_SIZE.height *2 ), TEST_LOCATION );
222   DALI_TEST_EQUALS( actor3Frame, Vector4( root.z - ITEM_SIZE.width, ITEM_SIZE.height *2, root.z, ITEM_SIZE.height *3 ), TEST_LOCATION );
223
224   tet_infoline(" Justify to the End, items should now be displayed at the bottom, third item should now be displayed at the end");
225   flexNode->SetFlexJustification( Flex::Justification::FLEX_END );
226   flexNode->SetFlexItemsAlignment( Flex::Alignment::FLEX_START );
227
228   // Recalulate layout
229   flexNode->CalculateLayout(480, 800, false);
230
231   root = flexNode->GetNodeFrame(-1); // -1 is the root
232   actor1Frame = flexNode->GetNodeFrame(0); // 0 is first child
233   actor2Frame = flexNode->GetNodeFrame(1); // 1 is second child
234   actor3Frame = flexNode->GetNodeFrame(2); // 2 is third child
235
236   tet_printf("Root frame(left:%f,top:%f,right:%f,bottom:%f)\n", root.x, root.y, root.z, root.w);
237
238   tet_printf("Actor 1 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor1Frame.x, actor1Frame.y, actor1Frame.z, actor1Frame.w);
239   tet_printf("Actor 2 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor2Frame.x, actor2Frame.y, actor2Frame.z, actor2Frame.w);
240   tet_printf("Actor 3 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor3Frame.x, actor3Frame.y, actor3Frame.z, actor3Frame.w);
241
242   /*
243     ---------
244     |       |
245     |       |
246     |1      |
247     |2      |
248     |      3|
249     ---------
250   */
251
252   DALI_TEST_EQUALS( actor1Frame, Vector4( 0.0f, root.w - (ITEM_SIZE.height*3), ITEM_SIZE.width,  root.w - (ITEM_SIZE.height*2) ), TEST_LOCATION );
253   DALI_TEST_EQUALS( actor2Frame, Vector4( 0.0f, root.w - (ITEM_SIZE.height*2), ITEM_SIZE.width, root.w - ITEM_SIZE.height ), TEST_LOCATION );
254   DALI_TEST_EQUALS( actor3Frame, Vector4( root.z - ITEM_SIZE.width, root.w - ITEM_SIZE.height, root.z, root.w ), TEST_LOCATION );
255
256   tet_infoline(" Align to End, items should now be displayed at the bottom and the end");
257   flexNode->SetFlexJustification( Flex::Justification::FLEX_END );
258   flexNode->SetFlexItemsAlignment( Flex::Alignment::FLEX_END );
259   // Recalulate layout
260   flexNode->CalculateLayout(480, 800, false);
261
262   root = flexNode->GetNodeFrame(-1); // -1 is the root
263   actor1Frame = flexNode->GetNodeFrame(0); // 0 is first child
264   actor2Frame = flexNode->GetNodeFrame(1); // 1 is second child
265   actor3Frame = flexNode->GetNodeFrame(2); // 2 is third child
266
267   tet_printf("Actor 1 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor1Frame.x, actor1Frame.y, actor1Frame.z, actor1Frame.w);
268   tet_printf("Actor 2 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor2Frame.x, actor2Frame.y, actor2Frame.z, actor2Frame.w);
269   tet_printf("Actor 3 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor3Frame.x, actor3Frame.y, actor3Frame.z, actor3Frame.w);
270
271   /*
272     ---------
273     |       |
274     |       |
275     |      1|
276     |      2|
277     |      3|
278     ---------
279   */
280
281   DALI_TEST_EQUALS( actor1Frame, Vector4( root.z - ITEM_SIZE.width, root.w - (ITEM_SIZE.height*3), root.z,  root.w - (ITEM_SIZE.height*2) ), TEST_LOCATION );
282   DALI_TEST_EQUALS( actor2Frame, Vector4( root.z - ITEM_SIZE.width, root.w - (ITEM_SIZE.height*2), root.z,  root.w - ITEM_SIZE.height ), TEST_LOCATION );
283   DALI_TEST_EQUALS( actor3Frame, Vector4( root.z - ITEM_SIZE.width, root.w - ITEM_SIZE.height, root.z, root.w ), TEST_LOCATION );
284
285   END_TEST;
286 }
287
288 int UtcDaliToolkitFlexNodeSizingP(void)
289 {
290   ToolkitTestApplication application;
291   tet_infoline(" UtcDaliToolkitFlexNodeSizingP");
292   Flex::Node* flexNode = new Flex::Node();
293   DALI_TEST_CHECK( flexNode );
294
295   // Create two actors and add them to the parent flex node
296   Actor actor1 = Actor::New();
297   Actor actor2 = Actor::New();
298   DALI_TEST_CHECK( actor1 );
299   DALI_TEST_CHECK( actor2 );
300
301   flexNode->AddChild(actor1, Extents(0,0,0,0), &MeasureChild, 0);
302   flexNode->AddChild(actor2, Extents(0,0,0,0), &MeasureChild, 1);
303
304   flexNode->CalculateLayout(480, 800, false);
305
306   DALI_TEST_EQUALS( flexNode->GetFlexWidth(), 480.0f, TEST_LOCATION );
307   DALI_TEST_EQUALS( flexNode->GetFlexHeight(), 800.0f, TEST_LOCATION );
308
309   END_TEST;
310 }
311
312 int UtcDaliToolkitFlexNodeWrapModeP(void)
313 {
314   ToolkitTestApplication application;
315   tet_infoline("UtcDaliToolkitFlexNodeWrapModeP");
316   Flex::Node* flexNode = new Flex::Node();
317   DALI_TEST_CHECK( flexNode );
318
319   // Position elements in a Column
320   flexNode->SetFlexDirection( Flex::FlexDirection::ROW );
321   flexNode->SetFlexAlignment( Flex::Alignment::FLEX_START );
322   flexNode->SetFlexWrap( Flex::WrapType::NO_WRAP );
323
324   // Create two actors and add them to the parent flex node
325   Actor actor1 = Actor::New();
326   Actor actor2 = Actor::New();
327   Actor actor3 = Actor::New();
328   Actor actor4 = Actor::New();
329
330   DALI_TEST_EQUALS( (int)flexNode->GetFlexJustification(), (int)Flex::Justification::FLEX_START, TEST_LOCATION );
331   DALI_TEST_EQUALS( (int)flexNode->GetFlexItemsAlignment(), (int)Flex::Alignment::FLEX_START, TEST_LOCATION );
332   DALI_TEST_EQUALS( (int)flexNode->GetFlexAlignment(), (int)Flex::Alignment::FLEX_START, TEST_LOCATION );
333   DALI_TEST_EQUALS( (int)flexNode->GetFlexWrap(), (int)Flex::WrapType::NO_WRAP, TEST_LOCATION );
334
335   flexNode->AddChild( actor1, Extents(0,0,0,0), &MeasureChild, 0 );
336   flexNode->AddChild( actor2, Extents(0,0,0,0), &MeasureChild, 1 );
337   flexNode->AddChild( actor2, Extents(0,0,0,0), &MeasureChild, 2 );
338   flexNode->AddChild( actor2, Extents(0,0,0,0), &MeasureChild, 3 );
339
340   flexNode->CalculateLayout(30, 800, false);
341
342   Vector4 root = flexNode->GetNodeFrame(-1); // -1 is the root
343   Vector4 actor1Frame = flexNode->GetNodeFrame(0); // 0 is first child
344   Vector4 actor2Frame = flexNode->GetNodeFrame(1); // 1 is second child
345   Vector4 actor3Frame = flexNode->GetNodeFrame(2); // 2 is first child
346   Vector4 actor4Frame = flexNode->GetNodeFrame(3); // 3 is second child
347
348   tet_printf("Root frame(left:%f,top:%f,right:%f,bottom:%f)\n", root.x, root.y, root.z, root.w);
349   tet_printf("Actor 1 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor1Frame.x, actor1Frame.y, actor1Frame.z, actor1Frame.w);
350   tet_printf("Actor 2 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor2Frame.x, actor2Frame.y, actor2Frame.z, actor2Frame.w);
351   tet_printf("Actor 3 frame(left:%f,top:%f,right:cdt%f,bottom:%f)\n", actor3Frame.x, actor3Frame.y, actor3Frame.z, actor3Frame.w);
352   tet_printf("Actor 4 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor4Frame.x, actor4Frame.y, actor4Frame.z, actor4Frame.w);
353
354   /*
355     -------
356     |1 2 3 4     |
357     |     |
358     |     |
359     |     |
360     |     |
361     -------
362   */
363
364   DALI_TEST_EQUALS( actor1Frame, Vector4( 0.0f,            0.0f, ITEM_SIZE.width, ITEM_SIZE.height ), TEST_LOCATION );
365   DALI_TEST_EQUALS( actor2Frame, Vector4( ITEM_SIZE.width, 0.0f, ITEM_SIZE.width*2, ITEM_SIZE.height ), TEST_LOCATION );
366   DALI_TEST_EQUALS( actor3Frame, Vector4( ITEM_SIZE.width*2, 0.0f, ITEM_SIZE.width*3, ITEM_SIZE.height ), TEST_LOCATION );
367   DALI_TEST_EQUALS( actor4Frame, Vector4( ITEM_SIZE.width*3, 0.0f, ITEM_SIZE.width*4, ITEM_SIZE.height ), TEST_LOCATION );
368
369   flexNode->SetFlexWrap( Flex::WrapType::WRAP );
370
371   flexNode->CalculateLayout( 30, 800, false );
372   root = flexNode->GetNodeFrame(-1); // -1 is the root
373
374   DALI_TEST_EQUALS( (int)flexNode->GetFlexWrap(), (int)Flex::WrapType::WRAP, TEST_LOCATION );
375   tet_printf("Root frame(left:%f,top:%f,right:%f,bottom:%f)\n", root.x, root.y, root.z, root.w);
376
377   actor1Frame = flexNode->GetNodeFrame(0); // 0 is first child
378   actor2Frame = flexNode->GetNodeFrame(1); // 1 is second child
379   actor3Frame = flexNode->GetNodeFrame(2); // 2 is first child
380   actor4Frame = flexNode->GetNodeFrame(3); // 3 is second child
381
382   tet_printf("Actor 1 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor1Frame.x, actor1Frame.y, actor1Frame.z, actor1Frame.w);
383   tet_printf("Actor 2 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor2Frame.x, actor2Frame.y, actor2Frame.z, actor2Frame.w);
384   tet_printf("Actor 3 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor3Frame.x, actor3Frame.y, actor3Frame.z, actor3Frame.w);
385   tet_printf("Actor 4 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor4Frame.x, actor4Frame.y, actor4Frame.z, actor4Frame.w);
386
387   /*
388     -------
389     |1 2 3|     |
390     |4    |
391     |     |
392     |     |
393     |     |
394     -------
395   */
396
397   DALI_TEST_EQUALS( actor1Frame, Vector4( 0.0f,            0.0f, ITEM_SIZE.width, ITEM_SIZE.height ), TEST_LOCATION );
398   DALI_TEST_EQUALS( actor2Frame, Vector4( ITEM_SIZE.width, 0.0f, ITEM_SIZE.width*2, ITEM_SIZE.height ), TEST_LOCATION );
399   DALI_TEST_EQUALS( actor3Frame, Vector4( ITEM_SIZE.width*2, 0.0f, ITEM_SIZE.width*3, ITEM_SIZE.height ), TEST_LOCATION );
400   DALI_TEST_EQUALS( actor4Frame, Vector4( 0.0,ITEM_SIZE.height, ITEM_SIZE.width, ITEM_SIZE.height*2 ), TEST_LOCATION );
401
402
403   END_TEST;
404 }
405
406 int UtcDaliToolkitFlexNodeRemoveChildP(void)
407 {
408   ToolkitTestApplication application;
409   tet_infoline(" UtcDaliToolkitFlexNodeRemoveChildP");
410   Flex::Node* flexNode = new Flex::Node();
411   DALI_TEST_CHECK( flexNode );
412
413   // Create two actors and add them to the parent flex node
414   Actor actor1 = Actor::New();
415   Actor actor2 = Actor::New();
416   actor1.SetProperty( Dali::Actor::Property::NAME,"Actor1");
417   actor2.SetProperty( Dali::Actor::Property::NAME,"Actor2");
418
419   DALI_TEST_CHECK( actor1 );
420   DALI_TEST_CHECK( actor2 );
421
422   flexNode->AddChild(actor1, Extents(0,0,0,0), &MeasureChild, 0);
423   flexNode->AddChild(actor2, Extents(0,0,0,0), &MeasureChild, 1);
424
425   flexNode->CalculateLayout(480, 800, false);
426
427   Vector4 actor1Frame = flexNode->GetNodeFrame(0);
428   Vector4 actor2Frame = flexNode->GetNodeFrame(1);
429
430   tet_printf("Actor 1 frame(%f,%f,%f,%f)\n", actor1Frame.x, actor1Frame.y, actor1Frame.z, actor1Frame.w);
431   tet_printf("Actor 2 frame(%f,%f,%f,%f)\n", actor2Frame.x, actor2Frame.y, actor2Frame.z, actor2Frame.w);
432
433   DALI_TEST_EQUALS( actor2Frame, Vector4( 0.0f, ITEM_SIZE.width, ITEM_SIZE.width, ITEM_SIZE.height*2 ), TEST_LOCATION );
434
435   flexNode->RemoveChild(actor1);
436
437   flexNode->CalculateLayout(480, 800, false);
438
439   actor2Frame = flexNode->GetNodeFrame(0);
440
441   tet_printf("Actor 1 frame(%f,%f,%f,%f)\n", actor1Frame.x, actor1Frame.y, actor1Frame.z, actor1Frame.w);
442   tet_printf("Actor 2 frame(%f,%f,%f,%f)\n", actor2Frame.x, actor2Frame.y, actor2Frame.z, actor2Frame.w);
443
444   DALI_TEST_EQUALS( actor2Frame, Vector4( 0.0f, 0.0f, ITEM_SIZE.width, ITEM_SIZE.height ), TEST_LOCATION );
445
446   END_TEST;
447 }
448
449 int UtcDaliToolkitFlexNodeRemoveAllChildrenP(void)
450 {
451   ToolkitTestApplication application;
452   tet_infoline(" UtcDaliToolkitFlexNodeRemoveAllChildrenP");
453   Flex::Node* flexNode = new Flex::Node();
454   DALI_TEST_CHECK( flexNode );
455
456   // Create two actors and add them to the parent flex node
457   Actor actor1 = Actor::New();
458   Actor actor2 = Actor::New();
459   actor1.SetProperty( Dali::Actor::Property::NAME,"Actor1");
460   actor2.SetProperty( Dali::Actor::Property::NAME,"Actor2");
461
462   DALI_TEST_CHECK( actor1 );
463   DALI_TEST_CHECK( actor2 );
464
465   flexNode->AddChild(actor1, Extents(0,0,0,0), &MeasureChild, 0);
466   flexNode->AddChild(actor2, Extents(0,0,0,0), &MeasureChild, 1);
467
468   flexNode->CalculateLayout(480, 800, false);
469
470   Vector4 actor1Frame = flexNode->GetNodeFrame(0);
471   Vector4 actor2Frame = flexNode->GetNodeFrame(1);
472
473   tet_printf("Actor 1 frame(%f,%f,%f,%f)\n", actor1Frame.x, actor1Frame.y, actor1Frame.z, actor1Frame.w);
474   tet_printf("Actor 2 frame(%f,%f,%f,%f)\n", actor2Frame.x, actor2Frame.y, actor2Frame.z, actor2Frame.w);
475
476   flexNode->RemoveChild(actor1);
477   flexNode->RemoveChild(actor2);
478
479   flexNode->CalculateLayout(480, 800, false);
480
481   Vector4 actor1FrameRemoved = flexNode->GetNodeFrame(0);
482   Vector4 actor2FrameRemoved = flexNode->GetNodeFrame(1);
483
484   tet_printf("Actor 1 frame(%f,%f,%f,%f)\n", actor1FrameRemoved.x, actor1FrameRemoved.y, actor1FrameRemoved.z, actor1FrameRemoved.w);
485   tet_printf("Actor 2 frame(%f,%f,%f,%f)\n", actor2FrameRemoved.x, actor2FrameRemoved.y, actor2FrameRemoved.z, actor2FrameRemoved.w);
486
487   DALI_TEST_NOT_EQUALS( actor1Frame, actor1FrameRemoved, 0.1, TEST_LOCATION );
488   DALI_TEST_NOT_EQUALS( actor2Frame, actor2FrameRemoved, 0.1, TEST_LOCATION );
489
490   END_TEST;
491 }
492
493 int UtcDaliToolkitFlexNodePaddingMarginP(void)
494 {
495   ToolkitTestApplication application;
496   tet_infoline(" UtcDaliToolkitFlexNodePaddingMarginP");
497   Flex::Node* flexNode = new Flex::Node();
498   DALI_TEST_CHECK( flexNode );
499   flexNode->SetFlexDirection( Flex::FlexDirection::ROW );
500
501   // Create two actors and add them to the parent flex node
502   Actor actor1 = Actor::New();
503   Actor actor2 = Actor::New();
504   DALI_TEST_CHECK( actor1 );
505   DALI_TEST_CHECK( actor2 );
506
507   flexNode->AddChild(actor1, Extents(0,0,0,0), &MeasureChild, 0);
508   flexNode->AddChild(actor2, Extents(0,0,0,0), &MeasureChild, 1);
509
510   Extents padding( 5,5,5,5);
511   Extents margin( 5,5,5,5);
512
513   flexNode->SetPadding( padding );
514   flexNode->SetMargin( margin );
515
516   flexNode->CalculateLayout(480, 800, false);
517
518   Vector4 actor1Frame = flexNode->GetNodeFrame(0);
519   Vector4 actor2Frame = flexNode->GetNodeFrame(1);
520
521   /*  p = padding
522   -----
523   |ppppp|
524   |p1 2p|
525   |p   p|
526   |ppppp|
527   -------
528   */
529   DALI_TEST_EQUALS( actor1Frame, Vector4( 5.0f, 5.0f, ITEM_SIZE.width +5 , ITEM_SIZE.height + 5 ), TEST_LOCATION );
530   DALI_TEST_EQUALS( actor2Frame, Vector4( 5+ ITEM_SIZE.width, 5.0f, (ITEM_SIZE.width*2) +5, ITEM_SIZE.height +5 ), TEST_LOCATION );
531
532   END_TEST;
533 }
534
535 int UtcDaliToolkitFlexNodeCallbackTestP(void)
536 {
537   ToolkitTestApplication application;
538   tet_infoline("UtcDaliToolkitFlexNodeCallbackTestP");
539   Flex::Node* flexNode = new Flex::Node();
540   DALI_TEST_CHECK( flexNode );
541
542   // Position elements in a Column
543   flexNode->SetFlexDirection(Flex::FlexDirection::COLUMN);
544
545   // Create two actors and add them to the parent flex node
546   Actor actor1 = Actor::New();
547   Actor actor2 = Actor::New();
548
549   actor1.SetProperty( Dali::Actor::Property::NAME,"callbackTest");
550
551   DALI_TEST_CHECK( actor1 );
552   DALI_TEST_CHECK( actor2 );
553
554   flexNode->AddChild(actor1, Extents(0,0,0,0), &MeasureChild, 0);
555   flexNode->AddChild(actor2, Extents(0,0,0,0), &MeasureChild, 1);
556
557   flexNode->CalculateLayout(480, 800, false);
558
559   Vector4 root = flexNode->GetNodeFrame(-1); // -1 is the root
560   Vector4 actor1Frame = flexNode->GetNodeFrame(0); // 0 is first child
561   Vector4 actor2Frame = flexNode->GetNodeFrame(1); // 1 is second child
562
563   tet_printf("Root frame(left:%f,top:%f,right:%f,bottom:%f)\n", root.x, root.y, root.z, root.w);
564
565   tet_printf("Actor 1 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor1Frame.x, actor1Frame.y, actor1Frame.z, actor1Frame.w);
566   tet_printf("Actor 2 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor2Frame.x, actor2Frame.y, actor2Frame.z, actor2Frame.w);
567
568   DALI_TEST_EQUALS( actor1Frame, Vector4( 0.0f, 0.0f, ITEM_SIZE_CALLBACK_TEST.width, ITEM_SIZE_CALLBACK_TEST.height ), TEST_LOCATION );
569   DALI_TEST_EQUALS( actor2Frame, Vector4( 0.0f, ITEM_SIZE_CALLBACK_TEST.height, ITEM_SIZE.width, ITEM_SIZE_CALLBACK_TEST.height + ITEM_SIZE.height ), TEST_LOCATION );
570
571   END_TEST;
572 }
573
574 int UtcDaliToolkitFlexNodeFlexPositionType(void)
575 {
576   ToolkitTestApplication application;
577   tet_infoline("UtcDaliToolkitFlexNodeFlexPositionType");
578   Flex::Node* flexNode = new Flex::Node();
579   DALI_TEST_CHECK( flexNode );
580
581   tet_infoline(" FlexPositionType is RELATIVE by default");
582
583   // Create two actors and add them to the parent flex node
584   Actor actor1 = Actor::New();
585   Actor actor2 = Actor::New();
586   DALI_TEST_CHECK( actor1 );
587   DALI_TEST_CHECK( actor2 );
588
589   flexNode->AddChild(actor1, Extents(0,0,0,0), &MeasureChild, 0);
590   Flex::Node* actor2node = flexNode->AddChild(actor2, Extents(0,0,0,0), &MeasureChild, 1);
591
592   DALI_TEST_EQUALS( (int)actor2node->GetFlexPositionType(), (int)Flex::PositionType::RELATIVE, TEST_LOCATION );
593
594   flexNode->CalculateLayout(480, 800, false);
595
596   Vector4 root = flexNode->GetNodeFrame(-1); // -1 is the root
597   Vector4 actor1Frame = flexNode->GetNodeFrame(0); // 0 is first child
598   Vector4 actor2Frame = flexNode->GetNodeFrame(1); // 1 is second child
599
600   tet_printf("Root frame(left:%f,top:%f,right:%f,bottom:%f)\n", root.x, root.y, root.z, root.w);
601
602   tet_printf("Actor 1 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor1Frame.x, actor1Frame.y, actor1Frame.z, actor1Frame.w);
603   tet_printf("Actor 2 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor2Frame.x, actor2Frame.y, actor2Frame.z, actor2Frame.w);
604
605   /*
606     ---------
607     |1      |
608     |2      |
609     |       |
610     |       |
611     |       |
612     ---------
613   */
614
615   DALI_TEST_EQUALS( actor1Frame, Vector4( 0.0f, 0.0f, ITEM_SIZE.width, ITEM_SIZE.height ), TEST_LOCATION );
616   DALI_TEST_EQUALS( actor2Frame, Vector4( 0.0f, ITEM_SIZE.height, ITEM_SIZE.width, ITEM_SIZE.height *2 ), TEST_LOCATION );
617
618   tet_infoline(" ABSOLUTE FlexPositionType, second item should now be ignore any properties");
619   actor2node->SetFlexPositionType( Flex::PositionType::ABSOLUTE );
620
621   // Recalulate layout
622   flexNode->CalculateLayout(480, 800, false);
623
624   root = flexNode->GetNodeFrame(-1); // -1 is the root
625   actor1Frame = flexNode->GetNodeFrame(0); // 0 is first child
626   actor2Frame = flexNode->GetNodeFrame(1); // 1 is second child
627
628   tet_printf("Root frame(left:%f,top:%f,right:%f,bottom:%f)\n", root.x, root.y, root.z, root.w);
629
630   tet_printf("Actor 1 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor1Frame.x, actor1Frame.y, actor1Frame.z, actor1Frame.w);
631   tet_printf("Actor 2 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor2Frame.x, actor2Frame.y, actor2Frame.z, actor2Frame.w);
632
633   /*
634     ---------
635     |1(2)   |
636     |       |
637     |       |
638     |       |
639     |       |
640     ---------
641   */
642
643   DALI_TEST_EQUALS( actor1Frame, Vector4( 0.0f, 0.0f, ITEM_SIZE.width, ITEM_SIZE.height ), TEST_LOCATION );
644   DALI_TEST_EQUALS( actor2Frame, Vector4( 0.0f, 0.0f, ITEM_SIZE.width, ITEM_SIZE.height ), TEST_LOCATION );
645
646   END_TEST;
647 }
648
649 int UtcDaliToolkitFlexNodeFlexAspectRatio(void)
650 {
651   ToolkitTestApplication application;
652   tet_infoline("UtcDaliToolkitFlexNodeFlexAspectRatio");
653   Flex::Node* flexNode = new Flex::Node();
654   DALI_TEST_CHECK( flexNode );
655
656   // Create a actor and add them to the parent flex node
657   Actor actor1 = Actor::New();
658   DALI_TEST_CHECK( actor1 );
659
660   tet_infoline(" 1.0 FlexAspectRatio");
661   Flex::Node* actor1node = flexNode->AddChild(actor1, Extents(0,0,0,0), &MeasureChild, 0);
662   actor1node->SetFlexAspectRatio(1.0);
663
664   DALI_TEST_EQUALS( actor1node->GetFlexAspectRatio(), 1.0f, TEST_LOCATION );
665
666   flexNode->CalculateLayout(480, 800, false);
667
668   Vector4 root = flexNode->GetNodeFrame(-1); // -1 is the root
669   Vector4 actor1Frame = flexNode->GetNodeFrame(0); // 0 is first child
670
671   tet_printf("Root frame(left:%f,top:%f,right:%f,bottom:%f)\n", root.x, root.y, root.z, root.w);
672
673   tet_printf("Actor 1 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor1Frame.x, actor1Frame.y, actor1Frame.z, actor1Frame.w);
674
675   /*
676     ---------
677     |---    |
678     ||1|    |
679     |---    |
680     |       |
681     |       |
682     ---------
683   */
684
685   DALI_TEST_EQUALS( actor1Frame, Vector4( 0.0f, 0.0f, ITEM_SIZE.width, ITEM_SIZE.height ), TEST_LOCATION );
686
687   tet_infoline(" 2.0 FlexAspectRatio");
688   actor1node->SetFlexAspectRatio(2.0);
689
690   DALI_TEST_EQUALS( actor1node->GetFlexAspectRatio(), 2.0f, TEST_LOCATION );
691
692   // Recalulate layout
693   flexNode->CalculateLayout(480, 800, false);
694
695   root = flexNode->GetNodeFrame(-1); // -1 is the root
696   actor1Frame = flexNode->GetNodeFrame(0); // 0 is first child
697
698   tet_printf("Root frame(left:%f,top:%f,right:%f,bottom:%f)\n", root.x, root.y, root.z, root.w);
699
700   tet_printf("Actor 1 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor1Frame.x, actor1Frame.y, actor1Frame.z, actor1Frame.w);
701
702   /*
703     ---------
704     |------ |
705     || 1  | |
706     |------ |
707     |       |
708     |       |
709     ---------
710   */
711
712   DALI_TEST_EQUALS( actor1Frame, Vector4( 0.0f, 0.0f, ITEM_SIZE.width*2, ITEM_SIZE.height ), TEST_LOCATION );
713
714   END_TEST;
715 }
716
717 int UtcDaliToolkitFlexNodeFlexBasisShrinkGrow(void)
718 {
719   ToolkitTestApplication application;
720   tet_infoline("UtcDaliToolkitFlexNodeFlexBasisShrinkGrow");
721   Flex::Node* flexNode = new Flex::Node();
722   DALI_TEST_CHECK( flexNode );
723
724   // Position elements as a Row
725   flexNode->SetFlexDirection(Flex::FlexDirection::ROW);
726
727   // Create three actors and add them to the parent flex node
728   Actor actor1 = Actor::New();
729   Actor actor2 = Actor::New();
730   Actor actor3 = Actor::New();
731   DALI_TEST_CHECK( actor1 );
732   DALI_TEST_CHECK( actor2 );
733   DALI_TEST_CHECK( actor3 );
734
735   Flex::Node* actor1node = flexNode->AddChild(actor1, Extents(0,0,0,0), &MeasureChild, 0);
736   Flex::Node* actor2node = flexNode->AddChild(actor2, Extents(0,0,0,0), &MeasureChild, 1);
737   Flex::Node* actor3node = flexNode->AddChild(actor3, Extents(0,0,0,0), &MeasureChild, 2);
738
739   float basis = 5;
740
741   actor1node->SetFlexGrow(0.0);
742   actor2node->SetFlexGrow(0.0);
743   actor3node->SetFlexGrow(0.0);
744   actor1node->SetFlexShrink(1.0);
745   actor2node->SetFlexShrink(1.0);
746   actor3node->SetFlexShrink(1.0);
747   actor1node->SetFlexBasis(basis);
748   actor2node->SetFlexBasis(basis);
749   actor3node->SetFlexBasis(basis);
750
751   DALI_TEST_EQUALS( actor1node->GetFlexGrow(), 0.0f, TEST_LOCATION );
752   DALI_TEST_EQUALS( actor1node->GetFlexShrink(), 1.0f, TEST_LOCATION );
753   DALI_TEST_EQUALS( actor1node->GetFlexBasis(), basis, TEST_LOCATION );
754
755   flexNode->CalculateLayout(600, 200, false);
756
757   Vector4 root = flexNode->GetNodeFrame(-1); // -1 is the root
758   Vector4 actor1Frame = flexNode->GetNodeFrame(0); // 0 is first child
759   Vector4 actor2Frame = flexNode->GetNodeFrame(1); // 1 is second child
760   Vector4 actor3Frame = flexNode->GetNodeFrame(2); // 2 is third child
761
762   tet_printf("Root frame(left:%f,top:%f,right:%f,bottom:%f)\n", root.x, root.y, root.z, root.w);
763
764   tet_printf("Actor 1 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor1Frame.x, actor1Frame.y, actor1Frame.z, actor1Frame.w);
765   tet_printf("Actor 2 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor2Frame.x, actor2Frame.y, actor2Frame.z, actor2Frame.w);
766   tet_printf("Actor 3 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor3Frame.x, actor3Frame.y, actor3Frame.z, actor3Frame.w);
767
768   /*
769     -------------------
770     ||1||2||3|        |
771     |                 |
772     -------------------
773   */
774
775   DALI_TEST_EQUALS( actor1Frame, Vector4( 0.0f, 0.0f, basis, ITEM_SIZE.height ), TEST_LOCATION );
776   DALI_TEST_EQUALS( actor2Frame, Vector4( basis, 0.0f, basis*2, ITEM_SIZE.height ), TEST_LOCATION );
777   DALI_TEST_EQUALS( actor3Frame, Vector4( basis*2, 0.0f, basis*3, ITEM_SIZE.height ), TEST_LOCATION );
778
779
780   actor2node->SetFlexGrow(1.0);
781   actor3node->SetFlexGrow(1.0);
782
783   // Recalulate layout
784   flexNode->CalculateLayout(605, 200, false);
785
786   root = flexNode->GetNodeFrame(-1); // -1 is the root
787   actor1Frame = flexNode->GetNodeFrame(0); // 0 is first child
788   actor2Frame = flexNode->GetNodeFrame(1); // 1 is second child
789   actor3Frame = flexNode->GetNodeFrame(2); // 2 is third child
790
791   tet_printf("Root frame(left:%f,top:%f,right:%f,bottom:%f)\n", root.x, root.y, root.z, root.w);
792
793   tet_printf("Actor 1 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor1Frame.x, actor1Frame.y, actor1Frame.z, actor1Frame.w);
794   tet_printf("Actor 2 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor2Frame.x, actor2Frame.y, actor2Frame.z, actor2Frame.w);
795   tet_printf("Actor 3 frame(left:%f,top:%f,right:%f,bottom:%f)\n", actor3Frame.x, actor3Frame.y, actor3Frame.z, actor3Frame.w);
796
797   /*
798     -------------------
799     ||1||  2  ||  3  ||
800     |                 |
801     -------------------
802   */
803
804   DALI_TEST_EQUALS( actor1Frame, Vector4( 0.0f, 0.0f, basis, ITEM_SIZE.height ), TEST_LOCATION );
805   DALI_TEST_EQUALS( actor2Frame, Vector4( basis, 0.0f, basis + (root.z-basis)/2, ITEM_SIZE.height ), TEST_LOCATION );
806   DALI_TEST_EQUALS( actor3Frame, Vector4( basis + (root.z-basis)/2, 0.0f, root.z, ITEM_SIZE.height ), TEST_LOCATION );
807
808   END_TEST;
809 }