License conversion from Flora to Apache 2.0
[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/dali.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 = Image::New("diffuse-texture.png");
133   material.SetDiffuseTexture(diffuseTexture);
134   DALI_TEST_EQUALS( material.GetDiffuseTexture(), diffuseTexture, TEST_LOCATION );
135
136   Image opacityTexture = Image::New("opacity-texture.png");
137   material.SetOpacityTexture(opacityTexture);
138   DALI_TEST_EQUALS( material.GetOpacityTexture(), opacityTexture, TEST_LOCATION);
139
140   Image normalMap = Image::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 = Image::New( "image.png", Image::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, true );
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       meshActor.SetAffectedByLighting(false);
209       Stage::GetCurrent().Add(meshActor);
210       application.SendNotification();
211       application.Render();
212
213       material.SetOpacity(0.5f);
214       application.SendNotification();
215       application.Render();
216       DALI_TEST_EQUALS( material.GetOpacity(), 0.5f, 0.001f, TEST_LOCATION );
217
218       Stage::GetCurrent().Remove(meshActor);
219       application.SendNotification();
220       application.Render();
221
222       DALI_TEST_CHECK( glAbstraction.CheckNoTexturesDeleted() );
223       DALI_TEST_CHECK( ! textureTrace.FindMethod( "DeleteTextures" ) );
224     }
225     application.SendNotification();
226     application.Render();
227
228     // Mesh should be destroyed, reducing connection count on material to zero.
229     // This should also reduce connection count on image to zero
230     DALI_TEST_EQUALS( material.GetOpacity(), 0.5f, 0.001f, TEST_LOCATION );
231   }
232   // SceneGraph::Material & SceneGraph::RenderMaterial should be destroyed
233   // Image should be destroyed
234   application.SendNotification();
235   application.Render();
236
237   application.Render();
238   DALI_TEST_CHECK( textureTrace.FindMethod( "DeleteTextures" ) );
239   DALI_TEST_CHECK( glAbstraction.CheckTextureDeleted( 23 ) );
240   END_TEST;
241 }
242
243
244 int UtcDaliMaterialStage01MemCheck(void)
245 {
246   TestApplication application;
247   tet_result(TET_PASS);
248   END_TEST;
249 }
250
251 int UtcDaliMaterialStage02(void)
252 {
253   TestApplication application;
254   TraceCallStack& textureTrace = application.GetGlAbstraction().GetTextureTrace();
255   textureTrace.Enable(true);
256   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
257
258   {
259     Material material = Material::New("material");
260
261     Image image = Image::New( "image.png", Image::OnDemand, Image::Unused );
262     DALI_TEST_CHECK(image);
263     application.SendNotification();
264     application.Render(16);
265     DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
266     DALI_TEST_CHECK( application.GetPlatform().GetRequest() == NULL );
267
268     std::vector<GLuint> ids;
269     ids.push_back( 23 );
270     application.GetGlAbstraction().SetNextTextureIds( ids );
271
272     material.SetDiffuseTexture(image);
273     application.SendNotification();
274     application.Render();
275     DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
276     DALI_TEST_CHECK( application.GetPlatform().GetRequest() == NULL );
277
278     AnimatableMesh mesh = CreateMeshData(material);
279
280     application.SendNotification();
281     application.Render();
282     DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
283     DALI_TEST_CHECK( application.GetPlatform().GetRequest() == NULL );
284
285     {
286       MeshActor meshActor = MeshActor::New(mesh);
287       meshActor.SetSize(100, 100);
288       meshActor.SetAffectedByLighting(false);
289       Stage::GetCurrent().Add(meshActor);
290       application.SendNotification();
291       application.Render();
292
293       // Image connection count should go to one - image should get loaded
294       DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
295       Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
296       DALI_TEST_CHECK( request != NULL );
297
298       Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
299       Integration::ResourcePointer resource(bitmap);
300       bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
301       if(request)
302       {
303         application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
304       }
305       application.Render();
306
307       material.SetOpacity(0.5f);
308       application.SendNotification();
309       application.Render();
310       DALI_TEST_EQUALS( material.GetOpacity(), 0.5f, 0.001f, TEST_LOCATION );
311
312       Stage::GetCurrent().Remove(meshActor);
313       application.SendNotification();
314       application.Render();
315
316       // This should reduce connection count on material to zero, freeing the texture:
317       DALI_TEST_CHECK( textureTrace.FindMethod( "DeleteTextures" ) );
318       DALI_TEST_CHECK( glAbstraction.CheckTextureDeleted( 23 ) );
319     }
320     application.SendNotification();
321     application.Render();
322
323     // Mesh should be destroyed, reducing connection count on material to zero.
324     // This should also reduce connection count on image to zero, freeing it
325     DALI_TEST_EQUALS( material.GetOpacity(), 0.5f, 0.001f, TEST_LOCATION );
326   }
327   application.SendNotification();
328   application.Render();
329
330   // SceneGraph::Material & SceneGraph::RenderMaterial should be destroyed
331   END_TEST;
332 }