Refactoring of path constraints + LinearConstrainer
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-Material.cpp
1 /*
2  * Copyright (c) 2014 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 <iostream>
19
20 #include <stdlib.h>
21 #include <dali/public-api/dali-core.h>
22 #include <dali-test-suite-utils.h>
23
24 using namespace Dali;
25
26
27 void utc_dali_material_startup(void)
28 {
29   test_return_value = TET_UNDEF;
30 }
31
32 void utc_dali_material_cleanup(void)
33 {
34   test_return_value = TET_PASS;
35 }
36
37 namespace
38 {
39
40 static AnimatableMesh CreateMeshData(Material material)
41 {
42   AnimatableMesh::Faces faces;
43   for(int i=0; i<10-3; i++)
44   {
45     faces.push_back(i);
46     faces.push_back(i+1);
47     faces.push_back(i+2);
48   }
49   return AnimatableMesh::New(10, faces, material);
50 }
51
52 }// anonymous namespace
53
54
55 // Positive test case for a method
56 int UtcDaliMaterialNew01(void)
57 {
58   TestApplication application;
59   tet_infoline("Testing constructors, New and destructors");
60
61   Material material;
62   DALI_TEST_CHECK( ! material );
63
64   material = Material::New("material");
65   DALI_TEST_CHECK( material );
66
67   Material* material2 = new Material();
68   DALI_TEST_CHECK( ! *material2 );
69   delete material2;
70
71   Material material3 = material;
72   Material material4;
73   material4 = material;
74   Material material5 = material;
75   END_TEST;
76 }
77
78
79 int UtcDaliMaterialDownCast(void)
80 {
81   TestApplication application;
82
83   Material material = Material::New("material");
84   BaseHandle handle(material);
85
86   Material mat2 = Material::DownCast( handle );
87   DALI_TEST_CHECK( mat2 );
88   END_TEST;
89 }
90
91 int UtcDaliMaterialSettersAndGetters(void)
92 {
93   TestApplication application;
94   Material material = Material::New("material");
95   DALI_TEST_EQUALS( material.GetName(), "material", TEST_LOCATION );
96   material.SetName( "AnotherMaterial" );
97   DALI_TEST_EQUALS( material.GetName(), "AnotherMaterial", TEST_LOCATION );
98
99   DALI_TEST_EQUALS( material.GetOpacity(), Material::DEFAULT_OPACITY, 0.001, TEST_LOCATION);
100   material.SetOpacity(0.38f);
101   DALI_TEST_EQUALS( material.GetOpacity(), 0.38f, 0.001, TEST_LOCATION);
102
103   DALI_TEST_EQUALS( material.GetShininess(), Material::DEFAULT_SHININESS, 0.001, TEST_LOCATION);
104   material.SetShininess(0.47f);
105   DALI_TEST_EQUALS( material.GetShininess(), 0.47f, 0.001, TEST_LOCATION);
106
107   DALI_TEST_EQUALS( material.GetAmbientColor(), Material::DEFAULT_AMBIENT_COLOR, 0.001, TEST_LOCATION);
108   material.SetAmbientColor(Color::BLACK);
109   DALI_TEST_EQUALS( material.GetAmbientColor(), Color::BLACK, 0.001, TEST_LOCATION);
110
111   DALI_TEST_EQUALS( material.GetDiffuseColor(), Material::DEFAULT_DIFFUSE_COLOR, 0.001, TEST_LOCATION);
112   material.SetDiffuseColor(Color::BLUE);
113   DALI_TEST_EQUALS( material.GetDiffuseColor(), Color::BLUE, 0.001, TEST_LOCATION);
114
115   DALI_TEST_EQUALS( material.GetSpecularColor(), Material::DEFAULT_SPECULAR_COLOR, 0.001, TEST_LOCATION);
116   material.SetSpecularColor(Color::GREEN);
117   DALI_TEST_EQUALS( material.GetSpecularColor(), Color::GREEN, 0.001, TEST_LOCATION);
118
119   DALI_TEST_EQUALS( material.GetEmissiveColor(), Material::DEFAULT_EMISSIVE_COLOR, 0.001, TEST_LOCATION);
120   material.SetEmissiveColor(Color::MAGENTA);
121   DALI_TEST_EQUALS( material.GetEmissiveColor(), Color::MAGENTA, 0.001, TEST_LOCATION);
122
123   material.SetDiffuseTextureFileName("diffuse-texture.png");
124   DALI_TEST_EQUALS( material.GetDiffuseFileName(), "diffuse-texture.png", TEST_LOCATION);
125
126   material.SetOpacityTextureFileName("opacity-texture.png");
127   DALI_TEST_EQUALS( material.GetOpacityTextureFileName(), "opacity-texture.png", TEST_LOCATION);
128
129   material.SetNormalMapFileName("normal-map.png");
130   DALI_TEST_EQUALS( material.GetNormalMapFileName(), "normal-map.png", TEST_LOCATION);
131
132   Image diffuseTexture = ResourceImage::New("diffuse-texture.png");
133   material.SetDiffuseTexture(diffuseTexture);
134   DALI_TEST_EQUALS( material.GetDiffuseTexture(), diffuseTexture, TEST_LOCATION );
135
136   Image opacityTexture = ResourceImage::New("opacity-texture.png");
137   material.SetOpacityTexture(opacityTexture);
138   DALI_TEST_EQUALS( material.GetOpacityTexture(), opacityTexture, TEST_LOCATION);
139
140   Image normalMap = ResourceImage::New("normal-map.png");
141   material.SetNormalMap(normalMap);
142   DALI_TEST_EQUALS( material.GetNormalMap(), normalMap, TEST_LOCATION);
143
144   DALI_TEST_EQUALS( material.GetMapU(), (unsigned int)Material::DEFAULT_MAPPING_MODE, TEST_LOCATION );
145   DALI_TEST_EQUALS( material.GetMapV(), (unsigned int)Material::DEFAULT_MAPPING_MODE, TEST_LOCATION );
146   material.SetMapU( Material::MAPPING_MODE_WRAP );
147   material.SetMapV( Material::MAPPING_MODE_MIRROR );
148   DALI_TEST_EQUALS( material.GetMapU(), (unsigned int)Material::MAPPING_MODE_WRAP, TEST_LOCATION );
149   DALI_TEST_EQUALS( material.GetMapV(), (unsigned int)Material::MAPPING_MODE_MIRROR, TEST_LOCATION );
150
151   DALI_TEST_EQUALS( material.GetDiffuseUVIndex(), Material::DEFAULT_DIFFUSE_UV_INDEX, TEST_LOCATION );
152   material.SetDiffuseUVIndex( 1u );
153   DALI_TEST_EQUALS( material.GetDiffuseUVIndex(), 1u, TEST_LOCATION );
154
155   DALI_TEST_EQUALS( material.GetOpacityUVIndex(), Material::DEFAULT_OPACITY_UV_INDEX, TEST_LOCATION );
156   material.SetOpacityUVIndex( 1u );
157   DALI_TEST_EQUALS( material.GetOpacityUVIndex(), 1u, TEST_LOCATION );
158
159   DALI_TEST_EQUALS( material.GetNormalUVIndex(), Material::DEFAULT_NORMAL_UV_INDEX, TEST_LOCATION );
160   material.SetNormalUVIndex( 1u );
161   DALI_TEST_EQUALS( material.GetNormalUVIndex(), 1u, TEST_LOCATION );
162
163   DALI_TEST_EQUALS( material.GetHasHeightMap(), Material::DEFAULT_HAS_HEIGHT_MAP, TEST_LOCATION );
164   material.SetHasHeightMap(true);
165   DALI_TEST_EQUALS( material.GetHasHeightMap(), true, TEST_LOCATION );
166   END_TEST;
167 }
168
169 int UtcDaliMaterialStage01(void)
170 {
171   TestApplication application;
172   TraceCallStack& textureTrace = application.GetGlAbstraction().GetTextureTrace();
173   textureTrace.Enable(true);
174   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
175
176   {
177     Material material = Material::New("material");
178     Image image = ResourceImage::New( "image.png", ResourceImage::IMMEDIATE, Image::NEVER );
179     DALI_TEST_CHECK(image);
180     application.SendNotification();
181     application.Render(16);
182
183     std::vector<GLuint> ids;
184     ids.push_back( 23 );
185     application.GetGlAbstraction().SetNextTextureIds( ids );
186     Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
187     Integration::ResourcePointer resource(bitmap);
188     bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
189     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
190     Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
191     DALI_TEST_CHECK( request != NULL );
192     if(request)
193     {
194       application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
195     }
196
197     material.SetDiffuseTexture(image);
198     application.SendNotification();
199     application.Render();
200
201     AnimatableMesh mesh = CreateMeshData(material);
202
203     application.SendNotification();
204     application.Render();
205     {
206       MeshActor meshActor = MeshActor::New(mesh);
207       meshActor.SetSize(100, 100);
208       Stage::GetCurrent().Add(meshActor);
209       application.SendNotification();
210       application.Render();
211
212       material.SetOpacity(0.5f);
213       application.SendNotification();
214       application.Render();
215       DALI_TEST_EQUALS( material.GetOpacity(), 0.5f, 0.001f, TEST_LOCATION );
216
217       Stage::GetCurrent().Remove(meshActor);
218       application.SendNotification();
219       application.Render();
220
221       DALI_TEST_CHECK( glAbstraction.CheckNoTexturesDeleted() );
222       DALI_TEST_CHECK( ! textureTrace.FindMethod( "DeleteTextures" ) );
223     }
224     application.SendNotification();
225     application.Render();
226
227     // Mesh should be destroyed, reducing connection count on material to zero.
228     // This should also reduce connection count on image to zero
229     DALI_TEST_EQUALS( material.GetOpacity(), 0.5f, 0.001f, TEST_LOCATION );
230   }
231   // SceneGraph::Material & SceneGraph::RenderMaterial should be destroyed
232   // Image should be destroyed
233   application.SendNotification();
234   application.Render();
235
236   application.Render();
237   DALI_TEST_CHECK( textureTrace.FindMethod( "DeleteTextures" ) );
238   DALI_TEST_CHECK( glAbstraction.CheckTextureDeleted( 23 ) );
239   END_TEST;
240 }
241
242
243 int UtcDaliMaterialStage01MemCheck(void)
244 {
245   TestApplication application;
246   tet_result(TET_PASS);
247   END_TEST;
248 }
249
250 int UtcDaliMaterialStage02(void)
251 {
252   TestApplication application;
253   TraceCallStack& textureTrace = application.GetGlAbstraction().GetTextureTrace();
254   textureTrace.Enable(true);
255   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
256
257   {
258     Material material = Material::New("material");
259
260     Image image = ResourceImage::New( "image.png", ResourceImage::ON_DEMAND, Image::UNUSED );
261     DALI_TEST_CHECK(image);
262     application.SendNotification();
263     application.Render(16);
264     DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
265     DALI_TEST_CHECK( application.GetPlatform().GetRequest() == NULL );
266
267     std::vector<GLuint> ids;
268     ids.push_back( 23 );
269     application.GetGlAbstraction().SetNextTextureIds( ids );
270
271     material.SetDiffuseTexture(image);
272     application.SendNotification();
273     application.Render();
274     DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
275     DALI_TEST_CHECK( application.GetPlatform().GetRequest() == NULL );
276
277     AnimatableMesh mesh = CreateMeshData(material);
278
279     application.SendNotification();
280     application.Render();
281     DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
282     DALI_TEST_CHECK( application.GetPlatform().GetRequest() == NULL );
283
284     {
285       MeshActor meshActor = MeshActor::New(mesh);
286       meshActor.SetSize(100, 100);
287       Stage::GetCurrent().Add(meshActor);
288       application.SendNotification();
289       application.Render();
290
291       // Image connection count should go to one - image should get loaded
292       DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
293       Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
294       DALI_TEST_CHECK( request != NULL );
295
296       Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
297       Integration::ResourcePointer resource(bitmap);
298       bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
299       if(request)
300       {
301         application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
302       }
303       application.Render();
304
305       material.SetOpacity(0.5f);
306       application.SendNotification();
307       application.Render();
308       DALI_TEST_EQUALS( material.GetOpacity(), 0.5f, 0.001f, TEST_LOCATION );
309
310       Stage::GetCurrent().Remove(meshActor);
311       application.SendNotification();
312       application.Render();
313
314       // This should reduce connection count on material to zero, freeing the texture:
315       DALI_TEST_CHECK( textureTrace.FindMethod( "DeleteTextures" ) );
316       DALI_TEST_CHECK( glAbstraction.CheckTextureDeleted( 23 ) );
317     }
318     application.SendNotification();
319     application.Render();
320
321     // Mesh should be destroyed, reducing connection count on material to zero.
322     // This should also reduce connection count on image to zero, freeing it
323     DALI_TEST_EQUALS( material.GetOpacity(), 0.5f, 0.001f, TEST_LOCATION );
324   }
325   application.SendNotification();
326   application.Render();
327
328   // SceneGraph::Material & SceneGraph::RenderMaterial should be destroyed
329   END_TEST;
330 }