Merge "Added scroll-bar to text selection toolbar" into devel/master
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / dali-toolkit-test-utils / dali-test-suite-utils.cpp
1 /*
2  * Copyright (c) 2017 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 // CLASS HEADER
19 #include "dali-test-suite-utils.h"
20
21 // EXTERNAL INCLUDES
22 #include <ostream>
23
24 // INTERNAL INCLUDES
25 #include <dali/public-api/dali-core.h>
26
27 using namespace Dali;
28
29 int test_return_value = TET_UNDEF;
30
31 void tet_result(int value)
32 {
33   // First TET_PASS should set to zero
34   // first TET_FAIL should prevent any further TET_PASS from setting back to zero
35   // Any TET_FAIL should set to fail or leave as fail
36   if( test_return_value != 1 )
37     test_return_value = value;
38 }
39
40 #define END_TEST \
41   return ((test_return_value>0)?1:0)
42
43
44 void tet_infoline(const char* str)
45 {
46   fprintf(stderr, "%s\n", str);
47 }
48
49 void tet_printf(const char *format, ...)
50 {
51   va_list arg;
52   va_start(arg, format);
53   vfprintf(stderr, format, arg);
54   va_end(arg);
55 }
56
57 bool operator==(TimePeriod a, TimePeriod b)
58 {
59   return Equals(a.durationSeconds, b.durationSeconds) && Equals(a.delaySeconds, b.delaySeconds) ;
60 }
61
62 std::ostream& operator<<( std::ostream& ostream, TimePeriod value )
63 {
64   return ostream << "( Duration:" << value.durationSeconds << " Delay:" << value.delaySeconds << ")";
65 }
66
67 std::ostream& operator<<( std::ostream& ostream, Radian angle )
68 {
69   ostream << angle.radian;
70   return ostream;
71 }
72
73 std::ostream& operator<<( std::ostream& ostream, Degree angle )
74 {
75   ostream << angle.degree;
76   return ostream;
77 }
78
79 void DALI_TEST_EQUALS( const BaseHandle& baseHandle1, const BaseHandle& baseHandle2, const char* location )
80 {
81   DALI_TEST_EQUALS< const BaseHandle& >( baseHandle1, baseHandle2, location );
82 }
83
84 void DALI_TEST_EQUALS( const size_t value1, const unsigned int value2, const char* location )
85 {
86   DALI_TEST_EQUALS< unsigned int>( ( unsigned int )( value1 ), value2, location );
87 }
88
89 void DALI_TEST_EQUALS( const unsigned int value1, const size_t value2, const char* location )
90 {
91   DALI_TEST_EQUALS< unsigned int >( value1, ( unsigned int )( value2 ), location );
92 }
93
94 void DALI_TEST_EQUALS( const Matrix3& matrix1, const Matrix3& matrix2, const char* location)
95 {
96   const float* m1 = matrix1.AsFloat();
97   const float* m2 = matrix2.AsFloat();
98   bool equivalent = true;
99
100   for (int i=0;i<9;++i)
101   {
102     if( ! (fabsf(m1[i] - m2[i])< GetRangedEpsilon(m1[i], m2[i])) )
103     {
104       equivalent = false;
105     }
106   }
107
108   if( !equivalent )
109   {
110     fprintf(stderr, "%s, checking\n"
111                "(%f, %f, %f)    (%f, %f, %f)\n"
112                "(%f, %f, %f) == (%f, %f, %f)\n"
113                "(%f, %f, %f)    (%f, %f, %f)\n",
114                location,
115                m1[0],  m1[1], m1[2],   m2[0],  m2[1], m2[2],
116                m1[3],  m1[4], m1[5],   m2[3],  m2[4], m2[5],
117                m1[6],  m1[7], m1[8],   m2[6],  m2[7], m2[8]);
118
119     tet_result(TET_FAIL);
120   }
121   else
122   {
123     tet_result(TET_PASS);
124   }
125 }
126
127 void DALI_TEST_EQUALS( const Matrix3& matrix1, const Matrix3& matrix2, float epsilon, const char* location)
128 {
129   const float* m1 = matrix1.AsFloat();
130   const float* m2 = matrix2.AsFloat();
131   bool equivalent = true;
132
133   for (int i=0;i<9;++i)
134   {
135     equivalent &= (fabsf(m1[i] - m2[i])<epsilon);
136   }
137
138   if (!equivalent)
139   {
140     fprintf(stderr, "%s, checking\n"
141                "(%f, %f, %f)    (%f, %f, %f)\n"
142                "(%f, %f, %f) == (%f, %f, %f)\n"
143                "(%f, %f, %f)    (%f, %f, %f)\n",
144                location,
145                m1[0],  m1[1], m1[2],   m2[0],  m2[1], m2[2],
146                m1[3],  m1[4], m1[5],   m2[3],  m2[4], m2[5],
147                m1[6],  m1[7], m1[8],   m2[6],  m2[7], m2[8]);
148
149     tet_result(TET_FAIL);
150   }
151   else
152   {
153     tet_result(TET_PASS);
154   }
155 }
156
157 void DALI_TEST_EQUALS( const Matrix& matrix1, const Matrix& matrix2, const char* location)
158 {
159   const float* m1 = matrix1.AsFloat();
160   const float* m2 = matrix2.AsFloat();
161   bool identical = true;
162
163   int i;
164   for (i=0;i<16;++i)
165   {
166     if(m1[i] != m2[i])
167     {
168       identical = false;
169       break;
170     }
171   }
172
173   if (!identical)
174   {
175     fprintf(stderr, "%s, checking\n"
176                "(%f, %f, %f, %f)    (%f, %f, %f, %f)\n"
177                "(%f, %f, %f, %f) == (%f, %f, %f, %f)\n"
178                "(%f, %f, %f, %f)    (%f, %f, %f, %f)\n"
179                "(%f, %f, %f, %f)    (%f, %f, %f, %f)\n", location,
180                m1[0],  m1[1],  m1[2],  m1[3],   m2[0],  m2[1],  m2[2],  m2[3],
181                m1[4],  m1[5],  m1[6],  m1[7],   m2[4],  m2[5],  m2[6],  m2[7],
182                m1[8],  m1[9], m1[10], m1[11],   m2[8],  m2[9], m2[10], m2[11],
183               m1[12], m1[13], m1[14], m1[15],  m2[12], m2[13], m2[14], m2[15]);
184
185     tet_result(TET_FAIL);
186   }
187   else
188   {
189     tet_result(TET_PASS);
190   }
191 }
192
193 void DALI_TEST_EQUALS( const Matrix& matrix1, const Matrix& matrix2, float epsilon, const char* location)
194 {
195   const float* m1 = matrix1.AsFloat();
196   const float* m2 = matrix2.AsFloat();
197   bool equivalent = true;
198
199   for (int i=0;i<16;++i)
200   {
201     equivalent &= (fabsf(m1[i] - m2[i])<epsilon);
202   }
203
204   if (!equivalent)
205   {
206     fprintf(stderr, "%s, checking\n"
207                "(%f, %f, %f, %f)    (%f, %f, %f, %f)\n"
208                "(%f, %f, %f, %f) == (%f, %f, %f, %f)\n"
209                "(%f, %f, %f, %f)    (%f, %f, %f, %f)\n"
210                "(%f, %f, %f, %f)    (%f, %f, %f, %f)\n", location,
211                m1[0],  m1[1],  m1[2],  m1[3],   m2[0],  m2[1],  m2[2],  m2[3],
212                m1[4],  m1[5],  m1[6],  m1[7],   m2[4],  m2[5],  m2[6],  m2[7],
213                m1[8],  m1[9], m1[10], m1[11],   m2[8],  m2[9], m2[10], m2[11],
214               m1[12], m1[13], m1[14], m1[15],  m2[12], m2[13], m2[14], m2[15]);
215
216     tet_result(TET_FAIL);
217   }
218   else
219   {
220     tet_result(TET_PASS);
221   }
222 }
223
224
225 /**
226  * Test whether two strings are equal.
227  * @param[in] str1 The first string
228  * @param[in] str2 The second string
229  * @param[in] location The TEST_LOCATION macro should be used here
230  */
231 void DALI_TEST_EQUALS( const std::string &str1, const char* str2, const char* location)
232 {
233   DALI_TEST_EQUALS(str1.c_str(), str2, location);
234 }
235
236 void DALI_TEST_EQUALS( Property::Value& str1, const char* str2, const char* location)
237 {
238   bool result = false;
239
240   if( str1.GetType() == Property::STRING )
241   {
242     std::string string;
243     str1.Get(string);
244     result = !string.compare(str2);
245   }
246
247   if( result )
248   {
249     tet_result(TET_PASS);
250   }
251   else
252   {
253     tet_result(TET_FAIL);
254   }
255 }
256
257 void DALI_TEST_EQUALS( const char* str1, const std::string &str2, const char* location)
258 {
259   DALI_TEST_EQUALS(str1, str2.c_str(), location);
260 }
261
262 void DALI_TEST_ASSERT( DaliException& e, std::string conditionSubString, const char* location )
263 {
264   if( NULL == strstr( e.condition, conditionSubString.c_str() ) )
265   {
266     fprintf(stderr, "Expected substring '%s' : actual exception string '%s' : location %s\n", conditionSubString.c_str(), e.condition, location );
267     tet_result(TET_FAIL);
268   }
269   else
270   {
271     tet_result(TET_PASS);
272   }
273 }
274
275 // Functor to test whether an Applied signal is emitted
276 ConstraintAppliedCheck::ConstraintAppliedCheck( bool& signalReceived )
277 : mSignalReceived( signalReceived )
278 {
279 }
280
281 void ConstraintAppliedCheck::operator()( Constraint& constraint )
282 {
283   mSignalReceived = true;
284 }
285
286 void ConstraintAppliedCheck::Reset()
287 {
288   mSignalReceived = false;
289 }
290
291 void ConstraintAppliedCheck::CheckSignalReceived()
292 {
293   if ( !mSignalReceived )
294   {
295     fprintf(stderr,  "Expected Applied signal was not received\n" );
296     tet_result( TET_FAIL );
297   }
298   else
299   {
300     tet_result( TET_PASS );
301   }
302 }
303
304 void ConstraintAppliedCheck::CheckSignalNotReceived()
305 {
306   if ( mSignalReceived )
307   {
308     fprintf(stderr,  "Unexpected Applied signal was received\n" );
309     tet_result( TET_FAIL );
310   }
311   else
312   {
313     tet_result( TET_PASS );
314   }
315 }
316
317 BufferImage CreateBufferImage(int width, int height, const Vector4& color)
318 {
319   BufferImage image = BufferImage::New(width, height, Pixel::RGBA8888);
320
321   PixelBuffer* pixbuf = image.GetBuffer();
322
323   // Using a 4x4 image gives a better blend with the GL implementation
324   // than a 3x3 image
325   for(size_t i=0; i<16; i++)
326   {
327     pixbuf[i*4+0] = color.r*255;
328     pixbuf[i*4+1] = color.g*255;
329     pixbuf[i*4+2] = color.b*255;
330     pixbuf[i*4+3] = color.a*255;
331   }
332
333   return image;
334 }
335
336 BufferImage CreateBufferImage()
337 {
338   return CreateBufferImage(4, 4, Color::WHITE);
339 }
340
341 void PrepareResourceImage( TestApplication& application, unsigned int imageWidth, unsigned int imageHeight, Pixel::Format pixelFormat )
342 {
343   TestPlatformAbstraction& platform = application.GetPlatform();
344   platform.SetClosestImageSize(Vector2( imageWidth, imageHeight));
345
346   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_RETAIN );
347   Integration::PixelBuffer* pixbuffer = bitmap->GetPackedPixelsProfile()->ReserveBuffer( pixelFormat, imageWidth, imageHeight, imageWidth, imageHeight );
348   unsigned int bytesPerPixel = GetBytesPerPixel(  pixelFormat );
349   unsigned int initialColor = 0xFF;
350   memset( pixbuffer, initialColor, imageHeight*imageWidth*bytesPerPixel);
351
352   Integration::ResourcePointer resourcePtr(bitmap);
353   platform.SetSynchronouslyLoadedResource( resourcePtr );
354 }
355
356 namespace Test
357 {
358
359 struct ObjectDestructionFunctor
360 {
361   // Create a ObjectDestructionFunctor passing in a Dali::RefObject* to be monitored and a bool variable.
362   // Create ObjectRegistry instance and connect to the ObjectDestroyedSignal passing in the above functor for the callback.
363   // Get the ObjectPointer (Actor::GetObjectPtr) of the Actor to be checked for destruction and assign it to the Dali::RefObject*
364   // Check the bool variable which would be true when object destroyed.
365   ObjectDestructionFunctor( Dali::RefObject* objectPtr, bool& refObjectDestroyed )
366   : refObjectPointerToCheck( objectPtr ),
367     refObjectDestroyedBoolean( refObjectDestroyed )
368   {
369     refObjectDestroyed = false;
370   }
371
372   void operator()( const Dali::RefObject* objectPointer )
373   {
374     if ( refObjectPointerToCheck == objectPointer )
375     {
376       refObjectDestroyedBoolean = true;
377     }
378   }
379
380   Dali::RefObject* refObjectPointerToCheck;
381   bool& refObjectDestroyedBoolean;
382 };
383
384 ObjectDestructionTracker::ObjectDestructionTracker()
385   :mRefObjectDestroyed( false)
386 {
387 }
388
389 void ObjectDestructionTracker::Start( Actor actor )
390 {
391   ObjectDestructionFunctor destructionFunctor( actor.GetObjectPtr(), mRefObjectDestroyed );
392
393   ObjectRegistry objectRegistry = Stage::GetCurrent().GetObjectRegistry();
394   objectRegistry.ObjectDestroyedSignal().Connect( this, destructionFunctor );
395 }
396
397 bool ObjectDestructionTracker::IsDestroyed()
398 {
399    return mRefObjectDestroyed;
400 }
401
402 } // namespace Test