+
+int UtcDaliLayouting_RemoveLayout01(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline(" UtcDaliLayouting_RemoveLayout");
+
+ Stage stage = Stage::GetCurrent();
+
+ auto rootControl = Control::New();
+ auto absoluteLayout = AbsoluteLayout::New();
+ DevelControl::SetLayout( rootControl, absoluteLayout );
+ rootControl.SetName( "AbsoluteLayout" );
+ stage.Add( rootControl );
+
+ auto hbox = Control::New();
+ auto hboxLayout = LinearLayout::New();
+ hboxLayout.SetOrientation( LinearLayout::Orientation::HORIZONTAL );
+ DevelControl::SetLayout( hbox, hboxLayout );
+ hbox.SetName( "HBox" );
+
+ std::vector< Control > controls;
+ controls.push_back( CreateLeafControl( 40, 40 ) );
+ controls.push_back( CreateLeafControl( 60, 40 ) );
+
+ for( auto&& iter : controls )
+ {
+ hbox.Add( iter );
+ }
+ hbox.SetParentOrigin( ParentOrigin::CENTER );
+ hbox.SetAnchorPoint( AnchorPoint::CENTER );
+ rootControl.Add( hbox );
+
+ tet_infoline("Layout as normal");
+ application.SendNotification();
+ application.Render();
+
+ tet_infoline("Set an empty layout on hbox container");
+ LinearLayout emptyLayout;
+ DevelControl::SetLayout( hbox, emptyLayout );
+
+ tet_infoline("Run another layout");
+ application.SendNotification();
+ application.Render();
+
+ tet_infoline("Check leaf controls haven't moved");
+
+ DALI_TEST_EQUALS( controls[0].GetProperty<Vector3>( Actor::Property::POSITION ), Vector3( 0.0f, 0.0f, 0.0f ), 0.0001f, TEST_LOCATION );
+ DALI_TEST_EQUALS( controls[1].GetProperty<Vector3>( Actor::Property::POSITION ), Vector3( 40.0f, 0.0f, 0.0f ), 0.0001f, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( controls[0].GetProperty<Vector3>( Actor::Property::SIZE ), Vector3( 40.0f, 40.0f, 0.0f ), 0.0001f, TEST_LOCATION );
+ DALI_TEST_EQUALS( controls[1].GetProperty<Vector3>( Actor::Property::SIZE ), Vector3( 60.0f, 40.0f, 0.0f ), 0.0001f, TEST_LOCATION );
+
+ END_TEST;
+}
+
+int UtcDaliLayouting_LayoutChildren01(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline(" UtcDaliLayouting_LayoutChildren01");
+
+ Stage stage = Stage::GetCurrent();
+
+ auto rootControl = Control::New();
+ auto absoluteLayout = AbsoluteLayout::New();
+ DevelControl::SetLayout( rootControl, absoluteLayout );
+ stage.Add( rootControl );
+
+ auto hbox = Control::New();
+ auto hboxLayout = LinearLayout::New();
+ DevelControl::SetLayout( hbox, hboxLayout );
+ rootControl.Add( hbox );
+
+ DALI_TEST_EQUALS( absoluteLayout.GetChildCount(), 1, TEST_LOCATION );
+
+ tet_infoline("Test removal by setting empty layout to child container" );
+ DevelControl::SetLayout( hbox, LayoutItem{} );
+
+ DALI_TEST_EQUALS( absoluteLayout.GetChildCount(), 0, TEST_LOCATION );
+
+ auto& hboxImpl = GetImplementation( hboxLayout );
+ Handle empty;
+ DALI_TEST_EQUALS( hboxLayout.GetOwner(), empty, TEST_LOCATION );
+ DALI_TEST_EQUALS( (void*)hboxImpl.GetParent(), (void*)nullptr, TEST_LOCATION );
+
+ // For coverage
+ hboxImpl.SetLayoutRequested();
+
+ END_TEST;
+}
+
+int UtcDaliLayouting_LayoutChildren02(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline(" UtcDaliLayouting_LayoutChildren02");
+
+ Stage stage = Stage::GetCurrent();
+
+ auto rootControl = Control::New();
+ auto absoluteLayout = AbsoluteLayout::New();
+ DevelControl::SetLayout( rootControl, absoluteLayout );
+ stage.Add( rootControl );
+
+ auto hbox = Control::New();
+ auto hboxLayout = LinearLayout::New();
+ DevelControl::SetLayout( hbox, hboxLayout );
+ rootControl.Add( hbox );
+
+ DALI_TEST_EQUALS( absoluteLayout.GetChildCount(), 1, TEST_LOCATION );
+
+ tet_infoline("Test removal by removing child actor from parent container" );
+ hbox.Unparent();
+
+ DALI_TEST_EQUALS( absoluteLayout.GetChildCount(), 0, TEST_LOCATION );
+
+ auto& hboxImpl = GetImplementation( hboxLayout );
+ tet_infoline("Test child actor still has hbox layout " );
+ DALI_TEST_EQUALS( (bool)hboxLayout.GetOwner(), true, TEST_LOCATION );
+
+ tet_infoline("Test hbox layout has no parent " );
+ DALI_TEST_EQUALS( (void*)hboxImpl.GetParent(), (void*)nullptr, TEST_LOCATION );
+
+ END_TEST;
+}
+
+int UtcDaliLayouting_LayoutChildren03(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline(" UtcDaliLayouting_LayoutChildren02");
+
+ Stage stage = Stage::GetCurrent();
+
+ auto rootControl = Control::New();
+ auto absoluteLayout = AbsoluteLayout::New();
+ DevelControl::SetLayout( rootControl, absoluteLayout );
+ stage.Add( rootControl );
+
+ auto hbox = Control::New();
+ auto hboxLayout = LinearLayout::New();
+ DevelControl::SetLayout( hbox, hboxLayout );
+ rootControl.Add( hbox );
+
+ DALI_TEST_EQUALS( absoluteLayout.GetChildCount(), 1, TEST_LOCATION );
+
+ tet_infoline("Test removal by removing child layout from parent layout" );
+ absoluteLayout.Remove( hboxLayout );
+
+ DALI_TEST_EQUALS( absoluteLayout.GetChildCount(), 0, TEST_LOCATION );
+
+ auto& hboxImpl = GetImplementation( hboxLayout );
+
+ tet_infoline("Check child actor has orphaned layout (Moving child keeps old layout)");
+ DALI_TEST_EQUALS( hboxLayout.GetOwner(), hbox, TEST_LOCATION );
+ DALI_TEST_EQUALS( DevelControl::GetLayout(hbox), hboxLayout, TEST_LOCATION );
+
+ tet_infoline("Check orphaned layout has no parent");
+ DALI_TEST_EQUALS( (void*)hboxImpl.GetParent(), (void*)nullptr, TEST_LOCATION );
+
+ END_TEST;
+}
+
+
+int UtcDaliLayouting_LayoutChildren04(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline(" UtcDaliLayouting_LayoutChildren03");
+
+ Stage stage = Stage::GetCurrent();
+
+ auto rootControl = Control::New();
+ auto absoluteLayout = AbsoluteLayout::New();
+ DevelControl::SetLayout( rootControl, absoluteLayout );
+ stage.Add( rootControl );
+
+ auto hbox = Control::New();
+ tet_infoline("Test unparenting by adding child with no layout to parent (should auto-generate LayoutItem) ");
+ auto hboxLayout = LinearLayout::New();
+ rootControl.Add( hbox );
+
+ DALI_TEST_EQUALS( absoluteLayout.GetChildCount(), 1, TEST_LOCATION );
+
+ tet_infoline("Then setting a layout on the child container");
+ DevelControl::SetLayout( hbox, hboxLayout );
+
+ DALI_TEST_EQUALS( absoluteLayout.GetChildCount(), 1, TEST_LOCATION );
+
+ auto& hboxImpl = GetImplementation( hboxLayout );
+ auto& absImpl = GetImplementation( absoluteLayout );
+ DALI_TEST_EQUALS( hboxLayout.GetOwner(), Handle(hbox), TEST_LOCATION );
+ DALI_TEST_EQUALS( hboxImpl.GetParent(), (Dali::Toolkit::Internal::LayoutParent*)&absImpl, TEST_LOCATION );
+
+ END_TEST;
+}
+
+int UtcDaliLayouting_SetLayoutOrder01(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline(" UtcDaliLayouting_SetLayoutOrder01 - Call SetLayout after adding the control to the root layout");
+
+ Stage stage = Stage::GetCurrent();
+
+ auto rootControl = Control::New();
+ auto absoluteLayout = AbsoluteLayout::New();
+ DevelControl::SetLayout( rootControl, absoluteLayout );
+ rootControl.SetName( "AbsoluteLayout" );
+ stage.Add( rootControl );
+
+ tet_infoline(" UtcDaliLayouting_SetLayoutOrder - Creating control");
+ auto hbox = Control::New();
+ auto hboxLayout = LinearLayout::New();
+ hbox.SetName( "HBox");
+
+ tet_infoline(" UtcDaliLayouting_SetLayoutOrder - Add control to root layout");
+ rootControl.Add( hbox );
+
+ tet_infoline(" UtcDaliLayouting_SetLayoutOrder - Set layout to control AFTER control added to root");
+ DevelControl::SetLayout( hbox, hboxLayout );
+
+ // Add a Child control
+ std::vector< Control > controls;
+ controls.push_back( CreateLeafControl( 100, 100 ) ); // Single control
+ for( auto&& iter : controls )
+ {
+ hbox.Add( iter );
+ }
+
+ // Ensure layouting happens
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( controls[0].GetProperty<Vector3>( Actor::Property::SIZE ), Vector3( 100.0f, 100.0f, 0.0f ), 0.0001f, TEST_LOCATION );
+
+ END_TEST;
+}
+
+int UtcDaliLayouting_SetLayoutOrder02(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline(" UtcDaliLayouting_SetLayoutOrder02 - Test the layout item order and the control order");
+
+ Stage stage = Stage::GetCurrent();
+
+ auto rootControl = Control::New();
+ auto absoluteLayout = AbsoluteLayout::New();
+ DevelControl::SetLayout( rootControl, absoluteLayout );
+ rootControl.SetName( "AbsoluteLayout" );
+ stage.Add( rootControl );
+
+ auto hbox = Control::New();
+ auto hboxLayout = LinearLayout::New();
+ hbox.SetName( "HBox");
+
+ rootControl.Add( hbox );
+
+ DevelControl::SetLayout( hbox, hboxLayout );
+
+ // Add child controls
+ std::vector< Control > controls;
+ controls.push_back( CreateLeafControl( 100, 100 ) ); // 0
+ controls.push_back( CreateLeafControl( 100, 100 ) ); // 1
+ controls.push_back( CreateLeafControl( 100, 100 ) ); // 2
+
+ for( auto&& iter : controls )
+ {
+ hbox.Add( iter );
+ }
+
+ // Ensure layouting happens
+ application.SendNotification();
+ application.Render();
+
+ TestLayoutItemOrder( controls, hboxLayout );
+
+ tet_infoline("RaiseToTop");
+
+ controls[0].RaiseToTop(); // 1 2 0
+
+ TestLayoutItemOrder( controls, hboxLayout );
+
+ tet_infoline("LowerToBottom");
+
+ controls[2].LowerToBottom(); // 2 1 0
+
+ TestLayoutItemOrder( controls, hboxLayout );
+
+ tet_infoline("Remove / Add");
+
+ hbox.Remove( controls[2] ); // 1 0
+ hbox.Add( controls[2] ); // 1 0 2
+
+ TestLayoutItemOrder( controls, hboxLayout );
+
+ tet_infoline("SetLayout");
+
+ auto vboxLayout = LinearLayout::New();
+ DevelControl::SetLayout( controls[0], vboxLayout );
+
+ TestLayoutItemOrder( controls, hboxLayout );
+
+ tet_infoline("Raise");
+
+ controls[0].Raise(); // 1 2 0
+
+ TestLayoutItemOrder( controls, hboxLayout );
+
+ tet_infoline("Lower");
+
+ controls[2].Lower(); // 2 1 0
+
+ TestLayoutItemOrder( controls, hboxLayout );
+
+ tet_infoline("SetLayout again");
+
+ auto vboxLayout1 = LinearLayout::New();
+ DevelControl::SetLayout( controls[2], vboxLayout1 );
+
+ TestLayoutItemOrder( controls, hboxLayout );
+
+ DevelControl::SetLayout( controls[2], vboxLayout );
+
+ END_TEST;
+}