2 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 // Need to override adaptor classes for toolkit test harness, so include
22 // test harness headers before dali headers.
23 #include <dali-toolkit-test-suite-utils.h>
26 #include <dali/public-api/dali-core.h>
27 #include <dali-toolkit/dali-toolkit.h>
28 #include <dali-toolkit/devel-api/controls/control-wrapper.h>
29 #include <dali-toolkit/devel-api/controls/control-wrapper-impl.h>
30 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
31 #include <dali-toolkit/devel-api/visual-factory/transition-data.h>
34 using namespace Dali::Toolkit;
36 void utc_dali_toolkit_control_wrapper_startup(void)
38 test_return_value = TET_UNDEF;
41 void utc_dali_toolkit_control_wrapper_cleanup(void)
43 test_return_value = TET_PASS;
46 ///////////////////////////////////////////////////////////////////////////////////////////////////
50 bool gOnRelayout = false;
53 ///////////////////////////////////////////////////////////////////////////////////////////////////
57 struct TestCustomControl : public Toolkit::Internal::ControlWrapper
62 TestCustomControl() : Toolkit::Internal::ControlWrapper( CustomControlBehaviour( Toolkit::Internal::ControlWrapper::DISABLE_STYLE_CHANGE_SIGNALS |
63 Toolkit::Internal::ControlWrapper::REQUIRES_KEYBOARD_NAVIGATION_SUPPORT )) ,
64 mDaliProperty( Property::INVALID_INDEX ),
65 mSizeSet( Vector3::ZERO ),
66 mTargetSize( Vector3::ZERO ),
72 TestCustomControl(bool nego) : Toolkit::Internal::ControlWrapper( CustomControlBehaviour( Toolkit::Internal::ControlWrapper::DISABLE_STYLE_CHANGE_SIGNALS |
73 Toolkit::Internal::ControlWrapper::REQUIRES_KEYBOARD_NAVIGATION_SUPPORT ) ),
74 mDaliProperty( Property::INVALID_INDEX ),
75 mSizeSet( Vector3::ZERO ),
76 mTargetSize( Vector3::ZERO ),
83 virtual ~TestCustomControl()
87 void Initialize( const char* name = NULL )
89 mDaliProperty = Self().RegisterProperty( "Dali", std::string("no"), Property::READ_WRITE );
94 virtual void OnInitialize( const char* name ) {}
96 // From Toolkit::Internal::ControlWrapper
97 virtual void OnStageConnection( int depth )
101 virtual void OnStageDisconnection()
104 virtual void OnChildAdd( Actor& child )
107 virtual void OnChildRemove( Actor& child )
110 virtual void OnPropertySet( Property::Index index, Property::Value propertyValue )
113 virtual void OnSizeSet( const Vector3& targetSize )
115 mSizeSet = targetSize;
117 virtual void OnSizeAnimation( Animation& animation, const Vector3& targetSize )
119 mTargetSize = targetSize;
121 virtual bool OnTouchEvent( const TouchEvent& event )
125 virtual bool OnHoverEvent( const HoverEvent& event )
129 virtual bool OnWheelEvent( const WheelEvent& event )
133 virtual bool OnKeyEvent( const KeyEvent& event )
137 virtual void OnKeyInputFocusGained()
140 virtual void OnKeyInputFocusLost()
143 virtual Vector3 GetNaturalSize()
145 return Vector3( 0.0f, 0.0f, 0.0f );
148 virtual float GetHeightForWidth( float width )
153 virtual float GetWidthForHeight( float height )
158 virtual void OnRelayout( const Vector2& size, RelayoutContainer& container )
163 virtual void OnSetResizePolicy( ResizePolicy::Type policy, Dimension::Type dimension )
167 virtual void OnCalculateRelayoutSize( Dimension::Type dimension )
171 virtual float CalculateChildSize( const Dali::Actor& child, Dimension::Type dimension )
176 virtual void OnLayoutNegotiated( float size, Dimension::Type dimension )
180 virtual bool RelayoutDependentOnChildren( Dimension::Type dimension = Dimension::ALL_DIMENSIONS )
185 void SetDaliProperty(std::string s)
187 Self().SetProperty(mDaliProperty, s);
189 void TestRelayoutRequest()
194 float TestGetHeightForWidthBase( float width )
196 return GetHeightForWidthBase( width );
199 float TestGetWidthForHeightBase( float height )
201 return GetWidthForHeightBase( height );
204 float TestCalculateChildSizeBase( const Dali::Actor& child, Dimension::Type dimension )
206 return CalculateChildSizeBase( child, dimension );
209 bool TestRelayoutDependentOnChildrenBase( Dimension::Type dimension )
211 return RelayoutDependentOnChildrenBase( dimension );
214 Property::Index mDaliProperty;
223 static std::string customControlTypeName = "TestCustomControl";
224 static TypeRegistration customControl( customControlTypeName, typeid(Dali::Toolkit::Control), NULL );
226 int UtcDaliControlWrapperConstructor(void)
228 ToolkitTestApplication application; // Exceptions require ToolkitTestApplication
230 Toolkit::Internal::ControlWrapper* controlWrapperImpl = new Toolkit::Internal::ControlWrapper( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
231 ControlWrapper controlWrapper;
233 DALI_TEST_CHECK( !ControlWrapper::DownCast( controlWrapper ) );
235 controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
237 DALI_TEST_CHECK( ControlWrapper::DownCast( controlWrapper ) );
242 int UtcDaliControlWrapperDestructor(void)
244 TestApplication application;
246 ControlWrapper control = ControlWrapper::New( customControlTypeName, *( new Toolkit::Internal::ControlWrapper( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT ) ) );
248 ControlWrapper control2( control );
250 DALI_TEST_CHECK( control );
252 DALI_TEST_CHECK( !control );
254 DALI_TEST_CHECK( control2 );
256 DALI_TEST_CHECK( !control2 );
261 int UtcDaliControlWrapperRelayoutRequest(void)
263 TestApplication application;
265 DALI_TEST_EQUALS( gOnRelayout, false, TEST_LOCATION );
267 Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
268 ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
270 Stage::GetCurrent().Add( controlWrapper );
272 application.SendNotification();
273 application.Render();
275 DALI_TEST_EQUALS( gOnRelayout, true, TEST_LOCATION );
278 controlWrapperImpl->TestRelayoutRequest();
279 application.SendNotification();
280 application.Render();
282 DALI_TEST_EQUALS( gOnRelayout, true, TEST_LOCATION );
287 int UtcDaliControlWrapperImplGetHeightForWidthBase(void)
289 TestApplication application;
291 Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
292 ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
294 float width = 300.0f;
297 application.SendNotification();
298 application.Render();
300 v = controlWrapperImpl->TestGetHeightForWidthBase( width );
302 DALI_TEST_EQUALS( width, v, TEST_LOCATION );
307 int UtcDaliControlWrapperGetWidthForHeightBase(void)
309 TestApplication application;
311 Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
312 ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
314 float height = 300.0f;
317 application.SendNotification();
318 application.Render();
320 v = controlWrapperImpl->TestGetWidthForHeightBase( height );
322 DALI_TEST_EQUALS( height, v, TEST_LOCATION );
327 int UtcDaliControlWrapperCalculateChildSizeBase(void)
329 TestApplication application;
331 Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
332 ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
334 Actor child = Actor::New();
335 child.SetResizePolicy( Dali::ResizePolicy::FIXED, Dali::Dimension::ALL_DIMENSIONS );
336 child.SetSize(150, 150);
338 application.SendNotification();
339 application.Render();
342 v = controlWrapperImpl->TestCalculateChildSizeBase( child, Dali::Dimension::ALL_DIMENSIONS );
343 DALI_TEST_EQUALS( v, 0.0f, TEST_LOCATION );
348 int UtcDaliControlWrapperRelayoutDependentOnChildrenBase(void)
350 TestApplication application;
352 Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
353 ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
357 v = controlWrapperImpl->TestRelayoutDependentOnChildrenBase( Dali::Dimension::ALL_DIMENSIONS );
358 application.SendNotification();
359 application.Render();
361 DALI_TEST_EQUALS( v, true, TEST_LOCATION );
363 controlWrapper.SetResizePolicy( Dali::ResizePolicy::FIXED, Dali::Dimension::ALL_DIMENSIONS );
364 v = controlWrapperImpl->TestRelayoutDependentOnChildrenBase( Dali::Dimension::WIDTH );
365 application.SendNotification();
366 application.Render();
367 DALI_TEST_EQUALS( v, false, TEST_LOCATION );
372 int UtcDaliControlWrapperRegisterVisualToSelf(void)
374 ToolkitTestApplication application;
376 Test::ObjectDestructionTracker objectDestructionTracker;
379 Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
380 ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
382 objectDestructionTracker.Start( controlWrapper );
384 Property::Index index = 1;
386 Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get();
387 Toolkit::Visual::Base visual;
390 map[Visual::Property::TYPE] = Visual::COLOR;
391 map[ColorVisual::Property::MIX_COLOR] = Color::RED;
393 visual = visualFactory.CreateVisual( map );
394 DALI_TEST_CHECK( visual );
397 controlWrapperImpl->RegisterVisual( index, visual );
399 DALI_TEST_EQUALS( objectDestructionTracker.IsDestroyed(), false, TEST_LOCATION ); // Control not destroyed yet
400 DALI_TEST_EQUALS( controlWrapperImpl->GetVisual( index ), visual, TEST_LOCATION );
403 DALI_TEST_EQUALS( objectDestructionTracker.IsDestroyed(), true, TEST_LOCATION ); // Should be destroyed
408 int UtcDaliControlWrapperRegisterVisualWithDepthIndexToSelf(void)
410 ToolkitTestApplication application;
412 Test::ObjectDestructionTracker objectDestructionTracker;
415 Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
416 ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
418 objectDestructionTracker.Start( controlWrapper );
420 Property::Index index = 1;
422 Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get();
423 Toolkit::Visual::Base visual;
426 map[Visual::Property::TYPE] = Visual::COLOR;
427 map[ColorVisual::Property::MIX_COLOR] = Color::RED;
429 visual = visualFactory.CreateVisual( map );
430 DALI_TEST_CHECK( visual );
433 controlWrapperImpl->RegisterVisual( index, visual, 4 );
435 DALI_TEST_EQUALS( objectDestructionTracker.IsDestroyed(), false, TEST_LOCATION ); // Control not destroyed yet
436 DALI_TEST_EQUALS( controlWrapperImpl->GetVisual( index ), visual, TEST_LOCATION );
437 DALI_TEST_EQUALS( visual.GetDepthIndex(), 4, TEST_LOCATION );
440 DALI_TEST_EQUALS( objectDestructionTracker.IsDestroyed(), true, TEST_LOCATION ); // Should be destroyed
445 int UtcDaliControlWrapperRegisterDisabledVisual(void)
447 ToolkitTestApplication application;
449 Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
450 ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
452 Property::Index TEST_PROPERTY = 1;
454 Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get();
455 Toolkit::Visual::Base visual;
458 map[Visual::Property::TYPE] = Visual::COLOR;
459 map[ColorVisual::Property::MIX_COLOR] = Color::RED;
461 visual = visualFactory.CreateVisual( map );
462 DALI_TEST_CHECK(visual);
464 // Register index with a color visual
465 controlWrapperImpl->RegisterVisual( TEST_PROPERTY, visual, false );
467 DALI_TEST_EQUALS( controlWrapperImpl->GetVisual( TEST_PROPERTY ), visual, TEST_LOCATION );
468 DALI_TEST_EQUALS( controlWrapperImpl->IsVisualEnabled( TEST_PROPERTY ), false, TEST_LOCATION );
470 Stage::GetCurrent().Add( controlWrapper );
473 application.SendNotification();
474 application.Render();
476 DALI_TEST_EQUALS( controlWrapperImpl->IsVisualEnabled( TEST_PROPERTY ), false, TEST_LOCATION );
478 DALI_TEST_EQUALS( controlWrapper.OnStage(), true, TEST_LOCATION );
480 controlWrapperImpl->EnableVisual( TEST_PROPERTY, true );
482 DALI_TEST_EQUALS( controlWrapperImpl->IsVisualEnabled( TEST_PROPERTY ), true, TEST_LOCATION );
487 int UtcDaliControlWrapperRegisterDisabledVisualWithDepthIndex(void)
489 ToolkitTestApplication application;
491 Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
492 ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
494 Property::Index TEST_PROPERTY = 1;
496 Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get();
497 Toolkit::Visual::Base visual;
500 map[Visual::Property::TYPE] = Visual::COLOR;
501 map[ColorVisual::Property::MIX_COLOR] = Color::RED;
503 visual = visualFactory.CreateVisual( map );
504 DALI_TEST_CHECK(visual);
506 // Register index with a color visual
507 controlWrapperImpl->RegisterVisual( TEST_PROPERTY, visual, false, 10 );
509 DALI_TEST_EQUALS( controlWrapperImpl->GetVisual( TEST_PROPERTY ), visual, TEST_LOCATION );
510 DALI_TEST_EQUALS( controlWrapperImpl->IsVisualEnabled( TEST_PROPERTY ), false, TEST_LOCATION );
511 DALI_TEST_EQUALS( visual.GetDepthIndex(), 10, TEST_LOCATION );
513 Stage::GetCurrent().Add( controlWrapper );
516 application.SendNotification();
517 application.Render();
519 DALI_TEST_EQUALS( controlWrapperImpl->IsVisualEnabled( TEST_PROPERTY ), false, TEST_LOCATION );
521 DALI_TEST_EQUALS( controlWrapper.OnStage(), true, TEST_LOCATION );
523 controlWrapperImpl->EnableVisual( TEST_PROPERTY, true );
525 DALI_TEST_EQUALS( controlWrapperImpl->IsVisualEnabled( TEST_PROPERTY ), true, TEST_LOCATION );
530 int UtcDaliControlWrapperRegisterUnregisterVisual(void)
532 ToolkitTestApplication application;
534 Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
535 ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
537 Property::Index index = 1;
539 Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get();
540 Toolkit::Visual::Base visual;
543 map[Visual::Property::TYPE] = Visual::COLOR;
544 map[ColorVisual::Property::MIX_COLOR] = Color::RED;
546 visual = visualFactory.CreateVisual( map );
547 DALI_TEST_CHECK(visual);
549 // Register index with a color visual
550 controlWrapperImpl->RegisterVisual( index, visual );
552 DALI_TEST_EQUALS( controlWrapperImpl->GetVisual( index ), visual, TEST_LOCATION );
555 controlWrapperImpl->UnregisterVisual( index );
557 DALI_TEST_CHECK( !controlWrapperImpl->GetVisual( index ) );
562 int UtcDaliControlWrapperTransitionDataMap1N(void)
564 TestApplication application;
567 map["target"] = "Actor1";
568 map["property"] = "randomProperty";
569 map["initialValue"] = Color::MAGENTA;
570 map["targetValue"] = Color::RED;
571 map["animator"] = Property::Map()
572 .Add("alphaFunction", "EASE_OUT")
573 .Add("timePeriod", Property::Map()
575 .Add("duration", 1.0f));
577 Dali::Toolkit::TransitionData transition = TransitionData::New( map );
579 Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
580 ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
582 //DummyControl actor = DummyControl::New();
583 controlWrapper.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
584 controlWrapper.SetName("Actor1");
585 controlWrapper.SetColor(Color::CYAN);
586 Stage::GetCurrent().Add(controlWrapper);
588 Animation anim = controlWrapperImpl->CreateTransition( transition );
589 DALI_TEST_CHECK( ! anim );
591 Property::Map returnedMap = transition.GetAnimatorAt(0);
593 Property::Value* value = returnedMap.Find("property");
594 DALI_TEST_CHECK( value != NULL);
595 DALI_TEST_EQUALS( "randomProperty", value->Get<std::string>(), TEST_LOCATION );
597 value = returnedMap.Find("initialValue");
598 DALI_TEST_CHECK( value != NULL);
599 DALI_TEST_EQUALS( Color::MAGENTA, value->Get<Vector4>(), TEST_LOCATION );
601 value = returnedMap.Find("targetValue");
602 DALI_TEST_CHECK( value != NULL);
603 DALI_TEST_EQUALS( Color::RED, value->Get<Vector4>(), TEST_LOCATION );
605 value = returnedMap.Find("animator");
606 DALI_TEST_CHECK( value != NULL);
607 Property::Map returnedAnimatorMap = value->Get<Property::Map>();
609 value = returnedAnimatorMap.Find("alphaFunction");
610 DALI_TEST_CHECK( value != NULL);
611 DALI_TEST_EQUALS( "EASE_OUT", value->Get<std::string>(), TEST_LOCATION );
613 value = returnedAnimatorMap.Find("timePeriod");
614 DALI_TEST_CHECK( value != NULL);
615 Property::Map returnedTimePeriodMap = value->Get<Property::Map>();
617 value = returnedTimePeriodMap.Find("delay");
618 DALI_TEST_CHECK( value != NULL);
619 DALI_TEST_EQUALS( 0.5f, value->Get<float>(), TEST_LOCATION );
621 value = returnedTimePeriodMap.Find("duration");
622 DALI_TEST_CHECK( value != NULL);
623 DALI_TEST_EQUALS( 1.0f, value->Get<float>(), TEST_LOCATION );
628 int UtcDaliControlWrapperApplyThemeStyle(void)
630 ToolkitTestApplication application;
632 Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
633 ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
635 controlWrapperImpl->ApplyThemeStyle();
637 DALI_TEST_CHECK( true );
641 int UtcDaliControlWrapperTestControlProperties(void)
643 ToolkitTestApplication application;
645 Impl::TestCustomControl* controlWrapperImpl = new ::Impl::TestCustomControl( Toolkit::Internal::ControlWrapper::CONTROL_BEHAVIOUR_DEFAULT );
646 ControlWrapper controlWrapper = ControlWrapper::New( customControlTypeName, *controlWrapperImpl );
648 Stage::GetCurrent().Add( controlWrapper );
650 // "background" property
651 Property::Map rendererMap;
652 rendererMap[Visual::Property::TYPE] = Visual::COLOR;
653 rendererMap[ColorVisual::Property::MIX_COLOR] = Color::RED;
654 controlWrapper.SetProperty( Control::Property::BACKGROUND, rendererMap );
655 Property::Value propertyValue = controlWrapper.GetProperty( Control::Property::BACKGROUND );
656 Property::Map* resultMap = propertyValue.GetMap();
657 DALI_TEST_CHECK( resultMap->Find( Visual::Property::TYPE ) );
658 DALI_TEST_EQUALS( resultMap->Find( Visual::Property::TYPE )->Get<int>(), (int)Visual::COLOR, TEST_LOCATION );
659 DALI_TEST_CHECK( resultMap->Find( ColorVisual::Property::MIX_COLOR ) );
660 DALI_TEST_EQUALS( resultMap->Find( ColorVisual::Property::MIX_COLOR )->Get<Vector4>(), Color::RED, TEST_LOCATION );
662 // "keyInputFocus" property
663 controlWrapper.SetProperty( Control::Property::KEY_INPUT_FOCUS, true );
664 DALI_TEST_EQUALS( true, controlWrapper.GetProperty( Control::Property::KEY_INPUT_FOCUS ).Get< bool >(), TEST_LOCATION );
666 // "styleName" property
667 controlWrapper.SetProperty( Control::Property::STYLE_NAME, "MyCustomStyle" );
668 DALI_TEST_EQUALS( "MyCustomStyle", controlWrapper.GetProperty( Control::Property::STYLE_NAME ).Get< std::string >(), TEST_LOCATION );
673 int UtcDaliControlWrapperTypeRegistryCreation(void)
675 ToolkitTestApplication application;
677 TypeInfo typeInfo = TypeRegistry::Get().GetTypeInfo( "ControlWrapper" );
678 DALI_TEST_CHECK( typeInfo )
680 // Check that we can't create a ControlWrapper instance
681 BaseHandle baseHandle = typeInfo.CreateInstance();
682 DALI_TEST_CHECK( !baseHandle )