Remove constaints from BloomView, GaussianBlurView & Magnifier
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-unmanaged / utc-Dali-ScrollViewEffect.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-toolkit-test-suite-utils.h>
22 #include <dali-toolkit/dali-toolkit.h>
23 #include <dali/integration-api/events/touch-event-integ.h>
24 #include <dali/integration-api/events/pan-gesture-event.h>
25
26
27 using namespace Dali;
28 using namespace Toolkit;
29
30 void dali_scroll_view_effect_startup(void)
31 {
32   test_return_value = TET_UNDEF;
33 }
34
35 void dali_scroll_view_effect_cleanup(void)
36 {
37   test_return_value = TET_PASS;
38 }
39
40 namespace
41 {
42
43 const int MILLISECONDS_PER_SECOND = 1000;
44 const int RENDER_FRAME_INTERVAL = 16;                           ///< Duration of each frame in ms. (at approx 60FPS)
45 const int RENDER_ANIMATION_TEST_DURATION_MS = 1000;             ///< 1000ms to test animation
46 const int RENDER_DELAY_SCROLL = 1000;                           ///< duration to wait for any scroll to complete.
47
48 /*
49  * Simulate time passed by.
50  *
51  * @note this will always process at least 1 frame (1/60 sec)
52  *
53  * @param application Test application instance
54  * @param duration Time to pass in milliseconds.
55  * @return The actual time passed in milliseconds
56  */
57 int Wait(ToolkitTestApplication& application, int duration = 0)
58 {
59   int time = 0;
60
61   for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
62   {
63     application.SendNotification();
64     application.Render(RENDER_FRAME_INTERVAL);
65     time += RENDER_FRAME_INTERVAL;
66   }
67
68   return time;
69 }
70
71 /**
72  * Creates a Ruler that snaps to a specified grid size.
73  * If that grid size is 0.0 then this ruler does not
74  * snap.
75  *
76  * @param[in] gridSize (optional) The grid size for the ruler,
77  * (Default = 0.0 i.e. no snapping)
78  * @return The ruler is returned.
79  */
80 RulerPtr CreateRuler(float gridSize = 0.0f)
81 {
82   if(gridSize <= Math::MACHINE_EPSILON_0)
83   {
84       return new DefaultRuler();
85   }
86   return new FixedRuler(gridSize);
87 }
88
89 // Callback probes.
90
91 static bool gOnScrollStartCalled;                       ///< Whether the OnScrollStart signal was invoked.
92 static bool gOnScrollUpdateCalled;                      ///< Whether the OnScrollUpdate signal was invoked.
93 static bool gOnScrollCompleteCalled;                    ///< Whether the OnScrollComplete signal was invoked.
94 static Vector3 gConstraintResult;                       ///< Result from constraint.
95
96 static ActorContainer gPages;                                ///< Keeps track of all the pages for applying effects.
97
98 static void ResetScrollCallbackResults()
99 {
100   gOnScrollStartCalled = false;
101   gOnScrollUpdateCalled = false;
102   gOnScrollCompleteCalled = false;
103 }
104
105 /**
106  * Invoked when scrolling starts.
107  *
108  * @param[in] position The current scroll position.
109  */
110 static void OnScrollStart( const Vector3& position )
111 {
112   gOnScrollStartCalled = true;
113 }
114
115 /**
116  * Invoked when scrolling updates (via dragging)
117  *
118  * @param[in] position The current scroll position.
119  */
120 static void OnScrollUpdate( const Vector3& position )
121 {
122   gOnScrollUpdateCalled = true;
123 }
124
125 /**
126  * Invoked when scrolling finishes
127  *
128  * @param[in] position The current scroll position.
129  */
130 static void OnScrollComplete( const Vector3& position )
131 {
132   gOnScrollCompleteCalled = true;
133 }
134
135
136 ScrollView SetupTestScrollView(int rows, int columns, Vector2 size)
137 {
138   ScrollView scrollView = ScrollView::New();
139   scrollView.SetSize(size);
140   scrollView.SetAnchorPoint(AnchorPoint::CENTER);
141   scrollView.SetParentOrigin(ParentOrigin::CENTER);
142   scrollView.ApplyConstraint( Constraint::New<Dali::Vector3>( Dali::Actor::SIZE, Dali::ParentSource( Dali::Actor::SIZE ), Dali::EqualToConstraint() ) );
143   scrollView.SetWrapMode(false);
144   scrollView.ScrollStartedSignal().Connect( &OnScrollStart );
145   scrollView.ScrollUpdatedSignal().Connect( &OnScrollUpdate );
146   scrollView.ScrollCompletedSignal().Connect( &OnScrollComplete );
147   Stage::GetCurrent().Add( scrollView );
148   RulerPtr rulerX = CreateRuler(size.width);
149   RulerPtr rulerY = CreateRuler(size.height);
150   if(columns > 1)
151   {
152     rulerX->SetDomain(RulerDomain(0.0f, size.width * columns));
153   }
154   else
155   {
156     rulerX->Disable();
157   }
158   if(rows > 1)
159   {
160     rulerY->SetDomain(RulerDomain(0.0f, size.width * rows));
161   }
162   else
163   {
164     rulerY->Disable();
165   }
166
167   scrollView.SetRulerX( rulerX );
168   scrollView.SetRulerY( rulerY );
169   Stage::GetCurrent().Add( scrollView );
170
171   Actor container = Actor::New();
172   container.SetParentOrigin(ParentOrigin::CENTER);
173   container.SetAnchorPoint(AnchorPoint::CENTER);
174   container.SetSize( size );
175   scrollView.Add( container );
176   container.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
177
178   gPages.clear();
179   for(int row = 0;row<rows;row++)
180   {
181     for(int column = 0;column<columns;column++)
182     {
183       Actor page = Actor::New();
184       page.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
185       page.SetParentOrigin( ParentOrigin::CENTER );
186       page.SetAnchorPoint( AnchorPoint::CENTER );
187       page.SetPosition( column * size.x, row * size.y );
188       container.Add(page);
189
190       gPages.push_back(page);
191     }
192   }
193
194   ResetScrollCallbackResults();
195   return scrollView;
196 }
197
198 void CleanupTest()
199 {
200   gPages.clear();
201   ResetScrollCallbackResults();
202 }
203
204 Actor AddActorToPage(Actor page, float x, float y, float cols, float rows)
205 {
206   Stage stage = Stage::GetCurrent();
207   Vector2 stageSize = stage.GetSize();
208
209   const float margin = 10.0f;
210   const Vector2 actorSize((stageSize.x / cols) - margin, (stageSize.y / rows) - margin);
211
212   Actor actor = Actor::New();
213   actor.SetParentOrigin( ParentOrigin::CENTER );
214   actor.SetAnchorPoint( AnchorPoint::CENTER );
215
216   Vector3 position( margin * 0.5f + (actorSize.x + margin) * x - stageSize.width * 0.5f,
217                     margin * 0.5f + (actorSize.y + margin) * y - stageSize.height * 0.5f,
218                     0.0f);
219   Vector3 positionEnd( margin * 0.5f + (actorSize.x + margin) * (x + cols) - stageSize.width * 0.5f - margin,
220                        margin * 0.5f + (actorSize.y + margin) * (y + rows) - stageSize.height * 0.5f - margin,
221                        0.0f);
222   Vector3 size(positionEnd - position);
223   actor.SetPosition( position + size * 0.5f);
224   actor.SetSize( positionEnd - position );
225   page.Add(actor);
226   return actor;
227 }
228
229 } // unnamed namespace
230
231
232 int UtcDaliScrollViewPageCubeEffectSetup(void)
233 {
234   tet_infoline(" UtcDaliScrollViewPageCubeEffectSetup");
235
236   ScrollViewPageCubeEffect effect;
237
238   DALI_TEST_CHECK( !effect );
239
240   BaseHandle handle = ScrollViewPageCubeEffect::New();
241
242   DALI_TEST_CHECK( handle );
243
244   effect = ScrollViewPageCubeEffect::DownCast(handle);
245
246   DALI_TEST_CHECK( effect );
247   END_TEST;
248 }
249
250
251 int UtcDaliScrollViewPageCarouselEffectSetup(void)
252 {
253   tet_infoline(" UtcDaliScrollViewCarouselEffectSetup");
254
255   ScrollViewPageCarouselEffect effect;
256
257   DALI_TEST_CHECK( !effect );
258
259   BaseHandle handle = ScrollViewPageCarouselEffect::New();
260
261   DALI_TEST_CHECK( handle );
262
263   effect = ScrollViewPageCarouselEffect::DownCast(handle);
264
265   DALI_TEST_CHECK( effect );
266   END_TEST;
267 }
268
269 int UtcDaliScrollViewCarouselEffectSetup(void)
270 {
271   tet_infoline(" UtcDaliScrollViewCarouselEffectSetup");
272
273   ScrollViewCarouselEffect effect;
274
275   DALI_TEST_CHECK( !effect );
276
277   BaseHandle handle = ScrollViewCarouselEffect::New();
278
279   DALI_TEST_CHECK( handle );
280
281   effect = ScrollViewCarouselEffect::DownCast(handle);
282
283   DALI_TEST_CHECK( effect );
284   END_TEST;
285 }
286
287 int UtcDaliScrollViewDepthEffectSetup(void)
288 {
289   tet_infoline(" UtcDaliScrollViewDepthEffectSetup");
290
291   ScrollViewDepthEffect effect;
292
293   DALI_TEST_CHECK( !effect );
294
295   BaseHandle handle = ScrollViewDepthEffect::New();
296
297   DALI_TEST_CHECK( handle );
298
299   effect = ScrollViewDepthEffect::DownCast(handle);
300
301   DALI_TEST_CHECK( effect );
302   END_TEST;
303 }
304
305
306 int UtcDaliScrollViewPageCubeEffectTest(void)
307 {
308   ToolkitTestApplication application;
309   tet_infoline(" UtcDaliScrollViewPageCubeEffectTest");
310
311   Vector2 size = Stage::GetCurrent().GetSize();
312
313   ScrollView scrollView = SetupTestScrollView(1, 3, size);
314   Actor testPage = gPages[1];
315   Wait(application, 500);
316
317   ScrollViewPageCubeEffect effect = ScrollViewPageCubeEffect::New();
318   scrollView.ApplyEffect(effect);
319
320   for(ActorIter pageIter = gPages.begin(); pageIter != gPages.end(); ++pageIter)
321   {
322     Actor page = *pageIter;
323     page.RemoveConstraints();
324     page.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
325     effect.ApplyToPage(page, Vector2(Math::PI_2, 0.0f));
326   }
327   Wait(application);
328
329   scrollView.ScrollTo(1);
330   while(!gOnScrollCompleteCalled)
331   {
332     Wait(application);
333   }
334   // test that the first page has reached centre of screen
335   Vector3 pagePos = testPage.GetCurrentPosition();
336   DALI_TEST_EQUALS(pagePos, Vector3::ZERO, Math::MACHINE_EPSILON_0, TEST_LOCATION);
337   CleanupTest();
338   END_TEST;
339 }
340
341 int UtcDaliScrollViewPageCarouselEffectTest(void)
342 {
343   ToolkitTestApplication application;
344   tet_infoline(" UtcDaliScrollViewPageCarouselEffectTest");
345
346   Vector2 size = Stage::GetCurrent().GetSize();
347
348   ScrollView scrollView = SetupTestScrollView(1, 3, size);
349   Actor testPage = gPages[1];
350   Wait(application, 500);
351
352   ScrollViewPageCarouselEffect effect = ScrollViewPageCarouselEffect::New();
353   scrollView.ApplyEffect(effect);
354
355   for(ActorIter pageIter = gPages.begin(); pageIter != gPages.end(); ++pageIter)
356   {
357     Actor page = *pageIter;
358     page.RemoveConstraints();
359     page.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
360     effect.ApplyToPage(page);
361   }
362   Wait(application);
363
364   scrollView.ScrollTo(1, 0.5f, DirectionBiasNone);
365   while(!gOnScrollCompleteCalled)
366   {
367     Wait(application);
368   }
369   // test that the first page has reached centre of screen
370   Vector3 pagePos = testPage.GetCurrentPosition();
371   DALI_TEST_EQUALS(pagePos, Vector3::ZERO, Math::MACHINE_EPSILON_0, TEST_LOCATION);
372   CleanupTest();
373   END_TEST;
374 }
375
376 int UtcDaliScrollViewCarouselEffectTest(void)
377 {
378   ToolkitTestApplication application;
379   tet_infoline(" UtcDaliScrollViewCarouselEffectTest");
380
381   Vector2 size = Stage::GetCurrent().GetSize();
382
383   ScrollView scrollView = SetupTestScrollView(1, 3, size);
384   Actor testPage = gPages[1];
385   Wait(application, 500);
386
387   ScrollViewCarouselEffect effect = ScrollViewCarouselEffect::New();
388   scrollView.ApplyEffect(effect);
389
390   Actor actor = AddActorToPage(testPage, 0.5f, 0.5f, 3, 3);
391   Wait(application);
392   Vector3 actorPrePosition = actor.GetCurrentPosition();
393
394   effect.ApplyToActor( actor, Vector2(1.2f, 1.2f) );
395
396   scrollView.ScrollTo(Vector3(size.x, 0.0f, 0.0f), 0.5f, DirectionBiasNone, DirectionBiasNone);
397   while(!gOnScrollCompleteCalled)
398   {
399     Wait(application);
400   }
401   // test that the first page has reached centre of screen
402   Vector3 actorPostPosition = actor.GetCurrentPosition();
403   // just check the actor has moved
404   DALI_TEST_CHECK((actorPostPosition - actorPrePosition).Length() > Math::MACHINE_EPSILON_1);
405   CleanupTest();
406   END_TEST;
407 }
408
409 int UtcDaliScrollViewDepthEffectTest(void)
410 {
411   ToolkitTestApplication application;
412   tet_infoline(" UtcDaliScrollViewDepthEffectTest");
413
414   Vector2 size = Stage::GetCurrent().GetSize();
415
416   ScrollView scrollView = SetupTestScrollView(1, 3, size);
417   Actor testPage = gPages[1];
418   Wait(application, 500);
419
420   ScrollViewDepthEffect effect = ScrollViewDepthEffect::New();
421   scrollView.ApplyEffect(effect);
422
423   Actor actor = AddActorToPage(testPage, 0.5f, 0.5f, 3, 3);
424   Wait(application);
425   Vector3 actorPrePosition = actor.GetCurrentPosition();
426
427   const Vector2 positionExtent(0.5f, 2.5f);
428   const Vector2 offsetExtent(1.0f, 1.0f);
429   const float positionScale(1.5f);
430   const float scaleExtent(0.5f);
431
432   effect.ApplyToActor( actor, positionExtent, offsetExtent, positionScale, scaleExtent );
433
434   scrollView.ScrollTo(1);
435   while(!gOnScrollCompleteCalled)
436   {
437     Wait(application);
438   }
439   // test that the first page has reached centre of screen
440   Vector3 actorPostPosition = actor.GetCurrentPosition();
441   // just check the actor has moved
442   DALI_TEST_CHECK((actorPostPosition - actorPrePosition).Length() > Math::MACHINE_EPSILON_1);
443   CleanupTest();
444   END_TEST;
445 }