Fix PropertyNotification issue
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-PropertyNotification.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 #include <iostream>
19
20 #include <stdlib.h>
21 #include <dali/public-api/dali-core.h>
22 #include <dali-test-suite-utils.h>
23
24 using namespace Dali;
25
26 void utc_dali_property_notification_startup(void)
27 {
28   test_return_value = TET_UNDEF;
29 }
30
31 void utc_dali_property_notification_cleanup(void)
32 {
33   test_return_value = TET_PASS;
34 }
35
36 namespace {
37
38 static bool gCallBackCalled;
39
40 static void TestCallback(PropertyNotification& source)
41 {
42   gCallBackCalled = true;
43 }
44
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.
47
48
49 class TestClass : public ConnectionTracker
50 {
51 public:
52
53   TestClass(Integration::Scene scene )
54   : mScene( scene )
55   {
56   }
57
58   ~TestClass()
59   {
60   }
61
62   void Initialize()
63   {
64     mActor = Actor::New();
65     mScene.Add( mActor );
66     mNotification = mActor.AddPropertyNotification( Actor::Property::POSITION_X, GreaterThanCondition(100.0f) );
67     mNotification.NotifySignal().Connect( this, &TestClass::OnPropertyNotify );
68   }
69
70   void RemovePropertyNotification()
71   {
72     mActor.RemovePropertyNotification( mNotification );
73   }
74
75   void RemovePropertyNotifications()
76   {
77     mActor.RemovePropertyNotifications();
78   }
79
80   void Terminate()
81   {
82     mScene.Remove( mActor );
83     mActor.Reset();
84     mNotification.Reset();
85   }
86
87   void OnPropertyNotify( PropertyNotification& source )
88   {
89     tet_infoline(" OnPropertyNotify");
90     gCallBackCalled = true;
91   }
92
93   Actor mActor;
94   PropertyNotification mNotification;
95   Integration::Scene mScene;
96 };
97
98
99 /*
100  * Simulate time passed by.
101  *
102  * @note this will always process at least 1 frame (1/60 sec)
103  *
104  * @param application Test application instance
105  * @param duration Time to pass in milliseconds.
106  * @return The actual time passed in milliseconds
107  */
108 int Wait(TestApplication& application, int duration = 0)
109 {
110   int time = 0;
111
112   for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
113   {
114     application.SendNotification();
115     application.Render(RENDER_FRAME_INTERVAL);
116     time += RENDER_FRAME_INTERVAL;
117   }
118
119   return time;
120 }
121
122 } // unnamed namespace
123
124
125 // Positive test case for a method
126 int UtcDaliPropertyNotificationDownCast(void)
127 {
128   TestApplication application;
129   tet_infoline(" UtcDaliPropertyNotificationDownCast");
130
131   Actor actor = Actor::New();
132   PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(100.0f));
133   BaseHandle handle = notification;
134   PropertyNotification notificationHandle;
135
136   DALI_TEST_CHECK(notification);
137   DALI_TEST_CHECK(handle);
138   DALI_TEST_CHECK(!notificationHandle);
139
140   notificationHandle = PropertyNotification::DownCast( handle );
141   DALI_TEST_CHECK(notificationHandle);
142   END_TEST;
143 }
144
145
146 // Negative test case for a method
147 int UtcDaliPropertyNotificationDownCastNegative(void)
148 {
149   TestApplication application;
150   tet_infoline(" UtcDaliPropertyNotificationDownCastNegative");
151
152   // Create something derived from BaseHandle other than a PropertyNotification.
153   Actor somethingElse = Actor::New();
154
155   Actor actor = Actor::New();
156   actor.AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(100.0f));
157   BaseHandle handle = somethingElse;
158   PropertyNotification notificationHandle;
159
160   notificationHandle = PropertyNotification::DownCast( handle );
161   DALI_TEST_CHECK(!notificationHandle);
162   END_TEST;
163 }
164
165 int UtcDaliAddPropertyNotification(void)
166 {
167   TestApplication application; // Reset all test adapter return codes
168   tet_infoline(" UtcDaliAddPropertyNotification");
169
170   Actor actor = Actor::New();
171
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 );
176   END_TEST;
177 }
178
179 int UtcDaliAddPropertyNotificationCallback(void)
180 {
181   TestApplication application; // Reset all test adapter return codes
182
183   TestClass* object = new TestClass(application.GetScene());
184
185   object->Initialize();
186   application.Render(RENDER_FRAME_INTERVAL);
187   application.SendNotification();
188
189   gCallBackCalled = false;
190
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;
199
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;
208
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();
213   object->Terminate();
214   application.Render(RENDER_FRAME_INTERVAL);
215   application.SendNotification();
216   DALI_TEST_CHECK( !gCallBackCalled );
217
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;
223
224   object->RemovePropertyNotification();
225
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 );
232
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;
238
239   object->RemovePropertyNotifications();
240
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 );
247
248
249   delete object;
250   END_TEST;
251 }
252
253 int UtcDaliAddPropertyNotificationTypeProperty(void)
254 {
255   TestApplication application;
256
257   Actor actor = Actor::New();
258
259   // Currently, Type registry properties cannot be animated
260   try
261   {
262     actor.AddPropertyNotification( PROPERTY_REGISTRATION_START_INDEX, GreaterThanCondition( 100.0f ) );
263   }
264   catch ( DaliException& e )
265   {
266     DALI_TEST_ASSERT( e, "Property notification added to event side only property", TEST_LOCATION );
267   }
268   END_TEST;
269 }
270
271 int UtcDaliAddPropertyNotificationEventSidePropertyN(void)
272 {
273   TestApplication application;
274
275   Actor actor = Actor::New();
276
277   // Currently, Type registry properties cannot be animated
278   try
279   {
280     actor.AddPropertyNotification( PROPERTY_REGISTRATION_MAX_INDEX - 1, GreaterThanCondition( 100.0f ) );
281   }
282   catch ( DaliException& e )
283   {
284     DALI_TEST_ASSERT( e, "Property notification added to event side only property", TEST_LOCATION );
285   }
286   END_TEST;
287 }
288
289 int UtcDaliAddPropertyNotificationSize(void)
290 {
291   TestApplication application;
292   tet_infoline(" UtcDaliAddPropertyNotificationSize");
293
294   Actor actor = Actor::New();
295
296   PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::SIZE, StepCondition( 1.0f, 1.0f ));
297   DALI_TEST_CHECK( notification );
298   END_TEST;
299 }
300
301 int UtcDaliPropertyNotificationGetCondition(void)
302 {
303   TestApplication application;
304   tet_infoline(" UtcDaliPropertyNotificationGetCondition");
305
306   Actor actor = Actor::New();
307
308   PropertyCondition condition = GreaterThanCondition(100.0f);
309   PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X, condition);
310   DALI_TEST_CHECK( condition == notification.GetCondition() );
311   END_TEST;
312 }
313
314 class PropertyNotificationConstWrapper
315 {
316 public:
317
318   PropertyNotificationConstWrapper(PropertyNotification propertyNotification)
319   :mPropertyNotification(propertyNotification)
320   {
321
322   }
323
324   /**
325    * Returns const reference to property notification.
326    * @return const reference.
327    */
328   const PropertyCondition& GetCondition() const
329   {
330     return mPropertyNotification.GetCondition();
331   }
332
333   PropertyNotification mPropertyNotification;
334 };
335
336 int UtcDaliPropertyNotificationGetConditionConst(void)
337 {
338   TestApplication application;
339   tet_infoline(" UtcDaliPropertyNotificationGetConditionConst");
340
341   Actor actor = Actor::New();
342
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();
348
349   DALI_TEST_CHECK( (&conditionReference1) == (&conditionReference2) );
350   DALI_TEST_CHECK( conditionReference1 == condition );
351   END_TEST;
352 }
353
354 int UtcDaliPropertyNotificationGetTarget(void)
355 {
356   TestApplication application;
357   tet_infoline(" UtcDaliPropertyNotificationGetTarget");
358
359   Actor actor = Actor::New();
360   Actor actor2 = Actor::New();
361
362   PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X,
363                                                                     GreaterThanCondition(100.0f));
364   Actor targetActor = Actor::DownCast( notification.GetTarget() );
365
366   DALI_TEST_CHECK( targetActor == actor );
367   END_TEST;
368 }
369
370 int UtcDaliPropertyNotificationGetProperty(void)
371 {
372   TestApplication application;
373   tet_infoline(" UtcDaliPropertyNotificationGetProperty");
374
375   Actor actor = Actor::New();
376
377   PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X,
378                                                                     GreaterThanCondition(100.0f));
379   Property::Index targetProperty = notification.GetTargetProperty();
380
381   DALI_TEST_EQUALS( targetProperty, (Property::Index)Actor::Property::POSITION_X, TEST_LOCATION );
382   END_TEST;
383 }
384
385 int UtcDaliPropertyNotificationGetNotifyMode(void)
386 {
387   TestApplication application;
388   tet_infoline(" UtcDaliPropertyNotificationGetNotifyMode");
389
390   Actor actor = Actor::New();
391
392   PropertyNotification notification = actor.AddPropertyNotification(Actor::Property::POSITION_X,
393                                                                     GreaterThanCondition(100.0f));
394   notification.SetNotifyMode(PropertyNotification::NotifyOnChanged);
395   PropertyNotification::NotifyMode notifyMode = notification.GetNotifyMode();
396
397   DALI_TEST_EQUALS( notifyMode, PropertyNotification::NotifyOnChanged, TEST_LOCATION );
398   END_TEST;
399 }
400
401 int UtcDaliPropertyNotificationGetNotifyResultP(void)
402 {
403   TestApplication application;
404   tet_infoline(" UtcDaliPropertyNotificationGetNotifyMode");
405
406   Actor actor = Actor::New();
407
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 );
413
414   actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
415
416   application.Render(RENDER_FRAME_INTERVAL);
417   application.SendNotification();
418   application.Render(RENDER_FRAME_INTERVAL);
419   application.SendNotification();
420
421   bool notifyResult = notification.GetNotifyResult();
422
423   DALI_TEST_EQUALS( notifyResult, false, TEST_LOCATION );
424
425   END_TEST;
426 }
427
428 int UtcDaliPropertyNotificationGreaterThan(void)
429 {
430   TestApplication application;
431   tet_infoline(" UtcDaliPropertyNotificationGreaterThan");
432
433   Actor actor = Actor::New();
434   application.GetScene().Add(actor);
435
436   PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION_X, GreaterThanCondition(100.0f) );
437   notification.NotifySignal().Connect( &TestCallback );
438
439   actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
440   Wait(application, DEFAULT_WAIT_PERIOD);
441
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 );
447
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 );
453
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 );
460   END_TEST;
461 }
462
463 int UtcDaliPropertyNotificationLessThan(void)
464 {
465   TestApplication application;
466   tet_infoline(" UtcDaliPropertyNotificationLessThan");
467
468   Actor actor = Actor::New();
469   application.GetScene().Add(actor);
470
471   PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION_X, LessThanCondition(100.0f ) );
472   notification.NotifySignal().Connect( &TestCallback );
473
474   actor.SetProperty( Actor::Property::POSITION, Vector3(200.0f, 0.0f, 0.0f));
475   Wait(application, DEFAULT_WAIT_PERIOD);
476
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 );
482
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 );
488
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 );
495   END_TEST;
496 }
497
498 int UtcDaliPropertyNotificationInside(void)
499 {
500   TestApplication application;
501   tet_infoline(" UtcDaliPropertyNotificationInside");
502
503   Actor actor = Actor::New();
504   application.GetScene().Add(actor);
505
506   PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION_X, InsideCondition(100.0f, 200.0f) );
507   notification.NotifySignal().Connect( &TestCallback );
508
509   actor.SetProperty( Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
510   Wait(application, DEFAULT_WAIT_PERIOD);
511
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 );
517
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 );
523
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 );
530   END_TEST;
531 }
532
533 int UtcDaliPropertyNotificationOutside(void)
534 {
535   TestApplication application;
536   tet_infoline(" UtcDaliPropertyNotificationOutside");
537
538   Actor actor = Actor::New();
539   application.GetScene().Add(actor);
540
541   PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION_X, OutsideCondition(100.0f, 200.0f) );
542   notification.NotifySignal().Connect( &TestCallback );
543
544   actor.SetProperty( Actor::Property::POSITION, Vector3(150.0f, 0.0f, 0.0f));
545   Wait(application, DEFAULT_WAIT_PERIOD);
546
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 );
552
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 );
558
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 );
565   END_TEST;
566 }
567
568 int UtcDaliPropertyNotificationVectorComponentGreaterThan(void)
569 {
570   TestApplication application;
571   tet_infoline(" UtcDaliPropertyNotificationGreaterThan");
572
573   Actor actor = Actor::New();
574   application.GetScene().Add(actor);
575
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 );
584
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);
588
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 );
594
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 );
600
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 );
607
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 );
614   END_TEST;
615 }
616
617 int UtcDaliPropertyNotificationVectorComponentLessThan(void)
618 {
619   TestApplication application;
620   tet_infoline(" UtcDaliPropertyNotificationLessThan");
621
622   Actor actor = Actor::New();
623   application.GetScene().Add(actor);
624
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 );
633
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);
637
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 );
643
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 );
649
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 );
656
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 );
663   END_TEST;
664 }
665
666 int UtcDaliPropertyNotificationVectorComponentInside(void)
667 {
668   TestApplication application;
669   tet_infoline(" UtcDaliPropertyNotificationInside");
670
671   Actor actor = Actor::New();
672   application.GetScene().Add(actor);
673
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 );
682
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);
687
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 );
693
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 );
699
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 );
706
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 );
713   END_TEST;
714 }
715
716 int UtcDaliPropertyNotificationVectorComponentOutside(void)
717 {
718   TestApplication application;
719   tet_infoline(" UtcDaliPropertyNotificationOutside");
720
721   Actor actor = Actor::New();
722   application.GetScene().Add(actor);
723
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 );
732
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);
737
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 );
743
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 );
749
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 );
756
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 );
763   END_TEST;
764 }
765
766 int UtcDaliPropertyNotificationSetSizeResultP(void)
767 {
768   TestApplication application;
769   bool notifyResult;
770   tet_infoline(" UtcDaliPropertyNotificationSetSizeResultP");
771
772   Actor actor = Actor::New();
773
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 );
778
779   actor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f) );
780
781   application.Render(RENDER_FRAME_INTERVAL);
782   application.SendNotification();
783   application.Render(RENDER_FRAME_INTERVAL);
784   application.SendNotification();
785
786   notifyResult = notification.GetNotifyResult();
787
788   DALI_TEST_EQUALS( notifyResult, true, TEST_LOCATION );
789
790   gCallBackCalled = false;
791
792   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.0f, 200.0f ) );
793
794   application.Render(RENDER_FRAME_INTERVAL);
795   application.SendNotification();
796   application.Render(RENDER_FRAME_INTERVAL);
797   application.SendNotification();
798
799   notifyResult = notification.GetNotifyResult();
800
801   DALI_TEST_EQUALS( notifyResult, true, TEST_LOCATION );
802
803   END_TEST;
804 }
805
806 int UtcDaliPropertyConditionGetArguments(void)
807 {
808   TestApplication application;
809   tet_infoline(" UtcDaliPropertyConditionGetArguments");
810
811   PropertyCondition condition = GreaterThanCondition( 50.0f );
812
813   DALI_TEST_EQUALS( condition.GetArgumentCount(), 1u, TEST_LOCATION );
814   float value = condition.GetArgument( 0 );
815   DALI_TEST_EQUALS( value, 50.0f, TEST_LOCATION );
816
817   condition = InsideCondition( 125.0f, 250.0f );
818
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 );
824   END_TEST;
825 }
826
827 int UtcDaliPropertyNotificationStepVector4(void)
828 {
829   TestApplication application;
830   tet_infoline(" UtcDaliPropertyNotificationStepVector4");
831
832   Actor actor = Actor::New();
833   application.GetScene().Add(actor);
834
835   const float step = 10.0f;
836   float initValue = 5.0f;
837
838   PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::COLOR, StepCondition(step * 2, 0.0f) );
839   notification.NotifySignal().Connect( &TestCallback );
840
841   actor.SetProperty( Actor::Property::COLOR, Vector4(initValue, 0.0f, 0.0f, 0.0f));
842   Wait(application, DEFAULT_WAIT_PERIOD);
843
844   // test both directions
845   for( int i = 1 ; i < 10 ; )
846   {
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 );
852
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 );
856   }
857
858   initValue = -5.0f;
859   actor.SetProperty( Actor::Property::COLOR, Vector4(initValue, 0.0f, 0.0f, 0.0f));
860   Wait(application, DEFAULT_WAIT_PERIOD);
861
862   for( int i = 1 ; i < 10 ; )
863   {
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 );
869
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 );
873   }
874   END_TEST;
875 }
876
877 int UtcDaliPropertyNotificationStepFloat(void)
878 {
879   TestApplication application;
880   tet_infoline(" UtcDaliPropertyNotificationStepFloat");
881
882   Actor actor = Actor::New();
883   application.GetScene().Add(actor);
884
885   const float step = 10.0f;
886   float initValue = 5.0f;
887
888   // float
889   PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION, 0, StepCondition(step * 2, 0.0f) );
890   notification.NotifySignal().Connect( &TestCallback );
891
892   // set initial position
893   actor.SetProperty( Actor::Property::POSITION, Vector3(initValue, 0.0f, 0.0f));
894   Wait(application, DEFAULT_WAIT_PERIOD);
895
896   // test both directions
897   for( int i = 1 ; i < 10 ; )
898   {
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 );
904
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 );
908   }
909
910   initValue = -5.0f;
911   actor.SetProperty( Actor::Property::POSITION, Vector3(initValue, 0.0f, 0.0f));
912   Wait(application, DEFAULT_WAIT_PERIOD);
913
914   for( int i = 1 ; i < 10 ; )
915   {
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 );
921
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 );
925   }
926   END_TEST;
927 }
928
929 int UtcDaliPropertyNotificationStepVector2(void)
930 {
931   TestApplication application;
932   tet_infoline(" UtcDaliPropertyNotificationStepVector2");
933
934   Actor actor = Actor::New();
935   application.GetScene().Add(actor);
936
937   const float step = 10.0f;
938   float initValue = 5.0f;
939
940   Property::Index propertyIndex = actor.RegisterProperty( "testProperty", Vector2::ZERO );
941
942   PropertyNotification notification = actor.AddPropertyNotification( propertyIndex, StepCondition(step * 2, 0.0f) );
943   notification.NotifySignal().Connect( &TestCallback );
944
945   actor.SetProperty( propertyIndex, Vector2(initValue, 0.0f));
946   Wait(application, DEFAULT_WAIT_PERIOD);
947
948   // test both directions
949   for( int i = 1 ; i < 10 ; )
950   {
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 );
956
957     actor.SetProperty( propertyIndex, Vector2(initValue + (i++ * step), 0.0f));
958     Wait(application, DEFAULT_WAIT_PERIOD);
959     DALI_TEST_CHECK( gCallBackCalled );
960   }
961
962   initValue = -5.0f;
963   actor.SetProperty( propertyIndex, Vector2(initValue, 0.0f));
964   Wait(application, DEFAULT_WAIT_PERIOD);
965
966   for( int i = 1 ; i < 10 ; )
967   {
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 );
973
974     actor.SetProperty( propertyIndex, Vector2(initValue -(i++ * step), 0.0f));
975     Wait(application, DEFAULT_WAIT_PERIOD);
976     DALI_TEST_CHECK( gCallBackCalled );
977   }
978   END_TEST;
979 }
980
981 int UtcDaliPropertyNotificationStepVector3(void)
982 {
983   TestApplication application;
984   tet_infoline(" UtcDaliPropertyNotificationStepVector3");
985
986   Actor actor = Actor::New();
987   application.GetScene().Add(actor);
988
989   const float step = 10.0f;
990   float initValue = 5.0f;
991
992   // float
993   PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION, StepCondition(step * 2, 0.0f) );
994   notification.NotifySignal().Connect( &TestCallback );
995
996   // set initial position
997   actor.SetProperty( Actor::Property::POSITION, Vector3(initValue, 0.0f, 0.0f));
998   Wait(application, DEFAULT_WAIT_PERIOD);
999
1000   // test both directions
1001   for( int i = 1 ; i < 10 ; )
1002   {
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 );
1008
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 );
1012   }
1013
1014   initValue = -5.0f;
1015   actor.SetProperty( Actor::Property::POSITION, Vector3( initValue, 0.0f, 0.0f) );
1016   Wait(application, DEFAULT_WAIT_PERIOD);
1017
1018   for( int i = 1 ; i < 10 ; )
1019   {
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 );
1025
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 );
1029   }
1030   END_TEST;
1031 }
1032
1033 int UtcDaliPropertyNotificationVariableStep(void)
1034 {
1035   TestApplication application;
1036   tet_infoline(" UtcDaliPropertyNotificationStep");
1037
1038   Actor actor = Actor::New();
1039   application.GetScene().Add(actor);
1040
1041   Dali::Vector<float> values;
1042
1043   const float averageStep = 100.0f;
1044
1045   for( int i = 1 ; i < 10 ; i++ )
1046   {
1047     values.PushBack(i * averageStep + (i % 2 == 0 ? -(averageStep * 0.2f) : (averageStep * 0.2f)));
1048   }
1049   // float
1050   PropertyNotification notification = actor.AddPropertyNotification( Actor::Property::POSITION, 0, VariableStepCondition(values) );
1051   notification.NotifySignal().Connect( &TestCallback );
1052
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);
1056
1057   for( unsigned int i = 0 ; i < values.Count() - 1 ; ++i )
1058   {
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 );
1065   }
1066   END_TEST;
1067 }
1068
1069 static bool gCallBack2Called = false;
1070 void TestCallback2(PropertyNotification& source)
1071 {
1072   gCallBack2Called = true;
1073 }
1074
1075 int UtcDaliPropertyNotificationOrder(void)
1076 {
1077   TestApplication application; // Reset all test adapter return codes
1078
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 );
1089   animation.Play();
1090
1091   // flush the queue
1092   application.SendNotification();
1093   // first frame
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;
1100
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
1103   // second frame
1104   application.Render(RENDER_FRAME_INTERVAL);
1105   DALI_TEST_EQUALS( gCallBackCalled, false, TEST_LOCATION );
1106   DALI_TEST_EQUALS( gCallBack2Called, false, TEST_LOCATION );
1107
1108   // serve the notifications
1109   application.SendNotification();
1110   DALI_TEST_EQUALS( gCallBackCalled, true, TEST_LOCATION );
1111   DALI_TEST_EQUALS( gCallBack2Called, true, TEST_LOCATION );
1112
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 );
1119
1120   END_TEST;
1121 }