2 * Copyright (c) 2014 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/integration-api/events/touch-event-integ.h>
27 #include <dali-toolkit/dali-toolkit.h>
30 using namespace Toolkit;
32 void utc_dali_toolkit_popup_startup(void)
34 test_return_value = TET_UNDEF;
37 void utc_dali_toolkit_popup_cleanup(void)
39 test_return_value = TET_PASS;
44 static bool gObjectCreatedCallBackCalled;
46 static void TestCallback(BaseHandle handle)
48 gObjectCreatedCallBackCalled = true;
51 const int RENDER_FRAME_INTERVAL = 10; ///< Duration of each frame in ms.
52 const int RENDER_ANIMATION_TEST_DURATION_MS = 1000; ///< 1000ms to test animation
53 const int RENDER_ANIMATION_TEST_DURATION_FRAMES = RENDER_ANIMATION_TEST_DURATION_MS / RENDER_FRAME_INTERVAL; ///< equivalent frames.
54 const Vector3 DEFAULT_BUTTON_SIZE(100.0f, 50.0f, 0.0f);
55 const Dali::TouchPoint pointDownOutside( 0, TouchPoint::Down, 10.0f, 10.0f );
56 const Dali::TouchPoint pointUpOutside( 0, TouchPoint::Up, 10.0f, 10.0f );
59 * Counts how many descendents root Actor has, including
62 * @param[in] root The root actor to count from.
63 * @return The number of descendents including root actor itself.
65 int DescendentCount(const Actor& root)
67 unsigned int numChildren = root.GetChildCount();
71 for(unsigned int i=0; i<numChildren; ++i)
73 count += DescendentCount(root.GetChildAt(i));
79 bool HasAncestor(Actor child, Actor ancestor)
81 while(child && child != ancestor)
83 child = child.GetParent();
86 return (child == ancestor);
90 static bool gHidden = false;
92 static void OnPopupHidden()
97 static bool gTouchedOutside;
99 static void OnPopupTouchedOutside()
101 gTouchedOutside = true;
107 int UtcDaliPopupNew(void)
109 ToolkitTestApplication application;
110 tet_infoline(" UtcDaliPopupNew");
112 // Create the Popup actor
115 DALI_TEST_CHECK( !popup );
117 popup = Popup::New();
119 DALI_TEST_CHECK( popup );
123 DALI_TEST_CHECK( popup2 == popup );
125 //Additional check to ensure object is created by checking if it's registered
126 ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
127 DALI_TEST_CHECK( registry );
129 gObjectCreatedCallBackCalled = false;
130 registry.ObjectCreatedSignal().Connect( &TestCallback );
132 Popup popup = Popup::New();
134 DALI_TEST_CHECK( gObjectCreatedCallBackCalled );
138 int UtcDaliPopupDestructor(void)
140 ToolkitTestApplication application;
142 Popup* popup = new Popup();
145 DALI_TEST_CHECK( true );
149 int UtcDaliPopupDownCast(void)
151 ToolkitTestApplication application;
153 Handle handle = Popup::New();
155 Popup popup = Popup::DownCast( handle );
157 DALI_TEST_CHECK( popup == handle );
161 int UtcDaliPopoupSetProperty(void)
163 tet_infoline("UtcDaliPopoupSetProperty: ");
164 ToolkitTestApplication application;
166 Popup popup = Popup::New();
169 std::string testString = "Hello World";
170 popup.SetProperty(popup.GetPropertyIndex("title"), testString);
171 DALI_TEST_EQUALS( testString, popup.GetTitle().GetText(), TEST_LOCATION );
176 int UtcDaliPopupSetBackgroundImage(void)
178 ToolkitTestApplication application; // Exceptions require ToolkitTestApplication
179 tet_infoline(" UtcDaliPopupSetBackgroundImage");
181 // Create the Popup actor
182 Popup popup = Popup::New();
183 Stage::GetCurrent().Add( popup );
185 ImageActor image = CreateSolidColorActor( Color::RED );
186 DALI_TEST_CHECK( !image.GetParent() );
187 popup.SetBackgroundImage(image);
188 DALI_TEST_CHECK( image.GetParent() );
192 int UtcDaliPopupSetTitle(void)
194 ToolkitTestApplication application; // Exceptions require ToolkitTestApplication
195 tet_infoline(" UtcDaliPopupSetTitle");
197 // Create the Popup actor
198 Popup popup = Popup::New();
199 Stage::GetCurrent().Add( popup );
200 // Put in show state so it's layer is connected to popup (for ancestor check).
201 popup.SetState(Popup::POPUP_SHOW, 0.0f);
203 TextView titleActor = TextView::New();
204 titleActor.SetText("title");
206 DALI_TEST_CHECK( !popup.GetTitle() );
207 popup.SetTitle(titleActor);
208 DALI_TEST_CHECK( popup.GetTitle() == titleActor );
209 DALI_TEST_CHECK( (popup.GetTitle()) && (popup.GetTitle().GetText() == "title") );
210 // verify titleActor is actually inside popup, and not elsewhere on stage, or off even.
211 DALI_TEST_CHECK( HasAncestor(titleActor, popup) );
213 TextView titleActor2 = TextView::New();
214 titleActor2.SetText("anothertitle");
215 popup.SetTitle(titleActor2);
216 DALI_TEST_CHECK( popup.GetTitle() != titleActor );
217 DALI_TEST_CHECK( popup.GetTitle() == titleActor2 );
218 DALI_TEST_CHECK( (popup.GetTitle()) && (popup.GetTitle().GetText() == "anothertitle") );
219 // verify titleActor is actually inside popup, and not elsewhere on stage, or off even.
220 DALI_TEST_CHECK( HasAncestor(titleActor2, popup) );
224 int UtcDaliPopupSetTitleText(void)
226 ToolkitTestApplication application; // Exceptions require ToolkitTestApplication
227 tet_infoline(" UtcDaliPopupSetTitleText");
229 // Create the Popup actor
230 Popup popup = Popup::New();
231 Stage::GetCurrent().Add( popup );
232 // Put in show state so it's layer is connected to popup (for ancestor check).
233 popup.SetState(Popup::POPUP_SHOW, 0.0f);
235 TextView titleActor = TextView::New();
236 titleActor.SetText("title");
238 DALI_TEST_CHECK( !popup.GetTitle() );
239 popup.SetTitle(titleActor);
240 DALI_TEST_CHECK( popup.GetTitle() == titleActor );
241 DALI_TEST_CHECK( (popup.GetTitle()) && (popup.GetTitle().GetText() == "title") );
242 // verify titleActor is actually inside popup, and not elsewhere on stage, or off even.
243 DALI_TEST_CHECK( HasAncestor(titleActor, popup) );
245 // this text should replace titleImage actor.
246 popup.SetTitle("newtext");
247 DALI_TEST_CHECK( popup.GetTitle() != titleActor );
248 DALI_TEST_CHECK( (popup.GetTitle()) && (popup.GetTitle().GetText() == "newtext") );
249 // verify titleActor is no longer inside popup. (been displaced by newtext actor)
250 DALI_TEST_CHECK( !HasAncestor(titleActor, popup) );
254 int UtcDaliPopupAddButton(void)
256 ToolkitTestApplication application; // Exceptions require ToolkitTestApplication
257 tet_infoline(" UtcDaliPopupAddButton");
259 // Create the Popup actor
260 Popup popup = Popup::New();
261 Stage::GetCurrent().Add( popup );
262 // Put in show state so it's layer is connected to popup (for ancestor check).
263 popup.SetState(Popup::POPUP_SHOW, 0.0f);
265 PushButton button = PushButton::New();
266 DALI_TEST_CHECK( !HasAncestor(button, popup) );
267 popup.AddButton(button);
268 // Hide and then re-show popup to cause button to be rearranged and added to popup.
269 popup.SetState( Popup::POPUP_HIDE, 0.0f );
270 popup.SetState( Popup::POPUP_SHOW, 0.0f );
271 DALI_TEST_CHECK( HasAncestor(button, popup) );
275 int UtcDaliPopupSetState(void)
277 ToolkitTestApplication application; // Exceptions require ToolkitTestApplication
278 tet_infoline(" UtcDaliPopupSetState");
280 // Create the Popup actor
281 Popup popup = Popup::New();
282 Stage::GetCurrent().Add( popup );
284 ImageActor backgroundImage = CreateSolidColorActor( Color::RED );
285 popup.SetBackgroundImage(backgroundImage);
287 // Showing/Hiding popup, results in all child Actors being
288 // connected/disconnected from the stage.
289 DALI_TEST_CHECK( !backgroundImage.OnStage() );
290 popup.SetState(Popup::POPUP_SHOW, 0.0f);
291 DALI_TEST_CHECK( backgroundImage.OnStage() );
292 DALI_TEST_EQUALS( Popup::POPUP_SHOW, popup.GetState(), TEST_LOCATION );
293 popup.SetState(Popup::POPUP_HIDE, 0.0f);
294 DALI_TEST_CHECK( !backgroundImage.OnStage() );
295 DALI_TEST_EQUALS( Popup::POPUP_HIDE, popup.GetState(), TEST_LOCATION );
299 int UtcDaliPopupSetStateSlow(void)
301 ToolkitTestApplication application; // Exceptions require ToolkitTestApplication
302 tet_infoline(" UtcDaliPopupSetStateSlow");
304 // Create the Popup actor
305 Popup popup = Popup::New();
306 Stage::GetCurrent().Add( popup );
308 ImageActor backgroundImage = CreateSolidColorActor( Color::RED );
309 popup.SetBackgroundImage(backgroundImage);
311 // Showing/Hiding popup, results in all child Actors being
312 // connected/disconnected from the stage.
313 DALI_TEST_CHECK( !backgroundImage.OnStage() );
314 popup.SetState(Popup::POPUP_SHOW, 0.0f);
315 DALI_TEST_CHECK( backgroundImage.OnStage() );
318 popup.SetState(Popup::POPUP_HIDE);
320 // Wait for a while (allow animation to complete), and then check state.
321 for(int i = 0; i < RENDER_ANIMATION_TEST_DURATION_FRAMES; i++)
323 application.SendNotification();
324 application.Render(RENDER_FRAME_INTERVAL);
327 DALI_TEST_CHECK( !backgroundImage.OnStage() );
333 int UtcDaliPopupShowHide(void)
335 ToolkitTestApplication application; // Exceptions require ToolkitTestApplication
336 tet_infoline(" UtcDaliPopupShowHide");
338 // Create the Popup actor
339 Popup popup = Popup::New();
340 Stage::GetCurrent().Add( popup );
341 popup.HiddenSignal().Connect( &OnPopupHidden );
343 ImageActor backgroundImage = CreateSolidColorActor( Color::RED );
344 popup.SetBackgroundImage(backgroundImage);
346 PushButton button1 = PushButton::New();
347 PushButton button2 = PushButton::New();
348 button1.SetSize(DEFAULT_BUTTON_SIZE);
349 popup.AddButton(button1);
350 button2.SetSize(DEFAULT_BUTTON_SIZE);
351 popup.AddButton(button2);
353 // Showing/Hiding popup, results in all child Actors being
354 // connected/disconnected from the stage.
355 DALI_TEST_CHECK( !backgroundImage.OnStage() );
358 // Note: in most popup animation implementations show would result in
359 // popup being onstage immediately following Show(). However we can't
360 // assume for all. e.g. If one creates a animation with a delay.
363 // Wait for a while (allow animation to complete), and then check state.
364 for(int i = 0; i < RENDER_ANIMATION_TEST_DURATION_FRAMES; i++)
366 application.SendNotification();
367 application.Render(RENDER_FRAME_INTERVAL);
370 DALI_TEST_CHECK( backgroundImage.OnStage() );
376 // Wait for a while (allow animation to complete), and then check state.
377 for(int i = 0; i < RENDER_ANIMATION_TEST_DURATION_FRAMES; i++)
379 application.SendNotification();
380 application.Render(RENDER_FRAME_INTERVAL);
383 DALI_TEST_CHECK( !backgroundImage.OnStage() );
384 DALI_TEST_CHECK( gHidden );
388 int UtcDaliPopupShowHideTail(void)
390 ToolkitTestApplication application; // Exceptions require ToolkitTestApplication
391 tet_infoline(" UtcDaliPopupShowHideTail");
393 // Create the Popup actor
394 Popup popup = Popup::New();
395 Stage::GetCurrent().Add( popup );
396 popup.SetState(Popup::POPUP_SHOW, 0.0f);
399 int withoutTailCount = DescendentCount(popup);
401 popup.ShowTail(ParentOrigin::BOTTOM_CENTER);
402 int withTailCount = DescendentCount(popup);
404 // There should be more actors if the Tail has been added.
405 DALI_TEST_CHECK( withTailCount > withoutTailCount );
409 int withoutTailCount2 = DescendentCount(popup);
411 DALI_TEST_CHECK( withTailCount > withoutTailCount2 );
415 int UtcDaliPopupOnTouchedOutside(void)
417 ToolkitTestApplication application; // Exceptions require ToolkitTestApplication
418 tet_infoline(" UtcDaliPopupOnTouchedOutside");
420 // Create the Popup actor
421 Popup popup = Popup::New();
422 Stage::GetCurrent().Add( popup );
423 popup.SetParentOrigin(ParentOrigin::CENTER);
424 popup.SetAnchorPoint(ParentOrigin::CENTER);
425 popup.SetState(Popup::POPUP_SHOW, 0.0f);
426 popup.OutsideTouchedSignal().Connect( &OnPopupTouchedOutside );
428 application.SendNotification();
429 application.Render();
431 gTouchedOutside = false;
432 Dali::Integration::TouchEvent event;
434 event = Dali::Integration::TouchEvent();
435 event.AddPoint( pointDownOutside );
436 application.ProcessEvent( event );
438 application.SendNotification();
439 application.Render();
441 event = Dali::Integration::TouchEvent();
442 event.AddPoint( pointUpOutside );
443 application.ProcessEvent( event );
445 application.SendNotification();
446 application.Render();
448 DALI_TEST_CHECK(gTouchedOutside);