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