Merge "Remove invalid calls to EnableVisual from Button" into devel/master
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-AnimatedVectorImageVisual.cpp
1 /*
2  * Copyright (c) 2018 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 <iostream>
18 #include <stdlib.h>
19 #include <dali-toolkit-test-suite-utils.h>
20 #include <toolkit-timer.h>
21 #include <toolkit-event-thread-callback.h>
22 #include <dali-toolkit/dali-toolkit.h>
23 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
24 #include <dali-toolkit/devel-api/controls/control-devel.h>
25 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
26 #include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h>
27 #include <dali-toolkit/devel-api/visuals/animated-vector-image-visual-actions-devel.h>
28 #include "dummy-control.h"
29
30 using namespace Dali;
31 using namespace Dali::Toolkit;
32
33 void dali_animated_vector_image_visual_startup(void)
34 {
35   test_return_value = TET_UNDEF;
36 }
37
38 void dali_animated_vector_image_visual_cleanup(void)
39 {
40   test_return_value = TET_PASS;
41 }
42
43 namespace
44 {
45
46 const char* TEST_VECTOR_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR  "/insta_camera.json";
47
48 }
49
50 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual01(void)
51 {
52   ToolkitTestApplication application;
53   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual01: Request animated vector image visual with a json url" );
54
55   VisualFactory factory = VisualFactory::Get();
56   Visual::Base visual = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
57   DALI_TEST_CHECK( visual );
58
59   DummyControl actor = DummyControl::New( true );
60   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
61   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
62   actor.SetSize( 200.0f, 200.0f );
63   Stage::GetCurrent().Add( actor );
64
65   application.SendNotification();
66   application.Render();
67
68   // Wait for resource ready event callback
69   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
70
71   // renderer is added to actor
72   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
73   Renderer renderer = actor.GetRendererAt( 0u );
74   DALI_TEST_CHECK( renderer );
75
76   // Test SetOffStage().
77   actor.Unparent();
78   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
79
80   END_TEST;
81 }
82
83 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual02(void)
84 {
85   ToolkitTestApplication application;
86   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual02: Request animated vector image visual with a Property::Map" );
87
88   Property::Map propertyMap;
89   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
90              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  );
91
92   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
93   DALI_TEST_CHECK( visual );
94
95   DummyControl actor = DummyControl::New( true );
96   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
97   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
98   actor.SetSize( 200.0f, 200.0f );
99   Stage::GetCurrent().Add( actor );
100
101   application.SendNotification();
102   application.Render();
103
104   // Wait for resource ready event callback
105   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
106
107   // renderer is added to actor
108   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
109   Renderer renderer = actor.GetRendererAt( 0u );
110   DALI_TEST_CHECK( renderer );
111
112   actor.Unparent( );
113   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
114
115   END_TEST;
116 }
117
118 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual03(void)
119 {
120   ToolkitTestApplication application;
121   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual03: Request animated vector image visual with a Property::Map" );
122
123   Property::Map propertyMap;
124   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
125              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
126              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  )
127              .Add( DevelImageVisual::Property::PLAY_RANGE, Vector2( 0.2f, 0.8f )  );
128
129   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
130   DALI_TEST_CHECK( visual );
131
132   DummyControl actor = DummyControl::New( true );
133   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
134   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
135   actor.SetSize( 200.0f, 200.0f );
136   Stage::GetCurrent().Add( actor );
137
138   application.SendNotification();
139   application.Render();
140
141   // Wait for resource ready event callback
142   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
143
144   // renderer is added to actor
145   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
146   Renderer renderer = actor.GetRendererAt( 0u );
147   DALI_TEST_CHECK( renderer );
148
149   actor.Unparent( );
150   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
151
152   END_TEST;
153 }
154
155 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual04(void)
156 {
157   ToolkitTestApplication application;
158   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual04: Request animated vector image visual with a Property::Map" );
159
160   Property::Map propertyMap;
161   propertyMap.Add( "visualType", DevelVisual::ANIMATED_VECTOR_IMAGE )
162              .Add( "url", TEST_VECTOR_IMAGE_FILE_NAME  )
163              .Add( "loopCount", 3  )
164              .Add( "playRange", Vector2( 0.2f, 0.8f )  );
165
166   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
167   DALI_TEST_CHECK( visual );
168
169   DummyControl actor = DummyControl::New( true );
170   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
171   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
172   actor.SetSize( 200.0f, 200.0f );
173   Stage::GetCurrent().Add( actor );
174
175   application.SendNotification();
176   application.Render();
177
178   // Wait for resource ready event callback
179   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
180
181   // renderer is added to actor
182   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
183   Renderer renderer = actor.GetRendererAt( 0u );
184   DALI_TEST_CHECK( renderer );
185
186   actor.Unparent( );
187   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
188
189   END_TEST;
190 }
191
192 int UtcDaliAnimatedVectorImageVisualGetPropertyMap01(void)
193 {
194   ToolkitTestApplication application;
195   tet_infoline( "UtcDaliAnimatedVectorImageVisualGetPropertyMap01" );
196
197   Vector2 playRange( 0.2f, 0.8f );
198
199   Property::Map propertyMap;
200   propertyMap.Add( Toolkit::Visual::Property::TYPE,  DevelVisual::ANIMATED_VECTOR_IMAGE )
201              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
202              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  )
203              .Add( DevelImageVisual::Property::PLAY_RANGE, playRange  );
204
205   // request AnimatedVectorImageVisual with a property map
206   VisualFactory factory = VisualFactory::Get();
207   Visual::Base visual = factory.CreateVisual( propertyMap );
208
209   Property::Map resultMap;
210   visual.CreatePropertyMap( resultMap );
211
212   // check the property values from the returned map from a visual
213   Property::Value* value = resultMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER );
214   DALI_TEST_CHECK( value );
215   DALI_TEST_CHECK( value->Get< int >() == DevelVisual::ANIMATED_VECTOR_IMAGE );
216
217   value = resultMap.Find( ImageVisual::Property::URL, Property::STRING );
218   DALI_TEST_CHECK( value );
219   DALI_TEST_CHECK( value->Get< std::string >() == TEST_VECTOR_IMAGE_FILE_NAME );
220
221   value = resultMap.Find( DevelImageVisual::Property::LOOP_COUNT, Property::INTEGER );
222   DALI_TEST_CHECK( value );
223   DALI_TEST_CHECK( value->Get< int >() == 3 );
224
225   value = resultMap.Find( DevelImageVisual::Property::PLAY_RANGE, Property::VECTOR2 );
226   DALI_TEST_CHECK( value );
227   DALI_TEST_CHECK( value->Get< Vector2 >() == playRange );
228
229   // request AnimatedVectorImageVisual with an URL
230   Visual::Base visual2 = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
231
232   resultMap.Clear();
233   visual2.CreatePropertyMap( resultMap );
234
235   // check the property values from the returned map from a visual
236   value = resultMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER );
237   DALI_TEST_CHECK( value );
238   DALI_TEST_CHECK( value->Get< int >() == DevelVisual::ANIMATED_VECTOR_IMAGE );
239
240   value = resultMap.Find( ImageVisual::Property::URL, Property::STRING );
241   DALI_TEST_CHECK( value );
242   DALI_TEST_CHECK( value->Get< std::string >() == TEST_VECTOR_IMAGE_FILE_NAME );
243
244   END_TEST;
245 }
246
247 int UtcDaliAnimatedVectorImageVisualPlayback(void)
248 {
249   ToolkitTestApplication application;
250
251   tet_infoline( "UtcDaliAnimatedVectorImageVisualPlayback" );
252
253   {
254     // request AnimatedVectorImageVisual with a property map
255     VisualFactory factory = VisualFactory::Get();
256     Visual::Base visual = factory.CreateVisual(
257       Property::Map()
258       .Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
259       .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME ) );
260
261     DummyControl dummyControl = DummyControl::New( true );
262     Impl::DummyControl& dummyImpl = static_cast< Impl::DummyControl& >( dummyControl.GetImplementation() );
263     dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
264     dummyControl.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
265
266     Property::Map attributes;
267     tet_infoline( "Test Play action" );
268     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
269
270     Stage::GetCurrent().Add( dummyControl );
271     application.SendNotification();
272     application.Render( 16 );
273
274     DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
275
276     // test
277
278     tet_infoline( "Test Pause action" );
279     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, attributes );
280
281     application.SendNotification();
282     application.Render(16);
283
284     // test
285
286     tet_infoline( "Test Resume action" );
287     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::RESUME, attributes );
288
289     application.SendNotification();
290     application.Render(16);
291
292     // test
293
294     tet_infoline( "Test Stop action" );
295     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
296
297     application.SendNotification();
298     application.Render(16);
299
300     // test
301
302     tet_infoline( "Test Stop action again" );
303     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
304
305     application.SendNotification();
306     application.Render(16);
307
308     // test
309
310     tet_infoline( "Test Play action" );
311     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
312
313     application.SendNotification();
314     application.Render(16);
315
316     // test
317
318     dummyControl.SetSize( 100.0f, 100.0f );
319
320     application.SendNotification();
321     application.Render(16);
322
323     // test
324     // Size should be changed
325
326     dummyControl.Unparent();
327   }
328
329   END_TEST;
330 }
331
332 int UtcDaliAnimatedVectorImageVisualCustomShader(void)
333 {
334   ToolkitTestApplication application;
335   tet_infoline( "UtcDaliAnimatedVectorImageVisualCustomShader Test custom shader" );
336
337   VisualFactory factory = VisualFactory::Get();
338   Property::Map properties;
339   Property::Map shader;
340   const std::string vertexShader = "Foobar";
341   const std::string fragmentShader = "Foobar sampler2D Foobar";
342   shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader;
343   shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader;
344
345   properties[Visual::Property::TYPE] = Visual::IMAGE;
346   properties[Visual::Property::SHADER] = shader;
347   properties[ImageVisual::Property::URL] = TEST_VECTOR_IMAGE_FILE_NAME;
348
349   Visual::Base visual = factory.CreateVisual( properties );
350
351   // trigger creation through setting on stage
352   DummyControl dummy = DummyControl::New( true );
353   Impl::DummyControl& dummyImpl = static_cast< Impl::DummyControl& >( dummy.GetImplementation() );
354   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
355
356   dummy.SetSize( 200.f, 200.f );
357   dummy.SetParentOrigin( ParentOrigin::CENTER );
358   Stage::GetCurrent().Add( dummy );
359
360   application.SendNotification();
361   application.Render();
362
363   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
364
365   Renderer renderer = dummy.GetRendererAt( 0 );
366   Shader shader2 = renderer.GetShader();
367   Property::Value value = shader2.GetProperty( Shader::Property::PROGRAM );
368   Property::Map* map = value.GetMap();
369   DALI_TEST_CHECK( map );
370
371   std::string resultFragmentShader, resultVertexShader;
372   Property::Value* fragment = map->Find( "fragment" ); // fragment key name from shader-impl.cpp
373   fragment->Get( resultFragmentShader );
374   DALI_TEST_CHECK( resultFragmentShader.find( fragmentShader ) != std::string::npos );
375
376   Property::Value* vertex = map->Find( "vertex" ); // vertex key name from shader-impl.cpp
377   vertex->Get( resultVertexShader );
378   DALI_TEST_CHECK( resultVertexShader.find( vertexShader ) != std::string::npos );
379
380   END_TEST;
381 }
382
383 int UtcDaliAnimatedVectorImageVisualNaturalSize(void)
384 {
385   ToolkitTestApplication application;
386   tet_infoline( "UtcDaliAnimatedVectorImageVisualNaturalSize" );
387
388   VisualFactory factory = VisualFactory::Get();
389   Visual::Base visual = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
390   DALI_TEST_CHECK( visual );
391
392   DummyControl actor = DummyControl::New( true );
393   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
394   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
395
396   Vector2 controlSize( 20.f, 30.f );
397   Vector2 naturalSize;
398
399   actor.SetSize( controlSize );
400   Stage::GetCurrent().Add( actor );
401
402   application.SendNotification();
403   application.Render();
404
405   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
406
407   visual.GetNaturalSize( naturalSize );
408
409   DALI_TEST_EQUALS( naturalSize, controlSize, TEST_LOCATION );
410
411   END_TEST;
412 }
413
414 int UtcDaliAnimatedVectorImageVisualLoopCount(void)
415 {
416   ToolkitTestApplication application;
417   tet_infoline( "UtcDaliAnimatedVectorImageVisualLoopCount" );
418
419   Property::Map propertyMap;
420   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
421              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
422              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  );
423
424   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
425   DALI_TEST_CHECK( visual );
426
427   DummyControl actor = DummyControl::New( true );
428   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
429   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
430
431   Vector2 controlSize( 20.f, 30.f );
432   actor.SetSize( controlSize );
433
434   Stage::GetCurrent().Add( actor );
435
436   Property::Map attributes;
437   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
438
439   application.SendNotification();
440   application.Render();
441
442   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
443
444   // renderer is added to actor
445   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
446   Renderer renderer = actor.GetRendererAt( 0u );
447   DALI_TEST_CHECK( renderer );
448
449   END_TEST;
450 }
451
452 int UtcDaliAnimatedVectorImageVisualPlayRange(void)
453 {
454   ToolkitTestApplication application;
455   tet_infoline( "UtcDaliAnimatedVectorImageVisualPlayRange" );
456
457   Vector2 playRange( 0.8f, 0.2f );
458
459   Property::Map propertyMap;
460   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
461              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
462              .Add( DevelImageVisual::Property::PLAY_RANGE, playRange  );
463
464   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
465   DALI_TEST_CHECK( visual );
466
467   DummyControl actor = DummyControl::New( true );
468   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
469   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
470
471   Vector2 controlSize( 20.f, 30.f );
472   actor.SetSize( controlSize );
473
474   Stage::GetCurrent().Add( actor );
475
476   Property::Map attributes;
477   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
478
479   application.SendNotification();
480   application.Render();
481
482   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
483
484   // renderer is added to actor
485   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
486   Renderer renderer = actor.GetRendererAt( 0u );
487   DALI_TEST_CHECK( renderer );
488
489   END_TEST;
490 }