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.
21 #include <dali/public-api/dali-core.h>
22 #include <dali-test-suite-utils.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.
49 class TestClass : public ConnectionTracker
53 TestClass(Integration::Scene scene )
64 mActor = Actor::New();
66 mNotification = mActor.AddPropertyNotification( Actor::Property::POSITION_X, GreaterThanCondition(100.0f) );
67 mNotification.NotifySignal().Connect( this, &TestClass::OnPropertyNotify );
70 void RemovePropertyNotification()
72 mActor.RemovePropertyNotification( mNotification );
75 void RemovePropertyNotifications()
77 mActor.RemovePropertyNotifications();
82 mScene.Remove( mActor );
84 mNotification.Reset();
87 void OnPropertyNotify( PropertyNotification& source )
89 tet_infoline(" OnPropertyNotify");
90 gCallBackCalled = true;
94 PropertyNotification mNotification;
95 Integration::Scene mScene;
100 * Simulate time passed by.
102 * @note this will always process at least 1 frame (1/60 sec)
104 * @param application Test application instance
105 * @param duration Time to pass in milliseconds.
106 * @return The actual time passed in milliseconds
108 int Wait(TestApplication& application, int duration = 0)
112 for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
114 application.SendNotification();
115 application.Render(RENDER_FRAME_INTERVAL);
116 time += RENDER_FRAME_INTERVAL;
122 } // unnamed namespace
125 // Positive test case for a method
126 int UtcDaliPropertyNotificationDownCast(void)
128 TestApplication application;
129 tet_infoline(" UtcDaliPropertyNotificationDownCast");
131 Actor actor = Actor::New();
132 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(100.0f));
133 BaseHandle handle = notification;
134 PropertyNotification notificationHandle;
136 DALI_TEST_CHECK(notification);
137 DALI_TEST_CHECK(handle);
138 DALI_TEST_CHECK(!notificationHandle);
140 notificationHandle = PropertyNotification::DownCast( handle );
141 DALI_TEST_CHECK(notificationHandle);
146 // Negative test case for a method
147 int UtcDaliPropertyNotificationDownCastNegative(void)
149 TestApplication application;
150 tet_infoline(" UtcDaliPropertyNotificationDownCastNegative");
152 // Create something derived from BaseHandle other than a PropertyNotification.
153 Actor somethingElse = Actor::New();
155 Actor actor = Actor::New();
156 actor.AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(100.0f));
157 BaseHandle handle = somethingElse;
158 PropertyNotification notificationHandle;
160 notificationHandle = PropertyNotification::DownCast( handle );
161 DALI_TEST_CHECK(!notificationHandle);
165 int UtcDaliPropertyNotificationMoveConstructor(void)
167 TestApplication application;
169 Actor actor = Actor::New();
171 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(100.0f));
172 DALI_TEST_CHECK( notification );
173 DALI_TEST_EQUALS( 2, notification.GetBaseObject().ReferenceCount(), TEST_LOCATION );
175 PropertyNotification movedNotification = std::move( notification );
176 DALI_TEST_CHECK( movedNotification );
178 // Check that object is moved (not copied, so ref count keeps the same)
179 DALI_TEST_EQUALS( 2, movedNotification.GetBaseObject().ReferenceCount(), TEST_LOCATION );
180 DALI_TEST_CHECK( !notification );
182 PropertyCondition condition = movedNotification.GetCondition();
183 DALI_TEST_CHECK( condition );
184 DALI_TEST_EQUALS( 2, condition.GetBaseObject().ReferenceCount(), TEST_LOCATION );
185 DALI_TEST_EQUALS( 1, condition.GetArgumentCount(), TEST_LOCATION );
187 PropertyCondition movedCondition = std::move( condition );
188 DALI_TEST_CHECK( movedCondition );
190 // Check that object is moved (not copied, so ref count keeps the same)
191 DALI_TEST_EQUALS( 2, movedCondition.GetBaseObject().ReferenceCount(), TEST_LOCATION );
192 DALI_TEST_EQUALS( 1, movedCondition.GetArgumentCount(), TEST_LOCATION );
193 DALI_TEST_CHECK( !condition );
198 int UtcDaliPropertyNotificationMoveAssignment(void)
200 TestApplication application;
202 Actor actor = Actor::New();
204 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(100.0f));
205 DALI_TEST_CHECK( notification );
206 DALI_TEST_EQUALS( 2, notification.GetBaseObject().ReferenceCount(), TEST_LOCATION );
208 PropertyNotification movedNotification;
209 movedNotification = std::move( notification );
210 DALI_TEST_CHECK( movedNotification );
212 // Check that object is moved (not copied, so ref count keeps the same)
213 DALI_TEST_EQUALS( 2, movedNotification.GetBaseObject().ReferenceCount(), TEST_LOCATION );
214 DALI_TEST_CHECK( !notification );
216 PropertyCondition condition = movedNotification.GetCondition();
217 DALI_TEST_CHECK( condition );
218 DALI_TEST_EQUALS( 2, condition.GetBaseObject().ReferenceCount(), TEST_LOCATION );
219 DALI_TEST_EQUALS( 1, condition.GetArgumentCount(), TEST_LOCATION );
221 PropertyCondition movedCondition;
222 movedCondition = std::move( condition );
223 DALI_TEST_CHECK( movedCondition );
225 // Check that object is moved (not copied, so ref count keeps the same)
226 DALI_TEST_EQUALS( 2, movedCondition.GetBaseObject().ReferenceCount(), TEST_LOCATION );
227 DALI_TEST_EQUALS( 1, movedCondition.GetArgumentCount(), TEST_LOCATION );
228 DALI_TEST_CHECK( !condition );
233 int UtcDaliAddPropertyNotification(void)
235 TestApplication application; // Reset all test adapter return codes
236 tet_infoline(" UtcDaliAddPropertyNotification");
238 Actor actor = Actor::New();
240 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(100.0f));
241 PropertyNotification notification2 = actor.AddPropertyNotification(Actor::Property::SIZE, StepCondition( 1.0f, 1.0f ));
242 DALI_TEST_CHECK( notification );
243 DALI_TEST_CHECK( notification2 );
247 int UtcDaliAddPropertyNotificationCallback(void)
249 TestApplication application; // Reset all test adapter return codes
251 TestClass* object = new TestClass(application.GetScene());
253 object->Initialize();
254 application.Render(RENDER_FRAME_INTERVAL);
255 application.SendNotification();
257 gCallBackCalled = false;
259 tet_infoline(" UtcDaliAddPropertyNotificationCallback - Forcing notification condition true, should receive a notification");
260 object->mActor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
261 application.Render(RENDER_FRAME_INTERVAL);
262 application.SendNotification();
263 application.Render(RENDER_FRAME_INTERVAL);
264 application.SendNotification();
265 DALI_TEST_CHECK( gCallBackCalled );
266 gCallBackCalled = false;
268 tet_infoline(" UtcDaliAddPropertyNotificationCallback - Forcing notification condition false, should not receive a notification");
269 object->mActor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
270 application.Render(RENDER_FRAME_INTERVAL);
271 application.SendNotification();
272 application.Render(RENDER_FRAME_INTERVAL);
273 application.SendNotification();
274 DALI_TEST_CHECK( !gCallBackCalled );
275 gCallBackCalled = false;
277 tet_infoline(" UtcDaliAddPropertyNotificationCallback - Deleting notification and it's owning object, should not receive a notification");
278 object->mActor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
279 application.Render(RENDER_FRAME_INTERVAL);
280 application.SendNotification();
282 application.Render(RENDER_FRAME_INTERVAL);
283 application.SendNotification();
284 DALI_TEST_CHECK( !gCallBackCalled );
286 tet_infoline(" UtcDaliAddPropertyNotificationCallback - Removing notification and it's owning object, should not receive a notification");
287 object->Initialize();
288 application.Render(RENDER_FRAME_INTERVAL);
289 application.SendNotification();
290 gCallBackCalled = false;
292 object->RemovePropertyNotification();
294 object->mActor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
295 application.Render(RENDER_FRAME_INTERVAL);
296 application.SendNotification();
297 application.Render(RENDER_FRAME_INTERVAL);
298 application.SendNotification();
299 DALI_TEST_CHECK( !gCallBackCalled );
301 tet_infoline(" UtcDaliAddPropertyNotificationCallback - Removing all notifications and it's owning object, should not receive a notification");
302 object->Initialize();
303 application.Render(RENDER_FRAME_INTERVAL);
304 application.SendNotification();
305 gCallBackCalled = false;
307 object->RemovePropertyNotifications();
309 object->mActor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
310 application.Render(RENDER_FRAME_INTERVAL);
311 application.SendNotification();
312 application.Render(RENDER_FRAME_INTERVAL);
313 application.SendNotification();
314 DALI_TEST_CHECK( !gCallBackCalled );
321 int UtcDaliAddPropertyNotificationTypeProperty(void)
323 TestApplication application;
325 Actor actor = Actor::New();
327 // Currently, Type registry properties cannot be animated
330 actor.AddPropertyNotification( PROPERTY_REGISTRATION_START_INDEX, GreaterThanCondition( 100.0f ) );
332 catch ( DaliException& e )
334 DALI_TEST_ASSERT( e, "Property notification added to event side only property", TEST_LOCATION );
339 int UtcDaliAddPropertyNotificationEventSidePropertyN(void)
341 TestApplication application;
343 Actor actor = Actor::New();
345 // Currently, Type registry properties cannot be animated
348 actor.AddPropertyNotification( PROPERTY_REGISTRATION_MAX_INDEX - 1, GreaterThanCondition( 100.0f ) );
350 catch ( DaliException& e )
352 DALI_TEST_ASSERT( e, "Property notification added to event side only property", TEST_LOCATION );
357 int UtcDaliAddPropertyNotificationSize(void)
359 TestApplication application;
360 tet_infoline(" UtcDaliAddPropertyNotificationSize");
362 Actor actor = Actor::New();
364 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::SIZE, StepCondition( 1.0f, 1.0f ));
365 DALI_TEST_CHECK( notification );
369 int UtcDaliPropertyNotificationGetCondition(void)
371 TestApplication application;
372 tet_infoline(" UtcDaliPropertyNotificationGetCondition");
374 Actor actor = Actor::New();
376 PropertyCondition condition = GreaterThanCondition(100.0f);
377 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, condition);
378 DALI_TEST_CHECK( condition == notification.GetCondition() );
382 class PropertyNotificationConstWrapper
386 PropertyNotificationConstWrapper(PropertyNotification propertyNotification)
387 :mPropertyNotification(propertyNotification)
393 * Returns const reference to property notification.
394 * @return const reference.
396 const PropertyCondition& GetCondition() const
398 return mPropertyNotification.GetCondition();
401 PropertyNotification mPropertyNotification;
404 int UtcDaliPropertyNotificationGetConditionConst(void)
406 TestApplication application;
407 tet_infoline(" UtcDaliPropertyNotificationGetConditionConst");
409 Actor actor = Actor::New();
411 PropertyCondition condition = GreaterThanCondition(100.0f);
412 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, condition);
413 PropertyNotificationConstWrapper notificationConst(notification);
414 const PropertyCondition& conditionReference1 = notificationConst.GetCondition();
415 const PropertyCondition& conditionReference2 = notificationConst.GetCondition();
417 DALI_TEST_CHECK( (&conditionReference1) == (&conditionReference2) );
418 DALI_TEST_CHECK( conditionReference1 == condition );
422 int UtcDaliPropertyNotificationGetTarget(void)
424 TestApplication application;
425 tet_infoline(" UtcDaliPropertyNotificationGetTarget");
427 Actor actor = Actor::New();
428 Actor actor2 = Actor::New();
430 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X,
431 GreaterThanCondition(100.0f));
432 Actor targetActor = Actor::DownCast( notification.GetTarget() );
434 DALI_TEST_CHECK( targetActor == actor );
438 int UtcDaliPropertyNotificationGetProperty(void)
440 TestApplication application;
441 tet_infoline(" UtcDaliPropertyNotificationGetProperty");
443 Actor actor = Actor::New();
445 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X,
446 GreaterThanCondition(100.0f));
447 Property::Index targetProperty = notification.GetTargetProperty();
449 DALI_TEST_EQUALS( targetProperty, (Property::Index)Actor::Property::POSITION_X, TEST_LOCATION );
453 int UtcDaliPropertyNotificationGetNotifyMode(void)
455 TestApplication application;
456 tet_infoline(" UtcDaliPropertyNotificationGetNotifyMode");
458 Actor actor = Actor::New();
460 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X,
461 GreaterThanCondition(100.0f));
462 notification.SetNotifyMode(PropertyNotification::NOTIFY_ON_CHANGED);
463 PropertyNotification::NotifyMode notifyMode = notification.GetNotifyMode();
465 DALI_TEST_EQUALS( notifyMode, PropertyNotification::NOTIFY_ON_CHANGED, TEST_LOCATION );
469 int UtcDaliPropertyNotificationGetNotifyResultP(void)
471 TestApplication application;
472 tet_infoline(" UtcDaliPropertyNotificationGetNotifyMode");
474 Actor actor = Actor::New();
476 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X,
477 GreaterThanCondition(100.0f));
478 notification.SetNotifyMode(PropertyNotification::NOTIFY_ON_CHANGED);
479 gCallBackCalled = false;
480 notification.NotifySignal().Connect( &TestCallback );
482 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
484 application.Render(RENDER_FRAME_INTERVAL);
485 application.SendNotification();
486 application.Render(RENDER_FRAME_INTERVAL);
487 application.SendNotification();
489 bool notifyResult = notification.GetNotifyResult();
491 DALI_TEST_EQUALS( notifyResult, false, TEST_LOCATION );
496 int UtcDaliPropertyNotificationGreaterThan(void)
498 TestApplication application;
499 tet_infoline(" UtcDaliPropertyNotificationGreaterThan");
501 Actor actor = Actor::New();
502 application.GetScene().Add(actor);
504 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION_X, GreaterThanCondition(100.0f) );
505 notification.NotifySignal().Connect( &TestCallback );
507 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
508 Wait(application, DEFAULT_WAIT_PERIOD);
510 // Move right to satisfy condition
511 gCallBackCalled = false;
512 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
513 Wait(application, DEFAULT_WAIT_PERIOD);
514 DALI_TEST_CHECK( gCallBackCalled );
516 // Move left to un-satisfy condition
517 gCallBackCalled = false;
518 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
519 Wait(application, DEFAULT_WAIT_PERIOD);
520 DALI_TEST_CHECK( !gCallBackCalled );
522 // Move right to satisfy condition again.
523 gCallBackCalled = false;
524 Wait(application, DEFAULT_WAIT_PERIOD);
525 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
526 Wait(application, DEFAULT_WAIT_PERIOD);
527 DALI_TEST_CHECK( gCallBackCalled );
531 int UtcDaliPropertyNotificationLessThan(void)
533 TestApplication application;
534 tet_infoline(" UtcDaliPropertyNotificationLessThan");
536 Actor actor = Actor::New();
537 application.GetScene().Add(actor);
539 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION_X, LessThanCondition(100.0f ) );
540 notification.NotifySignal().Connect( &TestCallback );
542 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
543 Wait(application, DEFAULT_WAIT_PERIOD);
545 // Move left to satisfy condition
546 gCallBackCalled = false;
547 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
548 Wait(application, DEFAULT_WAIT_PERIOD);
549 DALI_TEST_CHECK( gCallBackCalled );
551 // Move right to un-satisfy condition
552 gCallBackCalled = false;
553 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
554 Wait(application, DEFAULT_WAIT_PERIOD);
555 DALI_TEST_CHECK( !gCallBackCalled );
557 // Move left to satisfy condition again.
558 gCallBackCalled = false;
559 Wait(application, DEFAULT_WAIT_PERIOD);
560 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
561 Wait(application, DEFAULT_WAIT_PERIOD);
562 DALI_TEST_CHECK( gCallBackCalled );
566 int UtcDaliPropertyNotificationInside(void)
568 TestApplication application;
569 tet_infoline(" UtcDaliPropertyNotificationInside");
571 Actor actor = Actor::New();
572 application.GetScene().Add(actor);
574 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION_X, InsideCondition(100.0f, 200.0f) );
575 notification.NotifySignal().Connect( &TestCallback );
577 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
578 Wait(application, DEFAULT_WAIT_PERIOD);
580 // Move inside to satisfy condition
581 gCallBackCalled = false;
582 actor.SetProperty( Actor::Property::POSITION, Vector3(150.0f, 0.0f, 0.0f));
583 Wait(application, DEFAULT_WAIT_PERIOD);
584 DALI_TEST_CHECK( gCallBackCalled );
586 // Move outside (right) to un-satisfy condition
587 gCallBackCalled = false;
588 actor.SetProperty( Actor::Property::POSITION, Vector3(300.0f, 0.0f, 0.0f));
589 Wait(application, DEFAULT_WAIT_PERIOD);
590 DALI_TEST_CHECK( !gCallBackCalled );
592 // Move inside to satisfy condition again.
593 gCallBackCalled = false;
594 Wait(application, DEFAULT_WAIT_PERIOD);
595 actor.SetProperty( Actor::Property::POSITION, Vector3(150.0f, 0.0f, 0.0f));
596 Wait(application, DEFAULT_WAIT_PERIOD);
597 DALI_TEST_CHECK( gCallBackCalled );
601 int UtcDaliPropertyNotificationOutside(void)
603 TestApplication application;
604 tet_infoline(" UtcDaliPropertyNotificationOutside");
606 Actor actor = Actor::New();
607 application.GetScene().Add(actor);
609 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION_X, OutsideCondition(100.0f, 200.0f) );
610 notification.NotifySignal().Connect( &TestCallback );
612 actor.SetProperty( Actor::Property::POSITION, Vector3(150.0f, 0.0f, 0.0f));
613 Wait(application, DEFAULT_WAIT_PERIOD);
615 // Move outside (left) to satisfy condition
616 gCallBackCalled = false;
617 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
618 Wait(application, DEFAULT_WAIT_PERIOD);
619 DALI_TEST_CHECK( gCallBackCalled );
621 // Move inside to un-satisfy condition
622 gCallBackCalled = false;
623 actor.SetProperty( Actor::Property::POSITION, Vector3(150.0f, 0.0f, 0.0f));
624 Wait(application, DEFAULT_WAIT_PERIOD);
625 DALI_TEST_CHECK( !gCallBackCalled );
627 // Move outside (right) to satisfy condition again.
628 gCallBackCalled = false;
629 Wait(application, DEFAULT_WAIT_PERIOD);
630 actor.SetProperty( Actor::Property::POSITION, Vector3(300.0f, 0.0f, 0.0f));
631 Wait(application, DEFAULT_WAIT_PERIOD);
632 DALI_TEST_CHECK( gCallBackCalled );
636 int UtcDaliPropertyNotificationVectorComponentGreaterThan(void)
638 TestApplication application;
639 tet_infoline(" UtcDaliPropertyNotificationGreaterThan");
641 Actor actor = Actor::New();
642 application.GetScene().Add(actor);
644 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION, 0, GreaterThanCondition(100.0f) );
645 notification.NotifySignal().Connect( &TestCallback );
646 notification = actor.AddPropertyNotification( Actor::Property::POSITION, 1, GreaterThanCondition(100.0f) );
647 notification.NotifySignal().Connect( &TestCallback );
648 notification = actor.AddPropertyNotification( Actor::Property::POSITION, 2, GreaterThanCondition(100.0f) );
649 notification.NotifySignal().Connect( &TestCallback );
650 notification = actor.AddPropertyNotification( Actor::Property::COLOR, 3, GreaterThanCondition(0.5f) );
651 notification.NotifySignal().Connect( &TestCallback );
653 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
654 actor.SetProperty( Actor::Property::COLOR,Vector4(0.0f, 0.0f, 0.0f, 0.0f));
655 Wait(application, DEFAULT_WAIT_PERIOD);
657 // Move right to satisfy XAxis condition
658 gCallBackCalled = false;
659 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
660 Wait(application, DEFAULT_WAIT_PERIOD);
661 DALI_TEST_CHECK( gCallBackCalled );
663 // Move down to satisfy YAxis condition
664 gCallBackCalled = false;
665 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 200.0f, 0.0f));
666 Wait(application, DEFAULT_WAIT_PERIOD);
667 DALI_TEST_CHECK( gCallBackCalled );
669 // Move forward to satisfy ZAxis
670 gCallBackCalled = false;
671 Wait(application, DEFAULT_WAIT_PERIOD);
672 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 200.0f, 200.0f));
673 Wait(application, DEFAULT_WAIT_PERIOD);
674 DALI_TEST_CHECK( gCallBackCalled );
676 // Change alpha Colour to satisfy w/alpha component condition
677 gCallBackCalled = false;
678 Wait(application, DEFAULT_WAIT_PERIOD);
679 actor.SetProperty( Actor::Property::COLOR,Vector4(0.0f, 0.0f, 0.0f, 1.0f));
680 Wait(application, DEFAULT_WAIT_PERIOD);
681 DALI_TEST_CHECK( gCallBackCalled );
685 int UtcDaliPropertyNotificationVectorComponentLessThan(void)
687 TestApplication application;
688 tet_infoline(" UtcDaliPropertyNotificationLessThan");
690 Actor actor = Actor::New();
691 application.GetScene().Add(actor);
693 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION, 0, LessThanCondition(-100.0f) );
694 notification.NotifySignal().Connect( &TestCallback );
695 notification = actor.AddPropertyNotification( Actor::Property::POSITION, 1, LessThanCondition(-100.0f) );
696 notification.NotifySignal().Connect( &TestCallback );
697 notification = actor.AddPropertyNotification( Actor::Property::POSITION, 2, LessThanCondition(-100.0f) );
698 notification.NotifySignal().Connect( &TestCallback );
699 notification = actor.AddPropertyNotification( Actor::Property::COLOR, 3, LessThanCondition(0.5f) );
700 notification.NotifySignal().Connect( &TestCallback );
702 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
703 actor.SetProperty( Actor::Property::COLOR,Vector4(0.0f, 0.0f, 0.0f, 1.0f));
704 Wait(application, DEFAULT_WAIT_PERIOD);
706 // Move left to satisfy XAxis condition
707 gCallBackCalled = false;
708 actor.SetProperty( Actor::Property::POSITION, Vector3(-200.0f, 0.0f, 0.0f));
709 Wait(application, DEFAULT_WAIT_PERIOD);
710 DALI_TEST_CHECK( gCallBackCalled );
712 // Move up to satisfy YAxis condition
713 gCallBackCalled = false;
714 actor.SetProperty( Actor::Property::POSITION, Vector3(-200.0f, -200.0f, 0.0f));
715 Wait(application, DEFAULT_WAIT_PERIOD);
716 DALI_TEST_CHECK( gCallBackCalled );
718 // Move back to satisfy ZAxis
719 gCallBackCalled = false;
720 Wait(application, DEFAULT_WAIT_PERIOD);
721 actor.SetProperty( Actor::Property::POSITION, Vector3(-200.0f, -200.0f, -200.0f));
722 Wait(application, DEFAULT_WAIT_PERIOD);
723 DALI_TEST_CHECK( gCallBackCalled );
725 // Change alpha Colour to satisfy w/alpha component condition
726 gCallBackCalled = false;
727 Wait(application, DEFAULT_WAIT_PERIOD);
728 actor.SetProperty( Actor::Property::COLOR,Vector4(0.0f, 0.0f, 0.0f, 0.0f));
729 Wait(application, DEFAULT_WAIT_PERIOD);
730 DALI_TEST_CHECK( gCallBackCalled );
734 int UtcDaliPropertyNotificationVectorComponentInside(void)
736 TestApplication application;
737 tet_infoline(" UtcDaliPropertyNotificationInside");
739 Actor actor = Actor::New();
740 application.GetScene().Add(actor);
742 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION, 0, InsideCondition(-100.0f, 100.0f) );
743 notification.NotifySignal().Connect( &TestCallback );
744 notification = actor.AddPropertyNotification( Actor::Property::POSITION, 1, InsideCondition(-100.0f, 100.0f) );
745 notification.NotifySignal().Connect( &TestCallback );
746 notification = actor.AddPropertyNotification( Actor::Property::POSITION, 2, InsideCondition(-100.0f, 100.0f) );
747 notification.NotifySignal().Connect( &TestCallback );
748 notification = actor.AddPropertyNotification( Actor::Property::COLOR, 3, InsideCondition(0.25f, 0.75f) );
749 notification.NotifySignal().Connect( &TestCallback );
751 // set outside all conditions
752 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 200.0f, 200.0f));
753 actor.SetProperty( Actor::Property::COLOR,Vector4(0.0f, 0.0f, 0.0f, 1.0f));
754 Wait(application, DEFAULT_WAIT_PERIOD);
756 // Move x to inside condition
757 gCallBackCalled = false;
758 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 200.0f, 200.0f));
759 Wait(application, DEFAULT_WAIT_PERIOD);
760 DALI_TEST_CHECK( gCallBackCalled );
762 // Move y to inside condition
763 gCallBackCalled = false;
764 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 200.0f));
765 Wait(application, DEFAULT_WAIT_PERIOD);
766 DALI_TEST_CHECK( gCallBackCalled );
768 // Move z to inside condition
769 gCallBackCalled = false;
770 Wait(application, DEFAULT_WAIT_PERIOD);
771 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
772 Wait(application, DEFAULT_WAIT_PERIOD);
773 DALI_TEST_CHECK( gCallBackCalled );
775 // change alpha to inside condition
776 gCallBackCalled = false;
777 Wait(application, DEFAULT_WAIT_PERIOD);
778 actor.SetProperty( Actor::Property::COLOR,Vector4(0.0f, 0.0f, 0.0f, 0.5f));
779 Wait(application, DEFAULT_WAIT_PERIOD);
780 DALI_TEST_CHECK( gCallBackCalled );
784 int UtcDaliPropertyNotificationVectorComponentOutside(void)
786 TestApplication application;
787 tet_infoline(" UtcDaliPropertyNotificationOutside");
789 Actor actor = Actor::New();
790 application.GetScene().Add(actor);
792 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION, 0, OutsideCondition(-100.0f, 100.0f) );
793 notification.NotifySignal().Connect( &TestCallback );
794 notification = actor.AddPropertyNotification( Actor::Property::POSITION, 1, OutsideCondition(-100.0f, 100.0f) );
795 notification.NotifySignal().Connect( &TestCallback );
796 notification = actor.AddPropertyNotification( Actor::Property::POSITION, 2, OutsideCondition(-100.0f, 100.0f) );
797 notification.NotifySignal().Connect( &TestCallback );
798 notification = actor.AddPropertyNotification( Actor::Property::COLOR, 3, OutsideCondition(0.25f, 0.75f) );
799 notification.NotifySignal().Connect( &TestCallback );
801 // set inside all conditions
802 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
803 actor.SetProperty( Actor::Property::COLOR,Vector4(0.0f, 0.0f, 0.0f, 0.5f));
804 Wait(application, DEFAULT_WAIT_PERIOD);
806 // Move x to outside condition
807 gCallBackCalled = false;
808 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
809 Wait(application, DEFAULT_WAIT_PERIOD);
810 DALI_TEST_CHECK( gCallBackCalled );
812 // Move y to outside condition
813 gCallBackCalled = false;
814 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 200.0f, 0.0f));
815 Wait(application, DEFAULT_WAIT_PERIOD);
816 DALI_TEST_CHECK( gCallBackCalled );
818 // Move z to outside condition
819 gCallBackCalled = false;
820 Wait(application, DEFAULT_WAIT_PERIOD);
821 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 200.0f, 200.0f));
822 Wait(application, DEFAULT_WAIT_PERIOD);
823 DALI_TEST_CHECK( gCallBackCalled );
825 // change alpha to outside condition
826 gCallBackCalled = false;
827 Wait(application, DEFAULT_WAIT_PERIOD);
828 actor.SetProperty( Actor::Property::COLOR,Vector4(0.0f, 0.0f, 0.0f, 1.0f));
829 Wait(application, DEFAULT_WAIT_PERIOD);
830 DALI_TEST_CHECK( gCallBackCalled );
834 int UtcDaliPropertyNotificationSetSizeResultP(void)
836 TestApplication application;
838 tet_infoline(" UtcDaliPropertyNotificationSetSizeResultP");
840 Actor actor = Actor::New();
842 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::SIZE, StepCondition( 1.0f, 1.0f ) );
843 notification.SetNotifyMode(PropertyNotification::NOTIFY_ON_CHANGED);
844 gCallBackCalled = false;
845 notification.NotifySignal().Connect( &TestCallback );
847 actor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f) );
849 application.Render(RENDER_FRAME_INTERVAL);
850 application.SendNotification();
851 application.Render(RENDER_FRAME_INTERVAL);
852 application.SendNotification();
854 notifyResult = notification.GetNotifyResult();
856 DALI_TEST_EQUALS( notifyResult, true, TEST_LOCATION );
858 gCallBackCalled = false;
860 actor.SetProperty( Actor::Property::SIZE, Vector2( 200.0f, 200.0f ) );
862 application.Render(RENDER_FRAME_INTERVAL);
863 application.SendNotification();
864 application.Render(RENDER_FRAME_INTERVAL);
865 application.SendNotification();
867 notifyResult = notification.GetNotifyResult();
869 DALI_TEST_EQUALS( notifyResult, true, TEST_LOCATION );
874 int UtcDaliPropertyConditionGetArguments(void)
876 TestApplication application;
877 tet_infoline(" UtcDaliPropertyConditionGetArguments");
879 PropertyCondition condition = GreaterThanCondition( 50.0f );
881 DALI_TEST_EQUALS( condition.GetArgumentCount(), 1u, TEST_LOCATION );
882 float value = condition.GetArgument( 0 );
883 DALI_TEST_EQUALS( value, 50.0f, TEST_LOCATION );
885 condition = InsideCondition( 125.0f, 250.0f );
887 DALI_TEST_EQUALS( condition.GetArgumentCount(), 2u, TEST_LOCATION );
888 float value1 = condition.GetArgument( 0 );
889 float value2 = condition.GetArgument( 1 );
890 DALI_TEST_EQUALS( value1, 125.0f, TEST_LOCATION );
891 DALI_TEST_EQUALS( value2, 250.0f, TEST_LOCATION );
895 int UtcDaliPropertyNotificationStepVector4(void)
897 TestApplication application;
898 tet_infoline(" UtcDaliPropertyNotificationStepVector4");
900 Actor actor = Actor::New();
901 application.GetScene().Add(actor);
903 const float step = 10.0f;
904 float initValue = 5.0f;
906 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::COLOR, StepCondition(step * 2, 0.0f) );
907 notification.NotifySignal().Connect( &TestCallback );
909 actor.SetProperty( Actor::Property::COLOR, Vector4(initValue, 0.0f, 0.0f, 0.0f));
910 Wait(application, DEFAULT_WAIT_PERIOD);
912 // test both directions
913 for( int i = 1 ; i < 10 ; )
915 // Move x to positive
916 gCallBackCalled = false;
917 actor.SetProperty( Actor::Property::COLOR, Vector4(initValue + (i++ * step), 0.0f, 0.0f, 0.0f));
918 Wait(application, DEFAULT_WAIT_PERIOD);
919 DALI_TEST_CHECK( !gCallBackCalled );
921 actor.SetProperty( Actor::Property::COLOR, Vector4(initValue + (i++ * step), 0.0f, 0.0f, 0.0f));
922 Wait(application, DEFAULT_WAIT_PERIOD);
923 DALI_TEST_CHECK( gCallBackCalled );
927 actor.SetProperty( Actor::Property::COLOR, Vector4(initValue, 0.0f, 0.0f, 0.0f));
928 Wait(application, DEFAULT_WAIT_PERIOD);
930 for( int i = 1 ; i < 10 ; )
932 // Move x to negative
933 gCallBackCalled = false;
934 actor.SetProperty( Actor::Property::COLOR, Vector4(initValue -(i++ * step), 0.0f, 0.0f, 0.0f));
935 Wait(application, DEFAULT_WAIT_PERIOD);
936 DALI_TEST_CHECK( !gCallBackCalled );
938 actor.SetProperty( Actor::Property::COLOR, Vector4(initValue -(i++ * step), 0.0f, 0.0f, 0.0f));
939 Wait(application, DEFAULT_WAIT_PERIOD);
940 DALI_TEST_CHECK( gCallBackCalled );
945 int UtcDaliPropertyNotificationStepFloat(void)
947 TestApplication application;
948 tet_infoline(" UtcDaliPropertyNotificationStepFloat");
950 Actor actor = Actor::New();
951 application.GetScene().Add(actor);
953 const float step = 10.0f;
954 float initValue = 5.0f;
957 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION, 0, StepCondition(step * 2, 0.0f) );
958 notification.NotifySignal().Connect( &TestCallback );
960 // set initial position
961 actor.SetProperty( Actor::Property::POSITION, Vector3(initValue, 0.0f, 0.0f));
962 Wait(application, DEFAULT_WAIT_PERIOD);
964 // test both directions
965 for( int i = 1 ; i < 10 ; )
967 // Move x to positive
968 gCallBackCalled = false;
969 actor.SetProperty( Actor::Property::POSITION, Vector3(initValue + (i++ * step), 0.0f, 0.0f));
970 Wait(application, DEFAULT_WAIT_PERIOD);
971 DALI_TEST_CHECK( !gCallBackCalled );
973 actor.SetProperty( Actor::Property::POSITION, Vector3(initValue + (i++ * step), 0.0f, 0.0f));
974 Wait(application, DEFAULT_WAIT_PERIOD);
975 DALI_TEST_CHECK( gCallBackCalled );
979 actor.SetProperty( Actor::Property::POSITION, Vector3(initValue, 0.0f, 0.0f));
980 Wait(application, DEFAULT_WAIT_PERIOD);
982 for( int i = 1 ; i < 10 ; )
984 // Move x to negative
985 gCallBackCalled = false;
986 actor.SetProperty( Actor::Property::POSITION, Vector3(initValue -(i++ * step), 0.0f, 0.0f));
987 Wait(application, DEFAULT_WAIT_PERIOD);
988 DALI_TEST_CHECK( !gCallBackCalled );
990 actor.SetProperty( Actor::Property::POSITION, Vector3(initValue -(i++ * step), 0.0f, 0.0f));
991 Wait(application, DEFAULT_WAIT_PERIOD);
992 DALI_TEST_CHECK( gCallBackCalled );
997 int UtcDaliPropertyNotificationStepVector2(void)
999 TestApplication application;
1000 tet_infoline(" UtcDaliPropertyNotificationStepVector2");
1002 Actor actor = Actor::New();
1003 application.GetScene().Add(actor);
1005 const float step = 10.0f;
1006 float initValue = 5.0f;
1008 Property::Index propertyIndex = actor.RegisterProperty( "testProperty", Vector2::ZERO );
1010 PropertyNotification notification = actor.AddPropertyNotification( propertyIndex, StepCondition(step * 2, 0.0f) );
1011 notification.NotifySignal().Connect( &TestCallback );
1013 actor.SetProperty( propertyIndex, Vector2(initValue, 0.0f));
1014 Wait(application, DEFAULT_WAIT_PERIOD);
1016 // test both directions
1017 for( int i = 1 ; i < 10 ; )
1019 // Move x to positive
1020 gCallBackCalled = false;
1021 actor.SetProperty( propertyIndex, Vector2(initValue + (i++ * step), 0.0f));
1022 Wait(application, DEFAULT_WAIT_PERIOD);
1023 DALI_TEST_CHECK( !gCallBackCalled );
1025 actor.SetProperty( propertyIndex, Vector2(initValue + (i++ * step), 0.0f));
1026 Wait(application, DEFAULT_WAIT_PERIOD);
1027 DALI_TEST_CHECK( gCallBackCalled );
1031 actor.SetProperty( propertyIndex, Vector2(initValue, 0.0f));
1032 Wait(application, DEFAULT_WAIT_PERIOD);
1034 for( int i = 1 ; i < 10 ; )
1036 // Move x to negative
1037 gCallBackCalled = false;
1038 actor.SetProperty( propertyIndex, Vector2(initValue -(i++ * step), 0.0f));
1039 Wait(application, DEFAULT_WAIT_PERIOD);
1040 DALI_TEST_CHECK( !gCallBackCalled );
1042 actor.SetProperty( propertyIndex, Vector2(initValue -(i++ * step), 0.0f));
1043 Wait(application, DEFAULT_WAIT_PERIOD);
1044 DALI_TEST_CHECK( gCallBackCalled );
1049 int UtcDaliPropertyNotificationStepVector3(void)
1051 TestApplication application;
1052 tet_infoline(" UtcDaliPropertyNotificationStepVector3");
1054 Actor actor = Actor::New();
1055 application.GetScene().Add(actor);
1057 const float step = 10.0f;
1058 float initValue = 5.0f;
1061 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION, StepCondition(step * 2, 0.0f) );
1062 notification.NotifySignal().Connect( &TestCallback );
1064 // set initial position
1065 actor.SetProperty( Actor::Property::POSITION, Vector3(initValue, 0.0f, 0.0f));
1066 Wait(application, DEFAULT_WAIT_PERIOD);
1068 // test both directions
1069 for( int i = 1 ; i < 10 ; )
1071 // Move x to positive position
1072 gCallBackCalled = false;
1073 actor.SetProperty( Actor::Property::POSITION, Vector3( initValue + (i++ * step), 0.0f, 0.0f) );
1074 Wait(application, DEFAULT_WAIT_PERIOD);
1075 DALI_TEST_CHECK( !gCallBackCalled );
1077 actor.SetProperty( Actor::Property::POSITION, Vector3( initValue + (i++ * step), 0.0f, 0.0f) );
1078 Wait(application, DEFAULT_WAIT_PERIOD);
1079 DALI_TEST_CHECK( gCallBackCalled );
1083 actor.SetProperty( Actor::Property::POSITION, Vector3( initValue, 0.0f, 0.0f) );
1084 Wait(application, DEFAULT_WAIT_PERIOD);
1086 for( int i = 1 ; i < 10 ; )
1088 // Move x to negative position
1089 gCallBackCalled = false;
1090 actor.SetProperty( Actor::Property::POSITION, Vector3( initValue -(i++ * step), 0.0f, 0.0f) );
1091 Wait(application, DEFAULT_WAIT_PERIOD);
1092 DALI_TEST_CHECK( !gCallBackCalled );
1094 actor.SetProperty( Actor::Property::POSITION, Vector3( initValue -(i++ * step), 0.0f, 0.0f) );
1095 Wait(application, DEFAULT_WAIT_PERIOD);
1096 DALI_TEST_CHECK( gCallBackCalled );
1101 int UtcDaliPropertyNotificationVariableStep(void)
1103 TestApplication application;
1104 tet_infoline(" UtcDaliPropertyNotificationStep");
1106 Actor actor = Actor::New();
1107 application.GetScene().Add(actor);
1109 Dali::Vector<float> values;
1111 const float averageStep = 100.0f;
1113 for( int i = 1 ; i < 10 ; i++ )
1115 values.PushBack(i * averageStep + (i % 2 == 0 ? -(averageStep * 0.2f) : (averageStep * 0.2f)));
1118 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION, 0, VariableStepCondition(values) );
1119 notification.NotifySignal().Connect( &TestCallback );
1121 // set initial position lower than first position in list
1122 actor.SetProperty( Actor::Property::POSITION, Vector3(values[0] - averageStep, 0.0f, 0.0f));
1123 Wait(application, DEFAULT_WAIT_PERIOD);
1125 for( unsigned int i = 0 ; i < values.Count() - 1 ; ++i )
1127 gCallBackCalled = false;
1128 // set position half way between the current values
1129 float position = values[i] + (0.5f * (values[i + 1] - values[i]));
1130 actor.SetProperty( Actor::Property::POSITION, Vector3(position, 0.0f, 0.0f));
1131 Wait(application, DEFAULT_WAIT_PERIOD);
1132 DALI_TEST_CHECK( gCallBackCalled );
1137 static bool gCallBack2Called = false;
1138 void TestCallback2(PropertyNotification& source)
1140 gCallBack2Called = true;
1143 int UtcDaliPropertyNotificationOrder(void)
1145 TestApplication application; // Reset all test adapter return codes
1147 Actor actor = Actor::New();
1148 application.GetScene().Add(actor);
1149 // this should complete in first frame
1150 PropertyNotification notification1 = actor.AddPropertyNotification( Actor::Property::POSITION_X, GreaterThanCondition(90.0f) );
1151 notification1.NotifySignal().Connect( &TestCallback );
1152 // this should complete in second frame
1153 PropertyNotification notification2 = actor.AddPropertyNotification( Actor::Property::POSITION_X, GreaterThanCondition(150.0f) );
1154 notification2.NotifySignal().Connect( &TestCallback2 );
1155 Animation animation = Animation::New( 0.032f ); // finishes in 32 ms
1156 animation.AnimateTo( Property(actor, Actor::Property::POSITION ), Vector3( 200.0f, 0.0f, 0.0f ), AlphaFunction::LINEAR );
1160 application.SendNotification();
1162 application.Render(RENDER_FRAME_INTERVAL);
1163 // no notifications yet
1164 DALI_TEST_EQUALS( gCallBackCalled, false, TEST_LOCATION );
1165 DALI_TEST_EQUALS( gCallBack2Called, false, TEST_LOCATION );
1166 gCallBackCalled = false;
1167 gCallBack2Called = false;
1169 // dont serve the notifications but run another update & render
1170 // this simulates situation where there is a notification in event side but it's not been picked up by event thread
1172 application.Render(RENDER_FRAME_INTERVAL);
1173 DALI_TEST_EQUALS( gCallBackCalled, false, TEST_LOCATION );
1174 DALI_TEST_EQUALS( gCallBack2Called, false, TEST_LOCATION );
1176 // serve the notifications
1177 application.SendNotification();
1178 DALI_TEST_EQUALS( gCallBackCalled, true, TEST_LOCATION );
1179 DALI_TEST_EQUALS( gCallBack2Called, true, TEST_LOCATION );
1181 gCallBackCalled = false;
1182 gCallBack2Called = false;
1183 application.Render(RENDER_FRAME_INTERVAL);
1184 application.SendNotification();
1185 DALI_TEST_EQUALS( gCallBackCalled, false, TEST_LOCATION );
1186 DALI_TEST_EQUALS( gCallBack2Called, false, TEST_LOCATION );
1191 int UtcDaliPropertyConditionGetArgumentNegative(void)
1193 TestApplication application;
1194 Dali::PropertyCondition instance;
1198 unsigned long arg1(0u);
1199 instance.GetArgument(arg1);
1200 DALI_TEST_CHECK(false); // Should not get here
1204 DALI_TEST_CHECK(true); // We expect an assert
1209 int UtcDaliPropertyConditionGetArgumentCountNegative(void)
1211 TestApplication application;
1212 Dali::PropertyCondition instance;
1216 instance.GetArgumentCount();
1217 DALI_TEST_CHECK(false); // Should not get here
1221 DALI_TEST_CHECK(true); // We expect an assert