[dali_1.3.53] Merge branch '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 UtcDaliAnimatedVectorImageVisualGetPropertyMap01(void)
119 {
120   ToolkitTestApplication application;
121   tet_infoline( "UtcDaliAnimatedVectorImageVisualGetPropertyMap01" );
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
127   // request AnimatedVectorImageVisual with a property map
128   VisualFactory factory = VisualFactory::Get();
129   Visual::Base visual = factory.CreateVisual( propertyMap );
130
131   Property::Map resultMap;
132   visual.CreatePropertyMap( resultMap );
133
134   // check the property values from the returned map from a visual
135   Property::Value* value = resultMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER );
136   DALI_TEST_CHECK( value );
137   DALI_TEST_CHECK( value->Get< int >() == DevelVisual::ANIMATED_VECTOR_IMAGE );
138
139   value = resultMap.Find( ImageVisual::Property::URL, Property::STRING );
140   DALI_TEST_CHECK( value );
141   DALI_TEST_CHECK( value->Get< std::string >() == TEST_VECTOR_IMAGE_FILE_NAME );
142
143   // request AnimatedVectorImageVisual with an URL
144   Visual::Base visual2 = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
145
146   resultMap.Clear();
147   visual2.CreatePropertyMap( resultMap );
148
149   // check the property values from the returned map from a visual
150   value = resultMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER );
151   DALI_TEST_CHECK( value );
152   DALI_TEST_CHECK( value->Get< int >() == DevelVisual::ANIMATED_VECTOR_IMAGE );
153
154   value = resultMap.Find( ImageVisual::Property::URL, Property::STRING );
155   DALI_TEST_CHECK( value );
156   DALI_TEST_CHECK( value->Get< std::string >() == TEST_VECTOR_IMAGE_FILE_NAME );
157
158   END_TEST;
159 }
160
161 int UtcDaliAnimatedVectorImageVisualPlayback(void)
162 {
163   ToolkitTestApplication application;
164
165   tet_infoline( "UtcDaliAnimatedVectorImageVisualPlayback" );
166
167   {
168     // request AnimatedVectorImageVisual with a property map
169     VisualFactory factory = VisualFactory::Get();
170     Visual::Base visual = factory.CreateVisual(
171       Property::Map()
172       .Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
173       .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME ) );
174
175     DummyControl dummyControl = DummyControl::New( true );
176     Impl::DummyControl& dummyImpl = static_cast< Impl::DummyControl& >( dummyControl.GetImplementation() );
177     dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
178     dummyControl.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
179
180     Property::Map attributes;
181     tet_infoline( "Test Play action" );
182     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
183
184     Stage::GetCurrent().Add( dummyControl );
185     application.SendNotification();
186     application.Render( 16 );
187
188     DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
189
190     // test
191
192     tet_infoline( "Test Pause action" );
193     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, attributes );
194
195     application.SendNotification();
196     application.Render(16);
197
198     // test
199
200     tet_infoline( "Test Resume action" );
201     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::RESUME, attributes );
202
203     application.SendNotification();
204     application.Render(16);
205
206     // test
207
208     tet_infoline( "Test Stop action" );
209     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
210
211     application.SendNotification();
212     application.Render(16);
213
214     // test
215
216     tet_infoline( "Test Stop action again" );
217     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
218
219     application.SendNotification();
220     application.Render(16);
221
222     // test
223
224     tet_infoline( "Test Play action" );
225     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
226
227     application.SendNotification();
228     application.Render(16);
229
230     // test
231
232     dummyControl.SetSize( 100.0f, 100.0f );
233
234     application.SendNotification();
235     application.Render(16);
236
237     // test
238     // Size should be changed
239
240     dummyControl.Unparent();
241   }
242
243   END_TEST;
244 }
245
246 int UtcDaliAnimatedVectorImageVisualCustomShader(void)
247 {
248   ToolkitTestApplication application;
249   tet_infoline( "UtcDaliAnimatedVectorImageVisualCustomShader Test custom shader" );
250
251   VisualFactory factory = VisualFactory::Get();
252   Property::Map properties;
253   Property::Map shader;
254   const std::string vertexShader = "Foobar";
255   const std::string fragmentShader = "Foobar sampler2D Foobar";
256   shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader;
257   shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader;
258
259   properties[Visual::Property::TYPE] = Visual::IMAGE;
260   properties[Visual::Property::SHADER] = shader;
261   properties[ImageVisual::Property::URL] = TEST_VECTOR_IMAGE_FILE_NAME;
262
263   Visual::Base visual = factory.CreateVisual( properties );
264
265   // trigger creation through setting on stage
266   DummyControl dummy = DummyControl::New( true );
267   Impl::DummyControl& dummyImpl = static_cast< Impl::DummyControl& >( dummy.GetImplementation() );
268   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
269
270   dummy.SetSize( 200.f, 200.f );
271   dummy.SetParentOrigin( ParentOrigin::CENTER );
272   Stage::GetCurrent().Add( dummy );
273
274   application.SendNotification();
275   application.Render();
276
277   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
278
279   Renderer renderer = dummy.GetRendererAt( 0 );
280   Shader shader2 = renderer.GetShader();
281   Property::Value value = shader2.GetProperty( Shader::Property::PROGRAM );
282   Property::Map* map = value.GetMap();
283   DALI_TEST_CHECK( map );
284
285   std::string resultFragmentShader, resultVertexShader;
286   Property::Value* fragment = map->Find( "fragment" ); // fragment key name from shader-impl.cpp
287   fragment->Get( resultFragmentShader );
288   DALI_TEST_CHECK( resultFragmentShader.find( fragmentShader ) != std::string::npos );
289
290   Property::Value* vertex = map->Find( "vertex" ); // vertex key name from shader-impl.cpp
291   vertex->Get( resultVertexShader );
292   DALI_TEST_CHECK( resultVertexShader.find( vertexShader ) != std::string::npos );
293
294   END_TEST;
295 }
296
297 int UtcDaliAnimatedVectorImageVisualNaturalSize(void)
298 {
299   ToolkitTestApplication application;
300   tet_infoline( "UtcDaliAnimatedVectorImageVisualNaturalSize" );
301
302   VisualFactory factory = VisualFactory::Get();
303   Visual::Base visual = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
304   DALI_TEST_CHECK( visual );
305
306   DummyControl actor = DummyControl::New( true );
307   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
308   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
309
310   Vector2 controlSize( 20.f, 30.f );
311   Vector2 naturalSize;
312
313   actor.SetSize( controlSize );
314   Stage::GetCurrent().Add( actor );
315
316   application.SendNotification();
317   application.Render();
318
319   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
320
321   visual.GetNaturalSize( naturalSize );
322
323   DALI_TEST_EQUALS( naturalSize, controlSize, TEST_LOCATION );
324
325   END_TEST;
326 }