e85d90f66144fc9318bca7df6d96643eb301ac60
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-AsyncImageLoader.cpp
1 /*
2  * Copyright (c) 2016 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 #include <stdlib.h>
18 #include <unistd.h>
19 #include <dali/dali.h>
20 #include <dali-toolkit-test-suite-utils.h>
21 #include <toolkit-event-thread-callback.h>
22 #include <dali-toolkit/devel-api/image-loader/async-image-loader.h>
23
24 using namespace Dali;
25 using namespace Dali::Toolkit;
26
27 namespace
28 {
29 // resolution: 34*34, pixel format: RGBA8888
30 static const char* gImage_34_RGBA = TEST_RESOURCE_DIR "/icon-edit.png";
31 // resolution: 50*50, pixel format: RGBA8888
32 static const char* gImage_50_RGBA = TEST_RESOURCE_DIR "/icon-delete.png";
33 // resolution: 128*128, pixel format: RGB888
34 static const char* gImage_128_RGB = TEST_RESOURCE_DIR "/gallery-small-1.jpg";
35
36 // for testing the ImageLoadedSignal
37 class ImageLoadedSignalVerifier : public ConnectionTracker
38 {
39 public:
40
41   ImageLoadedSignalVerifier()
42   : mCount( 0 )
43   {}
44
45   virtual ~ImageLoadedSignalVerifier()
46   {}
47
48   void ImageLoaded( uint32_t id, PixelData pixelData )
49   {
50     mIDs.push_back( id );
51     mPixelDataList.push_back( pixelData );
52     mCount++;
53   }
54
55   int LoadedImageCount()
56   {
57     return mCount;
58   }
59
60   bool Verify( uint32_t id, uint32_t width, uint32_t height )
61   {
62     int size = mIDs.size();
63     for( int i = 0; i<size; i++  )
64     {
65       if( mIDs[i] == id )
66       {
67         return mPixelDataList[i].GetWidth() == width
68             && mPixelDataList[i].GetHeight() == height;
69       }
70     }
71
72     return false;
73   }
74
75 private:
76
77   int mCount;
78
79   std::vector<uint32_t> mIDs;
80   std::vector<PixelData> mPixelDataList;
81 };
82
83
84 } // anonymous namespace
85
86 void dali_async_image_loader_startup(void)
87 {
88   test_return_value = TET_UNDEF;
89 }
90
91 void dali_async_image_loader_cleanup(void)
92 {
93   test_return_value = TET_PASS;
94 }
95
96 int UtcDaliImageAtlasNew01(void)
97 {
98   ToolkitTestApplication application;
99
100   //invoke default handle constructor
101   AsyncImageLoader loader;
102
103   DALI_TEST_CHECK( !loader );
104
105   // initialise handle
106   loader = AsyncImageLoader::New();
107   DALI_TEST_CHECK( loader );
108
109   END_TEST;
110 }
111
112 int UtcDaliAsyncImageLoaderCopyConstructor(void)
113 {
114   ToolkitTestApplication application;
115
116   AsyncImageLoader loader = AsyncImageLoader::New( );
117   DALI_TEST_CHECK( loader );
118
119   AsyncImageLoader loaderCopy(loader);
120   DALI_TEST_CHECK( loaderCopy );
121
122   END_TEST;
123 }
124
125 int UtcDaliAsyncImageLoaderAssignmentOperator(void)
126 {
127   ToolkitTestApplication application;
128
129   AsyncImageLoader loader = AsyncImageLoader::New();
130   DALI_TEST_CHECK( loader );
131
132   AsyncImageLoader loader2;
133   DALI_TEST_CHECK( !loader2 );
134
135   loader2 = loader;
136   DALI_TEST_CHECK( loader2 );
137   DALI_TEST_CHECK( loader == loader2 ); // the two handles are pointing to the same object.
138
139   END_TEST;
140 }
141
142 int UtcDaliAsyncImageLoaderLoadAndLoadedSignal(void)
143 {
144   ToolkitTestApplication application;
145
146   AsyncImageLoader loader = AsyncImageLoader::New();
147   ImageLoadedSignalVerifier loadedSignalVerifier;
148
149   loader.ImageLoadedSignal().Connect( &loadedSignalVerifier, &ImageLoadedSignalVerifier::ImageLoaded );
150
151   loader.Load( gImage_34_RGBA );
152   uint32_t id02 = loader.Load( gImage_50_RGBA, ImageDimensions( 25, 25 ) );
153   uint32_t id03 = loader.Load( gImage_128_RGB, ImageDimensions( 100, 100 ), FittingMode::SCALE_TO_FILL, SamplingMode::BOX_THEN_LINEAR, true );
154
155   EventThreadCallback* eventTrigger = EventThreadCallback::Get();
156   CallbackBase* callback = eventTrigger->GetCallback();
157
158   eventTrigger->WaitingForTrigger( 3 );// waiting until all three images are loaded
159
160   CallbackBase::Execute( *callback );
161
162   application.SendNotification();
163   application.Render();
164
165   DALI_TEST_CHECK( loadedSignalVerifier.LoadedImageCount() == 3 );
166   DALI_TEST_CHECK( loadedSignalVerifier.Verify( id02, 25, 25 ) );
167   DALI_TEST_CHECK( loadedSignalVerifier.Verify( id03, 100, 100 ) );
168
169   END_TEST;
170 }
171
172 int UtcDaliAsyncImageLoaderCancel(void)
173 {
174   ToolkitTestApplication application;
175
176   AsyncImageLoader loader = AsyncImageLoader::New();
177   ImageLoadedSignalVerifier loadedSignalVerifier;
178
179   loader.ImageLoadedSignal().Connect( &loadedSignalVerifier, &ImageLoadedSignalVerifier::ImageLoaded );
180
181   uint32_t id01 = loader.Load( gImage_34_RGBA, ImageDimensions( 34, 34 ) );
182   uint32_t id02 = loader.Load( gImage_50_RGBA, ImageDimensions( 25, 25 ) );
183   uint32_t id03 = loader.Load( gImage_128_RGB, ImageDimensions( 100, 100 ), FittingMode::SCALE_TO_FILL, SamplingMode::BOX_THEN_LINEAR, true );
184
185   // cancel the loading of the second image
186   DALI_TEST_CHECK( loader.Cancel( id02 ) );
187
188   EventThreadCallback* eventTrigger = EventThreadCallback::Get();
189   CallbackBase* callback = eventTrigger->GetCallback();
190
191   eventTrigger->WaitingForTrigger( 2 );// waiting until first and third images are loaded
192
193   CallbackBase::Execute( *callback );
194
195   DALI_TEST_CHECK( ! loader.Cancel( id03 ) ); // can not cancel a task that is already implemeted
196
197   application.SendNotification();
198   application.Render();
199
200   DALI_TEST_CHECK( loadedSignalVerifier.LoadedImageCount() == 2 );
201
202   DALI_TEST_CHECK( loadedSignalVerifier.Verify( id01, 34, 34 ) );  // first image is successfully loaded
203   DALI_TEST_CHECK( !loadedSignalVerifier.Verify( id02, 25, 25 ) ); // second image is not loaded
204   DALI_TEST_CHECK( loadedSignalVerifier.Verify( id03, 100, 100 ) ); // third image is successfully loaded
205
206   END_TEST;
207 }
208
209 int UtcDaliAsyncImageLoaderCancelAll(void)
210 {
211   ToolkitTestApplication application;
212
213   AsyncImageLoader loader = AsyncImageLoader::New();
214   ImageLoadedSignalVerifier loadedSignalVerifier;
215
216   loader.ImageLoadedSignal().Connect( &loadedSignalVerifier, &ImageLoadedSignalVerifier::ImageLoaded );
217
218   uint32_t id01 = loader.Load( gImage_34_RGBA, ImageDimensions( 34, 34 ) );
219   uint32_t id02 = loader.Load( gImage_50_RGBA, ImageDimensions( 25, 25 ) );
220
221   // cancel the loading of the first and second image
222   loader.CancelAll();
223
224   uint32_t id03 = loader.Load( gImage_128_RGB, ImageDimensions( 100, 100 ), FittingMode::SCALE_TO_FILL, SamplingMode::BOX_THEN_LINEAR, true );
225
226   EventThreadCallback* eventTrigger = EventThreadCallback::Get();
227   CallbackBase* callback = eventTrigger->GetCallback();
228
229   eventTrigger->WaitingForTrigger( 1 );// waiting until the third images is loaded
230
231   CallbackBase::Execute( *callback );
232
233   application.SendNotification();
234   application.Render();
235
236   DALI_TEST_CHECK( loadedSignalVerifier.LoadedImageCount() == 1 );
237
238   DALI_TEST_CHECK( !loadedSignalVerifier.Verify( id01, 34, 34 ) );  // first image is not loaded
239   DALI_TEST_CHECK( !loadedSignalVerifier.Verify( id02, 25, 25 ) ); // second image is not loaded
240   DALI_TEST_CHECK( loadedSignalVerifier.Verify( id03, 100, 100 ) ); // third image is successfully loaded
241
242   END_TEST;
243 }
244
245