2 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 // Need to override adaptor classes for toolkit test harness, so include
22 // test harness headers before dali headers.
23 #include <dali-toolkit-test-suite-utils.h>
26 #include <dali-toolkit/dali-toolkit.h>
27 #include <dali/integration-api/events/touch-event-integ.h>
30 using namespace Toolkit;
32 void utc_dali_toolkit_scroll_view_effect_startup(void)
34 test_return_value = TET_UNDEF;
37 void utc_dali_toolkit_scroll_view_effect_cleanup(void)
39 test_return_value = TET_PASS;
45 const int RENDER_FRAME_INTERVAL = 16; ///< Duration of each frame in ms. (at approx 60FPS)
48 * Simulate time passed by.
50 * @note this will always process at least 1 frame (1/60 sec)
52 * @param application Test application instance
53 * @param duration Time to pass in milliseconds.
54 * @return The actual time passed in milliseconds
56 int Wait(ToolkitTestApplication& application, int duration = 0)
60 for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
62 application.SendNotification();
63 application.Render(RENDER_FRAME_INTERVAL);
64 time += RENDER_FRAME_INTERVAL;
71 * Creates a Ruler that snaps to a specified grid size.
72 * If that grid size is 0.0 then this ruler does not
75 * @param[in] gridSize (optional) The grid size for the ruler,
76 * (Default = 0.0 i.e. no snapping)
77 * @return The ruler is returned.
79 RulerPtr CreateRuler(float gridSize = 0.0f)
81 if(gridSize <= Math::MACHINE_EPSILON_0)
83 return new DefaultRuler();
85 return new FixedRuler(gridSize);
90 static bool gOnScrollStartCalled; ///< Whether the OnScrollStart signal was invoked.
91 static bool gOnScrollUpdateCalled; ///< Whether the OnScrollUpdate signal was invoked.
92 static bool gOnScrollCompleteCalled; ///< Whether the OnScrollComplete signal was invoked.
93 static Vector3 gConstraintResult; ///< Result from constraint.
95 static std::vector< Actor > gPages; ///< Keeps track of all the pages for applying effects.
96 typedef std::vector< Actor >::iterator ActorIter;
98 static void ResetScrollCallbackResults()
100 gOnScrollStartCalled = false;
101 gOnScrollUpdateCalled = false;
102 gOnScrollCompleteCalled = false;
106 * Invoked when scrolling starts.
108 * @param[in] position The current scroll position.
110 static void OnScrollStart( const Vector2& position )
112 gOnScrollStartCalled = true;
116 * Invoked when scrolling updates (via dragging)
118 * @param[in] position The current scroll position.
120 static void OnScrollUpdate( const Vector2& position )
122 gOnScrollUpdateCalled = true;
126 * Invoked when scrolling finishes
128 * @param[in] position The current scroll position.
130 static void OnScrollComplete( const Vector2& position )
132 gOnScrollCompleteCalled = true;
135 ScrollView SetupTestScrollView(Integration::Scene scene, int rows, int columns, Vector2 size)
137 Constraint constraint;
139 ScrollView scrollView = ScrollView::New();
140 scrollView.SetProperty( Actor::Property::SIZE, size);
141 scrollView.SetProperty( Actor::Property::ANCHOR_POINT,AnchorPoint::CENTER);
142 scrollView.SetProperty( Actor::Property::PARENT_ORIGIN,ParentOrigin::CENTER);
144 constraint = Constraint::New<Dali::Vector3>( scrollView, Dali::Actor::Property::SIZE, Dali::EqualToConstraint() );
145 constraint.AddSource( Dali::ParentSource( Dali::Actor::Property::SIZE ) );
148 scrollView.SetWrapMode(false);
149 scrollView.ScrollStartedSignal().Connect( &OnScrollStart );
150 scrollView.ScrollUpdatedSignal().Connect( &OnScrollUpdate );
151 scrollView.ScrollCompletedSignal().Connect( &OnScrollComplete );
152 scene.Add( scrollView );
153 RulerPtr rulerX = CreateRuler(size.width);
154 RulerPtr rulerY = CreateRuler(size.height);
157 rulerX->SetDomain(RulerDomain(0.0f, size.width * columns));
165 rulerY->SetDomain(RulerDomain(0.0f, size.width * rows));
172 scrollView.SetRulerX( rulerX );
173 scrollView.SetRulerY( rulerY );
174 scene.Add( scrollView );
176 Actor container = Actor::New();
177 container.SetProperty( Actor::Property::PARENT_ORIGIN,ParentOrigin::CENTER);
178 container.SetProperty( Actor::Property::ANCHOR_POINT,AnchorPoint::CENTER);
179 container.SetProperty( Actor::Property::SIZE, size );
180 scrollView.Add( container );
182 constraint = Constraint::New<Vector3>( container, Actor::Property::SIZE, EqualToConstraint() );
183 constraint.AddSource( Dali::ParentSource( Dali::Actor::Property::SIZE ) );
187 for(int row = 0;row<rows;row++)
189 for(int column = 0;column<columns;column++)
191 Actor page = Actor::New();
193 constraint = Constraint::New<Vector3>( page, Actor::Property::SIZE, EqualToConstraint() );
194 constraint.AddSource( Dali::ParentSource( Dali::Actor::Property::SIZE ) );
196 page.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
197 page.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER );
198 page.SetProperty( Actor::Property::POSITION, Vector2( column * size.x, row * size.y ));
201 gPages.push_back(page);
205 ResetScrollCallbackResults();
212 ResetScrollCallbackResults();
215 } // unnamed namespace
217 int UtcDaliScrollViewPagePathEffectSetup(void)
219 ToolkitTestApplication application;
220 tet_infoline(" UtcDaliScrollViewPagePathEffectSetup");
222 ScrollViewPagePathEffect effect;
224 DALI_TEST_CHECK( !effect );
226 BaseHandle handle = ScrollViewPagePathEffect::New(Dali::Path::New(), Vector3::ZERO,Toolkit::ScrollView::Property::SCROLL_FINAL_X, Vector3::ZERO,0);
228 DALI_TEST_CHECK( handle );
230 effect = ScrollViewPagePathEffect::DownCast(handle);
232 DALI_TEST_CHECK( effect );
236 int UtcDaliScrollViewPagePathEffectTest(void)
238 ToolkitTestApplication application;
239 tet_infoline(" UtcDaliScrollViewPagePathEffectTest");
241 Vector2 size = application.GetScene().GetSize();
243 ScrollView scrollView = SetupTestScrollView(application.GetScene(), 1, 3, size);
244 Actor testPage = gPages[2];
245 Wait(application, 500);
248 float xHalfSize( size.x * 0.5f);
250 Dali::Path path = Dali::Path::New();
251 Dali::Property::Array points;
253 points[0] = Vector3( xHalfSize, 0.0f, -xHalfSize);
254 points[1] = Vector3( 0.0f, 0.0f, 0.0f );
255 points[2] = Vector3( -xHalfSize, 0.0f, -xHalfSize);
256 path.SetProperty( Path::Property::POINTS, points );
258 Dali::Property::Array controlPoints;
259 controlPoints.Resize(4);
260 controlPoints[0] = Vector3( xHalfSize, 0.0f, 0.0f );
261 controlPoints[1] = Vector3( xHalfSize, 0.0f, 0.0f );
262 controlPoints[2] = Vector3(-xHalfSize, 0.0f, 0.0f );
263 controlPoints[3] = Vector3(-xHalfSize, 0.0f, 0.0f );
264 path.SetProperty( Path::Property::CONTROL_POINTS, controlPoints );
266 ScrollViewPagePathEffect effect = ScrollViewPagePathEffect::New(path,
268 Toolkit::ScrollView::Property::SCROLL_FINAL_X,
269 Vector3(size.x,size.y,0.0f),
271 scrollView.ApplyEffect(effect);
273 unsigned int pageCounter(0);
274 for(ActorIter pageIter = gPages.begin(); pageIter != gPages.end(); ++pageIter)
276 Actor page = *pageIter;
277 page.RemoveConstraints();
278 Constraint constraint = Constraint::New<Vector3>( page, Actor::Property::SIZE, EqualToConstraint() );
279 constraint.AddSource( ParentSource( Actor::Property::SIZE ) );
281 effect.ApplyToPage(page, pageCounter++);
285 scrollView.ScrollTo(1);
286 while(!gOnScrollCompleteCalled)
291 // test that the test page has reached centre of screen
292 Vector3 pagePos = testPage.GetCurrentProperty< Vector3 >( Actor::Property::POSITION );
293 DALI_TEST_EQUALS(pagePos, Vector3::ZERO, Math::MACHINE_EPSILON_0, TEST_LOCATION);