Merge "(LightActor) Fixed it reporting an incorrect type for one of its properties...
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-Image.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 #include <algorithm>
20 #include <stdlib.h>
21 #include <dali/public-api/dali-core.h>
22 #include <dali-test-suite-utils.h>
23 #include <test-native-image.h>
24
25 using namespace Dali;
26
27 void utc_dali_image_startup(void)
28 {
29   test_return_value = TET_UNDEF;
30 }
31
32 void utc_dali_image_cleanup(void)
33 {
34   test_return_value = TET_PASS;
35 }
36
37 static const char* gTestImageFilename = "icon_wrt.png";
38
39
40 // 1.1
41 int UtcDaliImageNew01(void)
42 {
43   TestApplication application;
44
45   tet_infoline("UtcDaliImageNew01 - Image::New(const std::string&)");
46
47   // invoke default handle constructor
48   Image image;
49
50   DALI_TEST_CHECK( !image );
51
52   // initialise handle
53   image = Image::New(gTestImageFilename);
54
55   DALI_TEST_CHECK( image );
56   END_TEST;
57 }
58
59 // 1.2
60 int UtcDaliImageNew02(void)
61 {
62   TestApplication application;
63
64   tet_infoline("UtcDaliImageNew02 - Image::New(const std::string&, const ImageAttributes&)");
65
66   // invoke default handle constructor
67   Image image;
68
69   DALI_TEST_CHECK( !image );
70
71   // initialise handle
72   Dali::ImageAttributes imageAttributes;
73   imageAttributes.SetSize(128, 256);
74   imageAttributes.SetScalingMode(Dali::ImageAttributes::FitHeight);
75   image = Image::New(gTestImageFilename, imageAttributes);
76
77   DALI_TEST_CHECK( image );
78   END_TEST;
79 }
80
81 // 1.3
82 int UtcDaliImageNew03(void)
83 {
84   TestApplication application;
85
86   tet_infoline("UtcDaliImageNew03 - Image::New(NativeImage&)");
87
88   // invoke default handle constructor
89   Image image;
90   TestNativeImagePointer nativeImage = TestNativeImage::New(16, 16);
91
92   DALI_TEST_CHECK( !image );
93
94   // initialise handle
95   image = Image::New(*(nativeImage.Get()));
96
97   DALI_TEST_CHECK( image );
98   END_TEST;
99 }
100
101 // 1.4
102 int UtcDaliImageNewWithPolicies01(void)
103 {
104   TestApplication application;
105
106   // testing delayed loading
107   tet_infoline("UtcDaliImageNewWithPolicies01 - Load image with LoadPolicy::OnDemand, ReleasePolicy::Never");
108   DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
109   Image image = Image::New(gTestImageFilename, Image::OnDemand, Image::Never);
110
111   DALI_TEST_CHECK( image );
112
113   application.SendNotification();
114   application.Render(16);
115
116   // request file loading only when actor added to stage
117   DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
118
119   ImageActor actor = ImageActor::New(image);
120
121   Stage::GetCurrent().Add(actor);
122
123   application.SendNotification();
124   application.Render(16);
125
126   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
127
128   // testing ReleasePolicy::Never
129   // fake loading image
130   std::vector<GLuint> ids;
131   ids.push_back( 23 );
132   application.GetGlAbstraction().SetNextTextureIds( ids );
133   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
134   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
135   Integration::ResourcePointer resource(bitmap);
136   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
137
138   if(request)
139   {
140     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
141   }
142   application.Render(16);
143   application.SendNotification();
144
145   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
146
147   // never discard texture
148   Stage::GetCurrent().Remove(actor);
149   application.Render(16);
150   application.SendNotification();
151   application.Render(16);
152   application.SendNotification();
153   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
154   END_TEST;
155 }
156
157 // 1.5
158 int UtcDaliImageNewWithPolicies02(void)
159 {
160   TestApplication application;
161
162   // testing resource deletion when taken off stage
163   tet_infoline("UtcDaliImageNewWithPolicies02 - Load image with LoadPolicy::OnDemand, ReleasePolicy::Unused");
164
165   Image image = Image::New(gTestImageFilename, Image::OnDemand, Image::Unused);
166
167   DALI_TEST_CHECK( image );
168
169   application.SendNotification();
170   application.Render(16);
171
172   // request file loading only when actor added to stage
173   DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
174
175   ImageActor actor = ImageActor::New(image);
176
177   Stage::GetCurrent().Add(actor);
178
179   application.SendNotification();
180   application.Render(16);
181
182   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
183
184   // testing ReleasePolicy::Unused
185   // fake loading image
186   std::vector<GLuint> ids;
187   ids.push_back( 23 );
188   application.GetGlAbstraction().SetNextTextureIds( ids );
189   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
190   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
191   Integration::ResourcePointer resource(bitmap);
192   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
193
194   if(request)
195   {
196     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
197   }
198   application.Render(16);
199   application.SendNotification();
200
201   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
202
203   // discard texture when actor comes off stage
204   Stage::GetCurrent().Remove(actor);
205   application.Render(16);
206   application.SendNotification();
207   application.Render(16);
208   application.SendNotification();
209   DALI_TEST_CHECK ( application.GetGlAbstraction().CheckTextureDeleted(23) );
210   END_TEST;
211 }
212
213 // 1.6
214 int UtcDaliImageNewWithPolicies03(void)
215 {
216   TestApplication application;
217
218   // load immediately -> resource deletion when taken off stage -> put actor back on stage -> load resource again
219   tet_infoline("UtcDaliImageNewWithPolicies03 - Load image with LoadPolicy::Immediate, ReleasePolicy::Unused");
220
221   Image image = Image::New(gTestImageFilename, Image::Immediate, Image::Unused);
222
223   DALI_TEST_CHECK( image );
224
225   application.SendNotification();
226   application.Render(16);
227
228   // request file loading immediately
229   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
230
231   ImageActor actor = ImageActor::New(image);
232
233   Stage::GetCurrent().Add(actor);
234
235   application.SendNotification();
236   application.Render(16);
237
238   // testing ReleasePolicy::Unused
239   // fake loading image
240   std::vector<GLuint> ids;
241   ids.push_back( 23 );
242   application.GetGlAbstraction().SetNextTextureIds( ids );
243   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
244   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
245   Integration::ResourcePointer resource(bitmap);
246   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
247
248   if(request)
249   {
250     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
251   }
252   application.Render(16);
253   application.SendNotification();
254
255   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
256
257   // discard texture when actor comes off stage
258   Stage::GetCurrent().Remove(actor);
259   application.Render(16);
260   application.SendNotification();
261   application.Render(16);
262   application.SendNotification();
263   DALI_TEST_CHECK ( application.GetGlAbstraction().CheckTextureDeleted(23) );
264
265   // check load request when actor added back to stage
266   application.GetPlatform().ResetTrace();
267
268   Stage::GetCurrent().Add(actor);
269
270   application.SendNotification();
271   application.Render(16);
272   application.SendNotification();
273   application.Render(16);
274
275   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
276   END_TEST;
277 }
278
279 // 1.7
280 int UtcDaliImageNewWithPolicies04(void)
281 {
282   TestApplication application;
283
284   // load immediately, don't release texture when off stage
285   tet_infoline("UtcDaliImageNewWithPolicies03 - Load image with LoadPolicy::Immediate, ReleasePolicy::Never");
286
287   Image image = Image::New(gTestImageFilename, Image::Immediate, Image::Never);
288
289   DALI_TEST_CHECK( image );
290
291   application.SendNotification();
292   application.Render(16);
293
294   // request file loading immediately
295   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
296
297   ImageActor actor = ImageActor::New(image);
298
299   Stage::GetCurrent().Add(actor);
300
301   application.SendNotification();
302   application.Render(16);
303
304   // testing ReleasePolicy::Never
305   // fake loading image
306   std::vector<GLuint> ids;
307   ids.push_back( 23 );
308   application.GetGlAbstraction().SetNextTextureIds( ids );
309   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
310   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
311   Integration::ResourcePointer resource(bitmap);
312   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
313
314   if(request)
315   {
316     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
317   }
318   application.Render(16);
319   application.SendNotification();
320
321   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
322
323   // texture is not discarded
324   Stage::GetCurrent().Remove(actor);
325   application.Render(16);
326   application.SendNotification();
327   application.Render(16);
328   application.SendNotification();
329   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
330
331   // no load request when actor added back to stage
332   application.GetPlatform().ResetTrace();
333
334   Stage::GetCurrent().Add(actor);
335
336   application.SendNotification();
337   application.Render(16);
338   application.SendNotification();
339   application.Render(16);
340
341   DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
342   END_TEST;
343 }
344
345 // 1.8
346 int UtcDaliImageNewDistanceField(void)
347 {
348   TestApplication application;
349
350   tet_infoline("UtcDaliImageNewDistanceField - Image::NewDistanceField(const std::string&)");
351
352   // invoke default handle constructor
353   Image image;
354
355   DALI_TEST_CHECK( !image );
356
357   // initialise handle
358   image = Image::NewDistanceField(gTestImageFilename);
359
360   DALI_TEST_CHECK( image );
361   END_TEST;
362 }
363
364 // 1.9
365 int UtcDaliImageNewDistanceFieldWithPolicies01(void)
366 {
367   TestApplication application;
368
369   // testing delayed loading
370   tet_infoline("UtcDaliImageNewDistanceFieldWithPolicies01 - Load image with LoadPolicy::OnDemand, ReleasePolicy::Never");
371   DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
372   Image image = Image::NewDistanceField(gTestImageFilename, Image::OnDemand, Image::Never);
373
374   DALI_TEST_CHECK( image );
375
376   application.SendNotification();
377   application.Render(16);
378
379   // request file loading only when actor added to stage
380   DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
381
382   ImageActor actor = ImageActor::New(image);
383
384   Stage::GetCurrent().Add(actor);
385
386   application.SendNotification();
387   application.Render(16);
388
389   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
390
391   // testing ReleasePolicy::Never
392   // fake loading image
393   std::vector<GLuint> ids;
394   ids.push_back( 23 );
395   application.GetGlAbstraction().SetNextTextureIds( ids );
396   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
397   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
398   Integration::ResourcePointer resource(bitmap);
399   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
400
401   if(request)
402   {
403     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
404   }
405   application.Render(16);
406   application.SendNotification();
407
408   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
409
410   // never discard texture
411   Stage::GetCurrent().Remove(actor);
412   application.Render(16);
413   application.SendNotification();
414   application.Render(16);
415   application.SendNotification();
416   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
417   END_TEST;
418 }
419
420 // 1.10
421 int UtcDaliImageNewDistanceFieldWithPolicies02(void)
422 {
423   TestApplication application;
424
425   // testing resource deletion when taken off stage
426   tet_infoline("UtcDaliImageNewDistanceFieldWithPolicies02 - Load image with LoadPolicy::OnDemand, ReleasePolicy::Unused");
427
428   Image image = Image::NewDistanceField(gTestImageFilename, Image::OnDemand, Image::Unused);
429
430   DALI_TEST_CHECK( image );
431
432   application.SendNotification();
433   application.Render(16);
434
435   // request file loading only when actor added to stage
436   DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
437
438   ImageActor actor = ImageActor::New(image);
439
440   Stage::GetCurrent().Add(actor);
441
442   application.SendNotification();
443   application.Render(16);
444
445   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
446
447   // testing ReleasePolicy::Unused
448   // fake loading image
449   std::vector<GLuint> ids;
450   ids.push_back( 23 );
451   application.GetGlAbstraction().SetNextTextureIds( ids );
452   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
453   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
454   Integration::ResourcePointer resource(bitmap);
455   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
456
457   if(request)
458   {
459     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
460   }
461   application.Render(16);
462   application.SendNotification();
463
464   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
465
466   // discard texture when actor comes off stage
467   Stage::GetCurrent().Remove(actor);
468   application.Render(16);
469   application.SendNotification();
470   application.Render(16);
471   application.SendNotification();
472   DALI_TEST_CHECK ( application.GetGlAbstraction().CheckTextureDeleted(23) );
473   END_TEST;
474 }
475
476 // 1.11
477 int UtcDaliImageNewDistanceFieldWithPolicies03(void)
478 {
479   TestApplication application;
480
481   // load immediately -> resource deletion when taken off stage -> put actor back on stage -> load resource again
482   tet_infoline("UtcDaliImageNewDistanceFieldWithPolicies03 - Load image with LoadPolicy::Immediate, ReleasePolicy::Unused");
483
484   Image image = Image::NewDistanceField(gTestImageFilename, Image::Immediate, Image::Unused);
485
486   DALI_TEST_CHECK( image );
487
488   application.SendNotification();
489   application.Render(16);
490
491   // request file loading immediately
492   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
493
494   ImageActor actor = ImageActor::New(image);
495
496   Stage::GetCurrent().Add(actor);
497
498   application.SendNotification();
499   application.Render(16);
500
501   // testing ReleasePolicy::Unused
502   // fake loading image
503   std::vector<GLuint> ids;
504   ids.push_back( 23 );
505   application.GetGlAbstraction().SetNextTextureIds( ids );
506   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
507   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
508   Integration::ResourcePointer resource(bitmap);
509   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
510
511   if(request)
512   {
513     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
514   }
515   application.Render(16);
516   application.SendNotification();
517
518   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
519
520   // discard texture when actor comes off stage
521   Stage::GetCurrent().Remove(actor);
522   application.Render(16);
523   application.SendNotification();
524   application.Render(16);
525   application.SendNotification();
526   DALI_TEST_CHECK ( application.GetGlAbstraction().CheckTextureDeleted(23) );
527
528   // check load request when actor added back to stage
529   application.GetPlatform().ResetTrace();
530
531   Stage::GetCurrent().Add(actor);
532
533   application.SendNotification();
534   application.Render(16);
535   application.SendNotification();
536   application.Render(16);
537
538   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
539   END_TEST;
540 }
541
542 // 1.12
543 int UtcDaliImageNewDistanceFieldWithPolicies04(void)
544 {
545   TestApplication application;
546
547   // load immediately, don't release texture when off stage
548   tet_infoline("UtcDaliImageNewDistanceFieldWithPolicies04 - Load image with LoadPolicy::Immediate, ReleasePolicy::Never");
549
550   Image image = Image::NewDistanceField(gTestImageFilename, Image::Immediate, Image::Never);
551
552   DALI_TEST_CHECK( image );
553
554   application.SendNotification();
555   application.Render(16);
556
557   // request file loading immediately
558   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
559
560   ImageActor actor = ImageActor::New(image);
561
562   Stage::GetCurrent().Add(actor);
563
564   application.SendNotification();
565   application.Render(16);
566
567   // testing ReleasePolicy::Never
568   // fake loading image
569   std::vector<GLuint> ids;
570   ids.push_back( 23 );
571   application.GetGlAbstraction().SetNextTextureIds( ids );
572   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
573   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
574   Integration::ResourcePointer resource(bitmap);
575   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
576
577   if(request)
578   {
579     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
580   }
581   application.Render(16);
582   application.SendNotification();
583
584   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
585
586   // texture is not discarded
587   Stage::GetCurrent().Remove(actor);
588   application.Render(16);
589   application.SendNotification();
590   application.Render(16);
591   application.SendNotification();
592   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
593
594   // no load request when actor added back to stage
595   application.GetPlatform().ResetTrace();
596
597   Stage::GetCurrent().Add(actor);
598
599   application.SendNotification();
600   application.Render(16);
601   application.SendNotification();
602   application.Render(16);
603
604   DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
605   END_TEST;
606 }
607
608 // 1.13
609 int UtcDaliImageNewDistanceFieldWithAttributes(void)
610 {
611   TestApplication application;
612
613   tet_infoline("UtcDaliImageNewDistanceFieldWithAttributes - Image::NewDistanceField(const std::string&, const ImageAttributes& attributes)");
614
615   // invoke default handle constructor
616   Image image;
617   Dali::ImageAttributes imageAttributes = Dali::ImageAttributes::NewDistanceField(6.0f, 12);
618
619   DALI_TEST_CHECK( !image );
620
621   // initialise handle
622   image = Image::NewDistanceField(gTestImageFilename, imageAttributes);
623
624   DALI_TEST_CHECK( image );
625   END_TEST;
626 }
627
628 // 1.14
629 int UtcDaliImageNewDistanceFieldWithAttrandPol(void)
630 {
631   TestApplication application;
632
633   tet_infoline("UtcDaliImageNewDistanceFieldWithAttrandPol - Load image with LoadPolicy::OnDemand, ReleasePolicy::Unused");
634
635   Dali::ImageAttributes imageAttributes = Dali::ImageAttributes::NewDistanceField(6.0f, 12);
636
637   Image image = Image::NewDistanceField(gTestImageFilename, imageAttributes, Image::OnDemand, Image::Unused);
638
639   DALI_TEST_CHECK( image );
640
641   application.SendNotification();
642   application.Render(16);
643
644   // request file loading only when actor added to stage
645   DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
646
647   ImageActor actor = ImageActor::New(image);
648
649   Stage::GetCurrent().Add(actor);
650
651   application.SendNotification();
652   application.Render(16);
653
654   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
655
656   // testing ReleasePolicy::Unused
657   // fake loading image
658   std::vector<GLuint> ids;
659   ids.push_back( 23 );
660   application.GetGlAbstraction().SetNextTextureIds( ids );
661   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
662   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
663   Integration::ResourcePointer resource(bitmap);
664   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
665
666   if(request)
667   {
668     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
669   }
670   application.Render(16);
671   application.SendNotification();
672
673   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
674
675   // discard texture when actor comes off stage
676   Stage::GetCurrent().Remove(actor);
677   application.Render(16);
678   application.SendNotification();
679   application.Render(16);
680   application.SendNotification();
681   DALI_TEST_CHECK ( application.GetGlAbstraction().CheckTextureDeleted(23) );
682   END_TEST;
683 }
684
685 // 1.15
686 int UtcDaliImageDownCast(void)
687 {
688   TestApplication application;
689   tet_infoline("Testing Dali::Image::DownCast()");
690
691   Image image = Image::New(gTestImageFilename);
692
693   BaseHandle object(image);
694
695   Image image2 = Image::DownCast(object);
696   DALI_TEST_CHECK(image2);
697
698   Image image3 = DownCast< Image >(object);
699   DALI_TEST_CHECK(image3);
700
701   BaseHandle unInitializedObject;
702   Image image4 = Image::DownCast(unInitializedObject);
703   DALI_TEST_CHECK(!image4);
704
705   Image image5 = DownCast< Image >(unInitializedObject);
706   DALI_TEST_CHECK(!image5);
707   END_TEST;
708 }
709
710 // 1.16
711 int UtcDaliImageGetImageSize(void)
712 {
713   TestApplication application;
714   TestPlatformAbstraction& platform = application.GetPlatform();
715
716   tet_infoline("UtcDaliImageGetImageSize - Image::GetImageSize()");
717
718   Vector2 testSize(8.0f, 16.0f);
719   platform.SetClosestImageSize(testSize);
720
721   Vector2 size = Image::GetImageSize(gTestImageFilename);
722
723   DALI_TEST_CHECK( application.GetPlatform().GetTrace().FindMethod("GetClosestImageSize"));
724   DALI_TEST_EQUALS( size, testSize, TEST_LOCATION);
725   END_TEST;
726 }
727
728 // 1.17
729 int UtcDaliImageGetFilename(void)
730 {
731   TestApplication application;
732
733   tet_infoline("UtcDaliImageGetFilename");
734
735   // invoke default handle constructor
736   Image image;
737
738   DALI_TEST_CHECK( !image );
739
740   // initialise handle
741   image = Image::New(gTestImageFilename);
742
743   DALI_TEST_EQUALS( image.GetFilename(), gTestImageFilename, TEST_LOCATION);
744   END_TEST;
745 }
746
747 // 1.18
748 int UtcDaliImageGetLoadingState01(void)
749 {
750   TestApplication application;
751   tet_infoline("UtcDaliImageGetLoadingState01");
752
753   Image image = Image::New(gTestImageFilename);
754   DALI_TEST_CHECK(image.GetLoadingState() == ResourceLoading);
755   application.SendNotification();
756   application.Render(16);
757
758   // simulate load success
759   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
760   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
761   Integration::ResourcePointer resource(bitmap);
762   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
763
764   if(request)
765   {
766     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
767   }
768   application.Render(16);
769   application.SendNotification();
770
771   // Test state == ResourceLoadingSucceeded
772   DALI_TEST_CHECK(image.GetLoadingState() == ResourceLoadingSucceeded);
773   END_TEST;
774 }
775
776 // 1.19
777 int UtcDaliImageGetLoadingState02(void)
778 {
779   TestApplication application;
780
781   tet_infoline("UtcDaliImageGetLoadingState02");
782
783   // invoke default handle constructor
784   Image image;
785
786   DALI_TEST_CHECK( !image );
787
788   // initialise handle
789   image = Image::New(gTestImageFilename);
790
791   // Test state == ResourceLoading
792   DALI_TEST_CHECK(image.GetLoadingState() == ResourceLoading);
793   application.SendNotification();
794   application.Render(16);
795
796   // simulate load failure
797   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
798   if(request)
799   {
800     application.GetPlatform().SetResourceLoadFailed(request->GetId(), Integration::FailureUnknown);
801   }
802   application.Render(16);
803   application.SendNotification();
804
805   // Test state == ResourceLoadingFailed
806   DALI_TEST_CHECK(image.GetLoadingState() == ResourceLoadingFailed);
807   END_TEST;
808 }
809
810 // 1.20
811 int UtcDaliImageGetReleasePolicy(void)
812 {
813   TestApplication application;
814
815   tet_infoline("UtcDaliImageGetReleasePolicy");
816
817   Image image = Image::New(gTestImageFilename, Image::Immediate, Image::Unused);
818
819   DALI_TEST_CHECK( image );
820
821   DALI_TEST_CHECK( Image::Unused == image.GetReleasePolicy() );
822
823   END_TEST;
824 }
825
826 // 1.21
827 int UtcDaliImageGetLoadPolicy(void)
828 {
829   TestApplication application;
830
831   tet_infoline("UtcDaliImageGetLoadPolicy");
832
833   Image image = Image::New(gTestImageFilename, Image::OnDemand, Image::Never);
834
835   DALI_TEST_CHECK( image );
836
837   DALI_TEST_CHECK( Image::OnDemand == image.GetLoadPolicy());
838   END_TEST;
839 }
840
841 static bool SignalLoadFlag = false;
842
843 static void SignalLoadHandler(Image image)
844 {
845   tet_infoline("Received image load finished signal");
846
847   SignalLoadFlag = true;
848 }
849
850 static bool SignalUploadedFlag = false;
851
852 static void SignalUploadedHandler(Image image)
853 {
854   tet_infoline("Received image uploaded signal");
855
856   SignalUploadedFlag = true;
857 }
858
859 // 1.22
860 int UtcDaliImageSignalLoadingFinished(void)
861 {
862   TestApplication application;
863
864   tet_infoline("UtcDaliImageSignalLoadingFinished");
865
866   SignalLoadFlag = false;
867
868   Image image = Image::New(gTestImageFilename);
869
870   image.LoadingFinishedSignal().Connect( SignalLoadHandler );
871   application.SendNotification();
872   application.Render(16);
873
874   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
875   if(request)
876   {
877     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true)));
878   }
879
880   application.Render(16);
881   application.SendNotification();
882
883   DALI_TEST_CHECK( SignalLoadFlag == true );
884   END_TEST;
885 }
886
887 // 1.23
888 int UtcDaliImageSignalUploaded(void)
889 {
890   TestApplication application;
891   tet_infoline("UtcDaliImageSignalUploaded - Image::SignalUploaded()");
892
893   // set up image in fake platform abstraction
894   Vector2 testSize(80.0f, 80.0f);
895   application.GetPlatform().SetClosestImageSize(testSize);
896
897   Image image = Image::New(gTestImageFilename);
898   image.LoadingFinishedSignal().Connect( SignalLoadHandler );
899
900   // Load image
901   application.SendNotification();
902   application.Render(16);
903   std::vector<GLuint> ids;
904   ids.push_back( 23 );
905   application.GetGlAbstraction().SetNextTextureIds( ids );
906   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
907   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
908   Integration::ResourcePointer resource(bitmap);
909   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
910   if(request)
911   {
912     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
913   }
914   application.Render(16);
915   application.SendNotification();
916
917   image.UploadedSignal().Connect( SignalUploadedHandler );
918
919   Dali::ImageActor imageActor = ImageActor::New(image);
920   Stage::GetCurrent().Add(imageActor);
921   imageActor.SetSize(80, 80);
922   imageActor.SetVisible(true);
923
924   application.SendNotification();
925   application.Render(0);
926   application.Render(16);
927   application.SendNotification();
928   application.Render(16);
929   application.SendNotification();
930   application.Render(16);
931   application.SendNotification();
932   application.Render(16);
933   application.SendNotification();
934
935   DALI_TEST_CHECK( SignalLoadFlag == true );
936   DALI_TEST_CHECK( SignalUploadedFlag == true );
937   SignalLoadFlag = false;
938   SignalUploadedFlag = false;
939
940   image.Reload();
941   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 160, 160, 160, 160);
942
943   application.SendNotification();
944   application.Render(16);
945   application.Render(16);
946   application.SendNotification();
947   DALI_TEST_CHECK( SignalLoadFlag == true );
948
949   application.Render(16);
950   application.SendNotification();
951   application.Render(16);
952   application.SendNotification();
953   DALI_TEST_CHECK( SignalUploadedFlag == true );
954   END_TEST;
955 }
956
957
958 // 1.24
959 int UtcDaliImageDiscard01(void)
960 {
961   TestApplication application;
962   tet_infoline("UtcDaliImageDiscard01 - no actors");
963
964   {
965     Image image = Image::New(gTestImageFilename);
966
967     // Load image
968     application.SendNotification();
969     application.Render(16);
970     std::vector<GLuint> ids;
971     ids.push_back( 23 );
972     application.GetGlAbstraction().SetNextTextureIds( ids );
973     Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
974     Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
975     Integration::ResourcePointer resource(bitmap);
976     bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
977     if(request)
978     {
979     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
980     }
981     application.Render(16);
982     application.SendNotification();
983   } // Drop image handle
984
985   application.SendNotification();
986   application.Render(16);
987   application.Render(16);
988   application.SendNotification();
989
990   // Shouldn't have been sent to GL...
991   const std::vector<GLuint>& texIds = application.GetGlAbstraction().GetNextTextureIds();
992   DALI_TEST_CHECK( texIds.size() == 1 );
993   DALI_TEST_CHECK( texIds[0] == 23 );
994   END_TEST;
995 }
996
997 // 1.25
998 int UtcDaliImageDiscard02(void)
999 {
1000   TestApplication application;
1001   tet_infoline("UtcDaliImageDiscard02 - one actor, tests TextureCache::DiscardTexture");
1002
1003   {
1004     {
1005       ImageActor actor;
1006       {
1007         Image image = Image::New(gTestImageFilename);
1008         actor = ImageActor::New(image);
1009         Stage::GetCurrent().Add(actor);
1010
1011         application.SendNotification();
1012         application.Render(16);
1013
1014         std::vector<GLuint> ids;
1015         ids.push_back( 23 );
1016         application.GetGlAbstraction().SetNextTextureIds( ids );
1017
1018         Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
1019         Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
1020         Integration::ResourcePointer resource(bitmap);
1021         bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
1022         if(request)
1023         {
1024           application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
1025         }
1026         application.Render(16);
1027         application.SendNotification();
1028       } // lose image handle, actor should still keep one
1029       application.SendNotification();
1030       application.Render(16);
1031
1032       Stage::GetCurrent().Remove(actor);
1033       application.SendNotification();
1034       application.Render(16);
1035     } // lose actor
1036     application.SendNotification();
1037     application.Render(16);
1038   }
1039
1040   // Cleanup
1041   application.SendNotification();
1042   application.Render(16);
1043   application.Render(16);
1044   application.SendNotification();
1045
1046   // texture should have been removed:
1047   DALI_TEST_CHECK( application.GetGlAbstraction().CheckTextureDeleted( 23 ));
1048   END_TEST;
1049 }
1050
1051 // 1.26
1052 int UtcDaliImageDiscard03(void)
1053 {
1054   TestApplication application;
1055   tet_infoline("UtcDaliImageDiscard03 - one actor, tests TextureCache::RemoveObserver");
1056
1057   Image image = Image::New(gTestImageFilename);
1058   ImageActor actor = ImageActor::New(image);
1059   Stage::GetCurrent().Add(actor);
1060
1061   application.SendNotification();
1062   application.Render(16);
1063
1064   std::vector<GLuint> ids;
1065   ids.push_back( 23 );
1066   application.GetGlAbstraction().SetNextTextureIds( ids );
1067
1068   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
1069   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
1070   Integration::ResourcePointer resource(bitmap);
1071   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
1072   if(request)
1073   {
1074     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
1075   }
1076   application.Render(16);
1077   application.SendNotification();
1078   application.SendNotification();
1079   application.Render(16);
1080
1081   const std::vector<GLuint>& texIds = application.GetGlAbstraction().GetNextTextureIds();
1082   DALI_TEST_CHECK( texIds.size() == 0 );
1083   const std::vector<GLuint>& boundTexIds = application.GetGlAbstraction().GetBoundTextures();
1084   DALI_TEST_CHECK( boundTexIds[0] == 23 );
1085
1086   Stage::GetCurrent().Remove(actor);
1087   application.SendNotification();
1088   application.Render(16);
1089   application.SendNotification();
1090   application.Render(16);
1091   application.SendNotification();
1092   application.Render(16); // Should remove image renderer
1093
1094   END_TEST;
1095 }