Improved pan gesture prediction
[platform/core/uifw/dali-core.git] / automated-tests / src / dali-unmanaged / utc-Dali-Model.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 #include "mesh-builder.h"
26
27 namespace
28 {
29
30 static std::string      gModelFile = "blah";
31
32
33 // Functor to test whether a Finish signal is emitted
34 struct AnimationFinishCheck
35 {
36   AnimationFinishCheck(bool& signalReceived)
37   : mSignalReceived(signalReceived)
38   {
39   }
40
41   void operator()(Animation& animation)
42   {
43     mSignalReceived = true;
44   }
45
46   void Reset()
47   {
48     mSignalReceived = false;
49   }
50
51   void CheckSignalReceived()
52   {
53     if (!mSignalReceived)
54     {
55       tet_printf("Expected Finish signal was not received\n");
56       tet_result(TET_FAIL);
57     }
58     else
59     {
60       tet_result(TET_PASS);
61     }
62   }
63
64   void CheckSignalNotReceived()
65   {
66     if (mSignalReceived)
67     {
68       tet_printf("Unexpected Finish signal was received\n");
69       tet_result(TET_FAIL);
70     }
71     else
72     {
73       tet_result(TET_PASS);
74     }
75   }
76
77   bool& mSignalReceived; // owned by individual tests
78 };
79
80 }
81
82
83 int UtcDaliModelConstructorVoid(void)
84 {
85   TestApplication application;
86   tet_infoline("Testing Dali::Model::Model()");
87
88   Model model;
89
90   DALI_TEST_CHECK(!model);
91   END_TEST;
92 }
93
94 int UtcDaliModelNew(void)
95 {
96   TestApplication application;
97   TestPlatformAbstraction& platform = application.GetPlatform();
98
99   tet_infoline("Testing Dali::Model::New()");
100
101   Model model = Model::New(gModelFile);
102   application.SendNotification();
103   application.Render();
104   application.Render();
105   application.SendNotification();
106
107   DALI_TEST_CHECK(platform.WasCalled(TestPlatformAbstraction::LoadResourceFunc));
108   DALI_TEST_CHECK(model);
109   END_TEST;
110 }
111
112 int UtcDaliModelDownCast(void)
113 {
114   TestApplication application;
115   tet_infoline("Testing Dali::Model::DownCast()");
116
117   Model model = Model::New(gModelFile);
118
119   BaseHandle object(model);
120
121   Model model2 = Model::DownCast(object);
122   DALI_TEST_CHECK(model2);
123
124   Model model3 = DownCast< Model >(object);
125   DALI_TEST_CHECK(model3);
126
127   BaseHandle unInitializedObject;
128   Model model4 = Model::DownCast(unInitializedObject);
129   DALI_TEST_CHECK(!model4);
130
131   Model model5 = DownCast< Model >(unInitializedObject);
132   DALI_TEST_CHECK(!model5);
133   END_TEST;
134 }
135
136
137 int UtcDaliModelGetLoadingState01(void)
138 {
139   TestApplication application;
140   TestPlatformAbstraction& platform = application.GetPlatform();
141
142   tet_infoline("Testing Dali::Model::New()");
143   Model model = Model::New(gModelFile);
144   application.SendNotification();
145   application.Render();
146   Integration::ResourceRequest* request = platform.GetRequest();
147   DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoading);
148   DALI_TEST_EQUALS(request->GetPath(), gModelFile, TEST_LOCATION);
149   DALI_TEST_EQUALS(request->GetType()->id, Integration::ResourceModel, TEST_LOCATION);
150   END_TEST;
151 }
152
153 int UtcDaliModelGetLoadingState02(void)
154 {
155   TestApplication application;
156   TestPlatformAbstraction& platform = application.GetPlatform();
157
158   tet_infoline("Testing Dali::Model::New()");
159   Dali::ModelData modelData = BuildTreeModel();
160   Model model = Model::New(gModelFile);
161   application.SendNotification();
162   application.Render();
163   Integration::ResourceRequest* request = platform.GetRequest();
164   if(request)
165   {
166     platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
167   }
168
169   // Get resources into resource cache
170   application.Render();
171   application.SendNotification();
172
173   DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
174   END_TEST;
175 }
176
177 int UtcDaliModelGetLoadingState03(void)
178 {
179   TestApplication application;
180   TestPlatformAbstraction& platform = application.GetPlatform();
181
182   tet_infoline("Testing Dali::Model::New()");
183   Model model = Model::New(gModelFile);
184   application.SendNotification();
185   application.Render();
186   Integration::ResourceRequest* request = platform.GetRequest();
187   if(request)
188   {
189     platform.SetResourceLoadFailed(request->GetId(), Integration::FailureFileNotFound);
190   }
191   application.Render();
192   application.SendNotification();
193
194   DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingFailed);
195   END_TEST;
196 }
197
198
199 // Could probably test the signals, too!
200
201 int UtcDaliModelNumberOfAnimations(void)
202 {
203   TestApplication application;
204   tet_infoline("Testing Dali::Model::NumberOfAnimations()");
205
206   int animationCount = -1;
207   Model model = Model::New("Blah"); // Probably need to create a real model...
208   animationCount = model.NumberOfAnimations();
209
210   DALI_TEST_CHECK( -1 != animationCount );
211   END_TEST;
212 }
213
214 int UtcDaliModelActorFactory(void)
215 {
216   TestApplication application;
217   TestPlatformAbstraction& platform = application.GetPlatform();
218
219   tet_infoline("Testing Dali::ModelActorFactory");
220
221   Dali::ModelData modelData = BuildTreeModel();
222
223   // Raise a request
224   Model model = Model::New("Tree");
225
226   application.SendNotification();
227   application.Render();
228   Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
229   if(request)
230   {
231     platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
232   }
233   application.Render();
234   application.SendNotification();
235
236   Actor modelRootActor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
237
238   DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
239   DALI_TEST_CHECK(modelRootActor);
240   DALI_TEST_CHECK(modelRootActor.GetName().compare("root") == 0);
241
242   Actor trunk = modelRootActor.FindChildByName("trunk");
243   DALI_TEST_CHECK(trunk);
244   Actor branch = modelRootActor.FindChildByName("branch");
245   DALI_TEST_CHECK(branch);
246   Actor twig = modelRootActor.FindChildByName("twig");
247   DALI_TEST_CHECK(twig);
248   MeshActor twigMeshActor = MeshActor::DownCast(twig);
249   DALI_TEST_CHECK(!twigMeshActor);
250   Actor leaf = modelRootActor.FindChildByName("leaf");
251   DALI_TEST_CHECK(leaf);
252   MeshActor leafMeshActor = MeshActor::DownCast(leaf);
253   DALI_TEST_CHECK(leafMeshActor);
254
255   Material leafMaterial = leafMeshActor.GetMaterial();
256   DALI_TEST_CHECK(leafMaterial);
257   END_TEST;
258 }
259
260 int UtcDaliModelActorFactoryTwoMesh(void)
261 {
262   TestApplication application;
263   TestPlatformAbstraction& platform = application.GetPlatform();
264
265   tet_infoline("Testing Dali::ModelActorFactory with 2 meshes in an entity");
266
267   Dali::ModelData modelData = BuildTreeModel();
268   Dali::Entity twoMeshEntity = Dali::Entity::New("2Mesh");
269   MeshData meshData;
270   CreateMeshData(meshData);
271   MeshData meshData2;
272   CreateMeshData(meshData2);
273   unsigned int meshIndex = modelData.NumberOfMeshes();
274   modelData.AddMesh(meshData);
275   modelData.AddMesh(meshData2);
276   twoMeshEntity.AddMeshIndex(meshIndex);
277   twoMeshEntity.AddMeshIndex(meshIndex+1);
278   modelData.GetRootEntity().Add(twoMeshEntity);
279
280   // Raise a request
281   Model model = Model::New("Tree");
282
283   application.SendNotification();
284   application.Render();
285   Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
286   if(request)
287   {
288     platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
289   }
290   application.Render();
291   application.SendNotification();
292
293   Actor actor;
294   try
295   {
296     actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
297   }
298   catch( Dali::DaliException& e )
299   {
300     DALI_TEST_PRINT_ASSERT( e );
301     DALI_TEST_ASSERT(e, "entity.NumberOfMeshes() == 1", TEST_LOCATION);
302     DALI_TEST_CHECK( !actor );
303   }
304   END_TEST;
305 }
306
307 int UtcDaliModelBuildAnimation01(void)
308 {
309   TestApplication application;
310   TestPlatformAbstraction& platform = application.GetPlatform();
311
312   tet_infoline("Testing Dali::MeshActor::New()");
313
314   Dali::ModelData modelData = BuildTreeModel();
315
316   // Raise a request
317   Model model = Model::New("Tree");
318
319   application.SendNotification();
320   application.Render();
321   Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
322   if(request)
323   {
324     platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
325   }
326   application.Render();
327   application.SendNotification();
328
329   Actor actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
330   Stage::GetCurrent().Add(actor);
331
332   DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
333   DALI_TEST_CHECK(actor);
334   DALI_TEST_CHECK(actor.GetName().compare("root") == 0);
335
336   DALI_TEST_EQUALS(model.NumberOfAnimations(), static_cast<size_t>(1), TEST_LOCATION);
337   unsigned int animIndex=0;
338   bool found = model.FindAnimation("Anim1", animIndex);
339   DALI_TEST_CHECK(found);
340
341   Animation twigAnim = ModelActorFactory::BuildAnimation(model, actor, animIndex);
342   DALI_TEST_CHECK(twigAnim);
343   DALI_TEST_EQUALS(twigAnim.GetDuration(), 10.0f, 0.001, TEST_LOCATION);
344   DALI_TEST_CHECK(twigAnim.GetDefaultAlphaFunction() == Dali::AlphaFunctions::Linear);
345
346   Actor twigActor = actor.FindChildByName("twig");
347   DALI_TEST_CHECK(twigActor);
348
349   // Start the animation
350   twigAnim.Play();
351
352   float durationSeconds = 10.0f;
353
354   bool signalReceived(false);
355   AnimationFinishCheck finishCheck(signalReceived);
356   twigAnim.FinishedSignal().Connect(&application, finishCheck);
357   application.SendNotification();
358   application.Render();
359   finishCheck.CheckSignalNotReceived();
360   DALI_TEST_EQUALS( twigActor.GetCurrentPosition(), Vector3(2.0f, 1.0f, 0.0f), 0.01f, TEST_LOCATION );
361
362   application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
363   application.SendNotification();
364   DALI_TEST_EQUALS( twigActor.GetCurrentPosition(), Vector3(2.5f, 1.0f, 2.5f), 0.01f, TEST_LOCATION );
365
366   application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 75% progress */);
367   application.SendNotification();
368   DALI_TEST_EQUALS( twigActor.GetCurrentPosition(), Vector3(3.5f, 1.0f, 7.5f), 0.01f, TEST_LOCATION );
369
370   application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* Past Finished */);
371   application.SendNotification();
372   DALI_TEST_EQUALS( twigActor.GetCurrentPosition(), Vector3(4.0f, 1.0f, 10.0f), 0.01f, TEST_LOCATION );
373
374   finishCheck.CheckSignalReceived();
375   END_TEST;
376 }
377
378
379
380 int UtcDaliModelBuildAnimation02(void)
381 {
382   TestApplication application;
383   TestPlatformAbstraction& platform = application.GetPlatform();
384
385   tet_infoline("Testing Dali::MeshActor::New()");
386
387   Dali::ModelData modelData = BuildTreeModel();
388
389   // Raise a request
390   Model model = Model::New("Tree");
391
392   application.SendNotification();
393   application.Render();
394   Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
395   if(request)
396   {
397     platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
398   }
399   application.Render();
400   application.SendNotification();
401
402   Actor actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
403
404   DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
405   DALI_TEST_CHECK(actor);
406   DALI_TEST_CHECK(actor.GetName().compare("root") == 0);
407
408   DALI_TEST_EQUALS(model.NumberOfAnimations(), static_cast<size_t>(1), TEST_LOCATION);
409   unsigned int animIndex=0;
410   bool found = model.FindAnimation("Anim1", animIndex);
411   DALI_TEST_CHECK(found);
412   Animation twigAnim = ModelActorFactory::BuildAnimation(model, actor, animIndex, 5.0f);
413   DALI_TEST_CHECK(twigAnim);
414   DALI_TEST_EQUALS(twigAnim.GetDuration(), 5.0f, 0.001, TEST_LOCATION);
415   DALI_TEST_CHECK(twigAnim.GetDefaultAlphaFunction() == Dali::AlphaFunctions::Linear);
416   END_TEST;
417 }
418
419
420 int UtcDaliModelBuildAnimation03(void)
421 {
422   TestApplication application;
423   TestPlatformAbstraction& platform = application.GetPlatform();
424
425   tet_infoline("Testing Dali::MeshActor::New()");
426
427   Dali::ModelData modelData = BuildTreeModel();
428
429   // Raise a request
430   Model model = Model::New("Tree");
431
432   application.SendNotification();
433   application.Render();
434   Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
435   if(request)
436   {
437     platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
438   }
439   application.Render();
440   application.SendNotification();
441
442   Actor actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
443
444   DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
445   DALI_TEST_CHECK(actor);
446   DALI_TEST_CHECK(actor.GetName().compare("root") == 0);
447
448   DALI_TEST_EQUALS(model.NumberOfAnimations(), static_cast<size_t>(1), TEST_LOCATION);
449   unsigned int animIndex=0;
450   bool found = model.FindAnimation("Anim1", animIndex);
451   DALI_TEST_CHECK(found);
452
453   Animation twigAnim = ModelActorFactory::BuildAnimation(model, actor, animIndex, Dali::AlphaFunctions::EaseInOut, 5.0f);
454   DALI_TEST_CHECK(twigAnim);
455   DALI_TEST_EQUALS(twigAnim.GetDuration(), 5.0f, 0.001, TEST_LOCATION);
456   DALI_TEST_CHECK(twigAnim.GetDefaultAlphaFunction() == Dali::AlphaFunctions::EaseInOut);
457   END_TEST;
458 }
459
460
461 int UtcDaliModelBuildAnimation04(void)
462 {
463   TestApplication application;
464   TestPlatformAbstraction& platform = application.GetPlatform();
465
466   tet_infoline("Testing Dali::MeshActor::New()");
467
468   Dali::ModelData modelData = BuildTreeModel();
469
470   // Raise a request
471   Model model = Model::New("Tree");
472
473   application.SendNotification();
474   application.Render();
475   Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
476   if(request)
477   {
478     platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
479   }
480   application.Render();
481   application.SendNotification();
482
483   Actor actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
484
485   DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
486   DALI_TEST_CHECK(actor);
487   DALI_TEST_CHECK(actor.GetName().compare("root") == 0);
488
489   DALI_TEST_EQUALS(model.NumberOfAnimations(), static_cast<size_t>(1), TEST_LOCATION);
490
491   unsigned int animIndex=0;
492   bool found = model.FindAnimation("Fred", animIndex);
493   DALI_TEST_CHECK(!found);
494   END_TEST;
495 }
496
497
498 int UtcDaliModelBuildAnimation05(void)
499 {
500   TestApplication application;
501   TestPlatformAbstraction& platform = application.GetPlatform();
502
503   tet_infoline("Testing Dali::MeshActor::New()");
504
505   Dali::ModelData modelData = BuildTreeModel();
506
507   // Raise a request
508   Model model = Model::New("Tree");
509
510   // Run Core - will query using TestPlatformAbstraction::GetResources().
511   application.SendNotification();
512   application.Render();
513   Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
514   if(request)
515   {
516     platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
517   }
518   application.Render();
519   application.SendNotification();
520
521   Actor actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
522
523   DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
524   DALI_TEST_CHECK(actor);
525   DALI_TEST_CHECK(actor.GetName().compare("root") == 0);
526
527   DALI_TEST_EQUALS(model.NumberOfAnimations(), static_cast<size_t>(1), TEST_LOCATION);
528   Animation twigAnim = ModelActorFactory::BuildAnimation(model, actor, 0);
529   DALI_TEST_CHECK(twigAnim);
530   DALI_TEST_EQUALS(twigAnim.GetDuration(), 10.0f, 0.001, TEST_LOCATION);
531   DALI_TEST_CHECK(twigAnim.GetDefaultAlphaFunction() == Dali::AlphaFunctions::Linear);
532   END_TEST;
533 }
534
535
536 int UtcDaliModelBuildAnimation06(void)
537 {
538   TestApplication application;
539   TestPlatformAbstraction& platform = application.GetPlatform();
540
541   tet_infoline("Testing Dali::MeshActor::New()");
542
543   Dali::ModelData modelData = BuildTreeModel();
544
545   // Raise a request
546   Model model = Model::New("Tree");
547
548   application.SendNotification();
549   application.Render();
550   Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
551   if(request)
552   {
553     platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
554   }
555   application.Render();
556   application.SendNotification();
557
558   Actor actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
559
560   DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
561   DALI_TEST_CHECK(actor);
562   DALI_TEST_CHECK(actor.GetName().compare("root") == 0);
563
564   DALI_TEST_EQUALS(model.NumberOfAnimations(), static_cast<size_t>(1), TEST_LOCATION);
565   Animation twigAnim = ModelActorFactory::BuildAnimation(model, actor, 0, 5.0f);
566   DALI_TEST_CHECK(twigAnim);
567   DALI_TEST_EQUALS(twigAnim.GetDuration(), 5.0f, 0.001, TEST_LOCATION);
568   DALI_TEST_CHECK(twigAnim.GetDefaultAlphaFunction() == Dali::AlphaFunctions::Linear);
569   END_TEST;
570 }
571
572
573 int UtcDaliModelBuildAnimation07(void)
574 {
575   TestApplication application;
576   TestPlatformAbstraction& platform = application.GetPlatform();
577
578   tet_infoline("Testing Dali::MeshActor::New()");
579
580   Dali::ModelData modelData = BuildTreeModel();
581
582   // Raise a request
583   Model model = Model::New("Tree");
584
585   application.SendNotification();
586   application.Render();
587   Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
588   if(request)
589   {
590     platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
591   }
592   application.Render();
593   application.SendNotification();
594
595   Actor actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
596
597   DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
598   DALI_TEST_CHECK(actor);
599   DALI_TEST_CHECK(actor.GetName().compare("root") == 0);
600
601   DALI_TEST_EQUALS(model.NumberOfAnimations(), static_cast<size_t>(1), TEST_LOCATION);
602   Animation twigAnim = ModelActorFactory::BuildAnimation(model, actor, 0, Dali::AlphaFunctions::Bounce);
603   DALI_TEST_CHECK(twigAnim);
604   DALI_TEST_EQUALS(twigAnim.GetDuration(), 10.0f, 0.001, TEST_LOCATION);
605   DALI_TEST_CHECK(twigAnim.GetDefaultAlphaFunction() == Dali::AlphaFunctions::Bounce);
606   END_TEST;
607 }
608
609 int UtcDaliModelBuildAnimation08(void)
610 {
611   TestApplication application;
612   TestPlatformAbstraction& platform = application.GetPlatform();
613
614   tet_infoline("Testing Dali::MeshActor::New()");
615
616   Dali::ModelData modelData = BuildTreeModel();
617
618   // Raise a request
619   Model model = Model::New("Tree");
620
621   application.SendNotification();
622   application.Render();
623   Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
624   if(request)
625   {
626     platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
627   }
628   application.Render();
629   application.SendNotification();
630
631   Actor actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
632
633   DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
634   DALI_TEST_CHECK(actor);
635   DALI_TEST_CHECK(actor.GetName().compare("root") == 0);
636
637   DALI_TEST_EQUALS(model.NumberOfAnimations(), static_cast<size_t>(1), TEST_LOCATION);
638
639   Animation twigAnim = ModelActorFactory::BuildAnimation(model, actor, 10);
640   DALI_TEST_CHECK(!twigAnim);
641   END_TEST;
642 }