Updating code formatting
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-SuperBlurView.cpp
1 /*
2  * Copyright (c) 2022 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 <stdlib.h>
19 #include <iostream>
20
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>
24
25 #include <dali-toolkit/dali-toolkit.h>
26 #include <dali-toolkit/devel-api/controls/super-blur-view/super-blur-view.h>
27 #include <dali.h>
28
29 using namespace Dali;
30 using namespace Dali::Toolkit;
31
32 void utc_dali_toolkit_super_blur_view_startup(void)
33 {
34   test_return_value = TET_UNDEF;
35 }
36
37 void utc_dali_toolkit_super_blur_view_cleanup(void)
38 {
39   test_return_value = TET_PASS;
40 }
41
42 namespace
43 {
44 const int          BLUR_LEVELS           = 3;
45 const int          RENDER_FRAME_INTERVAL = 16;
46 static const char* TEST_IMAGE_FILE_NAME  = TEST_RESOURCE_DIR "/gallery-small-1.jpg";
47 static bool        gObjectCreatedCallBackCalled;
48 static void        TestCallback(BaseHandle handle)
49 {
50   gObjectCreatedCallBackCalled = true;
51 }
52
53 /*
54  * Simulate time passed by.
55  *
56  * @note this will always process at least 1 frame (1/60 sec)
57  *
58  * @param application Test application instance
59  * @param duration Time to pass in milliseconds.
60  * @return The actual time passed in milliseconds
61  */
62 int Wait(ToolkitTestApplication& application, int duration = 0)
63 {
64   int time = 0;
65
66   for(int i = 0; i <= (duration / RENDER_FRAME_INTERVAL); i++)
67   {
68     application.SendNotification();
69     application.Render(RENDER_FRAME_INTERVAL);
70     time += RENDER_FRAME_INTERVAL;
71   }
72
73   return time;
74 }
75
76 Texture CreateSolidColorTexture(ToolkitTestApplication& application, const Vector4& color, unsigned int width, unsigned int height)
77 {
78   unsigned int size   = width * height;
79   uint8_t*     pixbuf = new uint8_t[size * 4];
80
81   for(size_t i = 0; i < size; i++)
82   {
83     pixbuf[i * 4 + 0] = 0xFF * color.r;
84     pixbuf[i * 4 + 1] = 0xFF * color.g;
85     pixbuf[i * 4 + 2] = 0xFF * color.b;
86     pixbuf[i * 4 + 3] = 0xFF * color.a;
87   }
88
89   PixelData pixels = PixelData::New(pixbuf, size, width, height, Pixel::RGBA8888, PixelData::ReleaseFunction::DELETE_ARRAY);
90
91   Texture texture = Texture::New(TextureType::TEXTURE_2D, pixels.GetPixelFormat(), pixels.GetWidth(), pixels.GetHeight());
92   texture.Upload(pixels, 0, 0, 0, 0, pixels.GetWidth(), pixels.GetHeight());
93
94   return texture;
95 }
96
97 class SignalHandler : public Dali::ConnectionTracker
98 {
99 public:
100   SignalHandler()
101   : mCalls(0)
102   {
103   }
104
105   void Callback(SuperBlurView handle)
106   {
107     mCalls++;
108     tet_infoline("Signal called");
109   }
110
111   unsigned int GetCalls() const
112   {
113     return mCalls;
114   }
115
116 private:
117   unsigned int mCalls; ///< Keeps track of how many times the signal has been called.
118 };
119
120 } //namespace
121
122 int UtcDaliSuperBlurViewNew(void)
123 {
124   ToolkitTestApplication application;
125
126   tet_infoline(" UtcDaliSuperBlurViewNew ");
127
128   // Test default constructor.
129   SuperBlurView blurView;
130   DALI_TEST_CHECK(!blurView);
131
132   // Test object creation
133   blurView = SuperBlurView::New(BLUR_LEVELS);
134   DALI_TEST_CHECK(blurView);
135
136   //Additional check to ensure object is created by checking if it's registered
137   ObjectRegistry registry = application.GetCore().GetObjectRegistry();
138   DALI_TEST_CHECK(registry);
139
140   gObjectCreatedCallBackCalled = false;
141   registry.ObjectCreatedSignal().Connect(&TestCallback);
142   {
143     SuperBlurView blurView = SuperBlurView::New(BLUR_LEVELS);
144   }
145   DALI_TEST_CHECK(gObjectCreatedCallBackCalled);
146
147   // Test copy constructor
148   SuperBlurView blurViewCopy2(blurView);
149   DALI_TEST_CHECK(blurViewCopy2);
150
151   // Test down cast
152   Actor actorView;
153   actorView                  = blurView;
154   SuperBlurView downCastView = SuperBlurView::DownCast(actorView);
155   DALI_TEST_CHECK(downCastView);
156   END_TEST;
157 }
158
159 int UtcDaliSuperBlurViewCreate(void)
160 {
161   ToolkitTestApplication application;
162
163   tet_infoline(" UtcDaliSuperBlurViewNew ");
164
165   // Test default constructor.
166   SuperBlurView blurView;
167   DALI_TEST_CHECK(!blurView);
168
169   // Test object creation
170   TypeInfo type = TypeRegistry::Get().GetTypeInfo("SuperBlurView");
171   if(type)
172   {
173     Dali::BaseHandle handle = type.CreateInstance();
174     if(handle)
175     {
176       blurView = Dali::Toolkit::SuperBlurView::DownCast(handle);
177     }
178   }
179
180   DALI_TEST_CHECK(blurView);
181
182   END_TEST;
183 }
184
185 int UtcDaliSuperBlurViewSetTexture(void)
186 {
187   ToolkitTestApplication application;
188
189   tet_infoline(" UtcDaliSuperBlurViewSetTexture ");
190
191   SuperBlurView blurView = SuperBlurView::New(BLUR_LEVELS);
192   blurView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
193
194   Texture inputTexture = CreateSolidColorTexture(application, Color::GREEN, 50, 50);
195   blurView.SetTexture(inputTexture);
196   // start multiple guassian blur call, each guassian blur creates two render tasks
197   DALI_TEST_CHECK(application.GetScene().GetRenderTaskList().GetTaskCount() == 1 + BLUR_LEVELS * 2);
198
199   {
200     // create renderers for the original image and each blurred image
201     application.GetScene().Add(blurView);
202     Wait(application);
203     DALI_TEST_EQUALS(blurView.GetRendererCount(), BLUR_LEVELS + 1, TEST_LOCATION);
204
205     Wait(application);
206     application.GetScene().Remove(blurView);
207   }
208
209   END_TEST;
210 }
211
212 int UtcDaliSuperBlurViewSetTexture2(void)
213 {
214   ToolkitTestApplication application;
215   Integration::Scene     stage = application.GetScene();
216
217   tet_infoline(" UtcDaliSuperBlurViewSetTexture2 - test setting a second texture ");
218
219   SuperBlurView blurView = SuperBlurView::New(BLUR_LEVELS);
220   blurView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
221
222   tet_infoline("Call SetTexture and add blurview to stage");
223   Texture inputTexture = CreateSolidColorTexture(application, Color::GREEN, 50, 50);
224   blurView.SetTexture(inputTexture);
225
226   // start multiple guassian blur call, each guassian blur creates two render tasks
227   DALI_TEST_CHECK(application.GetScene().GetRenderTaskList().GetTaskCount() == 1 + BLUR_LEVELS * 2);
228   {
229     // create renderers for the original image and each blurred image
230     stage.Add(blurView);
231     Wait(application);
232     DALI_TEST_EQUALS(blurView.GetRendererCount(), BLUR_LEVELS + 1, TEST_LOCATION);
233
234     tet_infoline("Wait for a second to allow blur to finish");
235     Wait(application, 1000);
236
237     tet_infoline("Remove from stage");
238     application.GetScene().Remove(blurView);
239   }
240
241   tet_infoline("Test that there are no render tasks remaining");
242   DALI_TEST_EQUALS(blurView.GetRendererCount(), 0, TEST_LOCATION);
243
244   tet_infoline("Call SetTexture a second time and add blurview back to stage");
245   Texture inputTexture2 = CreateSolidColorTexture(application, Color::CYAN, 50, 50);
246   blurView.SetTexture(inputTexture2);
247   // start multiple guassian blur call, each guassian blur creates two render tasks
248   DALI_TEST_CHECK(application.GetScene().GetRenderTaskList().GetTaskCount() == 1 + BLUR_LEVELS * 2);
249
250   {
251     // create renderers for the original image and each blurred image
252     application.GetScene().Add(blurView);
253     Wait(application);
254     DALI_TEST_EQUALS(blurView.GetRendererCount(), BLUR_LEVELS + 1, TEST_LOCATION);
255
256     tet_infoline("Wait for a second to allow blur to finish");
257     Wait(application, 1000);
258
259     tet_infoline("Remove from stage");
260     application.GetScene().Remove(blurView);
261   }
262
263   tet_infoline("Test that there are no render tasks remaining");
264   DALI_TEST_EQUALS(blurView.GetRendererCount(), 0, TEST_LOCATION);
265
266   END_TEST;
267 }
268
269 int UtcDaliSuperBlurViewSetProperty(void)
270 {
271   ToolkitTestApplication application;
272
273   tet_infoline(" UtcDaliSuperBlurViewSetProperty ");
274
275   SuperBlurView blurView = SuperBlurView::New(BLUR_LEVELS);
276   // create renderers for the original image and each blurred image
277   application.GetScene().Add(blurView);
278   blurView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
279
280   // Will create ResourceImage
281   blurView.SetProperty(SuperBlurView::Property::IMAGE_URL, TEST_IMAGE_FILE_NAME);
282   Wait(application);
283
284   // start multiple guassian blur call, each guassian blur creates two render tasks
285
286   unsigned int count = application.GetScene().GetRenderTaskList().GetTaskCount();
287   DALI_TEST_CHECK(count == 1 + BLUR_LEVELS * 2);
288
289   Wait(application);
290
291   END_TEST;
292 }
293
294 int UtcDaliSuperBlurViewGetProperty(void)
295 {
296   ToolkitTestApplication application;
297
298   tet_infoline(" UtcDaliSuperBlurViewSetProperty ");
299
300   SuperBlurView blurView = SuperBlurView::New(BLUR_LEVELS);
301   blurView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
302
303   blurView.SetProperty(SuperBlurView::Property::IMAGE_URL, TEST_IMAGE_FILE_NAME);
304   Wait(application);
305
306   // create renderers for the original image and each blurred image
307   application.GetScene().Add(blurView);
308
309   std::string imageUrl = blurView.GetProperty<std::string>(SuperBlurView::Property::IMAGE_URL);
310   DALI_TEST_EQUALS(imageUrl, TEST_IMAGE_FILE_NAME, TEST_LOCATION);
311
312   END_TEST;
313 }
314
315 int UtcDaliSuperBlurViewSetGetBlurStrength(void)
316 {
317   ToolkitTestApplication application;
318
319   tet_infoline(" UtcDaliSuperBlurViewSetGetBlurStrength ");
320
321   SuperBlurView blurView = SuperBlurView::New(BLUR_LEVELS);
322   DALI_TEST_EQUALS(blurView.GetCurrentBlurStrength(), 0.f, TEST_LOCATION);
323
324   blurView.SetBlurStrength(0.65f);
325   Wait(application);
326   DALI_TEST_EQUALS(blurView.GetCurrentBlurStrength(), 0.65f, TEST_LOCATION);
327   END_TEST;
328 }
329
330 int UtcDaliSuperBlurViewGetBlurStrengthPropertyIndex(void)
331 {
332   ToolkitTestApplication application;
333
334   tet_infoline(" UtcDaliSuperBlurViewGetBlurStrengthPropertyIndex ");
335
336   SuperBlurView   blurView        = SuperBlurView::New(BLUR_LEVELS);
337   Property::Index blurPropertyIdx = blurView.GetBlurStrengthPropertyIndex();
338
339   float blurStrength;
340   (blurView.GetProperty(blurPropertyIdx)).Get(blurStrength);
341   DALI_TEST_EQUALS(blurStrength, 0.f, TEST_LOCATION);
342
343   blurView.SetBlurStrength(0.65f);
344   Wait(application);
345   (blurView.GetProperty(blurPropertyIdx)).Get(blurStrength);
346   DALI_TEST_EQUALS(blurStrength, 0.65f, TEST_LOCATION);
347   END_TEST;
348 }
349
350 int UtcDaliSuperBlurViewGetBlurredTexture(void)
351 {
352   ToolkitTestApplication application;
353
354   tet_infoline("UtcDaliSuperBlurViewGetBlurredTexture");
355
356   SuperBlurView blurView = SuperBlurView::New(BLUR_LEVELS);
357   blurView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
358   Texture inputTexture = CreateSolidColorTexture(application, Color::GREEN, 100, 100);
359   blurView.SetTexture(inputTexture);
360
361   Wait(application, 200); // Make sure all the gaussian blur finished
362
363   Texture texture1 = blurView.GetBlurredTexture(1);
364   DALI_TEST_CHECK(texture1);
365
366   Texture texture2 = blurView.GetBlurredTexture(2);
367   DALI_TEST_EQUALS(texture2.GetWidth(), 25u, TEST_LOCATION);
368   DALI_TEST_EQUALS(texture2.GetHeight(), 25u, TEST_LOCATION);
369
370   Texture texture3 = blurView.GetBlurredTexture(3);
371   DALI_TEST_CHECK(texture3);
372
373   END_TEST;
374 }
375
376 int UtcDaliSuperBlurViewBlurSignal(void)
377 {
378   ToolkitTestApplication application;
379
380   tet_infoline(" UtcDaliSuperBlurViewSignal ");
381
382   SuperBlurView blurView = SuperBlurView::New(BLUR_LEVELS);
383   blurView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
384
385   Texture inputTexture = CreateSolidColorTexture(application, Color::GREEN, 50, 50);
386   blurView.SetTexture(inputTexture);
387   // start multiple guassian blur call, each guassian blur creates two render tasks
388   DALI_TEST_CHECK(application.GetScene().GetRenderTaskList().GetTaskCount() == 1 + BLUR_LEVELS * 2);
389
390   SignalHandler signalHandler;
391   blurView.BlurFinishedSignal().Connect(&signalHandler, &SignalHandler::Callback);
392
393   // create renderers for the original image and each blurred image
394   application.GetScene().Add(blurView);
395   Wait(application, 1000);
396
397   DALI_TEST_EQUALS(blurView.GetRendererCount(), BLUR_LEVELS + 1, TEST_LOCATION);
398   //DALI_TEST_EQUALS(signalHandler.GetCalls(), 1, TEST_LOCATION);
399
400   END_TEST;
401 }