Adding Visual namespace and Visual becomes Visual::Base
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-FlexContainer.cpp
1 /*
2  * Copyright (c) 2016 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
23 using namespace Dali;
24 using namespace Toolkit;
25
26 void dali_flexflexContainer_startup(void)
27 {
28   test_return_value = TET_UNDEF;
29 }
30
31 void dali_flexflexContainer_cleanup(void)
32 {
33   test_return_value = TET_PASS;
34 }
35
36 namespace
37 {
38
39 const char* const PROPERTY_NAME_CONTENT_DIRECTION = "contentDirection";
40 const char* const PROPERTY_NAME_FLEX_DIRECTION = "flexDirection";
41 const char* const PROPERTY_NAME_FLEX_WRAP = "flexWrap";
42 const char* const PROPERTY_NAME_JUSTIFY_CONTENT = "justifyContent";
43 const char* const PROPERTY_NAME_ALIGN_ITEMS = "alignItems";
44 const char* const PROPERTY_NAME_ALIGN_CONTENT =  "alignContent";
45 const char* const CHILD_PROPERTY_NAME_FLEX = "flex";
46 const char* const CHILD_PROPERTY_NAME_ALIGN_SELF = "alignSelf";
47 const char* const CHILD_PROPERTY_NAME_FLEX_MARGIN =  "flexMargin";
48
49 } // namespace
50
51 int UtcDaliToolkitFlexContainerConstructorP(void)
52 {
53   ToolkitTestApplication application;
54   tet_infoline(" UtcDaliToolkitFlexContainerConstructorP");
55   FlexContainer flexContainer;
56   DALI_TEST_CHECK( !flexContainer );
57   END_TEST;
58 }
59
60 int UtcDaliToolkitFlexContainerNewP(void)
61 {
62   ToolkitTestApplication application;
63   tet_infoline(" UtcDaliToolkitFlexContainerNewP");
64   FlexContainer flexContainer = FlexContainer::New();
65   DALI_TEST_CHECK( flexContainer );
66   END_TEST;
67 }
68
69 int UtcDaliToolkitFlexContainerDownCastP(void)
70 {
71   ToolkitTestApplication application;
72   tet_infoline(" UtcDaliToolkitFlexContainerDownCastP");
73   FlexContainer flexContainer1 = FlexContainer::New();
74   BaseHandle object( flexContainer1 );
75
76   FlexContainer flexContainer2 = FlexContainer::DownCast( object );
77   DALI_TEST_CHECK( flexContainer2 );
78
79   FlexContainer flexContainer3 = DownCast< FlexContainer >( object );
80   DALI_TEST_CHECK( flexContainer3 );
81   END_TEST;
82 }
83
84 int UtcDaliToolkitFlexContainerDownCastN(void)
85 {
86   ToolkitTestApplication application;
87   tet_infoline(" UtcDaliToolkitFlexContainerDownCastN");
88   BaseHandle uninitializedObject;
89   FlexContainer flexContainer1 = FlexContainer::DownCast( uninitializedObject );
90   DALI_TEST_CHECK( !flexContainer1 );
91
92   FlexContainer flexContainer2 = DownCast< FlexContainer >( uninitializedObject );
93   DALI_TEST_CHECK( !flexContainer2 );
94   END_TEST;
95 }
96
97 int UtcDaliToolkitFlexContainerCopyConstructorP(void)
98 {
99   ToolkitTestApplication application;
100   tet_infoline(" UtcDaliToolkitFlexContainerCopyConstructorP");
101   FlexContainer flexContainer = FlexContainer::New();
102   flexContainer.SetProperty( FlexContainer::Property::FLEX_DIRECTION, FlexContainer::ROW_REVERSE );
103
104   FlexContainer copy( flexContainer );
105   DALI_TEST_CHECK( copy );
106   DALI_TEST_CHECK( copy.GetProperty<int>( FlexContainer::Property::FLEX_DIRECTION ) == flexContainer.GetProperty<int>( FlexContainer::Property::FLEX_DIRECTION ) );
107
108   END_TEST;
109 }
110
111 int UtcDaliToolkitFlexContainerAssignmentOperatorP(void)
112 {
113   ToolkitTestApplication application;
114   tet_infoline(" UtcDaliToolkitFlexContainerAssingmentOperatorP");
115   FlexContainer flexContainer = FlexContainer::New();
116   flexContainer.SetProperty( FlexContainer::Property::FLEX_DIRECTION, FlexContainer::ROW_REVERSE );
117
118   FlexContainer copy = flexContainer;
119   DALI_TEST_CHECK( copy );
120   DALI_TEST_CHECK( copy.GetProperty<int>( FlexContainer::Property::FLEX_DIRECTION ) == flexContainer.GetProperty<int>( FlexContainer::Property::FLEX_DIRECTION ) );
121   END_TEST;
122 }
123
124 // Positive test case for a method
125 int UtcDaliToolkitFlexContainerGetPropertyP(void)
126 {
127   ToolkitTestApplication application;
128   tet_infoline(" UtcDaliToolkitFlexContainerGetPropertyP");
129   FlexContainer flexContainer = FlexContainer::New();
130   DALI_TEST_CHECK( flexContainer );
131
132   // Check Property Indices are correct
133   DALI_TEST_CHECK( flexContainer.GetPropertyIndex( PROPERTY_NAME_CONTENT_DIRECTION ) == FlexContainer::Property::CONTENT_DIRECTION );
134   DALI_TEST_CHECK( flexContainer.GetPropertyIndex( PROPERTY_NAME_FLEX_DIRECTION ) == FlexContainer::Property::FLEX_DIRECTION );
135   DALI_TEST_CHECK( flexContainer.GetPropertyIndex( PROPERTY_NAME_FLEX_WRAP ) == FlexContainer::Property::FLEX_WRAP );
136   DALI_TEST_CHECK( flexContainer.GetPropertyIndex( PROPERTY_NAME_JUSTIFY_CONTENT ) == FlexContainer::Property::JUSTIFY_CONTENT );
137   DALI_TEST_CHECK( flexContainer.GetPropertyIndex( PROPERTY_NAME_ALIGN_ITEMS ) == FlexContainer::Property::ALIGN_ITEMS );
138   DALI_TEST_CHECK( flexContainer.GetPropertyIndex( PROPERTY_NAME_ALIGN_CONTENT ) == FlexContainer::Property::ALIGN_CONTENT );
139
140   END_TEST;
141 }
142
143 int UtcDaliToolkitFlexContainerSetPropertyP(void)
144 {
145   ToolkitTestApplication application;
146   tet_infoline(" UtcDaliToolkitFlexContainerSetPropertyP");
147   FlexContainer flexContainer = FlexContainer::New();
148   DALI_TEST_CHECK( flexContainer );
149
150   // Add flex container to the stage
151   Stage::GetCurrent().Add( flexContainer );
152
153   // Create two actors and add them to the container
154   Actor actor1 = Actor::New();
155   Actor actor2 = Actor::New();
156   DALI_TEST_CHECK( actor1 );
157   DALI_TEST_CHECK( actor2 );
158
159   flexContainer.Add(actor1);
160   flexContainer.Add(actor2);
161
162   // Check content direction property.
163   flexContainer.SetProperty( FlexContainer::Property::CONTENT_DIRECTION, FlexContainer::RTL );
164   DALI_TEST_EQUALS( (FlexContainer::ContentDirection)flexContainer.GetProperty<int>( FlexContainer::Property::CONTENT_DIRECTION ), FlexContainer::RTL, TEST_LOCATION );
165
166   // Check flex direction property.
167   flexContainer.SetProperty( FlexContainer::Property::FLEX_DIRECTION, FlexContainer::COLUMN_REVERSE );
168   DALI_TEST_EQUALS( (FlexContainer::FlexDirection)flexContainer.GetProperty<int>( FlexContainer::Property::FLEX_DIRECTION ), FlexContainer::COLUMN_REVERSE, TEST_LOCATION );
169
170   // Check flex wrap property.
171   flexContainer.SetProperty( FlexContainer::Property::FLEX_WRAP, FlexContainer::WRAP );
172   DALI_TEST_EQUALS( (FlexContainer::WrapType)flexContainer.GetProperty<int>( FlexContainer::Property::FLEX_WRAP ), FlexContainer::WRAP, TEST_LOCATION );
173
174   // Check justify content property.
175   flexContainer.SetProperty( FlexContainer::Property::JUSTIFY_CONTENT, FlexContainer::JUSTIFY_SPACE_BETWEEN );
176   DALI_TEST_EQUALS( (FlexContainer::Justification)flexContainer.GetProperty<int>( FlexContainer::Property::JUSTIFY_CONTENT ), FlexContainer::JUSTIFY_SPACE_BETWEEN, TEST_LOCATION );
177
178   // Check align items property.
179   flexContainer.SetProperty( FlexContainer::Property::ALIGN_ITEMS, FlexContainer::ALIGN_FLEX_START );
180   DALI_TEST_EQUALS( (FlexContainer::Alignment)flexContainer.GetProperty<int>( FlexContainer::Property::ALIGN_ITEMS ), FlexContainer::ALIGN_FLEX_START, TEST_LOCATION );
181
182   // Check align content property.
183   flexContainer.SetProperty( FlexContainer::Property::ALIGN_CONTENT, FlexContainer::ALIGN_STRETCH );
184   DALI_TEST_EQUALS( (FlexContainer::Alignment)flexContainer.GetProperty<int>( FlexContainer::Property::ALIGN_CONTENT ), FlexContainer::ALIGN_STRETCH, TEST_LOCATION );
185
186   END_TEST;
187 }
188
189
190 int UtcDaliToolkitFlexContainerSetPropertyEnumP(void)
191 {
192   ToolkitTestApplication application;
193   tet_infoline(" UtcDaliToolkitFlexContainerSetPropertyEnumP");
194   FlexContainer flexContainer = FlexContainer::New();
195   DALI_TEST_CHECK( flexContainer );
196
197   // Add flex container to the stage
198   Stage::GetCurrent().Add( flexContainer );
199
200   // Create two actors and add them to the container
201   Actor actor1 = Actor::New();
202   Actor actor2 = Actor::New();
203   DALI_TEST_CHECK( actor1 );
204   DALI_TEST_CHECK( actor2 );
205
206   flexContainer.Add(actor1);
207   flexContainer.Add(actor2);
208
209   // Check content direction property.
210   flexContainer.SetProperty( FlexContainer::Property::CONTENT_DIRECTION, "RTL" );
211   DALI_TEST_EQUALS( (FlexContainer::ContentDirection)flexContainer.GetProperty<int>( FlexContainer::Property::CONTENT_DIRECTION ), FlexContainer::RTL, TEST_LOCATION );
212
213   // Check flex direction property.
214   flexContainer.SetProperty( FlexContainer::Property::FLEX_DIRECTION, "columnReverse" );
215   DALI_TEST_EQUALS( (FlexContainer::FlexDirection)flexContainer.GetProperty<int>( FlexContainer::Property::FLEX_DIRECTION ), FlexContainer::COLUMN_REVERSE, TEST_LOCATION );
216
217   // Check flex wrap property.
218   flexContainer.SetProperty( FlexContainer::Property::FLEX_WRAP, "wrap" );
219   DALI_TEST_EQUALS( (FlexContainer::WrapType)flexContainer.GetProperty<int>( FlexContainer::Property::FLEX_WRAP ), FlexContainer::WRAP, TEST_LOCATION );
220
221   // Check justify content property.
222   flexContainer.SetProperty( FlexContainer::Property::JUSTIFY_CONTENT, "spaceBetween" );
223   DALI_TEST_EQUALS( (FlexContainer::Justification)flexContainer.GetProperty<int>( FlexContainer::Property::JUSTIFY_CONTENT ), FlexContainer::JUSTIFY_SPACE_BETWEEN, TEST_LOCATION );
224
225   // Check align items property.
226   flexContainer.SetProperty( FlexContainer::Property::ALIGN_ITEMS, "flexStart" );
227   DALI_TEST_EQUALS( (FlexContainer::Alignment)flexContainer.GetProperty<int>( FlexContainer::Property::ALIGN_ITEMS ), FlexContainer::ALIGN_FLEX_START, TEST_LOCATION );
228
229   // Check align content property.
230   flexContainer.SetProperty( FlexContainer::Property::ALIGN_CONTENT, "stretch" );
231   DALI_TEST_EQUALS( (FlexContainer::Alignment)flexContainer.GetProperty<int>( FlexContainer::Property::ALIGN_CONTENT ), FlexContainer::ALIGN_STRETCH, TEST_LOCATION );
232
233   END_TEST;
234 }
235
236 int UtcDaliToolkitFlexContainerSetChildPropertyP(void)
237 {
238   ToolkitTestApplication application;
239   tet_infoline(" UtcDaliToolkitFlexContainerSetChildPropertyP");
240   FlexContainer flexContainer = FlexContainer::New();
241   DALI_TEST_CHECK( flexContainer );
242
243   // Add flex container to the stage
244   Stage::GetCurrent().Add( flexContainer );
245
246   // Create an actor and add it to the container
247   Actor actor = Actor::New();
248   DALI_TEST_CHECK( actor );
249
250   flexContainer.Add(actor);
251
252   // Check flex child property.
253   actor.SetProperty( FlexContainer::ChildProperty::FLEX, 2.0f );
254   DALI_TEST_EQUALS( actor.GetProperty<float>( FlexContainer::ChildProperty::FLEX ), 2.0f, TEST_LOCATION );
255   DALI_TEST_CHECK( actor.GetPropertyIndex( CHILD_PROPERTY_NAME_FLEX ) == FlexContainer::ChildProperty::FLEX );
256
257   // Check align self child property.
258   actor.SetProperty( FlexContainer::ChildProperty::ALIGN_SELF, FlexContainer::ALIGN_FLEX_END );
259   DALI_TEST_EQUALS( (FlexContainer::Alignment)actor.GetProperty<int>( FlexContainer::ChildProperty::ALIGN_SELF ), FlexContainer::ALIGN_FLEX_END, TEST_LOCATION );
260   DALI_TEST_CHECK( actor.GetPropertyIndex( CHILD_PROPERTY_NAME_ALIGN_SELF ) == FlexContainer::ChildProperty::ALIGN_SELF );
261
262   // Check flex margin child property.
263   actor.SetProperty( FlexContainer::ChildProperty::FLEX_MARGIN, Vector4( 10.0f, 10.0f, 10.0f, 10.0f ) );
264   DALI_TEST_EQUALS( actor.GetProperty<Vector4>( FlexContainer::ChildProperty::FLEX_MARGIN ), Vector4( 10.0f, 10.0f, 10.0f, 10.0f ), TEST_LOCATION );
265   DALI_TEST_CHECK( actor.GetPropertyIndex( CHILD_PROPERTY_NAME_FLEX_MARGIN ) == FlexContainer::ChildProperty::FLEX_MARGIN );
266
267   application.SendNotification();
268   application.Render();
269
270   END_TEST;
271 }
272
273
274
275 //Functor to test whether RelayoutSignal is emitted
276 class RelayoutSignalHandler : public Dali::ConnectionTracker
277 {
278 public:
279
280   RelayoutSignalHandler( FlexContainer& actor )
281   : mSignalVerified( false ),
282     mActor( actor )
283   {
284   }
285
286   // callback to be connected to RelayoutSignal
287   void RelayoutCallback( Actor actor  )
288   {
289     if( mActor == actor )
290     {
291       mSignalVerified = true;
292     }
293   }
294
295   void Reset()
296   {
297     mSignalVerified = false;
298   }
299
300   bool   mSignalVerified;
301   Actor& mActor;
302 };
303
304 int UtcDaliToolkitFlexContainerRemoveChildP(void)
305 {
306   ToolkitTestApplication application;
307   tet_infoline(" UtcDaliToolkitFlexContainerSetPropertyP");
308   FlexContainer flexContainer = FlexContainer::New();
309   DALI_TEST_CHECK( flexContainer );
310
311   // Add flex container to the stage
312   Stage::GetCurrent().Add( flexContainer );
313
314   RelayoutSignalHandler relayoutSignal(flexContainer);
315   flexContainer.OnRelayoutSignal().Connect(&relayoutSignal, &RelayoutSignalHandler::RelayoutCallback );
316
317   // Create two actors and add them to the container
318   Actor actor1 = Actor::New();
319   Actor actor2 = Actor::New();
320   DALI_TEST_CHECK( actor1 );
321   DALI_TEST_CHECK( actor2 );
322
323   flexContainer.Add(actor1);
324   flexContainer.Add(actor2);
325
326   application.SendNotification();
327   application.Render();
328
329   DALI_TEST_EQUALS( relayoutSignal.mSignalVerified, true, TEST_LOCATION );
330   relayoutSignal.Reset();
331
332   DALI_TEST_CHECK( actor1 );
333   DALI_TEST_CHECK( actor2 );
334
335   flexContainer.Remove(actor1);
336   application.SendNotification();
337   application.Render();
338   DALI_TEST_EQUALS( relayoutSignal.mSignalVerified, true, TEST_LOCATION );
339   relayoutSignal.Reset();
340
341   flexContainer.Remove(actor2);
342   application.SendNotification();
343   application.Render();
344   DALI_TEST_EQUALS( relayoutSignal.mSignalVerified, true, TEST_LOCATION );
345   relayoutSignal.Reset();
346
347   END_TEST;
348 }
349
350 namespace
351 {
352
353 // Functors to test whether PreFocusChange signal is emitted when the keyboard focus is about to change
354 class PreFocusChangeCallback : public Dali::ConnectionTracker
355 {
356 public:
357   PreFocusChangeCallback(bool& signalReceived, Actor firstFocusActor)
358   : mSignalVerified(signalReceived),
359     mFirstFocusActor(firstFocusActor),
360     mDirection(Control::KeyboardFocus::LEFT)
361   {
362   }
363
364   Actor Callback(Actor currentFocusedActor, Actor proposedActorToFocus, Control::KeyboardFocus::Direction direction)
365   {
366     tet_infoline("Verifying PreFocusChangeCallback()");
367
368     mSignalVerified = true;
369     mDirection = direction;
370     if( ! proposedActorToFocus )
371     {
372       return mFirstFocusActor;
373     }
374     else
375     {
376       return proposedActorToFocus;
377     }
378   }
379
380   void Reset()
381   {
382     mSignalVerified = false;
383     mDirection = Control::KeyboardFocus::LEFT;
384   }
385
386   bool& mSignalVerified;
387   Actor mFirstFocusActor;
388   Control::KeyboardFocus::Direction mDirection;
389 };
390
391 // Functors to test whether focus changed signal is emitted when the keyboard focus is changed
392 class FocusChangedCallback : public Dali::ConnectionTracker
393 {
394 public:
395   FocusChangedCallback(bool& signalReceived)
396   : mSignalVerified(signalReceived),
397     mOriginalFocusedActor(),
398     mCurrentFocusedActor()
399   {
400   }
401
402   void Callback(Actor originalFocusedActor, Actor currentFocusedActor)
403   {
404     tet_infoline("Verifying FocusChangedCallback()");
405
406     if(originalFocusedActor == mCurrentFocusedActor)
407     {
408       mSignalVerified = true;
409     }
410
411     mOriginalFocusedActor = originalFocusedActor;
412     mCurrentFocusedActor = currentFocusedActor;
413   }
414
415   void Reset()
416   {
417     mSignalVerified = false;
418   }
419
420   bool& mSignalVerified;
421   Actor mOriginalFocusedActor;
422   Actor mCurrentFocusedActor;
423 };
424
425 } // anonymous namespace
426
427
428 int UtcDaliToolkitFlexContainerMoveFocus(void)
429 {
430   ToolkitTestApplication application;
431   tet_infoline(" UtcDaliToolkitFlexContainerSetPropertyP");
432   FlexContainer flexContainer = FlexContainer::New();
433   DALI_TEST_CHECK( flexContainer );
434
435   flexContainer.SetProperty( FlexContainer::Property::FLEX_DIRECTION, FlexContainer::ROW );
436
437   // Add flex container to the stage
438   Stage::GetCurrent().Add( flexContainer );
439   Size stageSize = Stage::GetCurrent().GetSize();
440
441   RelayoutSignalHandler relayoutSignal(flexContainer);
442   flexContainer.OnRelayoutSignal().Connect(&relayoutSignal, &RelayoutSignalHandler::RelayoutCallback );
443   flexContainer.SetSize( stageSize );
444
445   // Create two actors and add them to the container
446   Actor actor1 = Actor::New();
447   Actor actor2 = Actor::New();
448   actor1.SetKeyboardFocusable(true);
449   actor2.SetKeyboardFocusable(true);
450   DALI_TEST_CHECK( actor1 );
451   DALI_TEST_CHECK( actor2 );
452
453   flexContainer.Add(actor1);
454   flexContainer.Add(actor2);
455
456   application.SendNotification();
457   application.Render();
458
459   KeyboardFocusManager manager = KeyboardFocusManager::Get();
460   DALI_TEST_CHECK(manager);
461
462   bool preFocusChangeSignalVerified = false;
463   PreFocusChangeCallback preFocusChangeCallback(preFocusChangeSignalVerified, actor1);
464   manager.PreFocusChangeSignal().Connect( &preFocusChangeCallback, &PreFocusChangeCallback::Callback );
465
466   bool focusChangedSignalVerified = false;
467   FocusChangedCallback focusChangedCallback(focusChangedSignalVerified);
468   manager.FocusChangedSignal().Connect( &focusChangedCallback, &FocusChangedCallback::Callback );
469
470   // Move the focus to the right
471   DALI_TEST_EQUALS(manager.MoveFocus(Control::KeyboardFocus::RIGHT), true, TEST_LOCATION);
472   DALI_TEST_CHECK(preFocusChangeCallback.mSignalVerified);
473   DALI_TEST_EQUALS(manager.GetCurrentFocusActor(), actor1, TEST_LOCATION);
474   preFocusChangeCallback.Reset();
475   DALI_TEST_EQUALS(focusChangedCallback.mCurrentFocusedActor, actor1, TEST_LOCATION);
476   focusChangedCallback.Reset();
477
478   // Move the focus towards right
479   DALI_TEST_EQUALS(manager.MoveFocus(Control::KeyboardFocus::RIGHT), true, TEST_LOCATION);
480   DALI_TEST_EQUALS(preFocusChangeCallback.mSignalVerified, true, TEST_LOCATION);
481   DALI_TEST_EQUALS(manager.GetCurrentFocusActor(), actor2, TEST_LOCATION);
482   DALI_TEST_EQUALS(focusChangedCallback.mSignalVerified, true, TEST_LOCATION);
483   DALI_TEST_EQUALS(focusChangedCallback.mCurrentFocusedActor, actor2, TEST_LOCATION);
484
485   preFocusChangeCallback.Reset();
486   focusChangedCallback.Reset();
487
488   // Move the focus towards left
489   DALI_TEST_EQUALS(manager.MoveFocus(Control::KeyboardFocus::LEFT), true, TEST_LOCATION);
490   DALI_TEST_EQUALS(preFocusChangeCallback.mSignalVerified, true, TEST_LOCATION);
491   DALI_TEST_EQUALS(manager.GetCurrentFocusActor(), actor1, TEST_LOCATION);
492   DALI_TEST_EQUALS(focusChangedCallback.mSignalVerified, true, TEST_LOCATION);
493   DALI_TEST_EQUALS(focusChangedCallback.mCurrentFocusedActor, actor1, TEST_LOCATION);
494
495   END_TEST;
496 }