[dali_1.9.20] Merge branch 'devel/master'
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-WeakHandle.cpp
1 /*
2  * Copyright (c) 2020 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 <dali/public-api/dali-core.h>
19 #include <dali-test-suite-utils.h>
20
21 using namespace Dali;
22
23 namespace
24 {
25
26 /*******************************************************************************
27  *
28  * Custom Actor
29  *
30  ******************************************************************************/
31 namespace Impl
32 {
33 struct MyTestCustomActor : public CustomActorImpl
34 {
35   typedef Signal< void ()> SignalType;
36   typedef Signal< void (float)> SignalTypeFloat;
37
38   MyTestCustomActor() : CustomActorImpl( ActorFlags( REQUIRES_TOUCH_EVENTS ) )
39   { }
40
41   virtual ~MyTestCustomActor()
42   { }
43
44   void ResetCallStack()
45   {
46   }
47
48   // From CustomActorImpl
49   virtual void OnStageConnection( int depth )
50   {
51   }
52   virtual void OnStageDisconnection()
53   {
54   }
55   virtual void OnChildAdd(Actor& child)
56   {
57   }
58   virtual void OnChildRemove(Actor& child)
59   {
60   }
61   virtual void OnSizeSet(const Vector3& targetSize)
62   {
63   }
64   virtual void OnSizeAnimation(Animation& animation, const Vector3& targetSize)
65   {
66   }
67   virtual bool OnTouchEvent(const TouchEvent& event)
68   {
69     return true;
70   }
71   virtual bool OnHoverEvent(const HoverEvent& event)
72   {
73     return true;
74   }
75   virtual bool OnWheelEvent(const WheelEvent& event)
76   {
77     return true;
78   }
79   virtual bool OnKeyEvent(const KeyEvent& event)
80   {
81     return true;
82   }
83   virtual void OnKeyInputFocusGained()
84   {
85   }
86   virtual void OnKeyInputFocusLost()
87   {
88   }
89   virtual Vector3 GetNaturalSize()
90   {
91     return Vector3( 0.0f, 0.0f, 0.0f );
92   }
93
94   virtual float GetHeightForWidth( float width )
95   {
96     return 0.0f;
97   }
98
99   virtual float GetWidthForHeight( float height )
100   {
101     return 0.0f;
102   }
103
104   virtual void OnRelayout( const Vector2& size, RelayoutContainer& container )
105   {
106   }
107
108   virtual void OnSetResizePolicy( ResizePolicy::Type policy, Dimension::Type dimension )
109   {
110   }
111
112   virtual void OnCalculateRelayoutSize( Dimension::Type dimension )
113   {
114   }
115
116   virtual float CalculateChildSize( const Dali::Actor& child, Dimension::Type dimension )
117   {
118     return 0.0f;
119   }
120
121   virtual void OnLayoutNegotiated( float size, Dimension::Type dimension )
122   {
123   }
124
125   virtual bool RelayoutDependentOnChildren( Dimension::Type dimension = Dimension::ALL_DIMENSIONS )
126   {
127     return false;
128   }
129
130 public:
131
132   SignalType mSignal;
133 };
134
135 }; // namespace Impl
136
137 class MyTestCustomActor : public CustomActor
138 {
139 public:
140
141   typedef Signal< void ()> SignalType;
142   typedef Signal< void (float)> SignalTypeFloat;
143
144   MyTestCustomActor()
145   {
146   }
147
148   static MyTestCustomActor New()
149   {
150     Impl::MyTestCustomActor* p = new Impl::MyTestCustomActor;
151     return MyTestCustomActor( *p ); // takes ownership
152   }
153
154   virtual ~MyTestCustomActor()
155   {
156   }
157
158   static MyTestCustomActor DownCast( BaseHandle handle )
159   {
160     MyTestCustomActor result;
161
162     CustomActor custom = Dali::CustomActor::DownCast( handle );
163     if ( custom )
164     {
165       CustomActorImpl& customImpl = custom.GetImplementation();
166
167       Impl::MyTestCustomActor* impl = dynamic_cast<Impl::MyTestCustomActor*>(&customImpl);
168
169       if (impl)
170       {
171         result = MyTestCustomActor(customImpl.GetOwner());
172       }
173     }
174
175     return result;
176   }
177
178   SignalType& GetCustomSignal()
179   {
180     Dali::RefObject& obj = GetImplementation();
181     return static_cast<Impl::MyTestCustomActor&>( obj ).mSignal;
182   }
183
184   MyTestCustomActor(Internal::CustomActor* internal)
185   : CustomActor(internal)
186   {
187   }
188
189   MyTestCustomActor( Impl::MyTestCustomActor& impl )
190   : CustomActor( impl )
191   {
192   }
193 };
194
195 }
196
197 int UtcDaliWeakHandleBaseConstructorVoid(void)
198 {
199   TestApplication application;
200   tet_infoline("Testing Dali::WeakHandleBase::WeakHandleBase()");
201
202   WeakHandleBase object;
203
204   DALI_TEST_CHECK(!object.GetBaseHandle());
205
206   END_TEST;
207 }
208
209 int UtcDaliWeakHandleBaseConstructorWithBaseHandle(void)
210 {
211   TestApplication application;
212   tet_infoline("Testing Dali::WeakHandleBase::WeakHandleBase(BaseHandle)");
213
214   BaseHandle emptyHandle;
215   WeakHandleBase emptyObject(emptyHandle);
216   DALI_TEST_CHECK(!emptyObject.GetBaseHandle());
217
218   Actor actor = Actor::New();
219   WeakHandleBase object(actor);
220   DALI_TEST_CHECK(object.GetBaseHandle() == actor);
221
222   Animation animation = Animation::New( 1.0f );
223   WeakHandleBase animationObject( animation );
224   DALI_TEST_CHECK( animationObject.GetBaseHandle() == animation );
225
226   END_TEST;
227 }
228
229 int UtcDaliWeakHandleBaseCopyConstructor(void)
230 {
231   TestApplication application;
232   tet_infoline("Testing Dali::WeakHandleBase::WeakHandleBase(const WeakHandleBase&)");
233
234   Actor actor = Actor::New();
235   DALI_TEST_EQUALS(1, actor.GetBaseObject().ReferenceCount(), TEST_LOCATION); // reference count of the actor is not increased
236
237   WeakHandleBase object(actor);
238   DALI_TEST_CHECK(object.GetBaseHandle() == actor);
239   DALI_TEST_EQUALS(1, actor.GetBaseObject().ReferenceCount(), TEST_LOCATION); // reference count of the actor is not increased
240
241   WeakHandleBase copy(object);
242   DALI_TEST_CHECK(copy.GetBaseHandle() == actor);
243   DALI_TEST_EQUALS(1, actor.GetBaseObject().ReferenceCount(), TEST_LOCATION); // reference count of the actor is not increased
244
245   END_TEST;
246 }
247
248 int UtcDaliWeakHandleBaseAssignmentOperator(void)
249 {
250   TestApplication application;
251   tet_infoline("Testing Dali::WeakHandleBase::operator=");
252
253   Actor actor = Actor::New();
254   DALI_TEST_EQUALS(1, actor.GetBaseObject().ReferenceCount(), TEST_LOCATION); // reference count of the actor is not increased
255
256   WeakHandleBase object(actor);
257   DALI_TEST_CHECK(object.GetBaseHandle() == actor);
258   DALI_TEST_EQUALS(1, actor.GetBaseObject().ReferenceCount(), TEST_LOCATION); // reference count of the actor is not increased
259
260   WeakHandleBase copy = object;
261   DALI_TEST_CHECK(copy.GetBaseHandle() == actor);
262   DALI_TEST_EQUALS(1, actor.GetBaseObject().ReferenceCount(), TEST_LOCATION); // reference count of the actor is not increased
263
264   END_TEST;
265 }
266
267 int UtcDaliWeakHandleBaseEqualityOperatorP(void)
268 {
269   TestApplication application;
270   tet_infoline("Positive Test Dali::WeakHandleBase::operator==");
271
272   WeakHandleBase object;
273   WeakHandleBase theSameObject;
274   DALI_TEST_CHECK(object == theSameObject);
275
276   Actor actor = Actor::New();
277
278   object = WeakHandleBase(actor);
279   DALI_TEST_CHECK(object.GetBaseHandle() == actor);
280
281   theSameObject = object;
282   DALI_TEST_CHECK(theSameObject.GetBaseHandle() == actor);
283   DALI_TEST_CHECK(object == theSameObject);
284
285   END_TEST;
286 }
287
288 int UtcDaliWeakHandleBaseEqualityOperatorN(void)
289 {
290   TestApplication application;
291   tet_infoline("Negative Test Dali::WeakHandleBase::operator==");
292
293   Actor actor = Actor::New();
294
295   WeakHandleBase object(actor);
296   DALI_TEST_CHECK(object.GetBaseHandle() == actor);
297
298   Actor differentActor = Actor::New();
299   WeakHandleBase aDifferentWeakHandleBase(differentActor);
300
301   DALI_TEST_CHECK(!(object == aDifferentWeakHandleBase));
302
303   END_TEST;
304 }
305
306 int UtcDaliWeakHandleBaseInequalityOperatorP(void)
307 {
308   TestApplication application;
309   tet_infoline("Positive Test Dali::WeakHandleBase::operator!=");
310
311   Actor actor = Actor::New();
312
313   WeakHandleBase object(actor);
314   DALI_TEST_CHECK(object.GetBaseHandle() == actor);
315
316   Actor differentActor = Actor::New();
317   WeakHandleBase aDifferentWeakHandleBase(differentActor);
318
319   DALI_TEST_CHECK(object != aDifferentWeakHandleBase);
320   END_TEST;
321 }
322
323 int UtcDaliWeakHandleBaseInequalityOperatorN(void)
324 {
325   TestApplication application;
326   tet_infoline("Negative Test Dali::WeakHandleBase::operator!=");
327
328   Actor actor = Actor::New();
329
330   WeakHandleBase object(actor);
331   DALI_TEST_CHECK(object.GetBaseHandle() == actor);
332
333   WeakHandleBase theSameWeakHandleBase = object;
334
335   DALI_TEST_CHECK(!(object != theSameWeakHandleBase));
336   END_TEST;
337 }
338
339 int UtcDaliWeakHandleBaseGetBaseHandle(void)
340 {
341   TestApplication application;
342   tet_infoline("Testing Dali::WeakHandleBase::GetBaseHandle()");
343
344   Handle emptyHandle;
345   WeakHandleBase emptyObject(emptyHandle);
346   DALI_TEST_CHECK(!emptyObject.GetBaseHandle());
347
348   Actor actor = Actor::New();
349   WeakHandleBase object(actor);
350   DALI_TEST_CHECK(object.GetBaseHandle() == actor);
351
352   WeakHandleBase theSameObject = WeakHandleBase(actor);
353   DALI_TEST_CHECK(object.GetBaseHandle() == theSameObject.GetBaseHandle());
354
355   Actor differentActor = Actor::New();
356   WeakHandleBase aDifferentWeakHandleBase(differentActor);
357   DALI_TEST_CHECK(object.GetBaseHandle() != aDifferentWeakHandleBase.GetBaseHandle());
358
359   Animation animation = Animation::New( 1.0f );
360   WeakHandleBase animationObject( animation );
361   DALI_TEST_CHECK( animationObject.GetBaseHandle() == animation );
362
363   WeakHandleBase theSameAnimationObject = WeakHandleBase( animation );
364   DALI_TEST_CHECK( animationObject.GetBaseHandle() == theSameAnimationObject.GetBaseHandle() );
365
366   Animation differentAnimation = Animation::New( 1.0f );
367   WeakHandleBase aDifferentAnimationObject( differentAnimation );
368   DALI_TEST_CHECK( animationObject.GetBaseHandle() != aDifferentAnimationObject.GetBaseHandle() );
369
370   END_TEST;
371 }
372
373 int UtcDaliWeakHandleBaseReset(void)
374 {
375   TestApplication application;
376   tet_infoline( "Testing Daku::WeakHandleBase::Reset()" );
377
378   Actor actor = Actor::New();
379   WeakHandleBase object(actor);
380   DALI_TEST_CHECK(object.GetBaseHandle() == actor);
381
382   object.Reset();
383
384   DALI_TEST_CHECK(object == WeakHandleBase());
385   DALI_TEST_CHECK(object.GetBaseHandle() == Handle());
386
387   END_TEST;
388 }
389
390 int UtcDaliWeakHandleGetHandle(void)
391 {
392   TestApplication application;
393   tet_infoline("Testing Dali::WeakHandle::GetHandle()");
394
395   Actor actor = Actor::New();
396   WeakHandle<Actor> object(actor);
397   DALI_TEST_CHECK(object.GetHandle() == actor);
398
399   MyTestCustomActor customActor = MyTestCustomActor::New();
400   WeakHandle<MyTestCustomActor> customObject(customActor);
401   DALI_TEST_CHECK(customObject.GetHandle() == customActor);
402
403   DALI_TEST_CHECK(object.GetHandle() != customObject.GetHandle());
404
405   Animation animation = Animation::New( 1.0f );
406   WeakHandle<Animation>  animationObject( animation );
407   DALI_TEST_CHECK( animationObject.GetHandle() == animation );
408
409   animation.Reset();
410   DALI_TEST_CHECK( animationObject.GetHandle() == Animation() );
411
412   END_TEST;
413 }
414
415