2 * Copyright (c) 2020 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.
18 #include <dali-test-suite-utils.h>
19 #include <dali/public-api/dali-core.h>
26 void utc_dali_property_notification_startup(void)
28 test_return_value = TET_UNDEF;
31 void utc_dali_property_notification_cleanup(void)
33 test_return_value = TET_PASS;
38 static bool gCallBackCalled;
40 static void TestCallback(PropertyNotification& source)
42 gCallBackCalled = true;
45 const int RENDER_FRAME_INTERVAL(16); ///< Duration of each frame in ms. (at approx 60FPS)
46 const int DEFAULT_WAIT_PERIOD(100); ///< Default waiting period for check.
48 class TestClass : public ConnectionTracker
51 TestClass(Integration::Scene scene)
62 mActor = Actor::New();
64 mNotification = mActor.AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(100.0f));
65 mNotification.NotifySignal().Connect(this, &TestClass::OnPropertyNotify);
68 void RemovePropertyNotification()
70 mActor.RemovePropertyNotification(mNotification);
73 void RemovePropertyNotifications()
75 mActor.RemovePropertyNotifications();
80 mScene.Remove(mActor);
82 mNotification.Reset();
85 void OnPropertyNotify(PropertyNotification& source)
87 tet_infoline(" OnPropertyNotify");
88 gCallBackCalled = true;
92 PropertyNotification mNotification;
93 Integration::Scene mScene;
97 * Simulate time passed by.
99 * @note this will always process at least 1 frame (1/60 sec)
101 * @param application Test application instance
102 * @param duration Time to pass in milliseconds.
103 * @return The actual time passed in milliseconds
105 int Wait(TestApplication& application, int duration = 0)
109 for(int i = 0; i <= (duration / RENDER_FRAME_INTERVAL); i++)
111 application.SendNotification();
112 application.Render(RENDER_FRAME_INTERVAL);
113 time += RENDER_FRAME_INTERVAL;
119 } // unnamed namespace
121 // Positive test case for a method
122 int UtcDaliPropertyNotificationDownCast(void)
124 TestApplication application;
125 tet_infoline(" UtcDaliPropertyNotificationDownCast");
127 Actor actor = Actor::New();
128 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(100.0f));
129 BaseHandle handle = notification;
130 PropertyNotification notificationHandle;
132 DALI_TEST_CHECK(notification);
133 DALI_TEST_CHECK(handle);
134 DALI_TEST_CHECK(!notificationHandle);
136 notificationHandle = PropertyNotification::DownCast(handle);
137 DALI_TEST_CHECK(notificationHandle);
141 // Negative test case for a method
142 int UtcDaliPropertyNotificationDownCastNegative(void)
144 TestApplication application;
145 tet_infoline(" UtcDaliPropertyNotificationDownCastNegative");
147 // Create something derived from BaseHandle other than a PropertyNotification.
148 Actor somethingElse = Actor::New();
150 Actor actor = Actor::New();
151 actor.AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(100.0f));
152 BaseHandle handle = somethingElse;
153 PropertyNotification notificationHandle;
155 notificationHandle = PropertyNotification::DownCast(handle);
156 DALI_TEST_CHECK(!notificationHandle);
160 int UtcDaliPropertyNotificationMoveConstructor(void)
162 TestApplication application;
164 Actor actor = Actor::New();
166 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(100.0f));
167 DALI_TEST_CHECK(notification);
168 DALI_TEST_EQUALS(2, notification.GetBaseObject().ReferenceCount(), TEST_LOCATION);
170 PropertyNotification movedNotification = std::move(notification);
171 DALI_TEST_CHECK(movedNotification);
173 // Check that object is moved (not copied, so ref count keeps the same)
174 DALI_TEST_EQUALS(2, movedNotification.GetBaseObject().ReferenceCount(), TEST_LOCATION);
175 DALI_TEST_CHECK(!notification);
177 PropertyCondition condition = movedNotification.GetCondition();
178 DALI_TEST_CHECK(condition);
179 DALI_TEST_EQUALS(2, condition.GetBaseObject().ReferenceCount(), TEST_LOCATION);
180 DALI_TEST_EQUALS(1, condition.GetArgumentCount(), TEST_LOCATION);
182 PropertyCondition movedCondition = std::move(condition);
183 DALI_TEST_CHECK(movedCondition);
185 // Check that object is moved (not copied, so ref count keeps the same)
186 DALI_TEST_EQUALS(2, movedCondition.GetBaseObject().ReferenceCount(), TEST_LOCATION);
187 DALI_TEST_EQUALS(1, movedCondition.GetArgumentCount(), TEST_LOCATION);
188 DALI_TEST_CHECK(!condition);
193 int UtcDaliPropertyNotificationMoveAssignment(void)
195 TestApplication application;
197 Actor actor = Actor::New();
199 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(100.0f));
200 DALI_TEST_CHECK(notification);
201 DALI_TEST_EQUALS(2, notification.GetBaseObject().ReferenceCount(), TEST_LOCATION);
203 PropertyNotification movedNotification;
204 movedNotification = std::move(notification);
205 DALI_TEST_CHECK(movedNotification);
207 // Check that object is moved (not copied, so ref count keeps the same)
208 DALI_TEST_EQUALS(2, movedNotification.GetBaseObject().ReferenceCount(), TEST_LOCATION);
209 DALI_TEST_CHECK(!notification);
211 PropertyCondition condition = movedNotification.GetCondition();
212 DALI_TEST_CHECK(condition);
213 DALI_TEST_EQUALS(2, condition.GetBaseObject().ReferenceCount(), TEST_LOCATION);
214 DALI_TEST_EQUALS(1, condition.GetArgumentCount(), TEST_LOCATION);
216 PropertyCondition movedCondition;
217 movedCondition = std::move(condition);
218 DALI_TEST_CHECK(movedCondition);
220 // Check that object is moved (not copied, so ref count keeps the same)
221 DALI_TEST_EQUALS(2, movedCondition.GetBaseObject().ReferenceCount(), TEST_LOCATION);
222 DALI_TEST_EQUALS(1, movedCondition.GetArgumentCount(), TEST_LOCATION);
223 DALI_TEST_CHECK(!condition);
228 int UtcDaliAddPropertyNotification(void)
230 TestApplication application; // Reset all test adapter return codes
231 tet_infoline(" UtcDaliAddPropertyNotification");
233 Actor actor = Actor::New();
235 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(100.0f));
236 PropertyNotification notification2 = actor.AddPropertyNotification(Actor::Property::SIZE, StepCondition(1.0f, 1.0f));
237 DALI_TEST_CHECK(notification);
238 DALI_TEST_CHECK(notification2);
242 int UtcDaliAddPropertyNotificationCallback(void)
244 TestApplication application; // Reset all test adapter return codes
246 TestClass* object = new TestClass(application.GetScene());
248 object->Initialize();
249 application.Render(RENDER_FRAME_INTERVAL);
250 application.SendNotification();
252 gCallBackCalled = false;
254 tet_infoline(" UtcDaliAddPropertyNotificationCallback - Forcing notification condition true, should receive a notification");
255 object->mActor.SetProperty(Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
256 application.Render(RENDER_FRAME_INTERVAL);
257 application.SendNotification();
258 application.Render(RENDER_FRAME_INTERVAL);
259 application.SendNotification();
260 DALI_TEST_CHECK(gCallBackCalled);
261 gCallBackCalled = false;
263 tet_infoline(" UtcDaliAddPropertyNotificationCallback - Forcing notification condition false, should not receive a notification");
264 object->mActor.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
265 application.Render(RENDER_FRAME_INTERVAL);
266 application.SendNotification();
267 application.Render(RENDER_FRAME_INTERVAL);
268 application.SendNotification();
269 DALI_TEST_CHECK(!gCallBackCalled);
270 gCallBackCalled = false;
272 tet_infoline(" UtcDaliAddPropertyNotificationCallback - Deleting notification and it's owning object, should not receive a notification");
273 object->mActor.SetProperty(Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
274 application.Render(RENDER_FRAME_INTERVAL);
275 application.SendNotification();
277 application.Render(RENDER_FRAME_INTERVAL);
278 application.SendNotification();
279 DALI_TEST_CHECK(!gCallBackCalled);
281 tet_infoline(" UtcDaliAddPropertyNotificationCallback - Removing notification and it's owning object, should not receive a notification");
282 object->Initialize();
283 application.Render(RENDER_FRAME_INTERVAL);
284 application.SendNotification();
285 gCallBackCalled = false;
287 object->RemovePropertyNotification();
289 object->mActor.SetProperty(Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
290 application.Render(RENDER_FRAME_INTERVAL);
291 application.SendNotification();
292 application.Render(RENDER_FRAME_INTERVAL);
293 application.SendNotification();
294 DALI_TEST_CHECK(!gCallBackCalled);
296 tet_infoline(" UtcDaliAddPropertyNotificationCallback - Removing all notifications and it's owning object, should not receive a notification");
297 object->Initialize();
298 application.Render(RENDER_FRAME_INTERVAL);
299 application.SendNotification();
300 gCallBackCalled = false;
302 object->RemovePropertyNotifications();
304 object->mActor.SetProperty(Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
305 application.Render(RENDER_FRAME_INTERVAL);
306 application.SendNotification();
307 application.Render(RENDER_FRAME_INTERVAL);
308 application.SendNotification();
309 DALI_TEST_CHECK(!gCallBackCalled);
315 int UtcDaliAddPropertyNotificationTypeProperty(void)
317 TestApplication application;
319 Actor actor = Actor::New();
321 // Currently, Type registry properties cannot be animated
324 actor.AddPropertyNotification(PROPERTY_REGISTRATION_START_INDEX, GreaterThanCondition(100.0f));
326 catch(DaliException& e)
328 DALI_TEST_ASSERT(e, "Property notification added to event side only property", TEST_LOCATION);
333 int UtcDaliAddPropertyNotificationEventSidePropertyN(void)
335 TestApplication application;
337 Actor actor = Actor::New();
339 // Currently, Type registry properties cannot be animated
342 actor.AddPropertyNotification(PROPERTY_REGISTRATION_MAX_INDEX - 1, GreaterThanCondition(100.0f));
344 catch(DaliException& e)
346 DALI_TEST_ASSERT(e, "Property notification added to event side only property", TEST_LOCATION);
351 int UtcDaliAddPropertyNotificationSize(void)
353 TestApplication application;
354 tet_infoline(" UtcDaliAddPropertyNotificationSize");
356 Actor actor = Actor::New();
358 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::SIZE, StepCondition(1.0f, 1.0f));
359 DALI_TEST_CHECK(notification);
363 int UtcDaliPropertyNotificationGetCondition(void)
365 TestApplication application;
366 tet_infoline(" UtcDaliPropertyNotificationGetCondition");
368 Actor actor = Actor::New();
370 PropertyCondition condition = GreaterThanCondition(100.0f);
371 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, condition);
372 DALI_TEST_CHECK(condition == notification.GetCondition());
376 class PropertyNotificationConstWrapper
379 PropertyNotificationConstWrapper(PropertyNotification propertyNotification)
380 : mPropertyNotification(propertyNotification)
385 * Returns const reference to property notification.
386 * @return const reference.
388 const PropertyCondition& GetCondition() const
390 return mPropertyNotification.GetCondition();
393 PropertyNotification mPropertyNotification;
396 int UtcDaliPropertyNotificationGetConditionConst(void)
398 TestApplication application;
399 tet_infoline(" UtcDaliPropertyNotificationGetConditionConst");
401 Actor actor = Actor::New();
403 PropertyCondition condition = GreaterThanCondition(100.0f);
404 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, condition);
405 PropertyNotificationConstWrapper notificationConst(notification);
406 const PropertyCondition& conditionReference1 = notificationConst.GetCondition();
407 const PropertyCondition& conditionReference2 = notificationConst.GetCondition();
409 DALI_TEST_CHECK((&conditionReference1) == (&conditionReference2));
410 DALI_TEST_CHECK(conditionReference1 == condition);
414 int UtcDaliPropertyNotificationGetTarget(void)
416 TestApplication application;
417 tet_infoline(" UtcDaliPropertyNotificationGetTarget");
419 Actor actor = Actor::New();
420 Actor actor2 = Actor::New();
422 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X,
423 GreaterThanCondition(100.0f));
424 Actor targetActor = Actor::DownCast(notification.GetTarget());
426 DALI_TEST_CHECK(targetActor == actor);
430 int UtcDaliPropertyNotificationGetProperty(void)
432 TestApplication application;
433 tet_infoline(" UtcDaliPropertyNotificationGetProperty");
435 Actor actor = Actor::New();
437 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X,
438 GreaterThanCondition(100.0f));
439 Property::Index targetProperty = notification.GetTargetProperty();
441 DALI_TEST_EQUALS(targetProperty, (Property::Index)Actor::Property::POSITION_X, TEST_LOCATION);
445 int UtcDaliPropertyNotificationGetNotifyMode(void)
447 TestApplication application;
448 tet_infoline(" UtcDaliPropertyNotificationGetNotifyMode");
450 Actor actor = Actor::New();
452 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X,
453 GreaterThanCondition(100.0f));
454 notification.SetNotifyMode(PropertyNotification::NOTIFY_ON_CHANGED);
455 PropertyNotification::NotifyMode notifyMode = notification.GetNotifyMode();
457 DALI_TEST_EQUALS(notifyMode, PropertyNotification::NOTIFY_ON_CHANGED, TEST_LOCATION);
461 int UtcDaliPropertyNotificationGetNotifyResultP(void)
463 TestApplication application;
464 tet_infoline(" UtcDaliPropertyNotificationGetNotifyMode");
466 Actor actor = Actor::New();
468 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X,
469 GreaterThanCondition(100.0f));
470 notification.SetNotifyMode(PropertyNotification::NOTIFY_ON_CHANGED);
471 gCallBackCalled = false;
472 notification.NotifySignal().Connect(&TestCallback);
474 actor.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
476 application.Render(RENDER_FRAME_INTERVAL);
477 application.SendNotification();
478 application.Render(RENDER_FRAME_INTERVAL);
479 application.SendNotification();
481 bool notifyResult = notification.GetNotifyResult();
483 DALI_TEST_EQUALS(notifyResult, false, TEST_LOCATION);
488 int UtcDaliPropertyNotificationGreaterThan(void)
490 TestApplication application;
491 tet_infoline(" UtcDaliPropertyNotificationGreaterThan");
493 Actor actor = Actor::New();
494 application.GetScene().Add(actor);
496 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(100.0f));
497 notification.NotifySignal().Connect(&TestCallback);
499 actor.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
500 Wait(application, DEFAULT_WAIT_PERIOD);
502 // Move right to satisfy condition
503 gCallBackCalled = false;
504 actor.SetProperty(Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
505 Wait(application, DEFAULT_WAIT_PERIOD);
506 DALI_TEST_CHECK(gCallBackCalled);
508 // Move left to un-satisfy condition
509 gCallBackCalled = false;
510 actor.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
511 Wait(application, DEFAULT_WAIT_PERIOD);
512 DALI_TEST_CHECK(!gCallBackCalled);
514 // Move right to satisfy condition again.
515 gCallBackCalled = false;
516 Wait(application, DEFAULT_WAIT_PERIOD);
517 actor.SetProperty(Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
518 Wait(application, DEFAULT_WAIT_PERIOD);
519 DALI_TEST_CHECK(gCallBackCalled);
523 int UtcDaliPropertyNotificationLessThan(void)
525 TestApplication application;
526 tet_infoline(" UtcDaliPropertyNotificationLessThan");
528 Actor actor = Actor::New();
529 application.GetScene().Add(actor);
531 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, LessThanCondition(100.0f));
532 notification.NotifySignal().Connect(&TestCallback);
534 actor.SetProperty(Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
535 Wait(application, DEFAULT_WAIT_PERIOD);
537 // Move left to satisfy condition
538 gCallBackCalled = false;
539 actor.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
540 Wait(application, DEFAULT_WAIT_PERIOD);
541 DALI_TEST_CHECK(gCallBackCalled);
543 // Move right to un-satisfy condition
544 gCallBackCalled = false;
545 actor.SetProperty(Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
546 Wait(application, DEFAULT_WAIT_PERIOD);
547 DALI_TEST_CHECK(!gCallBackCalled);
549 // Move left to satisfy condition again.
550 gCallBackCalled = false;
551 Wait(application, DEFAULT_WAIT_PERIOD);
552 actor.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
553 Wait(application, DEFAULT_WAIT_PERIOD);
554 DALI_TEST_CHECK(gCallBackCalled);
558 int UtcDaliPropertyNotificationInside(void)
560 TestApplication application;
561 tet_infoline(" UtcDaliPropertyNotificationInside");
563 Actor actor = Actor::New();
564 application.GetScene().Add(actor);
566 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, InsideCondition(100.0f, 200.0f));
567 notification.NotifySignal().Connect(&TestCallback);
569 actor.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
570 Wait(application, DEFAULT_WAIT_PERIOD);
572 // Move inside to satisfy condition
573 gCallBackCalled = false;
574 actor.SetProperty(Actor::Property::POSITION, Vector3(150.0f, 0.0f, 0.0f));
575 Wait(application, DEFAULT_WAIT_PERIOD);
576 DALI_TEST_CHECK(gCallBackCalled);
578 // Move outside (right) to un-satisfy condition
579 gCallBackCalled = false;
580 actor.SetProperty(Actor::Property::POSITION, Vector3(300.0f, 0.0f, 0.0f));
581 Wait(application, DEFAULT_WAIT_PERIOD);
582 DALI_TEST_CHECK(!gCallBackCalled);
584 // Move inside to satisfy condition again.
585 gCallBackCalled = false;
586 Wait(application, DEFAULT_WAIT_PERIOD);
587 actor.SetProperty(Actor::Property::POSITION, Vector3(150.0f, 0.0f, 0.0f));
588 Wait(application, DEFAULT_WAIT_PERIOD);
589 DALI_TEST_CHECK(gCallBackCalled);
593 int UtcDaliPropertyNotificationOutside(void)
595 TestApplication application;
596 tet_infoline(" UtcDaliPropertyNotificationOutside");
598 Actor actor = Actor::New();
599 application.GetScene().Add(actor);
601 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, OutsideCondition(100.0f, 200.0f));
602 notification.NotifySignal().Connect(&TestCallback);
604 actor.SetProperty(Actor::Property::POSITION, Vector3(150.0f, 0.0f, 0.0f));
605 Wait(application, DEFAULT_WAIT_PERIOD);
607 // Move outside (left) to satisfy condition
608 gCallBackCalled = false;
609 actor.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
610 Wait(application, DEFAULT_WAIT_PERIOD);
611 DALI_TEST_CHECK(gCallBackCalled);
613 // Move inside to un-satisfy condition
614 gCallBackCalled = false;
615 actor.SetProperty(Actor::Property::POSITION, Vector3(150.0f, 0.0f, 0.0f));
616 Wait(application, DEFAULT_WAIT_PERIOD);
617 DALI_TEST_CHECK(!gCallBackCalled);
619 // Move outside (right) to satisfy condition again.
620 gCallBackCalled = false;
621 Wait(application, DEFAULT_WAIT_PERIOD);
622 actor.SetProperty(Actor::Property::POSITION, Vector3(300.0f, 0.0f, 0.0f));
623 Wait(application, DEFAULT_WAIT_PERIOD);
624 DALI_TEST_CHECK(gCallBackCalled);
628 int UtcDaliPropertyNotificationVectorComponentGreaterThan(void)
630 TestApplication application;
631 tet_infoline(" UtcDaliPropertyNotificationGreaterThan");
633 Actor actor = Actor::New();
634 application.GetScene().Add(actor);
636 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION, 0, GreaterThanCondition(100.0f));
637 notification.NotifySignal().Connect(&TestCallback);
638 notification = actor.AddPropertyNotification(Actor::Property::POSITION, 1, GreaterThanCondition(100.0f));
639 notification.NotifySignal().Connect(&TestCallback);
640 notification = actor.AddPropertyNotification(Actor::Property::POSITION, 2, GreaterThanCondition(100.0f));
641 notification.NotifySignal().Connect(&TestCallback);
642 notification = actor.AddPropertyNotification(Actor::Property::COLOR, 3, GreaterThanCondition(0.5f));
643 notification.NotifySignal().Connect(&TestCallback);
645 actor.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
646 actor.SetProperty(Actor::Property::COLOR, Vector4(0.0f, 0.0f, 0.0f, 0.0f));
647 Wait(application, DEFAULT_WAIT_PERIOD);
649 // Move right to satisfy XAxis condition
650 gCallBackCalled = false;
651 actor.SetProperty(Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
652 Wait(application, DEFAULT_WAIT_PERIOD);
653 DALI_TEST_CHECK(gCallBackCalled);
655 // Move down to satisfy YAxis condition
656 gCallBackCalled = false;
657 actor.SetProperty(Actor::Property::POSITION, Vector3(200.0f, 200.0f, 0.0f));
658 Wait(application, DEFAULT_WAIT_PERIOD);
659 DALI_TEST_CHECK(gCallBackCalled);
661 // Move forward to satisfy ZAxis
662 gCallBackCalled = false;
663 Wait(application, DEFAULT_WAIT_PERIOD);
664 actor.SetProperty(Actor::Property::POSITION, Vector3(200.0f, 200.0f, 200.0f));
665 Wait(application, DEFAULT_WAIT_PERIOD);
666 DALI_TEST_CHECK(gCallBackCalled);
668 // Change alpha Colour to satisfy w/alpha component condition
669 gCallBackCalled = false;
670 Wait(application, DEFAULT_WAIT_PERIOD);
671 actor.SetProperty(Actor::Property::COLOR, Vector4(0.0f, 0.0f, 0.0f, 1.0f));
672 Wait(application, DEFAULT_WAIT_PERIOD);
673 DALI_TEST_CHECK(gCallBackCalled);
677 int UtcDaliPropertyNotificationVectorComponentLessThan(void)
679 TestApplication application;
680 tet_infoline(" UtcDaliPropertyNotificationLessThan");
682 Actor actor = Actor::New();
683 application.GetScene().Add(actor);
685 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION, 0, LessThanCondition(-100.0f));
686 notification.NotifySignal().Connect(&TestCallback);
687 notification = actor.AddPropertyNotification(Actor::Property::POSITION, 1, LessThanCondition(-100.0f));
688 notification.NotifySignal().Connect(&TestCallback);
689 notification = actor.AddPropertyNotification(Actor::Property::POSITION, 2, LessThanCondition(-100.0f));
690 notification.NotifySignal().Connect(&TestCallback);
691 notification = actor.AddPropertyNotification(Actor::Property::COLOR, 3, LessThanCondition(0.5f));
692 notification.NotifySignal().Connect(&TestCallback);
694 actor.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
695 actor.SetProperty(Actor::Property::COLOR, Vector4(0.0f, 0.0f, 0.0f, 1.0f));
696 Wait(application, DEFAULT_WAIT_PERIOD);
698 // Move left to satisfy XAxis condition
699 gCallBackCalled = false;
700 actor.SetProperty(Actor::Property::POSITION, Vector3(-200.0f, 0.0f, 0.0f));
701 Wait(application, DEFAULT_WAIT_PERIOD);
702 DALI_TEST_CHECK(gCallBackCalled);
704 // Move up to satisfy YAxis condition
705 gCallBackCalled = false;
706 actor.SetProperty(Actor::Property::POSITION, Vector3(-200.0f, -200.0f, 0.0f));
707 Wait(application, DEFAULT_WAIT_PERIOD);
708 DALI_TEST_CHECK(gCallBackCalled);
710 // Move back to satisfy ZAxis
711 gCallBackCalled = false;
712 Wait(application, DEFAULT_WAIT_PERIOD);
713 actor.SetProperty(Actor::Property::POSITION, Vector3(-200.0f, -200.0f, -200.0f));
714 Wait(application, DEFAULT_WAIT_PERIOD);
715 DALI_TEST_CHECK(gCallBackCalled);
717 // Change alpha Colour to satisfy w/alpha component condition
718 gCallBackCalled = false;
719 Wait(application, DEFAULT_WAIT_PERIOD);
720 actor.SetProperty(Actor::Property::COLOR, Vector4(0.0f, 0.0f, 0.0f, 0.0f));
721 Wait(application, DEFAULT_WAIT_PERIOD);
722 DALI_TEST_CHECK(gCallBackCalled);
726 int UtcDaliPropertyNotificationVectorComponentInside(void)
728 TestApplication application;
729 tet_infoline(" UtcDaliPropertyNotificationInside");
731 Actor actor = Actor::New();
732 application.GetScene().Add(actor);
734 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION, 0, InsideCondition(-100.0f, 100.0f));
735 notification.NotifySignal().Connect(&TestCallback);
736 notification = actor.AddPropertyNotification(Actor::Property::POSITION, 1, InsideCondition(-100.0f, 100.0f));
737 notification.NotifySignal().Connect(&TestCallback);
738 notification = actor.AddPropertyNotification(Actor::Property::POSITION, 2, InsideCondition(-100.0f, 100.0f));
739 notification.NotifySignal().Connect(&TestCallback);
740 notification = actor.AddPropertyNotification(Actor::Property::COLOR, 3, InsideCondition(0.25f, 0.75f));
741 notification.NotifySignal().Connect(&TestCallback);
743 // set outside all conditions
744 actor.SetProperty(Actor::Property::POSITION, Vector3(200.0f, 200.0f, 200.0f));
745 actor.SetProperty(Actor::Property::COLOR, Vector4(0.0f, 0.0f, 0.0f, 1.0f));
746 Wait(application, DEFAULT_WAIT_PERIOD);
748 // Move x to inside condition
749 gCallBackCalled = false;
750 actor.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 200.0f, 200.0f));
751 Wait(application, DEFAULT_WAIT_PERIOD);
752 DALI_TEST_CHECK(gCallBackCalled);
754 // Move y to inside condition
755 gCallBackCalled = false;
756 actor.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 200.0f));
757 Wait(application, DEFAULT_WAIT_PERIOD);
758 DALI_TEST_CHECK(gCallBackCalled);
760 // Move z to inside condition
761 gCallBackCalled = false;
762 Wait(application, DEFAULT_WAIT_PERIOD);
763 actor.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
764 Wait(application, DEFAULT_WAIT_PERIOD);
765 DALI_TEST_CHECK(gCallBackCalled);
767 // change alpha to inside condition
768 gCallBackCalled = false;
769 Wait(application, DEFAULT_WAIT_PERIOD);
770 actor.SetProperty(Actor::Property::COLOR, Vector4(0.0f, 0.0f, 0.0f, 0.5f));
771 Wait(application, DEFAULT_WAIT_PERIOD);
772 DALI_TEST_CHECK(gCallBackCalled);
776 int UtcDaliPropertyNotificationVectorComponentOutside(void)
778 TestApplication application;
779 tet_infoline(" UtcDaliPropertyNotificationOutside");
781 Actor actor = Actor::New();
782 application.GetScene().Add(actor);
784 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION, 0, OutsideCondition(-100.0f, 100.0f));
785 notification.NotifySignal().Connect(&TestCallback);
786 notification = actor.AddPropertyNotification(Actor::Property::POSITION, 1, OutsideCondition(-100.0f, 100.0f));
787 notification.NotifySignal().Connect(&TestCallback);
788 notification = actor.AddPropertyNotification(Actor::Property::POSITION, 2, OutsideCondition(-100.0f, 100.0f));
789 notification.NotifySignal().Connect(&TestCallback);
790 notification = actor.AddPropertyNotification(Actor::Property::COLOR, 3, OutsideCondition(0.25f, 0.75f));
791 notification.NotifySignal().Connect(&TestCallback);
793 // set inside all conditions
794 actor.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
795 actor.SetProperty(Actor::Property::COLOR, Vector4(0.0f, 0.0f, 0.0f, 0.5f));
796 Wait(application, DEFAULT_WAIT_PERIOD);
798 // Move x to outside condition
799 gCallBackCalled = false;
800 actor.SetProperty(Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
801 Wait(application, DEFAULT_WAIT_PERIOD);
802 DALI_TEST_CHECK(gCallBackCalled);
804 // Move y to outside condition
805 gCallBackCalled = false;
806 actor.SetProperty(Actor::Property::POSITION, Vector3(200.0f, 200.0f, 0.0f));
807 Wait(application, DEFAULT_WAIT_PERIOD);
808 DALI_TEST_CHECK(gCallBackCalled);
810 // Move z to outside condition
811 gCallBackCalled = false;
812 Wait(application, DEFAULT_WAIT_PERIOD);
813 actor.SetProperty(Actor::Property::POSITION, Vector3(200.0f, 200.0f, 200.0f));
814 Wait(application, DEFAULT_WAIT_PERIOD);
815 DALI_TEST_CHECK(gCallBackCalled);
817 // change alpha to outside condition
818 gCallBackCalled = false;
819 Wait(application, DEFAULT_WAIT_PERIOD);
820 actor.SetProperty(Actor::Property::COLOR, Vector4(0.0f, 0.0f, 0.0f, 1.0f));
821 Wait(application, DEFAULT_WAIT_PERIOD);
822 DALI_TEST_CHECK(gCallBackCalled);
826 int UtcDaliPropertyNotificationSetSizeResultP(void)
828 TestApplication application;
830 tet_infoline(" UtcDaliPropertyNotificationSetSizeResultP");
832 Actor actor = Actor::New();
834 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::SIZE, StepCondition(1.0f, 1.0f));
835 notification.SetNotifyMode(PropertyNotification::NOTIFY_ON_CHANGED);
836 gCallBackCalled = false;
837 notification.NotifySignal().Connect(&TestCallback);
839 actor.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
841 application.Render(RENDER_FRAME_INTERVAL);
842 application.SendNotification();
843 application.Render(RENDER_FRAME_INTERVAL);
844 application.SendNotification();
846 notifyResult = notification.GetNotifyResult();
848 DALI_TEST_EQUALS(notifyResult, true, TEST_LOCATION);
850 gCallBackCalled = false;
852 actor.SetProperty(Actor::Property::SIZE, Vector2(200.0f, 200.0f));
854 application.Render(RENDER_FRAME_INTERVAL);
855 application.SendNotification();
856 application.Render(RENDER_FRAME_INTERVAL);
857 application.SendNotification();
859 notifyResult = notification.GetNotifyResult();
861 DALI_TEST_EQUALS(notifyResult, true, TEST_LOCATION);
866 int UtcDaliPropertyConditionGetArguments(void)
868 TestApplication application;
869 tet_infoline(" UtcDaliPropertyConditionGetArguments");
871 PropertyCondition condition = GreaterThanCondition(50.0f);
873 DALI_TEST_EQUALS(condition.GetArgumentCount(), 1u, TEST_LOCATION);
874 float value = condition.GetArgument(0);
875 DALI_TEST_EQUALS(value, 50.0f, TEST_LOCATION);
877 condition = InsideCondition(125.0f, 250.0f);
879 DALI_TEST_EQUALS(condition.GetArgumentCount(), 2u, TEST_LOCATION);
880 float value1 = condition.GetArgument(0);
881 float value2 = condition.GetArgument(1);
882 DALI_TEST_EQUALS(value1, 125.0f, TEST_LOCATION);
883 DALI_TEST_EQUALS(value2, 250.0f, TEST_LOCATION);
887 int UtcDaliPropertyNotificationStepVector4(void)
889 TestApplication application;
890 tet_infoline(" UtcDaliPropertyNotificationStepVector4");
892 Actor actor = Actor::New();
893 application.GetScene().Add(actor);
895 const float step = 10.0f;
896 float initValue = 5.0f;
898 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::COLOR, StepCondition(step * 2, 0.0f));
899 notification.NotifySignal().Connect(&TestCallback);
901 actor.SetProperty(Actor::Property::COLOR, Vector4(initValue, 0.0f, 0.0f, 0.0f));
902 Wait(application, DEFAULT_WAIT_PERIOD);
904 // test both directions
905 for(int i = 1; i < 10;)
907 // Move x to positive
908 gCallBackCalled = false;
909 actor.SetProperty(Actor::Property::COLOR, Vector4(initValue + (i++ * step), 0.0f, 0.0f, 0.0f));
910 Wait(application, DEFAULT_WAIT_PERIOD);
911 DALI_TEST_CHECK(!gCallBackCalled);
913 actor.SetProperty(Actor::Property::COLOR, Vector4(initValue + (i++ * step), 0.0f, 0.0f, 0.0f));
914 Wait(application, DEFAULT_WAIT_PERIOD);
915 DALI_TEST_CHECK(gCallBackCalled);
919 actor.SetProperty(Actor::Property::COLOR, Vector4(initValue, 0.0f, 0.0f, 0.0f));
920 Wait(application, DEFAULT_WAIT_PERIOD);
922 for(int i = 1; i < 10;)
924 // Move x to negative
925 gCallBackCalled = false;
926 actor.SetProperty(Actor::Property::COLOR, Vector4(initValue - (i++ * step), 0.0f, 0.0f, 0.0f));
927 Wait(application, DEFAULT_WAIT_PERIOD);
928 DALI_TEST_CHECK(!gCallBackCalled);
930 actor.SetProperty(Actor::Property::COLOR, Vector4(initValue - (i++ * step), 0.0f, 0.0f, 0.0f));
931 Wait(application, DEFAULT_WAIT_PERIOD);
932 DALI_TEST_CHECK(gCallBackCalled);
937 int UtcDaliPropertyNotificationStepFloat(void)
939 TestApplication application;
940 tet_infoline(" UtcDaliPropertyNotificationStepFloat");
942 Actor actor = Actor::New();
943 application.GetScene().Add(actor);
945 const float step = 10.0f;
946 float initValue = 5.0f;
949 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION, 0, StepCondition(step * 2, 0.0f));
950 notification.NotifySignal().Connect(&TestCallback);
952 // set initial position
953 actor.SetProperty(Actor::Property::POSITION, Vector3(initValue, 0.0f, 0.0f));
954 Wait(application, DEFAULT_WAIT_PERIOD);
956 // test both directions
957 for(int i = 1; i < 10;)
959 // Move x to positive
960 gCallBackCalled = false;
961 actor.SetProperty(Actor::Property::POSITION, Vector3(initValue + (i++ * step), 0.0f, 0.0f));
962 Wait(application, DEFAULT_WAIT_PERIOD);
963 DALI_TEST_CHECK(!gCallBackCalled);
965 actor.SetProperty(Actor::Property::POSITION, Vector3(initValue + (i++ * step), 0.0f, 0.0f));
966 Wait(application, DEFAULT_WAIT_PERIOD);
967 DALI_TEST_CHECK(gCallBackCalled);
971 actor.SetProperty(Actor::Property::POSITION, Vector3(initValue, 0.0f, 0.0f));
972 Wait(application, DEFAULT_WAIT_PERIOD);
974 for(int i = 1; i < 10;)
976 // Move x to negative
977 gCallBackCalled = false;
978 actor.SetProperty(Actor::Property::POSITION, Vector3(initValue - (i++ * step), 0.0f, 0.0f));
979 Wait(application, DEFAULT_WAIT_PERIOD);
980 DALI_TEST_CHECK(!gCallBackCalled);
982 actor.SetProperty(Actor::Property::POSITION, Vector3(initValue - (i++ * step), 0.0f, 0.0f));
983 Wait(application, DEFAULT_WAIT_PERIOD);
984 DALI_TEST_CHECK(gCallBackCalled);
989 int UtcDaliPropertyNotificationStepVector2(void)
991 TestApplication application;
992 tet_infoline(" UtcDaliPropertyNotificationStepVector2");
994 Actor actor = Actor::New();
995 application.GetScene().Add(actor);
997 const float step = 10.0f;
998 float initValue = 5.0f;
1000 Property::Index propertyIndex = actor.RegisterProperty("testProperty", Vector2::ZERO);
1002 PropertyNotification notification = actor.AddPropertyNotification(propertyIndex, StepCondition(step * 2, 0.0f));
1003 notification.NotifySignal().Connect(&TestCallback);
1005 actor.SetProperty(propertyIndex, Vector2(initValue, 0.0f));
1006 Wait(application, DEFAULT_WAIT_PERIOD);
1008 // test both directions
1009 for(int i = 1; i < 10;)
1011 // Move x to positive
1012 gCallBackCalled = false;
1013 actor.SetProperty(propertyIndex, Vector2(initValue + (i++ * step), 0.0f));
1014 Wait(application, DEFAULT_WAIT_PERIOD);
1015 DALI_TEST_CHECK(!gCallBackCalled);
1017 actor.SetProperty(propertyIndex, Vector2(initValue + (i++ * step), 0.0f));
1018 Wait(application, DEFAULT_WAIT_PERIOD);
1019 DALI_TEST_CHECK(gCallBackCalled);
1023 actor.SetProperty(propertyIndex, Vector2(initValue, 0.0f));
1024 Wait(application, DEFAULT_WAIT_PERIOD);
1026 for(int i = 1; i < 10;)
1028 // Move x to negative
1029 gCallBackCalled = false;
1030 actor.SetProperty(propertyIndex, Vector2(initValue - (i++ * step), 0.0f));
1031 Wait(application, DEFAULT_WAIT_PERIOD);
1032 DALI_TEST_CHECK(!gCallBackCalled);
1034 actor.SetProperty(propertyIndex, Vector2(initValue - (i++ * step), 0.0f));
1035 Wait(application, DEFAULT_WAIT_PERIOD);
1036 DALI_TEST_CHECK(gCallBackCalled);
1041 int UtcDaliPropertyNotificationStepVector3(void)
1043 TestApplication application;
1044 tet_infoline(" UtcDaliPropertyNotificationStepVector3");
1046 Actor actor = Actor::New();
1047 application.GetScene().Add(actor);
1049 const float step = 10.0f;
1050 float initValue = 5.0f;
1053 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION, StepCondition(step * 2, 0.0f));
1054 notification.NotifySignal().Connect(&TestCallback);
1056 // set initial position
1057 actor.SetProperty(Actor::Property::POSITION, Vector3(initValue, 0.0f, 0.0f));
1058 Wait(application, DEFAULT_WAIT_PERIOD);
1060 // test both directions
1061 for(int i = 1; i < 10;)
1063 // Move x to positive position
1064 gCallBackCalled = false;
1065 actor.SetProperty(Actor::Property::POSITION, Vector3(initValue + (i++ * step), 0.0f, 0.0f));
1066 Wait(application, DEFAULT_WAIT_PERIOD);
1067 DALI_TEST_CHECK(!gCallBackCalled);
1069 actor.SetProperty(Actor::Property::POSITION, Vector3(initValue + (i++ * step), 0.0f, 0.0f));
1070 Wait(application, DEFAULT_WAIT_PERIOD);
1071 DALI_TEST_CHECK(gCallBackCalled);
1075 actor.SetProperty(Actor::Property::POSITION, Vector3(initValue, 0.0f, 0.0f));
1076 Wait(application, DEFAULT_WAIT_PERIOD);
1078 for(int i = 1; i < 10;)
1080 // Move x to negative position
1081 gCallBackCalled = false;
1082 actor.SetProperty(Actor::Property::POSITION, Vector3(initValue - (i++ * step), 0.0f, 0.0f));
1083 Wait(application, DEFAULT_WAIT_PERIOD);
1084 DALI_TEST_CHECK(!gCallBackCalled);
1086 actor.SetProperty(Actor::Property::POSITION, Vector3(initValue - (i++ * step), 0.0f, 0.0f));
1087 Wait(application, DEFAULT_WAIT_PERIOD);
1088 DALI_TEST_CHECK(gCallBackCalled);
1093 int UtcDaliPropertyNotificationVariableStep(void)
1095 TestApplication application;
1096 tet_infoline(" UtcDaliPropertyNotificationStep");
1098 Actor actor = Actor::New();
1099 application.GetScene().Add(actor);
1101 Dali::Vector<float> values;
1103 const float averageStep = 100.0f;
1105 for(int i = 1; i < 10; i++)
1107 values.PushBack(i * averageStep + (i % 2 == 0 ? -(averageStep * 0.2f) : (averageStep * 0.2f)));
1110 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION, 0, VariableStepCondition(values));
1111 notification.NotifySignal().Connect(&TestCallback);
1113 // set initial position lower than first position in list
1114 actor.SetProperty(Actor::Property::POSITION, Vector3(values[0] - averageStep, 0.0f, 0.0f));
1115 Wait(application, DEFAULT_WAIT_PERIOD);
1117 for(unsigned int i = 0; i < values.Count() - 1; ++i)
1119 gCallBackCalled = false;
1120 // set position half way between the current values
1121 float position = values[i] + (0.5f * (values[i + 1] - values[i]));
1122 actor.SetProperty(Actor::Property::POSITION, Vector3(position, 0.0f, 0.0f));
1123 Wait(application, DEFAULT_WAIT_PERIOD);
1124 DALI_TEST_CHECK(gCallBackCalled);
1129 static bool gCallBack2Called = false;
1130 void TestCallback2(PropertyNotification& source)
1132 gCallBack2Called = true;
1135 int UtcDaliPropertyNotificationOrder(void)
1137 TestApplication application; // Reset all test adapter return codes
1139 Actor actor = Actor::New();
1140 application.GetScene().Add(actor);
1141 // this should complete in first frame
1142 PropertyNotification notification1 = actor.AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(90.0f));
1143 notification1.NotifySignal().Connect(&TestCallback);
1144 // this should complete in second frame
1145 PropertyNotification notification2 = actor.AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(150.0f));
1146 notification2.NotifySignal().Connect(&TestCallback2);
1147 Animation animation = Animation::New(0.032f); // finishes in 32 ms
1148 animation.AnimateTo(Property(actor, Actor::Property::POSITION), Vector3(200.0f, 0.0f, 0.0f), AlphaFunction::LINEAR);
1152 application.SendNotification();
1154 application.Render(RENDER_FRAME_INTERVAL);
1155 // no notifications yet
1156 DALI_TEST_EQUALS(gCallBackCalled, false, TEST_LOCATION);
1157 DALI_TEST_EQUALS(gCallBack2Called, false, TEST_LOCATION);
1158 gCallBackCalled = false;
1159 gCallBack2Called = false;
1161 // dont serve the notifications but run another update & render
1162 // this simulates situation where there is a notification in event side but it's not been picked up by event thread
1164 application.Render(RENDER_FRAME_INTERVAL);
1165 DALI_TEST_EQUALS(gCallBackCalled, false, TEST_LOCATION);
1166 DALI_TEST_EQUALS(gCallBack2Called, false, TEST_LOCATION);
1168 // serve the notifications
1169 application.SendNotification();
1170 DALI_TEST_EQUALS(gCallBackCalled, true, TEST_LOCATION);
1171 DALI_TEST_EQUALS(gCallBack2Called, true, TEST_LOCATION);
1173 gCallBackCalled = false;
1174 gCallBack2Called = false;
1175 application.Render(RENDER_FRAME_INTERVAL);
1176 application.SendNotification();
1177 DALI_TEST_EQUALS(gCallBackCalled, false, TEST_LOCATION);
1178 DALI_TEST_EQUALS(gCallBack2Called, false, TEST_LOCATION);
1183 int UtcDaliPropertyConditionGetArgumentNegative(void)
1185 TestApplication application;
1186 Dali::PropertyCondition instance;
1190 unsigned long arg1(0u);
1191 instance.GetArgument(arg1);
1192 DALI_TEST_CHECK(false); // Should not get here
1196 DALI_TEST_CHECK(true); // We expect an assert
1201 int UtcDaliPropertyConditionGetArgumentCountNegative(void)
1203 TestApplication application;
1204 Dali::PropertyCondition instance;
1208 instance.GetArgumentCount();
1209 DALI_TEST_CHECK(false); // Should not get here
1213 DALI_TEST_CHECK(true); // We expect an assert