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