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 #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 UtcDaliAddPropertyNotification(void)
167 TestApplication application; // Reset all test adapter return codes
168 tet_infoline(" UtcDaliAddPropertyNotification");
170 Actor actor = Actor::New();
172 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(100.0f));
173 PropertyNotification notification2 = actor.AddPropertyNotification(Actor::Property::SIZE, StepCondition( 1.0f, 1.0f ));
174 DALI_TEST_CHECK( notification );
175 DALI_TEST_CHECK( notification2 );
179 int UtcDaliAddPropertyNotificationCallback(void)
181 TestApplication application; // Reset all test adapter return codes
183 TestClass* object = new TestClass(application.GetScene());
185 object->Initialize();
186 application.Render(RENDER_FRAME_INTERVAL);
187 application.SendNotification();
189 gCallBackCalled = false;
191 tet_infoline(" UtcDaliAddPropertyNotificationCallback - Forcing notification condition true, should receive a notification");
192 object->mActor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
193 application.Render(RENDER_FRAME_INTERVAL);
194 application.SendNotification();
195 application.Render(RENDER_FRAME_INTERVAL);
196 application.SendNotification();
197 DALI_TEST_CHECK( gCallBackCalled );
198 gCallBackCalled = false;
200 tet_infoline(" UtcDaliAddPropertyNotificationCallback - Forcing notification condition false, should not receive a notification");
201 object->mActor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
202 application.Render(RENDER_FRAME_INTERVAL);
203 application.SendNotification();
204 application.Render(RENDER_FRAME_INTERVAL);
205 application.SendNotification();
206 DALI_TEST_CHECK( !gCallBackCalled );
207 gCallBackCalled = false;
209 tet_infoline(" UtcDaliAddPropertyNotificationCallback - Deleting notification and it's owning object, should not receive a notification");
210 object->mActor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
211 application.Render(RENDER_FRAME_INTERVAL);
212 application.SendNotification();
214 application.Render(RENDER_FRAME_INTERVAL);
215 application.SendNotification();
216 DALI_TEST_CHECK( !gCallBackCalled );
218 tet_infoline(" UtcDaliAddPropertyNotificationCallback - Removing notification and it's owning object, should not receive a notification");
219 object->Initialize();
220 application.Render(RENDER_FRAME_INTERVAL);
221 application.SendNotification();
222 gCallBackCalled = false;
224 object->RemovePropertyNotification();
226 object->mActor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
227 application.Render(RENDER_FRAME_INTERVAL);
228 application.SendNotification();
229 application.Render(RENDER_FRAME_INTERVAL);
230 application.SendNotification();
231 DALI_TEST_CHECK( !gCallBackCalled );
233 tet_infoline(" UtcDaliAddPropertyNotificationCallback - Removing all notifications and it's owning object, should not receive a notification");
234 object->Initialize();
235 application.Render(RENDER_FRAME_INTERVAL);
236 application.SendNotification();
237 gCallBackCalled = false;
239 object->RemovePropertyNotifications();
241 object->mActor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
242 application.Render(RENDER_FRAME_INTERVAL);
243 application.SendNotification();
244 application.Render(RENDER_FRAME_INTERVAL);
245 application.SendNotification();
246 DALI_TEST_CHECK( !gCallBackCalled );
253 int UtcDaliAddPropertyNotificationTypeProperty(void)
255 TestApplication application;
257 Actor actor = Actor::New();
259 // Currently, Type registry properties cannot be animated
262 actor.AddPropertyNotification( PROPERTY_REGISTRATION_START_INDEX, GreaterThanCondition( 100.0f ) );
264 catch ( DaliException& e )
266 DALI_TEST_ASSERT( e, "Property notification added to event side only property", TEST_LOCATION );
271 int UtcDaliAddPropertyNotificationEventSidePropertyN(void)
273 TestApplication application;
275 Actor actor = Actor::New();
277 // Currently, Type registry properties cannot be animated
280 actor.AddPropertyNotification( PROPERTY_REGISTRATION_MAX_INDEX - 1, GreaterThanCondition( 100.0f ) );
282 catch ( DaliException& e )
284 DALI_TEST_ASSERT( e, "Property notification added to event side only property", TEST_LOCATION );
289 int UtcDaliAddPropertyNotificationSize(void)
291 TestApplication application;
292 tet_infoline(" UtcDaliAddPropertyNotificationSize");
294 Actor actor = Actor::New();
296 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::SIZE, StepCondition( 1.0f, 1.0f ));
297 DALI_TEST_CHECK( notification );
301 int UtcDaliPropertyNotificationGetCondition(void)
303 TestApplication application;
304 tet_infoline(" UtcDaliPropertyNotificationGetCondition");
306 Actor actor = Actor::New();
308 PropertyCondition condition = GreaterThanCondition(100.0f);
309 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, condition);
310 DALI_TEST_CHECK( condition == notification.GetCondition() );
314 class PropertyNotificationConstWrapper
318 PropertyNotificationConstWrapper(PropertyNotification propertyNotification)
319 :mPropertyNotification(propertyNotification)
325 * Returns const reference to property notification.
326 * @return const reference.
328 const PropertyCondition& GetCondition() const
330 return mPropertyNotification.GetCondition();
333 PropertyNotification mPropertyNotification;
336 int UtcDaliPropertyNotificationGetConditionConst(void)
338 TestApplication application;
339 tet_infoline(" UtcDaliPropertyNotificationGetConditionConst");
341 Actor actor = Actor::New();
343 PropertyCondition condition = GreaterThanCondition(100.0f);
344 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, condition);
345 PropertyNotificationConstWrapper notificationConst(notification);
346 const PropertyCondition& conditionReference1 = notificationConst.GetCondition();
347 const PropertyCondition& conditionReference2 = notificationConst.GetCondition();
349 DALI_TEST_CHECK( (&conditionReference1) == (&conditionReference2) );
350 DALI_TEST_CHECK( conditionReference1 == condition );
354 int UtcDaliPropertyNotificationGetTarget(void)
356 TestApplication application;
357 tet_infoline(" UtcDaliPropertyNotificationGetTarget");
359 Actor actor = Actor::New();
360 Actor actor2 = Actor::New();
362 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X,
363 GreaterThanCondition(100.0f));
364 Actor targetActor = Actor::DownCast( notification.GetTarget() );
366 DALI_TEST_CHECK( targetActor == actor );
370 int UtcDaliPropertyNotificationGetProperty(void)
372 TestApplication application;
373 tet_infoline(" UtcDaliPropertyNotificationGetProperty");
375 Actor actor = Actor::New();
377 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X,
378 GreaterThanCondition(100.0f));
379 Property::Index targetProperty = notification.GetTargetProperty();
381 DALI_TEST_EQUALS( targetProperty, (Property::Index)Actor::Property::POSITION_X, TEST_LOCATION );
385 int UtcDaliPropertyNotificationGetNotifyMode(void)
387 TestApplication application;
388 tet_infoline(" UtcDaliPropertyNotificationGetNotifyMode");
390 Actor actor = Actor::New();
392 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X,
393 GreaterThanCondition(100.0f));
394 notification.SetNotifyMode(PropertyNotification::NotifyOnChanged);
395 PropertyNotification::NotifyMode notifyMode = notification.GetNotifyMode();
397 DALI_TEST_EQUALS( notifyMode, PropertyNotification::NotifyOnChanged, TEST_LOCATION );
401 int UtcDaliPropertyNotificationGetNotifyResultP(void)
403 TestApplication application;
404 tet_infoline(" UtcDaliPropertyNotificationGetNotifyMode");
406 Actor actor = Actor::New();
408 PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X,
409 GreaterThanCondition(100.0f));
410 notification.SetNotifyMode(PropertyNotification::NotifyOnChanged);
411 gCallBackCalled = false;
412 notification.NotifySignal().Connect( &TestCallback );
414 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
416 application.Render(RENDER_FRAME_INTERVAL);
417 application.SendNotification();
418 application.Render(RENDER_FRAME_INTERVAL);
419 application.SendNotification();
421 bool notifyResult = notification.GetNotifyResult();
423 DALI_TEST_EQUALS( notifyResult, false, TEST_LOCATION );
428 int UtcDaliPropertyNotificationGreaterThan(void)
430 TestApplication application;
431 tet_infoline(" UtcDaliPropertyNotificationGreaterThan");
433 Actor actor = Actor::New();
434 application.GetScene().Add(actor);
436 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION_X, GreaterThanCondition(100.0f) );
437 notification.NotifySignal().Connect( &TestCallback );
439 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
440 Wait(application, DEFAULT_WAIT_PERIOD);
442 // Move right to satisfy condition
443 gCallBackCalled = false;
444 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
445 Wait(application, DEFAULT_WAIT_PERIOD);
446 DALI_TEST_CHECK( gCallBackCalled );
448 // Move left to un-satisfy condition
449 gCallBackCalled = false;
450 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
451 Wait(application, DEFAULT_WAIT_PERIOD);
452 DALI_TEST_CHECK( !gCallBackCalled );
454 // Move right to satisfy condition again.
455 gCallBackCalled = false;
456 Wait(application, DEFAULT_WAIT_PERIOD);
457 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
458 Wait(application, DEFAULT_WAIT_PERIOD);
459 DALI_TEST_CHECK( gCallBackCalled );
463 int UtcDaliPropertyNotificationLessThan(void)
465 TestApplication application;
466 tet_infoline(" UtcDaliPropertyNotificationLessThan");
468 Actor actor = Actor::New();
469 application.GetScene().Add(actor);
471 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION_X, LessThanCondition(100.0f ) );
472 notification.NotifySignal().Connect( &TestCallback );
474 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
475 Wait(application, DEFAULT_WAIT_PERIOD);
477 // Move left to satisfy condition
478 gCallBackCalled = false;
479 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
480 Wait(application, DEFAULT_WAIT_PERIOD);
481 DALI_TEST_CHECK( gCallBackCalled );
483 // Move right to un-satisfy condition
484 gCallBackCalled = false;
485 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
486 Wait(application, DEFAULT_WAIT_PERIOD);
487 DALI_TEST_CHECK( !gCallBackCalled );
489 // Move left to satisfy condition again.
490 gCallBackCalled = false;
491 Wait(application, DEFAULT_WAIT_PERIOD);
492 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
493 Wait(application, DEFAULT_WAIT_PERIOD);
494 DALI_TEST_CHECK( gCallBackCalled );
498 int UtcDaliPropertyNotificationInside(void)
500 TestApplication application;
501 tet_infoline(" UtcDaliPropertyNotificationInside");
503 Actor actor = Actor::New();
504 application.GetScene().Add(actor);
506 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION_X, InsideCondition(100.0f, 200.0f) );
507 notification.NotifySignal().Connect( &TestCallback );
509 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
510 Wait(application, DEFAULT_WAIT_PERIOD);
512 // Move inside to satisfy condition
513 gCallBackCalled = false;
514 actor.SetProperty( Actor::Property::POSITION, Vector3(150.0f, 0.0f, 0.0f));
515 Wait(application, DEFAULT_WAIT_PERIOD);
516 DALI_TEST_CHECK( gCallBackCalled );
518 // Move outside (right) to un-satisfy condition
519 gCallBackCalled = false;
520 actor.SetProperty( Actor::Property::POSITION, Vector3(300.0f, 0.0f, 0.0f));
521 Wait(application, DEFAULT_WAIT_PERIOD);
522 DALI_TEST_CHECK( !gCallBackCalled );
524 // Move inside to satisfy condition again.
525 gCallBackCalled = false;
526 Wait(application, DEFAULT_WAIT_PERIOD);
527 actor.SetProperty( Actor::Property::POSITION, Vector3(150.0f, 0.0f, 0.0f));
528 Wait(application, DEFAULT_WAIT_PERIOD);
529 DALI_TEST_CHECK( gCallBackCalled );
533 int UtcDaliPropertyNotificationOutside(void)
535 TestApplication application;
536 tet_infoline(" UtcDaliPropertyNotificationOutside");
538 Actor actor = Actor::New();
539 application.GetScene().Add(actor);
541 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION_X, OutsideCondition(100.0f, 200.0f) );
542 notification.NotifySignal().Connect( &TestCallback );
544 actor.SetProperty( Actor::Property::POSITION, Vector3(150.0f, 0.0f, 0.0f));
545 Wait(application, DEFAULT_WAIT_PERIOD);
547 // Move outside (left) to satisfy condition
548 gCallBackCalled = false;
549 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
550 Wait(application, DEFAULT_WAIT_PERIOD);
551 DALI_TEST_CHECK( gCallBackCalled );
553 // Move inside to un-satisfy condition
554 gCallBackCalled = false;
555 actor.SetProperty( Actor::Property::POSITION, Vector3(150.0f, 0.0f, 0.0f));
556 Wait(application, DEFAULT_WAIT_PERIOD);
557 DALI_TEST_CHECK( !gCallBackCalled );
559 // Move outside (right) to satisfy condition again.
560 gCallBackCalled = false;
561 Wait(application, DEFAULT_WAIT_PERIOD);
562 actor.SetProperty( Actor::Property::POSITION, Vector3(300.0f, 0.0f, 0.0f));
563 Wait(application, DEFAULT_WAIT_PERIOD);
564 DALI_TEST_CHECK( gCallBackCalled );
568 int UtcDaliPropertyNotificationVectorComponentGreaterThan(void)
570 TestApplication application;
571 tet_infoline(" UtcDaliPropertyNotificationGreaterThan");
573 Actor actor = Actor::New();
574 application.GetScene().Add(actor);
576 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION, 0, GreaterThanCondition(100.0f) );
577 notification.NotifySignal().Connect( &TestCallback );
578 notification = actor.AddPropertyNotification( Actor::Property::POSITION, 1, GreaterThanCondition(100.0f) );
579 notification.NotifySignal().Connect( &TestCallback );
580 notification = actor.AddPropertyNotification( Actor::Property::POSITION, 2, GreaterThanCondition(100.0f) );
581 notification.NotifySignal().Connect( &TestCallback );
582 notification = actor.AddPropertyNotification( Actor::Property::COLOR, 3, GreaterThanCondition(0.5f) );
583 notification.NotifySignal().Connect( &TestCallback );
585 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
586 actor.SetProperty( Actor::Property::COLOR,Vector4(0.0f, 0.0f, 0.0f, 0.0f));
587 Wait(application, DEFAULT_WAIT_PERIOD);
589 // Move right to satisfy XAxis condition
590 gCallBackCalled = false;
591 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
592 Wait(application, DEFAULT_WAIT_PERIOD);
593 DALI_TEST_CHECK( gCallBackCalled );
595 // Move down to satisfy YAxis condition
596 gCallBackCalled = false;
597 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 200.0f, 0.0f));
598 Wait(application, DEFAULT_WAIT_PERIOD);
599 DALI_TEST_CHECK( gCallBackCalled );
601 // Move forward to satisfy ZAxis
602 gCallBackCalled = false;
603 Wait(application, DEFAULT_WAIT_PERIOD);
604 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 200.0f, 200.0f));
605 Wait(application, DEFAULT_WAIT_PERIOD);
606 DALI_TEST_CHECK( gCallBackCalled );
608 // Change alpha Colour to satisfy w/alpha component condition
609 gCallBackCalled = false;
610 Wait(application, DEFAULT_WAIT_PERIOD);
611 actor.SetProperty( Actor::Property::COLOR,Vector4(0.0f, 0.0f, 0.0f, 1.0f));
612 Wait(application, DEFAULT_WAIT_PERIOD);
613 DALI_TEST_CHECK( gCallBackCalled );
617 int UtcDaliPropertyNotificationVectorComponentLessThan(void)
619 TestApplication application;
620 tet_infoline(" UtcDaliPropertyNotificationLessThan");
622 Actor actor = Actor::New();
623 application.GetScene().Add(actor);
625 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION, 0, LessThanCondition(-100.0f) );
626 notification.NotifySignal().Connect( &TestCallback );
627 notification = actor.AddPropertyNotification( Actor::Property::POSITION, 1, LessThanCondition(-100.0f) );
628 notification.NotifySignal().Connect( &TestCallback );
629 notification = actor.AddPropertyNotification( Actor::Property::POSITION, 2, LessThanCondition(-100.0f) );
630 notification.NotifySignal().Connect( &TestCallback );
631 notification = actor.AddPropertyNotification( Actor::Property::COLOR, 3, LessThanCondition(0.5f) );
632 notification.NotifySignal().Connect( &TestCallback );
634 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
635 actor.SetProperty( Actor::Property::COLOR,Vector4(0.0f, 0.0f, 0.0f, 1.0f));
636 Wait(application, DEFAULT_WAIT_PERIOD);
638 // Move left to satisfy XAxis condition
639 gCallBackCalled = false;
640 actor.SetProperty( Actor::Property::POSITION, Vector3(-200.0f, 0.0f, 0.0f));
641 Wait(application, DEFAULT_WAIT_PERIOD);
642 DALI_TEST_CHECK( gCallBackCalled );
644 // Move up to satisfy YAxis condition
645 gCallBackCalled = false;
646 actor.SetProperty( Actor::Property::POSITION, Vector3(-200.0f, -200.0f, 0.0f));
647 Wait(application, DEFAULT_WAIT_PERIOD);
648 DALI_TEST_CHECK( gCallBackCalled );
650 // Move back to satisfy ZAxis
651 gCallBackCalled = false;
652 Wait(application, DEFAULT_WAIT_PERIOD);
653 actor.SetProperty( Actor::Property::POSITION, Vector3(-200.0f, -200.0f, -200.0f));
654 Wait(application, DEFAULT_WAIT_PERIOD);
655 DALI_TEST_CHECK( gCallBackCalled );
657 // Change alpha Colour to satisfy w/alpha component condition
658 gCallBackCalled = false;
659 Wait(application, DEFAULT_WAIT_PERIOD);
660 actor.SetProperty( Actor::Property::COLOR,Vector4(0.0f, 0.0f, 0.0f, 0.0f));
661 Wait(application, DEFAULT_WAIT_PERIOD);
662 DALI_TEST_CHECK( gCallBackCalled );
666 int UtcDaliPropertyNotificationVectorComponentInside(void)
668 TestApplication application;
669 tet_infoline(" UtcDaliPropertyNotificationInside");
671 Actor actor = Actor::New();
672 application.GetScene().Add(actor);
674 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION, 0, InsideCondition(-100.0f, 100.0f) );
675 notification.NotifySignal().Connect( &TestCallback );
676 notification = actor.AddPropertyNotification( Actor::Property::POSITION, 1, InsideCondition(-100.0f, 100.0f) );
677 notification.NotifySignal().Connect( &TestCallback );
678 notification = actor.AddPropertyNotification( Actor::Property::POSITION, 2, InsideCondition(-100.0f, 100.0f) );
679 notification.NotifySignal().Connect( &TestCallback );
680 notification = actor.AddPropertyNotification( Actor::Property::COLOR, 3, InsideCondition(0.25f, 0.75f) );
681 notification.NotifySignal().Connect( &TestCallback );
683 // set outside all conditions
684 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 200.0f, 200.0f));
685 actor.SetProperty( Actor::Property::COLOR,Vector4(0.0f, 0.0f, 0.0f, 1.0f));
686 Wait(application, DEFAULT_WAIT_PERIOD);
688 // Move x to inside condition
689 gCallBackCalled = false;
690 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 200.0f, 200.0f));
691 Wait(application, DEFAULT_WAIT_PERIOD);
692 DALI_TEST_CHECK( gCallBackCalled );
694 // Move y to inside condition
695 gCallBackCalled = false;
696 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 200.0f));
697 Wait(application, DEFAULT_WAIT_PERIOD);
698 DALI_TEST_CHECK( gCallBackCalled );
700 // Move z to inside condition
701 gCallBackCalled = false;
702 Wait(application, DEFAULT_WAIT_PERIOD);
703 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
704 Wait(application, DEFAULT_WAIT_PERIOD);
705 DALI_TEST_CHECK( gCallBackCalled );
707 // change alpha to inside condition
708 gCallBackCalled = false;
709 Wait(application, DEFAULT_WAIT_PERIOD);
710 actor.SetProperty( Actor::Property::COLOR,Vector4(0.0f, 0.0f, 0.0f, 0.5f));
711 Wait(application, DEFAULT_WAIT_PERIOD);
712 DALI_TEST_CHECK( gCallBackCalled );
716 int UtcDaliPropertyNotificationVectorComponentOutside(void)
718 TestApplication application;
719 tet_infoline(" UtcDaliPropertyNotificationOutside");
721 Actor actor = Actor::New();
722 application.GetScene().Add(actor);
724 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION, 0, OutsideCondition(-100.0f, 100.0f) );
725 notification.NotifySignal().Connect( &TestCallback );
726 notification = actor.AddPropertyNotification( Actor::Property::POSITION, 1, OutsideCondition(-100.0f, 100.0f) );
727 notification.NotifySignal().Connect( &TestCallback );
728 notification = actor.AddPropertyNotification( Actor::Property::POSITION, 2, OutsideCondition(-100.0f, 100.0f) );
729 notification.NotifySignal().Connect( &TestCallback );
730 notification = actor.AddPropertyNotification( Actor::Property::COLOR, 3, OutsideCondition(0.25f, 0.75f) );
731 notification.NotifySignal().Connect( &TestCallback );
733 // set inside all conditions
734 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
735 actor.SetProperty( Actor::Property::COLOR,Vector4(0.0f, 0.0f, 0.0f, 0.5f));
736 Wait(application, DEFAULT_WAIT_PERIOD);
738 // Move x to outside condition
739 gCallBackCalled = false;
740 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
741 Wait(application, DEFAULT_WAIT_PERIOD);
742 DALI_TEST_CHECK( gCallBackCalled );
744 // Move y to outside condition
745 gCallBackCalled = false;
746 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 200.0f, 0.0f));
747 Wait(application, DEFAULT_WAIT_PERIOD);
748 DALI_TEST_CHECK( gCallBackCalled );
750 // Move z to outside condition
751 gCallBackCalled = false;
752 Wait(application, DEFAULT_WAIT_PERIOD);
753 actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 200.0f, 200.0f));
754 Wait(application, DEFAULT_WAIT_PERIOD);
755 DALI_TEST_CHECK( gCallBackCalled );
757 // change alpha to outside condition
758 gCallBackCalled = false;
759 Wait(application, DEFAULT_WAIT_PERIOD);
760 actor.SetProperty( Actor::Property::COLOR,Vector4(0.0f, 0.0f, 0.0f, 1.0f));
761 Wait(application, DEFAULT_WAIT_PERIOD);
762 DALI_TEST_CHECK( gCallBackCalled );
766 int UtcDaliPropertyNotificationSetSizeResultP(void)
768 TestApplication application;
770 tet_infoline(" UtcDaliPropertyNotificationSetSizeResultP");
772 Actor actor = Actor::New();
774 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::SIZE, StepCondition( 1.0f, 1.0f ) );
775 notification.SetNotifyMode(PropertyNotification::NotifyOnChanged);
776 gCallBackCalled = false;
777 notification.NotifySignal().Connect( &TestCallback );
779 actor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f) );
781 application.Render(RENDER_FRAME_INTERVAL);
782 application.SendNotification();
783 application.Render(RENDER_FRAME_INTERVAL);
784 application.SendNotification();
786 notifyResult = notification.GetNotifyResult();
788 DALI_TEST_EQUALS( notifyResult, true, TEST_LOCATION );
790 gCallBackCalled = false;
792 actor.SetProperty( Actor::Property::SIZE, Vector2( 200.0f, 200.0f ) );
794 application.Render(RENDER_FRAME_INTERVAL);
795 application.SendNotification();
796 application.Render(RENDER_FRAME_INTERVAL);
797 application.SendNotification();
799 notifyResult = notification.GetNotifyResult();
801 DALI_TEST_EQUALS( notifyResult, true, TEST_LOCATION );
806 int UtcDaliPropertyConditionGetArguments(void)
808 TestApplication application;
809 tet_infoline(" UtcDaliPropertyConditionGetArguments");
811 PropertyCondition condition = GreaterThanCondition( 50.0f );
813 DALI_TEST_EQUALS( condition.GetArgumentCount(), 1u, TEST_LOCATION );
814 float value = condition.GetArgument( 0 );
815 DALI_TEST_EQUALS( value, 50.0f, TEST_LOCATION );
817 condition = InsideCondition( 125.0f, 250.0f );
819 DALI_TEST_EQUALS( condition.GetArgumentCount(), 2u, TEST_LOCATION );
820 float value1 = condition.GetArgument( 0 );
821 float value2 = condition.GetArgument( 1 );
822 DALI_TEST_EQUALS( value1, 125.0f, TEST_LOCATION );
823 DALI_TEST_EQUALS( value2, 250.0f, TEST_LOCATION );
827 int UtcDaliPropertyNotificationStepVector4(void)
829 TestApplication application;
830 tet_infoline(" UtcDaliPropertyNotificationStepVector4");
832 Actor actor = Actor::New();
833 application.GetScene().Add(actor);
835 const float step = 10.0f;
836 float initValue = 5.0f;
838 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::COLOR, StepCondition(step * 2, 0.0f) );
839 notification.NotifySignal().Connect( &TestCallback );
841 actor.SetProperty( Actor::Property::COLOR, Vector4(initValue, 0.0f, 0.0f, 0.0f));
842 Wait(application, DEFAULT_WAIT_PERIOD);
844 // test both directions
845 for( int i = 1 ; i < 10 ; )
847 // Move x to positive
848 gCallBackCalled = false;
849 actor.SetProperty( Actor::Property::COLOR, Vector4(initValue + (i++ * step), 0.0f, 0.0f, 0.0f));
850 Wait(application, DEFAULT_WAIT_PERIOD);
851 DALI_TEST_CHECK( !gCallBackCalled );
853 actor.SetProperty( Actor::Property::COLOR, Vector4(initValue + (i++ * step), 0.0f, 0.0f, 0.0f));
854 Wait(application, DEFAULT_WAIT_PERIOD);
855 DALI_TEST_CHECK( gCallBackCalled );
859 actor.SetProperty( Actor::Property::COLOR, Vector4(initValue, 0.0f, 0.0f, 0.0f));
860 Wait(application, DEFAULT_WAIT_PERIOD);
862 for( int i = 1 ; i < 10 ; )
864 // Move x to negative
865 gCallBackCalled = false;
866 actor.SetProperty( Actor::Property::COLOR, Vector4(initValue -(i++ * step), 0.0f, 0.0f, 0.0f));
867 Wait(application, DEFAULT_WAIT_PERIOD);
868 DALI_TEST_CHECK( !gCallBackCalled );
870 actor.SetProperty( Actor::Property::COLOR, Vector4(initValue -(i++ * step), 0.0f, 0.0f, 0.0f));
871 Wait(application, DEFAULT_WAIT_PERIOD);
872 DALI_TEST_CHECK( gCallBackCalled );
877 int UtcDaliPropertyNotificationStepFloat(void)
879 TestApplication application;
880 tet_infoline(" UtcDaliPropertyNotificationStepFloat");
882 Actor actor = Actor::New();
883 application.GetScene().Add(actor);
885 const float step = 10.0f;
886 float initValue = 5.0f;
889 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION, 0, StepCondition(step * 2, 0.0f) );
890 notification.NotifySignal().Connect( &TestCallback );
892 // set initial position
893 actor.SetProperty( Actor::Property::POSITION, Vector3(initValue, 0.0f, 0.0f));
894 Wait(application, DEFAULT_WAIT_PERIOD);
896 // test both directions
897 for( int i = 1 ; i < 10 ; )
899 // Move x to positive
900 gCallBackCalled = false;
901 actor.SetProperty( Actor::Property::POSITION, Vector3(initValue + (i++ * step), 0.0f, 0.0f));
902 Wait(application, DEFAULT_WAIT_PERIOD);
903 DALI_TEST_CHECK( !gCallBackCalled );
905 actor.SetProperty( Actor::Property::POSITION, Vector3(initValue + (i++ * step), 0.0f, 0.0f));
906 Wait(application, DEFAULT_WAIT_PERIOD);
907 DALI_TEST_CHECK( gCallBackCalled );
911 actor.SetProperty( Actor::Property::POSITION, Vector3(initValue, 0.0f, 0.0f));
912 Wait(application, DEFAULT_WAIT_PERIOD);
914 for( int i = 1 ; i < 10 ; )
916 // Move x to negative
917 gCallBackCalled = false;
918 actor.SetProperty( Actor::Property::POSITION, Vector3(initValue -(i++ * step), 0.0f, 0.0f));
919 Wait(application, DEFAULT_WAIT_PERIOD);
920 DALI_TEST_CHECK( !gCallBackCalled );
922 actor.SetProperty( Actor::Property::POSITION, Vector3(initValue -(i++ * step), 0.0f, 0.0f));
923 Wait(application, DEFAULT_WAIT_PERIOD);
924 DALI_TEST_CHECK( gCallBackCalled );
929 int UtcDaliPropertyNotificationStepVector2(void)
931 TestApplication application;
932 tet_infoline(" UtcDaliPropertyNotificationStepVector2");
934 Actor actor = Actor::New();
935 application.GetScene().Add(actor);
937 const float step = 10.0f;
938 float initValue = 5.0f;
940 Property::Index propertyIndex = actor.RegisterProperty( "testProperty", Vector2::ZERO );
942 PropertyNotification notification = actor.AddPropertyNotification( propertyIndex, StepCondition(step * 2, 0.0f) );
943 notification.NotifySignal().Connect( &TestCallback );
945 actor.SetProperty( propertyIndex, Vector2(initValue, 0.0f));
946 Wait(application, DEFAULT_WAIT_PERIOD);
948 // test both directions
949 for( int i = 1 ; i < 10 ; )
951 // Move x to positive
952 gCallBackCalled = false;
953 actor.SetProperty( propertyIndex, Vector2(initValue + (i++ * step), 0.0f));
954 Wait(application, DEFAULT_WAIT_PERIOD);
955 DALI_TEST_CHECK( !gCallBackCalled );
957 actor.SetProperty( propertyIndex, Vector2(initValue + (i++ * step), 0.0f));
958 Wait(application, DEFAULT_WAIT_PERIOD);
959 DALI_TEST_CHECK( gCallBackCalled );
963 actor.SetProperty( propertyIndex, Vector2(initValue, 0.0f));
964 Wait(application, DEFAULT_WAIT_PERIOD);
966 for( int i = 1 ; i < 10 ; )
968 // Move x to negative
969 gCallBackCalled = false;
970 actor.SetProperty( propertyIndex, Vector2(initValue -(i++ * step), 0.0f));
971 Wait(application, DEFAULT_WAIT_PERIOD);
972 DALI_TEST_CHECK( !gCallBackCalled );
974 actor.SetProperty( propertyIndex, Vector2(initValue -(i++ * step), 0.0f));
975 Wait(application, DEFAULT_WAIT_PERIOD);
976 DALI_TEST_CHECK( gCallBackCalled );
981 int UtcDaliPropertyNotificationStepVector3(void)
983 TestApplication application;
984 tet_infoline(" UtcDaliPropertyNotificationStepVector3");
986 Actor actor = Actor::New();
987 application.GetScene().Add(actor);
989 const float step = 10.0f;
990 float initValue = 5.0f;
993 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION, StepCondition(step * 2, 0.0f) );
994 notification.NotifySignal().Connect( &TestCallback );
996 // set initial position
997 actor.SetProperty( Actor::Property::POSITION, Vector3(initValue, 0.0f, 0.0f));
998 Wait(application, DEFAULT_WAIT_PERIOD);
1000 // test both directions
1001 for( int i = 1 ; i < 10 ; )
1003 // Move x to positive position
1004 gCallBackCalled = false;
1005 actor.SetProperty( Actor::Property::POSITION, Vector3( initValue + (i++ * step), 0.0f, 0.0f) );
1006 Wait(application, DEFAULT_WAIT_PERIOD);
1007 DALI_TEST_CHECK( !gCallBackCalled );
1009 actor.SetProperty( Actor::Property::POSITION, Vector3( initValue + (i++ * step), 0.0f, 0.0f) );
1010 Wait(application, DEFAULT_WAIT_PERIOD);
1011 DALI_TEST_CHECK( gCallBackCalled );
1015 actor.SetProperty( Actor::Property::POSITION, Vector3( initValue, 0.0f, 0.0f) );
1016 Wait(application, DEFAULT_WAIT_PERIOD);
1018 for( int i = 1 ; i < 10 ; )
1020 // Move x to negative position
1021 gCallBackCalled = false;
1022 actor.SetProperty( Actor::Property::POSITION, Vector3( initValue -(i++ * step), 0.0f, 0.0f) );
1023 Wait(application, DEFAULT_WAIT_PERIOD);
1024 DALI_TEST_CHECK( !gCallBackCalled );
1026 actor.SetProperty( Actor::Property::POSITION, Vector3( initValue -(i++ * step), 0.0f, 0.0f) );
1027 Wait(application, DEFAULT_WAIT_PERIOD);
1028 DALI_TEST_CHECK( gCallBackCalled );
1033 int UtcDaliPropertyNotificationVariableStep(void)
1035 TestApplication application;
1036 tet_infoline(" UtcDaliPropertyNotificationStep");
1038 Actor actor = Actor::New();
1039 application.GetScene().Add(actor);
1041 Dali::Vector<float> values;
1043 const float averageStep = 100.0f;
1045 for( int i = 1 ; i < 10 ; i++ )
1047 values.PushBack(i * averageStep + (i % 2 == 0 ? -(averageStep * 0.2f) : (averageStep * 0.2f)));
1050 PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION, 0, VariableStepCondition(values) );
1051 notification.NotifySignal().Connect( &TestCallback );
1053 // set initial position lower than first position in list
1054 actor.SetProperty( Actor::Property::POSITION, Vector3(values[0] - averageStep, 0.0f, 0.0f));
1055 Wait(application, DEFAULT_WAIT_PERIOD);
1057 for( unsigned int i = 0 ; i < values.Count() - 1 ; ++i )
1059 gCallBackCalled = false;
1060 // set position half way between the current values
1061 float position = values[i] + (0.5f * (values[i + 1] - values[i]));
1062 actor.SetProperty( Actor::Property::POSITION, Vector3(position, 0.0f, 0.0f));
1063 Wait(application, DEFAULT_WAIT_PERIOD);
1064 DALI_TEST_CHECK( gCallBackCalled );
1069 static bool gCallBack2Called = false;
1070 void TestCallback2(PropertyNotification& source)
1072 gCallBack2Called = true;
1075 int UtcDaliPropertyNotificationOrder(void)
1077 TestApplication application; // Reset all test adapter return codes
1079 Actor actor = Actor::New();
1080 application.GetScene().Add(actor);
1081 // this should complete in first frame
1082 PropertyNotification notification1 = actor.AddPropertyNotification( Actor::Property::POSITION_X, GreaterThanCondition(90.0f) );
1083 notification1.NotifySignal().Connect( &TestCallback );
1084 // this should complete in second frame
1085 PropertyNotification notification2 = actor.AddPropertyNotification( Actor::Property::POSITION_X, GreaterThanCondition(150.0f) );
1086 notification2.NotifySignal().Connect( &TestCallback2 );
1087 Animation animation = Animation::New( 0.032f ); // finishes in 32 ms
1088 animation.AnimateTo( Property(actor, Actor::Property::POSITION ), Vector3( 200.0f, 0.0f, 0.0f ), AlphaFunction::LINEAR );
1092 application.SendNotification();
1094 application.Render(RENDER_FRAME_INTERVAL);
1095 // no notifications yet
1096 DALI_TEST_EQUALS( gCallBackCalled, false, TEST_LOCATION );
1097 DALI_TEST_EQUALS( gCallBack2Called, false, TEST_LOCATION );
1098 gCallBackCalled = false;
1099 gCallBack2Called = false;
1101 // dont serve the notifications but run another update & render
1102 // this simulates situation where there is a notification in event side but it's not been picked up by event thread
1104 application.Render(RENDER_FRAME_INTERVAL);
1105 DALI_TEST_EQUALS( gCallBackCalled, false, TEST_LOCATION );
1106 DALI_TEST_EQUALS( gCallBack2Called, false, TEST_LOCATION );
1108 // serve the notifications
1109 application.SendNotification();
1110 DALI_TEST_EQUALS( gCallBackCalled, true, TEST_LOCATION );
1111 DALI_TEST_EQUALS( gCallBack2Called, true, TEST_LOCATION );
1113 gCallBackCalled = false;
1114 gCallBack2Called = false;
1115 application.Render(RENDER_FRAME_INTERVAL);
1116 application.SendNotification();
1117 DALI_TEST_EQUALS( gCallBackCalled, false, TEST_LOCATION );
1118 DALI_TEST_EQUALS( gCallBack2Called, false, TEST_LOCATION );