Improved pan gesture prediction
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-DynamicsBody.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 <stdlib.h>
20 #include <dali/public-api/dali-core.h>
21 #include <dali-test-suite-utils.h>
22
23
24 int UtcDaliDynamicsBodyConstructor(void)
25 {
26 #if !defined(DYNAMICS_SUPPORT)
27   tet_infoline("No dynamics support compiled\n");
28   return 0;
29 #endif
30   tet_infoline("UtcDaliDynamicsBodyConstructor - DynamicsBody::DynamicsBody()");
31   TestApplication application;
32
33   // start up
34   application.SendNotification();
35   application.Render();
36   application.Render();
37
38   // Default constructor - create an uninitialized handle
39   DynamicsBody body;
40   DALI_TEST_CHECK( !body );
41
42   // create world and actor
43   DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
44   DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
45
46   if( !world )
47   {
48     // cannot create dynamics world, log failure and exit
49     DALI_TEST_CHECK( false );
50     END_TEST;
51   }
52
53   DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
54   Actor actor(Actor::New());
55
56   // enable dynamics on the actor to create the Dynamicsbody
57   actor.EnableDynamics(bodyConfig);
58
59   // initialize handle
60   body = actor.GetDynamicsBody();
61
62   DALI_TEST_CHECK( body );
63   END_TEST;
64 }
65
66 int UtcDaliDynamicsBodyGetMass(void)
67 {
68 #if !defined(DYNAMICS_SUPPORT)
69   tet_infoline("No dynamics support compiled\n");
70   return 0;
71 #endif
72   TestApplication application;
73
74   // start up
75   application.SendNotification();
76   application.Render();
77   application.Render();
78
79   const float testMass = 1.23f;
80
81   DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
82   DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
83
84   if( !world )
85   {
86     // cannot create dynamics world, log failure and exit
87     DALI_TEST_CHECK( false );
88     END_TEST;
89   }
90
91   DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
92   bodyConfig.SetMass(testMass);
93   Actor actor(Actor::New());
94
95   // enable dynamics on the actor to create the Dynamicsbody
96   actor.EnableDynamics(bodyConfig);
97
98   tet_infoline("UtcDaliDynamicsBodyGetMass - DynamicsBody::GetMass");
99   DALI_TEST_EQUALS( testMass, actor.GetDynamicsBody().GetMass(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
100
101   END_TEST;
102 }
103
104 int UtcDaliDynamicsBodyGetElasticity(void)
105 {
106 #if !defined(DYNAMICS_SUPPORT)
107   tet_infoline("No dynamics support compiled\n");
108   return 0;
109 #endif
110   TestApplication application;
111
112   // start up
113   application.SendNotification();
114   application.Render();
115   application.Render();
116
117   const float testElasticity = 1.23f;
118
119   DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
120   DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
121
122   if( !world )
123   {
124     // cannot create dynamics world, log failure and exit
125     DALI_TEST_CHECK( false );
126     END_TEST;
127   }
128
129   DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
130   bodyConfig.SetElasticity(testElasticity);
131   Actor actor(Actor::New());
132
133   // enable dynamics on the actor to create the Dynamicsbody
134   actor.EnableDynamics(bodyConfig);
135
136   tet_infoline("UtcDaliDynamicsBodyGetMass - DynamicsBody::GetElasticity");
137   DALI_TEST_EQUALS( testElasticity, actor.GetDynamicsBody().GetElasticity(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
138   END_TEST;
139 }
140
141 int UtcDaliDynamicsBodySetLinearVelocity(void)
142 {
143 #if !defined(DYNAMICS_SUPPORT)
144   tet_infoline("No dynamics support compiled\n");
145   return 0;
146 #endif
147   tet_infoline("UtcDaliDynamicsBodySetLinearVelocity - DynamicsBody::SetLinearVelocity");
148
149   TestApplication application;
150   TraceCallStack& trace( application.GetPlatform().GetTrace() );
151   trace.Enable( true );
152
153   // start up
154   application.SendNotification();
155   application.Render();
156   application.Render();
157
158   DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
159   DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
160
161   if( !world )
162   {
163     // cannot create dynamics world, log failure and exit
164     DALI_TEST_CHECK( false );
165     END_TEST;
166   }
167
168   DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
169   Actor actor(Actor::New());
170
171   // enable dynamics on the actor to create the Dynamicsbody
172   actor.EnableDynamics(bodyConfig);
173
174   DynamicsBody body(actor.GetDynamicsBody());
175   body.SetLinearVelocity(Vector3::ONE);
176
177   DALI_TEST_CHECK( ! trace.FindMethod( "DynamicsBody::SetLinearVelocity" ) );
178
179   // update
180   application.SendNotification();
181   application.Render();
182   application.Render();
183
184   DALI_TEST_CHECK( trace.FindMethod( "DynamicsBody::SetLinearVelocity" ) );
185   END_TEST;
186 }
187
188 int UtcDaliDynamicsBodySetAngularVelocity(void)
189 {
190 #if !defined(DYNAMICS_SUPPORT)
191   tet_infoline("No dynamics support compiled\n");
192   return 0;
193 #endif
194   tet_infoline("UtcDaliDynamicsBodySetAngularVelocity - DynamicsBody::SetAngularVelocity");
195
196   TestApplication application;
197   TraceCallStack& trace( application.GetPlatform().GetTrace() );
198   trace.Enable( true );
199
200   // start up
201   application.SendNotification();
202   application.Render();
203   application.Render();
204
205   DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
206   DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
207
208   if( !world )
209   {
210     // cannot create dynamics world, log failure and exit
211     DALI_TEST_CHECK( false );
212     END_TEST;
213   }
214
215   DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
216   Actor actor(Actor::New());
217
218   // enable dynamics on the actor to create the Dynamicsbody
219   actor.EnableDynamics(bodyConfig);
220
221   DynamicsBody body(actor.GetDynamicsBody());
222   body.SetAngularVelocity(Vector3::ONE);
223
224   DALI_TEST_CHECK( ! trace.FindMethod( "DynamicsBody::SetAngularVelocity" ) );
225
226   // update
227   application.SendNotification();
228   application.Render();
229   application.Render();
230
231   DALI_TEST_CHECK( trace.FindMethod( "DynamicsBody::SetAngularVelocity" ) );
232   END_TEST;
233 }
234
235 int UtcDaliDynamicsBodySetKinematic(void)
236 {
237 #if !defined(DYNAMICS_SUPPORT)
238   tet_infoline("No dynamics support compiled\n");
239   return 0;
240 #endif
241   TestApplication application;
242
243   // start up
244   application.SendNotification();
245   application.Render();
246   application.Render();
247
248   const float testMass = 1.0f;
249   DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
250   DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
251
252   if( !world )
253   {
254     // cannot create dynamics world, log failure and exit
255     DALI_TEST_CHECK( false );
256     END_TEST;
257   }
258
259   DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
260   bodyConfig.SetMass(testMass);
261   Actor actor(Actor::New());
262
263   // enable dynamics on the actor to create the Dynamicsbody
264   actor.EnableDynamics(bodyConfig);
265
266   DynamicsBody body(actor.GetDynamicsBody());
267
268   DALI_TEST_EQUALS( testMass, body.GetMass(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
269
270   tet_infoline("UtcDaliDynamicsBodySetKinematic - DynamicsBody::SetKinematic(true)");
271   body.SetKinematic(true);
272
273   DALI_TEST_CHECK( body.IsKinematic() );
274   DALI_TEST_EQUALS( 0.0f, body.GetMass(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
275
276   tet_infoline("UtcDaliDynamicsBodySetKinematic - DynamicsBody::SetKinematic(false)");
277   body.SetKinematic(false);
278   DALI_TEST_CHECK( !body.IsKinematic() );
279   DALI_TEST_EQUALS( testMass, body.GetMass(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
280   END_TEST;
281 }
282
283 int UtcDaliDynamicsBodyIsKinematic(void)
284 {
285 #if !defined(DYNAMICS_SUPPORT)
286   tet_infoline("No dynamics support compiled\n");
287   return 0;
288 #endif
289   TestApplication application;
290
291   // start up
292   application.SendNotification();
293   application.Render();
294   application.Render();
295
296   const float testMass = 1.0f;
297   DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
298   DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
299
300   if( !world )
301   {
302     // cannot create dynamics world, log failure and exit
303     DALI_TEST_CHECK( false );
304     END_TEST;
305   }
306
307   DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
308   bodyConfig.SetMass(testMass);
309   Actor actor(Actor::New());
310
311   // enable dynamics on the actor to create the Dynamicsbody
312   actor.EnableDynamics(bodyConfig);
313
314   DynamicsBody body(actor.GetDynamicsBody());
315
316   DALI_TEST_EQUALS( testMass, body.GetMass(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
317
318   tet_infoline("UtcDaliDynamicsBodySetKinematic - DynamicsBody::IsSetKinematic");
319   body.SetKinematic(true);
320
321   DALI_TEST_CHECK( body.IsKinematic() );
322   body.SetKinematic(false);
323   DALI_TEST_CHECK( !body.IsKinematic() );
324   END_TEST;
325 }
326
327 int UtcDaliDynamicsBodySetSleepEnabled(void)
328 {
329 #if !defined(DYNAMICS_SUPPORT)
330   tet_infoline("No dynamics support compiled\n");
331   return 0;
332 #endif
333   tet_infoline("UtcDaliDynamicsBodySetSleepEnabled");
334
335   TestApplication application;
336   TraceCallStack& trace( application.GetPlatform().GetTrace() );
337   trace.Enable( true );
338
339   // start up
340   application.SendNotification();
341   application.Render();
342   application.Render();
343
344   DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
345   DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
346
347   if( !world )
348   {
349     // cannot create dynamics world, log failure and exit
350     DALI_TEST_CHECK( false );
351     END_TEST;
352   }
353
354   DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
355   Actor actor(Actor::New());
356
357   // enable dynamics on the actor to create the Dynamicsbody
358   actor.EnableDynamics(bodyConfig);
359
360   DynamicsBody body(actor.GetDynamicsBody());
361
362   // SleepEnabled true by default
363   DALI_TEST_CHECK( body.GetSleepEnabled() );
364   body.SetSleepEnabled(false);
365
366   DALI_TEST_CHECK( ! trace.FindMethod( "DynamicsBody::SetSleepEnabled" ) );
367
368   // update
369   application.SendNotification();
370   application.Render();
371   application.Render();
372
373   DALI_TEST_CHECK( trace.FindMethod( "DynamicsBody::SetSleepEnabled" ) );
374
375   DALI_TEST_CHECK( ! body.GetSleepEnabled() );
376   END_TEST;
377 }
378
379 int UtcDaliDynamicsBodyGetSleepEnabled(void)
380 {
381 #if !defined(DYNAMICS_SUPPORT)
382   tet_infoline("No dynamics support compiled\n");
383   return 0;
384 #endif
385   tet_infoline("UtcDaliDynamicsBodyGetSleepEnabled");
386
387   TestApplication application;
388
389   // start up
390   application.SendNotification();
391   application.Render();
392   application.Render();
393
394   DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
395   DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
396
397   if( !world )
398   {
399     // cannot create dynamics world, log failure and exit
400     DALI_TEST_CHECK( false );
401     END_TEST;
402   }
403
404   DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
405   Actor actor(Actor::New());
406
407   // enable dynamics on the actor to create the Dynamicsbody
408   actor.EnableDynamics(bodyConfig);
409
410   DynamicsBody body(actor.GetDynamicsBody());
411
412   // SleepEnabled true by default
413   DALI_TEST_CHECK( body.GetSleepEnabled() );
414   body.SetSleepEnabled(false);
415   DALI_TEST_CHECK( !body.GetSleepEnabled() );
416   END_TEST;
417 }
418
419 int UtcDaliDynamicsBodyWakeUp(void)
420 {
421 #if !defined(DYNAMICS_SUPPORT)
422   tet_infoline("No dynamics support compiled\n");
423   return 0;
424 #endif
425   tet_infoline("UtcDaliDynamicsBodyWakeUp");
426
427   TestApplication application;
428   TraceCallStack& trace( application.GetPlatform().GetTrace() );
429   trace.Enable( true );
430
431   // start up
432   application.SendNotification();
433   application.Render();
434   application.Render();
435
436   DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
437   DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
438
439   if( !world )
440   {
441     // cannot create dynamics world, log failure and exit
442     DALI_TEST_CHECK( false );
443     END_TEST;
444   }
445
446   DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
447   Actor actor(Actor::New());
448
449   // enable dynamics on the actor to create the Dynamicsbody
450   actor.EnableDynamics(bodyConfig);
451
452   DynamicsBody body(actor.GetDynamicsBody());
453
454   body.WakeUp();
455
456   DALI_TEST_CHECK( ! trace.FindMethod( "DynamicsBody::WakeUp" ) );
457
458   // update
459   application.SendNotification();
460   application.Render();
461   application.Render();
462
463   DALI_TEST_CHECK( trace.FindMethod( "DynamicsBody::WakeUp" ) );
464   END_TEST;
465 }
466
467 int UtcDaliDynamicsBodyAddAnchor(void)
468 {
469 #if !defined(DYNAMICS_SUPPORT)
470   tet_infoline("No dynamics support compiled\n");
471   return 0;
472 #endif
473   tet_infoline("UtcDaliDynamicsBodyAddAnchor - DynamicsBody::AddAnchor()");
474
475   TestApplication application;
476
477   DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
478   worldConfig.SetType(DynamicsWorldConfig::SOFT);
479   DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
480
481   if( !world )
482   {
483     // cannot create dynamics world, log failure and exit
484     DALI_TEST_CHECK( false );
485     END_TEST;
486   }
487
488   Actor rootActor(Actor::New());
489   world.SetRootActor(rootActor);
490   Stage::GetCurrent().Add(rootActor);
491
492   DynamicsBodyConfig softConfig( DynamicsBodyConfig::New() );
493   softConfig.SetType(DynamicsBodyConfig::SOFT);
494   Cloth mesh(Cloth::New(10.0f, 10.0f, 10, 10));
495   DynamicsShape meshShape(DynamicsShape::NewMesh(mesh));
496   softConfig.SetShape( meshShape );
497   softConfig.SetMass(1.0f);
498   MeshActor softActor(MeshActor::New(mesh));
499
500   rootActor.Add(softActor);
501   softActor.EnableDynamics(softConfig);
502   DynamicsBody softBody(softActor.GetDynamicsBody());
503
504   DynamicsBodyConfig anchorConfig(DynamicsBodyConfig::New());
505   anchorConfig.SetMass(0.0f);
506   Actor anchor(Actor::New());
507   rootActor.Add(anchor);
508   anchor.EnableDynamics(anchorConfig);
509   DynamicsBody anchorBody(anchor.GetDynamicsBody());
510   anchorBody.SetKinematic(true);
511   try
512   {
513     softBody.AddAnchor(0, anchorBody, false);
514
515     DALI_TEST_CHECK(true)
516   }
517   catch(Dali::DaliException& e)
518   {
519     DALI_TEST_PRINT_ASSERT( e );
520     DALI_TEST_CHECK( false );
521   }
522
523   rootActor.Remove(softActor);
524   rootActor.Remove(anchor);
525   Stage::GetCurrent().Remove(rootActor);
526   softActor.DisableDynamics();
527   anchor.DisableDynamics();
528   END_TEST;
529 }
530
531 int UtcDaliDynamicsBodyConserveVolume(void)
532 {
533 #if !defined(DYNAMICS_SUPPORT)
534   tet_infoline("No dynamics support compiled\n");
535   return 0;
536 #endif
537   tet_infoline("UtcDaliDynamicsBodyConserveVolume");
538
539   TestApplication application;
540
541   // start up
542   application.SendNotification();
543   application.Render();
544   application.Render();
545
546   DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
547   DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
548
549   if( !world )
550   {
551     // cannot create dynamics world, log failure and exit
552     DALI_TEST_CHECK( false );
553     END_TEST;
554   }
555
556   DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
557   Actor actor(Actor::New());
558
559   // enable dynamics on the actor to create the Dynamicsbody
560   actor.EnableDynamics(bodyConfig);
561
562   DynamicsBody body(actor.GetDynamicsBody());
563
564   body.ConserveVolume(false);
565   DALI_TEST_CHECK( true );
566   END_TEST;
567 }
568
569 int UtcDaliDynamicsBodyConserveShape(void)
570 {
571 #if !defined(DYNAMICS_SUPPORT)
572   tet_infoline("No dynamics support compiled\n");
573   return 0;
574 #endif
575   tet_infoline("UtcDaliDynamicsBodyConserveShape");
576
577   TestApplication application;
578
579   // start up
580   application.SendNotification();
581   application.Render();
582   application.Render();
583
584   DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
585   DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
586
587   if( !world )
588   {
589     // cannot create dynamics world, log failure and exit
590     DALI_TEST_CHECK( false );
591     END_TEST;
592   }
593
594   DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
595   Actor actor(Actor::New());
596
597   // enable dynamics on the actor to create the Dynamicsbody
598   actor.EnableDynamics(bodyConfig);
599
600   DynamicsBody body(actor.GetDynamicsBody());
601
602   body.ConserveShape(false);
603   DALI_TEST_CHECK( true );
604   END_TEST;
605 }