X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-toolkit%2Futc-Dali-Popup.cpp;h=159ea013ffc83d35b4904e715c212457b9801a41;hp=294bec2ef751f6b73c8cb88033df7a88b791e11b;hb=HEAD;hpb=f58b8383147de70affa1e3949cf1c6757d705d3c diff --git a/automated-tests/src/dali-toolkit/utc-Dali-Popup.cpp b/automated-tests/src/dali-toolkit/utc-Dali-Popup.cpp index 294bec2..a46c93b 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-Popup.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-Popup.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,17 +15,21 @@ * */ -#include #include // Need to override adaptor classes for toolkit test harness, so include // test harness headers before dali headers. #include +#include "dali-toolkit-test-utils/toolkit-timer.h" -#include -#include #include #include +#include +#include +#include +#include +#include +#include using namespace Dali; using namespace Toolkit; @@ -49,19 +53,33 @@ static void TestCallback(BaseHandle handle) gObjectCreatedCallBackCalled = true; } -const int RENDER_FRAME_INTERVAL = 10; ///< Duration of each frame in ms. -const int RENDER_ANIMATION_TEST_DURATION_MS = 1000; ///< 1000ms to test animation -const int RENDER_ANIMATION_TEST_DURATION_FRAMES = RENDER_ANIMATION_TEST_DURATION_MS / RENDER_FRAME_INTERVAL; ///< equivalent frames. +const int RENDER_FRAME_INTERVAL = 10; ///< Duration of each frame in ms. +const int RENDER_ANIMATION_TEST_DURATION_MS = 2000; ///< 2000ms to test animation. +const int RENDER_ANIMATION_TEST_DURATION_FRAMES = RENDER_ANIMATION_TEST_DURATION_MS / RENDER_FRAME_INTERVAL; ///< equivalent frames. const Vector3 DEFAULT_BUTTON_SIZE(100.0f, 50.0f, 0.0f); -const Dali::TouchPoint pointDownOutside( 0, TouchPoint::Down, 10.0f, 10.0f ); -const Dali::TouchPoint pointUpOutside( 0, TouchPoint::Up, 10.0f, 10.0f ); + +Dali::Integration::Point GetPointDown() +{ + Dali::Integration::Point point; + point.SetState(PointState::DOWN); + point.SetScreenPosition(Vector2(10, 10)); + return point; +} + +Dali::Integration::Point GetPointUp() +{ + Dali::Integration::Point point; + point.SetState(PointState::UP); + point.SetScreenPosition(Vector2(10, 10)); + return point; +} /** - * Counts how many descendents root Actor has, including + * Counts how many descendants root Actor has, including * itself. * * @param[in] root The root actor to count from. - * @return The number of descendents including root actor itself. + * @return The number of descendants including root actor itself. */ int DescendentCount(const Actor& root) { @@ -69,7 +87,7 @@ int DescendentCount(const Actor& root) int count = 1; - for(unsigned int i=0; i withoutTailCount ); + DALI_TEST_CHECK(withTailCount > withoutTailCount); // Hide again - popup.HideTail(); + popup.SetDisplayState(Popup::HIDDEN); + popup.SetProperty(Popup::Property::TAIL_VISIBILITY, false); + popup.SetDisplayState(Popup::SHOWN); int withoutTailCount2 = DescendentCount(popup); - DALI_TEST_CHECK( withTailCount > withoutTailCount2 ); + DALI_TEST_CHECK(withTailCount > withoutTailCount2); END_TEST; } -int UtcDaliPopupOnTouchedOutside(void) +int UtcDaliPopupOnTouchedOutsideSignal(void) { - ToolkitTestApplication application; // Exceptions require ToolkitTestApplication + ToolkitTestApplication application; // Exceptions require ToolkitTestApplication tet_infoline(" UtcDaliPopupOnTouchedOutside"); // Create the Popup actor Popup popup = Popup::New(); - Stage::GetCurrent().Add( popup ); - popup.SetParentOrigin(ParentOrigin::CENTER); - popup.SetAnchorPoint(ParentOrigin::CENTER); - popup.SetState(Popup::POPUP_SHOW, 0.0f); - popup.OutsideTouchedSignal().Connect( &OnPopupTouchedOutside ); + popup.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + popup.SetProperty(Actor::Property::ANCHOR_POINT, ParentOrigin::CENTER); + popup.SetResizePolicy(ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS); + popup.SetProperty(Actor::Property::SIZE, Vector2(50.0f, 50.0f)); + popup.SetProperty(Popup::Property::ANIMATION_DURATION, 0.0f); + application.GetScene().Add(popup); + popup.OutsideTouchedSignal().Connect(&OnPopupTouchedOutside); + popup.SetDisplayState(Popup::SHOWN); application.SendNotification(); application.Render(); @@ -386,19 +691,824 @@ int UtcDaliPopupOnTouchedOutside(void) Dali::Integration::TouchEvent event; event = Dali::Integration::TouchEvent(); - event.AddPoint( pointDownOutside ); - application.ProcessEvent( event ); + event.AddPoint(GetPointDown()); + application.ProcessEvent(event); + + application.SendNotification(); + application.Render(); + + event = Dali::Integration::TouchEvent(); + event.AddPoint(GetPointUp()); + application.ProcessEvent(event); + + application.SendNotification(); + application.Render(); + + // Confirm the signal is ignored if touch_transparent. + gTouchedOutside = false; + popup.SetProperty(Popup::Property::TOUCH_TRANSPARENT, true); + + event = Dali::Integration::TouchEvent(); + event.AddPoint(GetPointDown()); + application.ProcessEvent(event); application.SendNotification(); application.Render(); event = Dali::Integration::TouchEvent(); - event.AddPoint( pointUpOutside ); - application.ProcessEvent( event ); + event.AddPoint(GetPointUp()); + application.ProcessEvent(event); application.SendNotification(); application.Render(); - DALI_TEST_CHECK(gTouchedOutside); + DALI_TEST_CHECK(!gTouchedOutside); + + END_TEST; +} + +int UtcDaliPopupPropertyAutoHide(void) +{ + ToolkitTestApplication application; // Exceptions require ToolkitTestApplication + tet_infoline(" UtcDaliPopupPropertyAutoHide"); + + // Create the Popup actor + Popup popup = Popup::New(); + ConnectStateSignals(popup); + + Actor container = Actor::New(); + PushButton button1 = PushButton::New(); + button1.SetProperty(Actor::Property::SIZE, DEFAULT_BUTTON_SIZE.GetVectorXY()); + container.Add(button1); + popup.SetFooter(container); + + popup.SetProperty(Popup::Property::ANIMATION_DURATION, 0.0f); + float getAnimationDuration = 0.0f; + DALI_TEST_CHECK(popup.GetProperty(Popup::Property::ANIMATION_DURATION).Get(getAnimationDuration)); + DALI_TEST_EQUALS(getAnimationDuration, 0.0f, Math::MACHINE_EPSILON_0, TEST_LOCATION); + + popup.SetProperty(Popup::Property::AUTO_HIDE_DELAY, 200); + int getAutoHideDelay = 0; + DALI_TEST_CHECK(popup.GetProperty(Popup::Property::AUTO_HIDE_DELAY).Get(getAutoHideDelay)); + DALI_TEST_EQUALS(getAutoHideDelay, 200, TEST_LOCATION); + + application.GetScene().Add(popup); + + DALI_TEST_EQUALS(gPopupState, Popup::HIDDEN, TEST_LOCATION); + + // Show + // Note: in most popup animation implementations show would result in + // popup being onstage immediately following Show(). However we can't + // assume for all. e.g. If one creates a animation with a delay. + popup.SetDisplayState(Popup::SHOWN); + + DALI_TEST_EQUALS(gPopupState, Popup::SHOWN, TEST_LOCATION); + + for(int i = 0; i < RENDER_ANIMATION_TEST_DURATION_FRAMES; i++) + { + application.SendNotification(); + application.Render(RENDER_FRAME_INTERVAL); + } + + // Force the timer used by the popup to expire, + // this will cause the popup to hide automatically. + Dali::Timer timer = Timer::New(0); + timer.MockEmitSignal(); + + DALI_TEST_EQUALS(gPopupState, Popup::HIDDEN, TEST_LOCATION); + + END_TEST; +} + +/* + * This test checks all animation modes to confirm they all trigger all display states at the expected times. + */ +int UtcDaliPopupPropertyAnimationMode(void) +{ + ToolkitTestApplication application; // Exceptions require ToolkitTestApplication + tet_infoline(" UtcDaliPopupPropertyAnimationMode"); + + // Create the Popup actor + Popup popup = Popup::New(); + ConnectStateSignals(popup); + popup.SetTitle(TextLabel::New("Title")); + application.GetScene().Add(popup); + + std::string animationModes[] = {"NONE", "ZOOM", "FADE", "CUSTOM"}; + + // Try both default and zero animation duration, as zero has a special case for some animation types. + for(int j = 0; j <= 1; j++) + { + // On the second loop, set duration to zero. + if(j == 1) + { + popup.SetProperty(Popup::Property::ANIMATION_DURATION, 0.0f); + } + + // Loop through 4 animation modes. + for(int i = 0; i < 4; i++) + { + popup.SetProperty(Popup::Property::ANIMATION_MODE, animationModes[i]); + + std::string checkMode; + DALI_TEST_CHECK(popup.GetProperty(Popup::Property::ANIMATION_MODE).Get(checkMode)) + + DALI_TEST_EQUALS(checkMode, animationModes[i], TEST_LOCATION); + + popup.SetProperty(Toolkit::Popup::Property::DISPLAY_STATE, "SHOWN"); + std::string resultState; + + // Only wait for animation if it isn't instant. + if(j == 0) + { + DALI_TEST_EQUALS(gPopupState, Popup::SHOWING, TEST_LOCATION); + DALI_TEST_CHECK(popup.GetProperty(Toolkit::Popup::Property::DISPLAY_STATE).Get(resultState)); + DALI_TEST_EQUALS(resultState, "SHOWING", TEST_LOCATION); + WaitAnimation(application); + } + + DALI_TEST_EQUALS(gPopupState, Popup::SHOWN, TEST_LOCATION); + DALI_TEST_CHECK(popup.GetProperty(Toolkit::Popup::Property::DISPLAY_STATE).Get(resultState)); + DALI_TEST_EQUALS(resultState, "SHOWN", TEST_LOCATION); + popup.SetDisplayState(Popup::HIDDEN); + + if(j == 0) + { + DALI_TEST_EQUALS(gPopupState, Popup::HIDING, TEST_LOCATION); + DALI_TEST_CHECK(popup.GetProperty(Toolkit::Popup::Property::DISPLAY_STATE).Get(resultState)); + DALI_TEST_EQUALS(resultState, "HIDING", TEST_LOCATION); + WaitAnimation(application); + } + + DALI_TEST_EQUALS(gPopupState, Popup::HIDDEN, TEST_LOCATION); + DALI_TEST_CHECK(popup.GetProperty(Toolkit::Popup::Property::DISPLAY_STATE).Get(resultState)); + DALI_TEST_EQUALS(resultState, "HIDDEN", TEST_LOCATION); + } + } + + END_TEST; +} + +int UtcDaliPopupPropertyTitle(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliPopupPropertyTitle"); + + // Create the Popup actor + Popup popup = Popup::New(); + + std::string testLabelText = "TitleTest"; + TextLabel titleLabel = TextLabel::New(); + titleLabel.SetProperty(Toolkit::TextLabel::Property::TEXT, testLabelText); + Actor title = titleLabel; + Property::Map map; + Scripting::CreatePropertyMap(title, map); + popup.SetProperty(Toolkit::Popup::Property::TITLE, map); + + Property::Map resultMap; + DALI_TEST_CHECK(popup.GetProperty(Toolkit::Popup::Property::TITLE).Get(resultMap)); + + Property::Value* resultProperty = resultMap.Find("text"); + DALI_TEST_CHECK(resultProperty); + + std::string resultText; + DALI_TEST_CHECK(resultProperty->Get(resultText)); + + DALI_TEST_EQUALS(resultText, testLabelText, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliPopupPropertyContent(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliPopupPropertyContent"); + + // Create the Popup actor + Popup popup = Popup::New(); + + std::string testLabelText = "ContentTest"; + TextLabel contentLabel = TextLabel::New(); + contentLabel.SetProperty(Toolkit::TextLabel::Property::TEXT, testLabelText); + Actor content = contentLabel; + Property::Map map; + Scripting::CreatePropertyMap(content, map); + popup.SetProperty(Toolkit::Popup::Property::CONTENT, map); + + Property::Map resultMap; + DALI_TEST_CHECK(popup.GetProperty(Toolkit::Popup::Property::CONTENT).Get(resultMap)); + + Property::Value* resultProperty = resultMap.Find("text"); + DALI_TEST_CHECK(resultProperty); + + std::string resultText; + DALI_TEST_CHECK(resultProperty->Get(resultText)); + + DALI_TEST_EQUALS(resultText, testLabelText, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliPopupPropertyFooter(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliPopupPropertyFooter"); + + // Create the Popup actor + Popup popup = Popup::New(); + + std::string testLabelText = "FooterTest"; + TextLabel footerLabel = TextLabel::New(); + footerLabel.SetProperty(Toolkit::TextLabel::Property::TEXT, testLabelText); + Actor footer = footerLabel; + Property::Map map; + Scripting::CreatePropertyMap(footer, map); + popup.SetProperty(Toolkit::Popup::Property::FOOTER, map); + + Property::Map resultMap; + DALI_TEST_CHECK(popup.GetProperty(Toolkit::Popup::Property::FOOTER).Get(resultMap)); + + Property::Value* resultProperty = resultMap.Find("text"); + DALI_TEST_CHECK(resultProperty); + + std::string resultText; + DALI_TEST_CHECK(resultProperty->Get(resultText)); + + DALI_TEST_EQUALS(resultText, testLabelText, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliPopupPropertyContextualMode(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliPopupPropertyContextualMode"); + + // Create the Popup actor + Popup popup = Popup::New(); + popup.SetProperty(Popup::Property::ANIMATION_DURATION, 0.0f); + std::string testLabelText = "ContentTest"; + + TextLabel contentLabel = TextLabel::New(); + + popup.SetContent(contentLabel); + + // Placement actor to parent the popup from so the popup's contextual position can be relative to it. + Actor placement = Actor::New(); + placement.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + placement.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER); + placement.SetProperty(Actor::Property::SIZE, Vector2(1.0f, 1.0f)); + placement.SetResizePolicy(ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS); + application.GetScene().Add(placement); + + placement.Add(popup); + + // Test all contextual modes. + const char* mode[5] = {"NON_CONTEXTUAL", "ABOVE", "RIGHT", "BELOW", "LEFT"}; + Vector2 offsetValues[5]; + offsetValues[0] = Vector2(0.375f, 0.0f); + offsetValues[1] = Vector2(-0.125f, -10.5f); + offsetValues[2] = Vector2(10.875f, -0.5f); + offsetValues[3] = Vector2(-0.125f, 10.5f); + offsetValues[4] = Vector2(-10.875f, -0.5f); + + for(int i = 0; i < 5; ++i) + { + popup.SetProperty(Toolkit::Popup::Property::CONTEXTUAL_MODE, mode[i]); + + std::string propertyResult; + DALI_TEST_CHECK(popup.GetProperty(Toolkit::Popup::Property::CONTEXTUAL_MODE).Get(propertyResult)); + DALI_TEST_EQUALS(propertyResult, std::string(mode[i]), TEST_LOCATION); + + popup.SetDisplayState(Popup::SHOWN); + application.SendNotification(); + application.Render(); + + // Check the position of the label within the popup. + DALI_TEST_EQUALS(contentLabel.GetCurrentProperty(Actor::Property::WORLD_POSITION).GetVectorXY(), offsetValues[i], TEST_LOCATION); + + popup.SetDisplayState(Popup::HIDDEN); + application.SendNotification(); + application.Render(); + } + + END_TEST; +} + +int UtcDaliPopupPropertyBacking(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliPopupPropertyBacking"); + + // Create the Popup actor + Popup popup = Popup::New(); + popup.SetProperty(Popup::Property::ANIMATION_DURATION, 0.0f); + application.GetScene().Add(popup); + + Actor backing = popup.FindChildByName("popupBacking"); + DALI_TEST_CHECK(backing); + + DALI_TEST_EQUALS(backing.GetCurrentProperty(Actor::Property::OPACITY), 1.0f, Math::MACHINE_EPSILON_0, TEST_LOCATION); + + // Check enabled property. + popup.SetDisplayState(Popup::SHOWN); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(backing.GetCurrentProperty(Actor::Property::OPACITY), 0.5f, Math::MACHINE_EPSILON_0, TEST_LOCATION); + + popup.SetDisplayState(Popup::HIDDEN); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(backing.GetCurrentProperty(Actor::Property::OPACITY), 0.0f, Math::MACHINE_EPSILON_0, TEST_LOCATION); + + popup.SetProperty(Popup::Property::BACKING_ENABLED, false); + bool propertyResult; + DALI_TEST_CHECK(popup.GetProperty(Popup::Property::BACKING_ENABLED).Get(propertyResult)); + DALI_TEST_EQUALS(propertyResult, false, TEST_LOCATION); + + popup.SetDisplayState(Popup::SHOWN); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(backing.GetCurrentProperty(Actor::Property::OPACITY), 0.0f, Math::MACHINE_EPSILON_0, TEST_LOCATION); + + popup.SetDisplayState(Popup::HIDDEN); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(backing.GetCurrentProperty(Actor::Property::OPACITY), 0.0f, Math::MACHINE_EPSILON_0, TEST_LOCATION); + + // Check color property. + popup.SetProperty(Popup::Property::BACKING_ENABLED, true); + popup.SetProperty(Popup::Property::BACKING_COLOR, Vector4(1.0f, 0.0f, 0.0f, 1.0f)); + + popup.SetDisplayState(Popup::SHOWN); + application.SendNotification(); + application.Render(); + + Vector4 resultColor; + popup.GetProperty(Popup::Property::BACKING_COLOR).Get(resultColor); + DALI_TEST_EQUALS(resultColor, Vector4(1.0f, 0.0f, 0.0f, 1.0f), Math::MACHINE_EPSILON_0, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliPopupPropertyBackgroundImage(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliPopupPropertyBackgroundImage"); + + // Create the Popup actor + Popup popup = Popup::New(); + application.GetScene().Add(popup); + + // Check setting an image + popup.SetProperty(Toolkit::Popup::Property::POPUP_BACKGROUND_IMAGE, "invalid-image.png"); + std::string resultString; + popup.GetProperty(Toolkit::Popup::Property::POPUP_BACKGROUND_IMAGE).Get(resultString); + DALI_TEST_EQUALS(resultString, "invalid-image.png", TEST_LOCATION); + + END_TEST; +} + +int UtcDaliPopupPropertyCustomAnimation(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliPopupPropertyCustomAnimation"); + + // Create the Popup actor + Popup popup = Popup::New(); + TextLabel content = TextLabel::New("text"); + popup.SetContent(content); + + popup.SetProperty(Popup::Property::ANIMATION_DURATION, 1.0f); + popup.SetProperty(Popup::Property::ANIMATION_MODE, "CUSTOM"); + + Actor popupContainer = popup.FindChildByName("popupContainer"); + DALI_TEST_CHECK(popupContainer); + + Vector3 entryAnimationDestination(300.0f, 200.0f, 0.0f); + Vector3 exitAnimationDestination(-300.0f, -200.0f, 0.0f); + + Property::Map animationMapEntry; + animationMapEntry.Insert("actor", "customAnimationPopup"); + animationMapEntry.Insert("property", "position"); + animationMapEntry.Insert("value", entryAnimationDestination); + animationMapEntry.Insert("alphaFunction", "EASE_OUT"); + + Property::Array timePeriodMapEntry; + timePeriodMapEntry.PushBack(0.0f); + timePeriodMapEntry.PushBack(1.0f); + + animationMapEntry.Insert("timePeriod", timePeriodMapEntry); + + Property::Map animationMapExit; + animationMapExit.Insert("actor", "customAnimationPopup"); + animationMapExit.Insert("property", "position"); + animationMapExit.Insert("value", exitAnimationDestination); + animationMapExit.Insert("alphaFunction", "EASE_IN"); + + Property::Array timePeriodMapExit; + timePeriodMapExit.PushBack(0.0f); + timePeriodMapExit.PushBack(1.0f); + + animationMapExit.Insert("timePeriod", timePeriodMapExit); + + popup.SetProperty(Toolkit::Popup::Property::ENTRY_ANIMATION, animationMapEntry); + popup.SetProperty(Toolkit::Popup::Property::EXIT_ANIMATION, animationMapExit); + + Property::Map resultMap; + DALI_TEST_CHECK(popup.GetProperty(Toolkit::Popup::Property::ENTRY_ANIMATION).Get(resultMap)); + DALI_TEST_EQUALS(resultMap.Count(), 0u, TEST_LOCATION); + DALI_TEST_CHECK(popup.GetProperty(Toolkit::Popup::Property::EXIT_ANIMATION).Get(resultMap)); + DALI_TEST_EQUALS(resultMap.Count(), 0u, TEST_LOCATION); + + application.GetScene().Add(popup); + popup.SetDisplayState(Popup::SHOWN); + + for(int i = 0; i < RENDER_ANIMATION_TEST_DURATION_FRAMES; i++) + { + application.SendNotification(); + application.Render(RENDER_FRAME_INTERVAL); + } + + // Test the popup has animated to it's entry-transition destination. + DALI_TEST_EQUALS(popupContainer.GetCurrentProperty(Actor::Property::WORLD_POSITION), entryAnimationDestination, 0.1f, TEST_LOCATION); + + popup.SetDisplayState(Popup::HIDDEN); + + for(int j = 0; j < RENDER_ANIMATION_TEST_DURATION_FRAMES; j++) + { + application.SendNotification(); + application.Render(RENDER_FRAME_INTERVAL); + } + + DALI_TEST_EQUALS(popupContainer.GetCurrentProperty(Actor::Property::WORLD_POSITION), exitAnimationDestination, 0.1f, TEST_LOCATION); + + END_TEST; +} + +static bool gPushButtonClicked; +static bool PushButtonClicked(Button button) +{ + gPushButtonClicked = true; + return true; +} + +int UtcDaliPopupPropertyTouchTransparent(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliPopupPropertyTouchTransparent"); + + // Create the Popup actor + Popup popup = Popup::New(); + TextLabel content = TextLabel::New("text"); + popup.SetContent(content); + popup.SetProperty(Popup::Property::ANIMATION_DURATION, 0.0f); + popup.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT); + popup.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT); + popup.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f)); + popup.SetResizePolicy(ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS); + + // Create a button (to go underneath the popup). + PushButton button = Toolkit::PushButton::New(); + button.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT); + button.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT); + button.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f)); + button.SetResizePolicy(ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS); + + button.ClickedSignal().Connect(&PushButtonClicked); + + application.GetScene().Add(button); + + button.Add(popup); + + popup.SetDisplayState(Popup::SHOWN); + application.SendNotification(); + application.Render(); + + gPushButtonClicked = false; + Dali::Integration::TouchEvent event; + + // Perform a click, the popup should block the click from hitting the button. + event = Dali::Integration::TouchEvent(); + event.AddPoint(GetPointDown()); + application.ProcessEvent(event); + application.SendNotification(); + application.Render(); + + event = Dali::Integration::TouchEvent(); + event.AddPoint(GetPointUp()); + application.ProcessEvent(event); + application.SendNotification(); + application.Render(); + + DALI_TEST_CHECK(!gPushButtonClicked); + + // Perform a wheel event + Dali::Integration::WheelEvent wheelEvent(Dali::Integration::WheelEvent::MOUSE_WHEEL, 0, 0u, Vector2(10.0f, 10.0f), 1, 1000u); + application.ProcessEvent(wheelEvent); + application.SendNotification(); + application.Render(); + + // Enable touch transparency. + popup.SetProperty(Popup::Property::TOUCH_TRANSPARENT, true); + bool propertyResult; + DALI_TEST_CHECK(popup.GetProperty(Popup::Property::TOUCH_TRANSPARENT).Get(propertyResult)); + DALI_TEST_EQUALS(propertyResult, true, TEST_LOCATION); + + // Perform a click, the popup should allow the click to travel through to the button. + event = Dali::Integration::TouchEvent(); + event.AddPoint(GetPointDown()); + application.ProcessEvent(event); + application.SendNotification(); + application.Render(); + + event = Dali::Integration::TouchEvent(); + event.AddPoint(GetPointUp()); + application.ProcessEvent(event); + application.SendNotification(); + application.Render(); + + DALI_TEST_CHECK(gPushButtonClicked); + + END_TEST; +} + +int UtcDaliPopupPropertyTail(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliPopupPropertyTail"); + + // Create the Popup actor + Popup popup = Popup::New(); + popup.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT); + popup.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT); + popup.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f)); + popup.SetResizePolicy(ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS); + TextLabel content = TextLabel::New("text"); + popup.SetContent(content); + + std::string imageFilename = "invalid-image.jpg"; + popup.SetProperty(Popup::Property::TAIL_DOWN_IMAGE, imageFilename); + popup.SetProperty(Popup::Property::TAIL_UP_IMAGE, imageFilename); + popup.SetProperty(Popup::Property::TAIL_RIGHT_IMAGE, imageFilename); + popup.SetProperty(Popup::Property::TAIL_LEFT_IMAGE, imageFilename); + + std::string resultString; + popup.GetProperty(Toolkit::Popup::Property::TAIL_DOWN_IMAGE).Get(resultString); + DALI_TEST_EQUALS(resultString, imageFilename, TEST_LOCATION); + popup.GetProperty(Toolkit::Popup::Property::TAIL_UP_IMAGE).Get(resultString); + DALI_TEST_EQUALS(resultString, imageFilename, TEST_LOCATION); + popup.GetProperty(Toolkit::Popup::Property::TAIL_RIGHT_IMAGE).Get(resultString); + DALI_TEST_EQUALS(resultString, imageFilename, TEST_LOCATION); + popup.GetProperty(Toolkit::Popup::Property::TAIL_LEFT_IMAGE).Get(resultString); + DALI_TEST_EQUALS(resultString, imageFilename, TEST_LOCATION); + + popup.SetProperty(Popup::Property::TAIL_VISIBILITY, true); + bool boolResult; + DALI_TEST_CHECK(popup.GetProperty(Popup::Property::TAIL_VISIBILITY).Get(boolResult)); + DALI_TEST_EQUALS(boolResult, true, TEST_LOCATION); + + Actor tailActor; + Vector3 tailPosition(ParentOrigin::TOP_CENTER); + + popup.SetProperty(Popup::Property::TAIL_POSITION, tailPosition); + Vector3 vectorResult; + DALI_TEST_CHECK(popup.GetProperty(Popup::Property::TAIL_POSITION).Get(vectorResult)); + DALI_TEST_EQUALS(vectorResult, tailPosition, TEST_LOCATION); + + application.GetScene().Add(popup); + + popup.SetDisplayState(Popup::SHOWN); + application.SendNotification(); + application.Render(); + tailActor = popup.FindChildByName("tailImage"); + DALI_TEST_CHECK(tailActor); + + float baseValX = tailActor.GetCurrentProperty(Actor::Property::WORLD_POSITION).x; + + DALI_TEST_GREATER(baseValX, tailActor.GetCurrentProperty(Actor::Property::WORLD_POSITION).y, TEST_LOCATION); + + popup.SetDisplayState(Popup::HIDDEN); + application.SendNotification(); + application.Render(); + + tailPosition = ParentOrigin::CENTER_LEFT; + popup.SetProperty(Popup::Property::TAIL_POSITION, tailPosition); + + popup.SetDisplayState(Popup::SHOWN); + application.SendNotification(); + application.Render(); + tailActor = popup.FindChildByName("tailImage"); + DALI_TEST_CHECK(tailActor); + + float baseValY = tailActor.GetCurrentProperty(Actor::Property::WORLD_POSITION).y; + DALI_TEST_GREATER(baseValX, tailActor.GetCurrentProperty(Actor::Property::WORLD_POSITION).x, TEST_LOCATION); + + popup.SetDisplayState(Popup::HIDDEN); + application.SendNotification(); + application.Render(); + + tailPosition = ParentOrigin::BOTTOM_CENTER; + popup.SetProperty(Popup::Property::TAIL_POSITION, tailPosition); + + popup.SetDisplayState(Popup::SHOWN); + application.SendNotification(); + application.Render(); + tailActor = popup.FindChildByName("tailImage"); + DALI_TEST_CHECK(tailActor); + DALI_TEST_EQUALS(tailActor.GetCurrentProperty(Actor::Property::WORLD_POSITION).x, baseValX, TEST_LOCATION); + DALI_TEST_GREATER(tailActor.GetCurrentProperty(Actor::Property::WORLD_POSITION).y, baseValY, TEST_LOCATION); + + popup.SetDisplayState(Popup::HIDDEN); + application.SendNotification(); + application.Render(); + + tailPosition = ParentOrigin::CENTER_RIGHT; + popup.SetProperty(Popup::Property::TAIL_POSITION, tailPosition); + + popup.SetDisplayState(Popup::SHOWN); + application.SendNotification(); + application.Render(); + tailActor = popup.FindChildByName("tailImage"); + DALI_TEST_CHECK(tailActor); + DALI_TEST_GREATER(tailActor.GetCurrentProperty(Actor::Property::WORLD_POSITION).x, baseValX, TEST_LOCATION); + DALI_TEST_EQUALS(tailActor.GetCurrentProperty(Actor::Property::WORLD_POSITION).y, baseValY, TEST_LOCATION); + + popup.SetDisplayState(Popup::HIDDEN); + application.SendNotification(); + application.Render(); + + END_TEST; +} + +int UtcDaliPopupTypeToast(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliPopupTypeToast"); + + TypeInfo typeInfo = TypeRegistry::Get().GetTypeInfo("PopupToast"); + DALI_TEST_CHECK(typeInfo) + + BaseHandle baseHandle = typeInfo.CreateInstance(); + DALI_TEST_CHECK(baseHandle) + + Toolkit::Popup popup = Toolkit::Popup::DownCast(baseHandle); + gPopupState = Toolkit::Popup::HIDDEN; + ConnectStateSignals(popup); + popup.SetProperty(Popup::Property::ANIMATION_DURATION, 1.0f); + + popup.SetTitle(Toolkit::TextLabel::New("This is a Toast Popup.\nIt will auto-hide itself")); + application.GetScene().Add(popup); + popup.SetDisplayState(Toolkit::Popup::SHOWN); + + for(int i = 0; i < RENDER_ANIMATION_TEST_DURATION_FRAMES; i++) + { + application.SendNotification(); + application.Render(RENDER_FRAME_INTERVAL); + } + + // Check the toast popup is shown. + DALI_TEST_EQUALS(gPopupState, Popup::SHOWN, TEST_LOCATION); + + for(int i = 0; i < RENDER_ANIMATION_TEST_DURATION_FRAMES; i++) + { + application.SendNotification(); + application.Render(RENDER_FRAME_INTERVAL); + } + + // Check the toast popup hides. + Dali::Timer timer = Timer::New(0); + timer.MockEmitSignal(); + + for(int i = 0; i < RENDER_ANIMATION_TEST_DURATION_FRAMES; i++) + { + application.SendNotification(); + application.Render(RENDER_FRAME_INTERVAL); + } + + DALI_TEST_EQUALS(gPopupState, Popup::HIDDEN, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliPopupTypeRegistryCreation(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliPopupTypeRegistryCreation"); + + TypeInfo typeInfo = TypeRegistry::Get().GetTypeInfo("Popup"); + DALI_TEST_CHECK(typeInfo) + + BaseHandle baseHandle = typeInfo.CreateInstance(); + DALI_TEST_CHECK(baseHandle) + + Toolkit::Popup popup = Toolkit::Popup::DownCast(baseHandle); + gPopupState = Toolkit::Popup::HIDDEN; + ConnectStateSignals(popup); + popup.SetProperty(Popup::Property::ANIMATION_DURATION, 0.0f); + + application.GetScene().Add(popup); + popup.SetDisplayState(Toolkit::Popup::SHOWN); + + application.SendNotification(); + application.Render(); + + // Check the popup is shown. + DALI_TEST_EQUALS(gPopupState, Popup::SHOWN, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliPopupPropertyTypeRegistryConnectSignal(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliPopupPropertyTypeRegistryConnectSignal"); + + // Create the Popup actor + Popup popup = Popup::New(); + + TestConnectionTrackerObject* testTracker = new TestConnectionTrackerObject(); + // Note: The emmision of this signals has already been tested in other tests. + DALI_TEST_CHECK(popup.ConnectSignal(testTracker, "touchedOutside", PopupTestFunctor())); + DALI_TEST_CHECK(popup.ConnectSignal(testTracker, "showing", PopupTestFunctor())); + DALI_TEST_CHECK(popup.ConnectSignal(testTracker, "shown", PopupTestFunctor())); + DALI_TEST_CHECK(popup.ConnectSignal(testTracker, "hiding", PopupTestFunctor())); + DALI_TEST_CHECK(popup.ConnectSignal(testTracker, "hidden", PopupTestFunctor())); + + // Test connecting to an invalid signal does not work. + DALI_TEST_CHECK(!popup.ConnectSignal(testTracker, "invalid", PopupTestFunctor())); + + END_TEST; +} + +int UtcDaliPopupOnChildAdd(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliPopupOnChildAdd"); + + // Create the Popup actor + Popup popup = Popup::New(); + popup.SetProperty(Popup::Property::ANIMATION_DURATION, 0.0f); + std::string testLabelText = "ContentTest"; + TextLabel contentLabel = TextLabel::New(testLabelText); + + popup.Add(contentLabel); + + DALI_TEST_CHECK(HasAncestor(contentLabel, popup)); + + END_TEST; +} + +int UtcDaliPopupOnKeyEvent(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliPopupOnKeyEvent"); + + // Create the Popup actor + Popup popup = Popup::New(); + popup.SetProperty(Popup::Property::ANIMATION_DURATION, 0.0f); + application.GetScene().Add(popup); + + popup.SetDisplayState(Popup::SHOWN); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(popup.GetDisplayState(), Popup::SHOWN, TEST_LOCATION); + + popup.SetKeyInputFocus(); + + application.ProcessEvent(GenerateKey("", "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::DOWN, "", "", Device::Class::TOUCH, Device::Subclass::NONE)); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(popup.GetDisplayState(), Popup::HIDDEN, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliPopupSetPopupBackgroundBorderProperty(void) +{ + ToolkitTestApplication application; + + tet_infoline("Set the background border property of a popup & retrieve it"); + Popup popup = Popup::New(); + + Rect rect(40, 30, 20, 10); + tet_infoline("Ensure value we want to set is different from what is already set"); + DALI_TEST_CHECK(rect != popup.GetProperty(Popup::Property::POPUP_BACKGROUND_BORDER).Get >()); + + tet_infoline("Set the property and retrieve it to make sure it's the value we set"); + popup.SetProperty(Popup::Property::POPUP_BACKGROUND_BORDER, rect); + DALI_TEST_EQUALS(rect, popup.GetProperty(Popup::Property::POPUP_BACKGROUND_BORDER).Get >(), TEST_LOCATION); + + tet_infoline("Set a vector4 as well which should also work"); + Vector4 vectorValue(10.0f, 20.0f, 30.0f, 40.0f); + popup.SetProperty(Popup::Property::POPUP_BACKGROUND_BORDER, vectorValue); + DALI_TEST_EQUALS(Rect(10, 20, 30, 40), popup.GetProperty(Popup::Property::POPUP_BACKGROUND_BORDER).Get >(), TEST_LOCATION); + END_TEST; }