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.
18 #include <dali-test-suite-utils.h>
19 #include <dali/devel-api/common/map-wrapper.h>
20 #include <dali/devel-api/common/stage-devel.h>
21 #include <dali/devel-api/update/frame-callback-interface.h>
22 #include <dali/devel-api/update/update-proxy.h>
23 #include <dali/public-api/dali-core.h>
30 void utc_dali_frame_callback_interface_startup(void)
32 test_return_value = TET_UNDEF;
35 void utc_dali_frame_callback_interface_cleanup(void)
37 test_return_value = TET_PASS;
40 ///////////////////////////////////////////////////////////////////////////////
43 class FrameCallbackBasic : public FrameCallbackInterface
46 FrameCallbackBasic() = default;
48 virtual void Update(Dali::UpdateProxy& updateProxy, float elapsedSeconds)
61 class FrameCallbackOneActor : public FrameCallbackBasic
64 FrameCallbackOneActor(unsigned int actorId)
69 virtual void Update(Dali::UpdateProxy& updateProxy, float elapsedSeconds) override
71 FrameCallbackBasic::Update(updateProxy, elapsedSeconds);
72 updateProxy.GetSize(mActorId, mSizeGetSizeCall);
73 updateProxy.GetPosition(mActorId, mPositionGetPositionCall);
74 updateProxy.GetPositionAndSize(mActorId, mPositionGetPositionAndSizeCall, mSizeGetPositionAndSizeCall);
75 updateProxy.GetColor(mActorId, mColor);
76 updateProxy.GetScale(mActorId, mScale);
79 const unsigned int mActorId;
81 Vector3 mSizeGetSizeCall;
82 Vector3 mPositionGetPositionCall;
83 Vector3 mPositionGetPositionAndSizeCall;
84 Vector3 mSizeGetPositionAndSizeCall;
89 class FrameCallbackSetter : public FrameCallbackBasic
94 const Vector3& sizeToSet,
95 const Vector3& positionToSet,
96 const Vector4& colorToSet,
97 const Vector3& scaleToSet)
99 mSizeToSet(sizeToSet),
100 mPositionToSet(positionToSet),
101 mColorToSet(colorToSet),
102 mScaleToSet(scaleToSet)
106 virtual void Update(Dali::UpdateProxy& updateProxy, float elapsedSeconds) override
108 FrameCallbackBasic::Update(updateProxy, elapsedSeconds);
109 updateProxy.SetSize(mActorId, mSizeToSet);
110 updateProxy.SetPosition(mActorId, mPositionToSet);
111 updateProxy.SetColor(mActorId, mColorToSet);
112 updateProxy.SetScale(mActorId, mScaleToSet);
113 updateProxy.GetSize(mActorId, mSizeAfterSetting);
114 updateProxy.GetPosition(mActorId, mPositionAfterSetting);
115 updateProxy.GetColor(mActorId, mColorAfterSetting);
116 updateProxy.GetScale(mActorId, mScaleAfterSetting);
119 const unsigned int mActorId;
120 const Vector3& mSizeToSet;
121 const Vector3& mPositionToSet;
122 const Vector4& mColorToSet;
123 const Vector3& mScaleToSet;
125 Vector3 mSizeAfterSetting;
126 Vector3 mPositionAfterSetting;
127 Vector4 mColorAfterSetting;
128 Vector3 mScaleAfterSetting;
131 class FrameCallbackBaker : public FrameCallbackBasic
135 unsigned int actorId,
136 const Vector3& sizeToSet,
137 const Vector3& positionToSet,
138 const Vector4& colorToSet,
139 const Vector3& scaleToSet)
141 mSizeToSet(sizeToSet),
142 mPositionToSet(positionToSet),
143 mColorToSet(colorToSet),
144 mScaleToSet(scaleToSet)
148 virtual void Update(Dali::UpdateProxy& updateProxy, float elapsedSeconds) override
150 FrameCallbackBasic::Update(updateProxy, elapsedSeconds);
151 updateProxy.BakeSize(mActorId, mSizeToSet);
152 updateProxy.BakePosition(mActorId, mPositionToSet);
153 updateProxy.BakeColor(mActorId, mColorToSet);
154 updateProxy.BakeScale(mActorId, mScaleToSet);
155 updateProxy.GetSize(mActorId, mSizeAfterSetting);
156 updateProxy.GetPosition(mActorId, mPositionAfterSetting);
157 updateProxy.GetColor(mActorId, mColorAfterSetting);
158 updateProxy.GetScale(mActorId, mScaleAfterSetting);
161 const unsigned int mActorId;
162 const Vector3& mSizeToSet;
163 const Vector3& mPositionToSet;
164 const Vector4& mColorToSet;
165 const Vector3& mScaleToSet;
167 Vector3 mSizeAfterSetting;
168 Vector3 mPositionAfterSetting;
169 Vector4 mColorAfterSetting;
170 Vector3 mScaleAfterSetting;
173 class FrameCallbackMultipleActors : public FrameCallbackBasic
176 FrameCallbackMultipleActors()
180 virtual void Update(Dali::UpdateProxy& updateProxy, float elapsedSeconds) override
182 FrameCallbackBasic::Update(updateProxy, elapsedSeconds);
183 for(auto&& i : mActorIds)
187 updateProxy.GetPositionAndSize(i, position, size);
188 mPositions[i] = position;
193 Vector<unsigned int> mActorIds;
195 std::map<unsigned int, Vector3> mPositions;
196 std::map<unsigned int, Vector3> mSizes;
199 class FrameCallbackActorIdCheck : public FrameCallbackBasic
202 FrameCallbackActorIdCheck(unsigned int actorId)
207 virtual void Update(Dali::UpdateProxy& updateProxy, float elapsedSeconds) override
209 FrameCallbackBasic::Update(updateProxy, elapsedSeconds);
213 mGetSizeCallSuccess = updateProxy.GetSize(mActorId, vec3);
214 mGetPositionCallSuccess = updateProxy.GetPosition(mActorId, vec3);
215 mGetColorCallSuccess = updateProxy.GetColor(mActorId, vec4);
216 mGetScaleCallSuccess = updateProxy.GetScale(mActorId, vec3);
217 mGetPositionAndSizeCallSuccess = updateProxy.GetPositionAndSize(mActorId, vec3, vec3);
218 mSetSizeCallSuccess = updateProxy.SetSize(mActorId, vec3);
219 mSetPositionCallSuccess = updateProxy.SetPosition(mActorId, vec3);
220 mSetColorCallSuccess = updateProxy.SetColor(mActorId, vec4);
221 mSetScaleCallSuccess = updateProxy.SetScale(mActorId, vec3);
222 mBakeSizeCallSuccess = updateProxy.BakeSize(mActorId, vec3);
223 mBakePositionCallSuccess = updateProxy.BakePosition(mActorId, vec3);
224 mBakeColorCallSuccess = updateProxy.BakeColor(mActorId, vec4);
225 mBakeScaleCallSuccess = updateProxy.BakeScale(mActorId, vec3);
228 virtual void Reset() override
231 FrameCallbackBasic::Reset();
233 mGetSizeCallSuccess = false;
234 mGetPositionCallSuccess = false;
235 mGetColorCallSuccess = false;
236 mGetScaleCallSuccess = false;
237 mGetPositionAndSizeCallSuccess = false;
238 mSetSizeCallSuccess = false;
239 mSetPositionCallSuccess = false;
240 mSetColorCallSuccess = false;
241 mSetScaleCallSuccess = false;
242 mBakeSizeCallSuccess = false;
243 mBakePositionCallSuccess = false;
244 mBakeColorCallSuccess = false;
245 mBakeScaleCallSuccess = false;
248 const uint32_t mActorId;
249 bool mGetSizeCallSuccess{false};
250 bool mGetPositionCallSuccess{false};
251 bool mGetColorCallSuccess{false};
252 bool mGetScaleCallSuccess{false};
253 bool mGetPositionAndSizeCallSuccess{false};
254 bool mSetSizeCallSuccess{false};
255 bool mSetPositionCallSuccess{false};
256 bool mSetColorCallSuccess{false};
257 bool mSetScaleCallSuccess{false};
258 bool mBakeSizeCallSuccess{false};
259 bool mBakePositionCallSuccess{false};
260 bool mBakeColorCallSuccess{false};
261 bool mBakeScaleCallSuccess{false};
266 ///////////////////////////////////////////////////////////////////////////////
268 int UtcDaliFrameCallbackCheckInstallationAndRemoval(void)
270 // Basic test to check that the frame-callback can be installed and removed correctly
272 TestApplication application;
274 FrameCallbackBasic frameCallback;
276 Stage stage = Stage::GetCurrent();
277 DevelStage::AddFrameCallback(stage, frameCallback, stage.GetRootLayer());
279 application.SendNotification();
280 application.Render();
282 DALI_TEST_EQUALS(frameCallback.mCalled, true, TEST_LOCATION);
284 frameCallback.mCalled = false;
286 DevelStage::RemoveFrameCallback(stage, frameCallback);
288 application.SendNotification();
289 application.Render();
291 DALI_TEST_EQUALS(frameCallback.mCalled, false, TEST_LOCATION);
296 int UtcDaliFrameCallbackGetters(void)
298 // Test to see that the Getters all return the expected values
300 TestApplication application;
301 Vector2 actorSize(200, 300);
302 Vector4 color(0.5f, 0.6f, 0.7f, 0.8f);
303 Vector3 position(10.0f, 20.0f, 30.0f);
304 Vector3 scale(2.0f, 4.0f, 6.0f);
306 Actor actor = Actor::New();
307 actor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
308 actor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
309 actor.SetProperty(Actor::Property::SIZE, actorSize);
310 actor.SetProperty(Actor::Property::COLOR, color);
311 actor.SetProperty(Actor::Property::POSITION, position);
312 actor.SetProperty(Actor::Property::SCALE, scale);
314 Stage stage = Stage::GetCurrent();
317 FrameCallbackOneActor frameCallback(actor.GetProperty<int>(Actor::Property::ID));
318 DevelStage::AddFrameCallback(stage, frameCallback, stage.GetRootLayer());
320 application.SendNotification();
321 application.Render();
323 DALI_TEST_EQUALS(frameCallback.mCalled, true, TEST_LOCATION);
324 DALI_TEST_EQUALS(frameCallback.mSizeGetSizeCall, Vector3(actorSize.width, actorSize.height, 0.0f), TEST_LOCATION);
325 DALI_TEST_EQUALS(frameCallback.mPositionGetPositionCall, position, TEST_LOCATION);
326 DALI_TEST_EQUALS(frameCallback.mPositionGetPositionAndSizeCall, position, TEST_LOCATION);
327 DALI_TEST_EQUALS(frameCallback.mSizeGetPositionAndSizeCall, Vector3(actorSize.width, actorSize.height, 0.0f), TEST_LOCATION);
328 DALI_TEST_EQUALS(frameCallback.mColor, color, TEST_LOCATION);
329 DALI_TEST_EQUALS(frameCallback.mScale, scale, TEST_LOCATION);
334 int UtcDaliFrameCallbackSetters(void)
336 // Test to see that the setters set the values appropriately
338 TestApplication application;
339 Vector2 actorSize(200, 300);
341 Actor actor = Actor::New();
342 actor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
343 actor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
344 actor.SetProperty(Actor::Property::SIZE, actorSize);
346 Stage stage = Stage::GetCurrent();
349 Vector3 sizeToSet(1.0f, 2.0f, 3.0f);
350 Vector3 positionToSet(10.0f, 20.0f, 30.0f);
351 Vector4 colorToSet(Color::MAGENTA);
352 Vector3 scaleToSet(1.0f, 3.0f, 5.0f);
354 FrameCallbackSetter frameCallback(actor.GetProperty<int>(Actor::Property::ID), sizeToSet, positionToSet, colorToSet, scaleToSet);
355 DevelStage::AddFrameCallback(stage, frameCallback, stage.GetRootLayer());
357 application.SendNotification();
358 application.Render();
360 DALI_TEST_EQUALS(frameCallback.mCalled, true, TEST_LOCATION);
361 DALI_TEST_EQUALS(frameCallback.mSizeAfterSetting, sizeToSet, TEST_LOCATION);
362 DALI_TEST_EQUALS(frameCallback.mPositionAfterSetting, positionToSet, TEST_LOCATION);
363 DALI_TEST_EQUALS(frameCallback.mColorAfterSetting, colorToSet, TEST_LOCATION);
364 DALI_TEST_EQUALS(frameCallback.mScaleAfterSetting, scaleToSet, TEST_LOCATION);
366 // Ensure the actual actor values haven't changed as we didn't bake the values after removing the callback
367 DevelStage::RemoveFrameCallback(stage, frameCallback);
369 application.SendNotification();
370 application.Render();
372 DALI_TEST_EQUALS(actor.GetCurrentProperty(Actor::Property::POSITION).Get<Vector3>(), Vector3::ZERO, TEST_LOCATION);
373 DALI_TEST_EQUALS(actor.GetCurrentProperty(Actor::Property::SIZE).Get<Vector3>(), Vector3(actorSize), TEST_LOCATION);
374 DALI_TEST_EQUALS(actor.GetCurrentProperty(Actor::Property::COLOR).Get<Vector4>(), Color::WHITE, TEST_LOCATION);
375 DALI_TEST_EQUALS(actor.GetCurrentProperty(Actor::Property::SCALE).Get<Vector3>(), Vector3::ONE, TEST_LOCATION);
377 // Render for a couple more frames to ensure the values are reset properly (some values are double-buffered)
379 application.SendNotification();
380 application.Render();
382 DALI_TEST_EQUALS(actor.GetCurrentProperty(Actor::Property::POSITION).Get<Vector3>(), Vector3::ZERO, TEST_LOCATION);
383 DALI_TEST_EQUALS(actor.GetCurrentProperty(Actor::Property::SIZE).Get<Vector3>(), Vector3(actorSize), TEST_LOCATION);
384 DALI_TEST_EQUALS(actor.GetCurrentProperty(Actor::Property::COLOR).Get<Vector4>(), Color::WHITE, TEST_LOCATION);
385 DALI_TEST_EQUALS(actor.GetCurrentProperty(Actor::Property::SCALE).Get<Vector3>(), Vector3::ONE, TEST_LOCATION);
387 application.SendNotification();
388 application.Render();
390 DALI_TEST_EQUALS(actor.GetCurrentProperty(Actor::Property::POSITION).Get<Vector3>(), Vector3::ZERO, TEST_LOCATION);
391 DALI_TEST_EQUALS(actor.GetCurrentProperty(Actor::Property::SIZE).Get<Vector3>(), Vector3(actorSize), TEST_LOCATION);
392 DALI_TEST_EQUALS(actor.GetCurrentProperty(Actor::Property::COLOR).Get<Vector4>(), Color::WHITE, TEST_LOCATION);
393 DALI_TEST_EQUALS(actor.GetCurrentProperty(Actor::Property::SCALE).Get<Vector3>(), Vector3::ONE, TEST_LOCATION);
398 int UtcDaliFrameCallbackBake(void)
400 // Test to see that the bake methods bake the values
402 TestApplication application;
403 Vector2 actorSize(200, 300);
405 Actor actor = Actor::New();
406 actor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
407 actor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
408 actor.SetProperty(Actor::Property::SIZE, actorSize);
410 Stage stage = Stage::GetCurrent();
413 Vector3 sizeToSet(1.0f, 2.0f, 3.0f);
414 Vector3 positionToSet(10.0f, 20.0f, 30.0f);
415 Vector4 colorToSet(Color::MAGENTA);
416 Vector3 scaleToSet(1.0f, 3.0f, 5.0f);
418 FrameCallbackBaker frameCallback(actor.GetProperty<int>(Actor::Property::ID), sizeToSet, positionToSet, colorToSet, scaleToSet);
419 DevelStage::AddFrameCallback(stage, frameCallback, stage.GetRootLayer());
421 application.SendNotification();
422 application.Render();
424 DALI_TEST_EQUALS(frameCallback.mCalled, true, TEST_LOCATION);
425 DALI_TEST_EQUALS(frameCallback.mSizeAfterSetting, sizeToSet, TEST_LOCATION);
426 DALI_TEST_EQUALS(frameCallback.mPositionAfterSetting, positionToSet, TEST_LOCATION);
427 DALI_TEST_EQUALS(frameCallback.mColorAfterSetting, colorToSet, TEST_LOCATION);
428 DALI_TEST_EQUALS(frameCallback.mScaleAfterSetting, scaleToSet, TEST_LOCATION);
430 // Ensure the new values are saved after removing the callback
431 DevelStage::RemoveFrameCallback(stage, frameCallback);
433 application.SendNotification();
434 application.Render();
436 DALI_TEST_EQUALS(actor.GetCurrentProperty(Actor::Property::POSITION).Get<Vector3>(), positionToSet, TEST_LOCATION);
437 DALI_TEST_EQUALS(actor.GetCurrentProperty(Actor::Property::SIZE).Get<Vector3>(), sizeToSet, TEST_LOCATION);
438 DALI_TEST_EQUALS(actor.GetCurrentProperty(Actor::Property::COLOR).Get<Vector4>(), colorToSet, TEST_LOCATION);
439 DALI_TEST_EQUALS(actor.GetCurrentProperty(Actor::Property::SCALE).Get<Vector3>(), scaleToSet, TEST_LOCATION);
444 int UtcDaliFrameCallbackMultipleActors(void)
447 * Test to check that the frame callback behaves appropriately with multiple actors
458 * actorB actorD actorF actorG
462 * Screen positions (with minor alterations due to local position):
463 * -----------------------
474 * -----------------------
477 TestApplication application;
478 Stage stage = Stage::GetCurrent();
480 std::map<char, Vector3> sizes;
481 sizes['A'] = Vector3(50.0f, 50.0f, 0.0f);
482 sizes['B'] = Vector3(100.0f, 100.0f, 0.0f);
483 sizes['C'] = Vector3(150.0f, 150.0f, 0.0f);
484 sizes['D'] = Vector3(200.0f, 200.0f, 0.0f);
485 sizes['E'] = Vector3(250.0f, 250.0f, 0.0f);
486 sizes['F'] = Vector3(300.0f, 300.0f, 0.0f);
487 sizes['G'] = Vector3(350.0f, 350.0f, 0.0f);
488 sizes['H'] = Vector3(400.0f, 350.0f, 0.0f);
490 std::map<char, Vector3> positions;
491 positions['A'] = Vector3(0.0f, 1.0f, 2.0f);
492 positions['B'] = Vector3(2.0f, 3.0f, 4.0f);
493 positions['C'] = Vector3(5.0f, 6.0f, 7.0f);
494 positions['D'] = Vector3(8.0f, 9.0f, 10.0f);
495 positions['E'] = Vector3(11.0f, 12.0f, 13.0f);
496 positions['F'] = Vector3(14.0f, 15.0f, 16.0f);
497 positions['G'] = Vector3(17.0f, 18.0f, 19.0f);
498 positions['H'] = Vector3(20.0f, 21.0f, 22.0f);
500 Actor actorA = Actor::New();
501 actorA.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
502 actorA.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
503 actorA.SetProperty(Actor::Property::SIZE, sizes['A']);
504 actorA.SetProperty(Actor::Property::POSITION, positions['A']);
507 Actor actorB = Actor::New();
508 actorB.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::BOTTOM_RIGHT);
509 actorB.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
510 actorB.SetProperty(Actor::Property::SIZE, sizes['B']);
511 actorB.SetProperty(Actor::Property::POSITION, positions['B']);
514 Actor actorC = Actor::New();
515 actorC.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::BOTTOM_CENTER);
516 actorC.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_CENTER);
517 actorC.SetProperty(Actor::Property::SIZE, sizes['C']);
518 actorC.SetProperty(Actor::Property::POSITION, positions['C']);
521 Actor actorD = Actor::New();
522 actorD.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER_RIGHT);
523 actorD.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER_LEFT);
524 actorD.SetProperty(Actor::Property::SIZE, sizes['D']);
525 actorD.SetProperty(Actor::Property::POSITION, positions['D']);
528 Actor actorE = Actor::New();
529 actorE.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::BOTTOM_LEFT);
530 actorE.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::BOTTOM_LEFT);
531 actorE.SetProperty(Actor::Property::SIZE, sizes['E']);
532 actorE.SetProperty(Actor::Property::POSITION, positions['E']);
535 Actor actorF = Actor::New();
536 actorF.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_CENTER);
537 actorF.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::BOTTOM_CENTER);
538 actorF.SetProperty(Actor::Property::SIZE, sizes['F']);
539 actorF.SetProperty(Actor::Property::POSITION, positions['F']);
542 Actor actorG = Actor::New();
543 actorG.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER_RIGHT);
544 actorG.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER_LEFT);
545 actorG.SetProperty(Actor::Property::SIZE, sizes['G']);
546 actorG.SetProperty(Actor::Property::POSITION, positions['G']);
549 Actor actorH = Actor::New();
550 actorH.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_RIGHT);
551 actorH.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::BOTTOM_LEFT);
552 actorH.SetProperty(Actor::Property::SIZE, sizes['H']);
553 actorH.SetProperty(Actor::Property::POSITION, positions['H']);
556 std::map<char, unsigned int> actorIds;
557 actorIds['A'] = actorA.GetProperty<int>(Actor::Property::ID);
558 actorIds['B'] = actorB.GetProperty<int>(Actor::Property::ID);
559 actorIds['C'] = actorC.GetProperty<int>(Actor::Property::ID);
560 actorIds['D'] = actorD.GetProperty<int>(Actor::Property::ID);
561 actorIds['E'] = actorE.GetProperty<int>(Actor::Property::ID);
562 actorIds['F'] = actorF.GetProperty<int>(Actor::Property::ID);
563 actorIds['G'] = actorG.GetProperty<int>(Actor::Property::ID);
564 actorIds['H'] = actorH.GetProperty<int>(Actor::Property::ID);
566 FrameCallbackMultipleActors frameCallback;
567 for(auto&& i : actorIds)
569 frameCallback.mActorIds.PushBack(i.second);
572 DevelStage::AddFrameCallback(stage, frameCallback, stage.GetRootLayer());
574 application.SendNotification();
575 application.Render();
577 DALI_TEST_EQUALS(frameCallback.mCalled, true, TEST_LOCATION);
579 for(char i = 'A'; i <= 'H'; ++i)
581 DALI_TEST_EQUALS(frameCallback.mPositions[actorIds[i]], positions[i], TEST_LOCATION);
582 DALI_TEST_EQUALS(frameCallback.mSizes[actorIds[i]], sizes[i], TEST_LOCATION);
585 // Render again to make sure it still gets called and gives the correct values (in case any optimisations break this)
586 frameCallback.mCalled = false;
588 application.SendNotification();
589 application.Render();
591 DALI_TEST_EQUALS(frameCallback.mCalled, true, TEST_LOCATION);
593 for(char i = 'A'; i <= 'H'; ++i)
595 DALI_TEST_EQUALS(frameCallback.mPositions[actorIds[i]], positions[i], TEST_LOCATION);
596 DALI_TEST_EQUALS(frameCallback.mSizes[actorIds[i]], sizes[i], TEST_LOCATION);
602 int UtcDaliFrameCallbackCheckActorNotAdded(void)
604 TestApplication application;
606 Actor actor = Actor::New();
607 actor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
608 actor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
609 actor.SetProperty(Actor::Property::SIZE, Vector2(200, 300));
611 Stage stage = Stage::GetCurrent();
612 FrameCallbackOneActor frameCallback(actor.GetProperty<int>(Actor::Property::ID));
613 DevelStage::AddFrameCallback(stage, frameCallback, stage.GetRootLayer());
615 application.SendNotification();
616 application.Render();
618 // All should be default constructed objects
619 DALI_TEST_EQUALS(frameCallback.mCalled, true, TEST_LOCATION);
620 DALI_TEST_EQUALS(frameCallback.mPositionGetPositionCall, Vector3::ZERO, TEST_LOCATION);
621 DALI_TEST_EQUALS(frameCallback.mSizeGetSizeCall, Vector3::ZERO, TEST_LOCATION);
622 DALI_TEST_EQUALS(frameCallback.mColor, Vector4::ZERO, TEST_LOCATION);
623 DALI_TEST_EQUALS(frameCallback.mScale, Vector3::ZERO, TEST_LOCATION);
628 int UtcDaliFrameCallbackInvalidActorId(void)
630 // Test to ensure that there are no issues when trying to use the update-proxy methods with an invalid actor ID.
632 TestApplication application;
633 Stage stage = Stage::GetCurrent();
635 FrameCallbackActorIdCheck frameCallback(10000);
636 DevelStage::AddFrameCallback(stage, frameCallback, stage.GetRootLayer());
638 application.SendNotification();
639 application.Render();
641 // Invalid Actor ID so all the methods should not return successfully.
643 DALI_TEST_EQUALS(frameCallback.mCalled, true, TEST_LOCATION);
644 DALI_TEST_EQUALS(frameCallback.mGetSizeCallSuccess, false, TEST_LOCATION);
645 DALI_TEST_EQUALS(frameCallback.mGetPositionCallSuccess, false, TEST_LOCATION);
646 DALI_TEST_EQUALS(frameCallback.mGetColorCallSuccess, false, TEST_LOCATION);
647 DALI_TEST_EQUALS(frameCallback.mGetScaleCallSuccess, false, TEST_LOCATION);
648 DALI_TEST_EQUALS(frameCallback.mGetPositionAndSizeCallSuccess, false, TEST_LOCATION);
649 DALI_TEST_EQUALS(frameCallback.mSetSizeCallSuccess, false, TEST_LOCATION);
650 DALI_TEST_EQUALS(frameCallback.mSetPositionCallSuccess, false, TEST_LOCATION);
651 DALI_TEST_EQUALS(frameCallback.mSetColorCallSuccess, false, TEST_LOCATION);
652 DALI_TEST_EQUALS(frameCallback.mSetScaleCallSuccess, false, TEST_LOCATION);
653 DALI_TEST_EQUALS(frameCallback.mBakeSizeCallSuccess, false, TEST_LOCATION);
654 DALI_TEST_EQUALS(frameCallback.mBakePositionCallSuccess, false, TEST_LOCATION);
655 DALI_TEST_EQUALS(frameCallback.mBakeColorCallSuccess, false, TEST_LOCATION);
656 DALI_TEST_EQUALS(frameCallback.mBakeScaleCallSuccess, false, TEST_LOCATION);
661 int UtcDaliFrameCallbackActorRemovedAndAdded(void)
663 // Test to ensure that we do not call methods on actors that have been removed on the stage
664 // and then re-start calling the required methods if that actor is re-added back to the stage
666 TestApplication application;
667 Stage stage = Stage::GetCurrent();
669 Actor actor = Actor::New();
672 FrameCallbackActorIdCheck frameCallback(actor.GetProperty<int>(Actor::Property::ID));
673 DevelStage::AddFrameCallback(stage, frameCallback, stage.GetRootLayer());
675 application.SendNotification();
676 application.Render();
678 // All methods should return successfully.
680 DALI_TEST_EQUALS(frameCallback.mCalled, true, TEST_LOCATION);
681 DALI_TEST_EQUALS(frameCallback.mGetSizeCallSuccess, true, TEST_LOCATION);
682 DALI_TEST_EQUALS(frameCallback.mGetPositionCallSuccess, true, TEST_LOCATION);
683 DALI_TEST_EQUALS(frameCallback.mGetColorCallSuccess, true, TEST_LOCATION);
684 DALI_TEST_EQUALS(frameCallback.mGetScaleCallSuccess, true, TEST_LOCATION);
685 DALI_TEST_EQUALS(frameCallback.mGetPositionAndSizeCallSuccess, true, TEST_LOCATION);
686 DALI_TEST_EQUALS(frameCallback.mSetSizeCallSuccess, true, TEST_LOCATION);
687 DALI_TEST_EQUALS(frameCallback.mSetPositionCallSuccess, true, TEST_LOCATION);
688 DALI_TEST_EQUALS(frameCallback.mSetColorCallSuccess, true, TEST_LOCATION);
689 DALI_TEST_EQUALS(frameCallback.mSetScaleCallSuccess, true, TEST_LOCATION);
690 DALI_TEST_EQUALS(frameCallback.mBakeSizeCallSuccess, true, TEST_LOCATION);
691 DALI_TEST_EQUALS(frameCallback.mBakePositionCallSuccess, true, TEST_LOCATION);
692 DALI_TEST_EQUALS(frameCallback.mBakeColorCallSuccess, true, TEST_LOCATION);
693 DALI_TEST_EQUALS(frameCallback.mBakeScaleCallSuccess, true, TEST_LOCATION);
694 frameCallback.Reset();
696 // Remove the actor from stage, the methods should not return successfully.
700 application.SendNotification();
701 application.Render();
703 DALI_TEST_EQUALS(frameCallback.mCalled, true, TEST_LOCATION);
704 DALI_TEST_EQUALS(frameCallback.mGetSizeCallSuccess, false, TEST_LOCATION);
705 DALI_TEST_EQUALS(frameCallback.mGetPositionCallSuccess, false, TEST_LOCATION);
706 DALI_TEST_EQUALS(frameCallback.mGetColorCallSuccess, false, TEST_LOCATION);
707 DALI_TEST_EQUALS(frameCallback.mGetScaleCallSuccess, false, TEST_LOCATION);
708 DALI_TEST_EQUALS(frameCallback.mGetPositionAndSizeCallSuccess, false, TEST_LOCATION);
709 DALI_TEST_EQUALS(frameCallback.mSetSizeCallSuccess, false, TEST_LOCATION);
710 DALI_TEST_EQUALS(frameCallback.mSetPositionCallSuccess, false, TEST_LOCATION);
711 DALI_TEST_EQUALS(frameCallback.mSetColorCallSuccess, false, TEST_LOCATION);
712 DALI_TEST_EQUALS(frameCallback.mSetScaleCallSuccess, false, TEST_LOCATION);
713 DALI_TEST_EQUALS(frameCallback.mBakeSizeCallSuccess, false, TEST_LOCATION);
714 DALI_TEST_EQUALS(frameCallback.mBakePositionCallSuccess, false, TEST_LOCATION);
715 DALI_TEST_EQUALS(frameCallback.mBakeColorCallSuccess, false, TEST_LOCATION);
716 DALI_TEST_EQUALS(frameCallback.mBakeScaleCallSuccess, false, TEST_LOCATION);
717 frameCallback.Reset();
719 // Re-add the actor back to the stage, all the methods should once again, return successfully.
723 application.SendNotification();
724 application.Render();
726 DALI_TEST_EQUALS(frameCallback.mCalled, true, TEST_LOCATION);
727 DALI_TEST_EQUALS(frameCallback.mGetSizeCallSuccess, true, TEST_LOCATION);
728 DALI_TEST_EQUALS(frameCallback.mGetPositionCallSuccess, true, TEST_LOCATION);
729 DALI_TEST_EQUALS(frameCallback.mGetColorCallSuccess, true, TEST_LOCATION);
730 DALI_TEST_EQUALS(frameCallback.mGetScaleCallSuccess, true, TEST_LOCATION);
731 DALI_TEST_EQUALS(frameCallback.mGetPositionAndSizeCallSuccess, true, TEST_LOCATION);
732 DALI_TEST_EQUALS(frameCallback.mSetSizeCallSuccess, true, TEST_LOCATION);
733 DALI_TEST_EQUALS(frameCallback.mSetPositionCallSuccess, true, TEST_LOCATION);
734 DALI_TEST_EQUALS(frameCallback.mSetColorCallSuccess, true, TEST_LOCATION);
735 DALI_TEST_EQUALS(frameCallback.mSetScaleCallSuccess, true, TEST_LOCATION);
736 DALI_TEST_EQUALS(frameCallback.mBakeSizeCallSuccess, true, TEST_LOCATION);
737 DALI_TEST_EQUALS(frameCallback.mBakePositionCallSuccess, true, TEST_LOCATION);
738 DALI_TEST_EQUALS(frameCallback.mBakeColorCallSuccess, true, TEST_LOCATION);
739 DALI_TEST_EQUALS(frameCallback.mBakeScaleCallSuccess, true, TEST_LOCATION);
744 int UtcDaliFrameCallbackMultipleCallbacks(void)
746 // Test to ensure multiple frame-callbacks work as expected
748 TestApplication application;
749 Stage stage = Stage::GetCurrent();
751 Actor actor = Actor::New();
754 FrameCallbackBasic frameCallback1;
755 FrameCallbackBasic frameCallback2;
756 DevelStage::AddFrameCallback(stage, frameCallback1, stage.GetRootLayer());
757 DevelStage::AddFrameCallback(stage, frameCallback2, stage.GetRootLayer());
759 application.SendNotification();
760 application.Render();
762 DALI_TEST_EQUALS(frameCallback1.mCalled, true, TEST_LOCATION);
763 DALI_TEST_EQUALS(frameCallback2.mCalled, true, TEST_LOCATION);
764 frameCallback1.Reset();
765 frameCallback2.Reset();
767 // Remove the second frame-callback, only the first should be called
769 DevelStage::RemoveFrameCallback(stage, frameCallback2);
771 application.SendNotification();
772 application.Render();
774 DALI_TEST_EQUALS(frameCallback1.mCalled, true, TEST_LOCATION);
775 DALI_TEST_EQUALS(frameCallback2.mCalled, false, TEST_LOCATION);
776 frameCallback1.Reset();
777 frameCallback2.Reset();
779 // Re-add the second frame-callback and remove the first, only the second should be called
781 DevelStage::AddFrameCallback(stage, frameCallback2, stage.GetRootLayer());
782 DevelStage::RemoveFrameCallback(stage, frameCallback1);
784 application.SendNotification();
785 application.Render();
787 DALI_TEST_EQUALS(frameCallback1.mCalled, false, TEST_LOCATION);
788 DALI_TEST_EQUALS(frameCallback2.mCalled, true, TEST_LOCATION);
789 frameCallback1.Reset();
790 frameCallback2.Reset();
792 // Attempt removal of the first frame-callback again, should be a no-op and yield the exact same results as the last run
793 DevelStage::RemoveFrameCallback(stage, frameCallback1);
795 application.SendNotification();
796 application.Render();
798 DALI_TEST_EQUALS(frameCallback1.mCalled, false, TEST_LOCATION);
799 DALI_TEST_EQUALS(frameCallback2.mCalled, true, TEST_LOCATION);
800 frameCallback1.Reset();
801 frameCallback2.Reset();
803 // Remove the second frame-callback as well, neither should be called
804 DevelStage::RemoveFrameCallback(stage, frameCallback2);
806 application.SendNotification();
807 application.Render();
809 DALI_TEST_EQUALS(frameCallback1.mCalled, false, TEST_LOCATION);
810 DALI_TEST_EQUALS(frameCallback2.mCalled, false, TEST_LOCATION);
815 int UtcDaliFrameCallbackActorDestroyed(void)
817 // Test to ensure that the frame-callback behaves gracefully if the connected root-actor is destroyed
819 TestApplication application;
820 Stage stage = Stage::GetCurrent();
822 Actor actor = Actor::New();
825 FrameCallbackBasic frameCallback1;
826 FrameCallbackBasic frameCallback2;
827 DevelStage::AddFrameCallback(stage, frameCallback1, actor);
828 DevelStage::AddFrameCallback(stage, frameCallback2, actor);
830 application.SendNotification();
831 application.Render();
833 DALI_TEST_EQUALS(frameCallback1.mCalled, true, TEST_LOCATION);
834 DALI_TEST_EQUALS(frameCallback2.mCalled, true, TEST_LOCATION);
835 frameCallback1.Reset();
836 frameCallback2.Reset();
838 // Remove the second frame-callback, only the first should be called
840 DevelStage::RemoveFrameCallback(stage, frameCallback2);
842 application.SendNotification();
843 application.Render();
845 DALI_TEST_EQUALS(frameCallback1.mCalled, true, TEST_LOCATION);
846 DALI_TEST_EQUALS(frameCallback2.mCalled, false, TEST_LOCATION);
847 frameCallback1.Reset();
848 frameCallback2.Reset();
850 // Remove and destroy the actor, the first one should not be called either
854 application.SendNotification();
855 application.Render();
857 DALI_TEST_EQUALS(frameCallback1.mCalled, false, TEST_LOCATION);
858 DALI_TEST_EQUALS(frameCallback2.mCalled, false, TEST_LOCATION);
863 int UtcDaliFrameCallbackDestroyedBeforeRemoving(void)
865 // Ensure there's no segmentation fault if the callback is deleted without being removed
867 TestApplication application;
868 Stage stage = Stage::GetCurrent();
870 Actor actor = Actor::New();
874 FrameCallbackBasic frameCallback;
875 DevelStage::AddFrameCallback(stage, frameCallback, actor);
877 application.SendNotification();
878 application.Render();
880 DALI_TEST_EQUALS(frameCallback.mCalled, true, TEST_LOCATION);
881 frameCallback.Reset();
884 // frameCallback has now been destroyed but not removed
886 application.SendNotification();
887 application.Render();
888 DALI_TEST_CHECK(true); // If it runs to here then there's no segmentation fault
893 int UtcDaliFrameCallbackDoubleAddition(void)
895 // Ensure we don't connect the same frame-callback twice
897 TestApplication application;
898 Stage stage = Stage::GetCurrent();
899 Actor rootActor = stage.GetRootLayer();
901 FrameCallbackBasic frameCallback;
902 DevelStage::AddFrameCallback(stage, frameCallback, rootActor);
906 DevelStage::AddFrameCallback(stage, frameCallback, rootActor);
910 DALI_TEST_CHECK(true);