1 // This file is part of VSTGUI. It is subject to the license terms
2 // in the LICENSE file found in the top-level directory of this
3 // distribution and at http://github.com/steinbergmedia/vstgui/LICENSE
4 
5 #include "../../../../lib/animation/timingfunctions.h"
6 #include "../../../../lib/cview.h"
7 #include "../../../../lib/cviewcontainer.h"
8 #include "../../../../lib/controls/ccontrol.h"
9 #include "../../unittests.h"
10 
11 namespace VSTGUI {
12 using namespace Animation;
13 
14 TESTCASE(TimingFunctionTests,
15 	TEST(linearTimingFunction,
16 		LinearTimingFunction f (100);
17 		ITimingFunction& tf = dynamic_cast<ITimingFunction&>(f);
18 		EXPECT(tf.getPosition (0) == 0.f);
19 		EXPECT(tf.getPosition (50) == 0.5f);
20 		EXPECT(tf.getPosition (100) == 1.f);
21 		EXPECT(tf.getPosition (150) == 1.f);
22 	);
23 	TEST(powerTwoTimingFunction,
24 		PowerTimingFunction f (100, 2);
25 		ITimingFunction& tf = dynamic_cast<ITimingFunction&>(f);
26 		EXPECT(tf.getPosition (0) == 0.f);
27 		EXPECT(tf.getPosition (50) == 0.25f);
28 		EXPECT(tf.getPosition (86) == 0.7396f);
29 		EXPECT(tf.getPosition (100) == 1.f);
30 		EXPECT(tf.getPosition (150) == 1.f);
31 	);
32 	TEST(powerFourTimingFunction,
33 		PowerTimingFunction f (100, 4);
34 		ITimingFunction& tf = dynamic_cast<ITimingFunction&>(f);
35 		EXPECT(tf.getPosition (0) == 0.f);
36 		EXPECT(tf.getPosition (50) == 0.0625f);
37 		EXPECT(tf.getPosition (100) == 1.f);
38 		EXPECT(tf.getPosition (150) == 1.f);
39 	);
40 	TEST(interpolationTimingFunction,
41 		InterpolationTimingFunction f (100);
42 		f.addPoint (0.5, 0.4f);
43 		ITimingFunction& tf = dynamic_cast<ITimingFunction&>(f);
44 		EXPECT(tf.getPosition (0) == 0.f);
45 		EXPECT(tf.getPosition (25) == 0.2f);
46 		EXPECT(tf.getPosition (50) == 0.4f);
47 		EXPECT(tf.getPosition (75) == 0.7f);
48 		EXPECT(tf.getPosition (100) == 1.f);
49 		EXPECT(tf.getPosition (150) == 1.f);
50 	);
51 	TEST(repeatTimingFunction,
52 		auto lf = new LinearTimingFunction (100);
53 		RepeatTimingFunction f (lf, 2, false);
54 		ITimingFunction& tf = dynamic_cast<ITimingFunction&>(f);
55 		EXPECT(tf.getPosition (0) == 0.f);
56 		EXPECT(tf.getPosition (50) == 0.5f);
57 		EXPECT(tf.getPosition (100) == 1.f);
58 		EXPECT(tf.isDone (100) == false);
59 		EXPECT(tf.getPosition (110) == 0.1f);
60 		EXPECT(tf.getPosition (150) == 0.5f);
61 		EXPECT(tf.getPosition (200) == 1.0f);
62 		EXPECT(tf.isDone (200) == true);
63 	);
64 	TEST(repeatTimingFunctionReverse,
65 		auto lf = new LinearTimingFunction (100);
66 		RepeatTimingFunction f (lf, 2, true);
67 		ITimingFunction& tf = dynamic_cast<ITimingFunction&>(f);
68 		EXPECT(tf.getPosition (0) == 0.f);
69 		EXPECT(tf.getPosition (50) == 0.5f);
70 		EXPECT(tf.getPosition (100) == 1.f);
71 		EXPECT(tf.isDone (100) == false);
72 		EXPECT(tf.getPosition (110) == 0.9f);
73 		EXPECT(tf.getPosition (150) == 0.5f);
74 		EXPECT(tf.getPosition (200) == 0.f);
75 		EXPECT(tf.isDone (200) == true);
76 	);
77 	TEST(cubicBezierTimingFunction,
78 		CubicBezierTimingFunction f (100, CPoint (0.42, 0.), CPoint (0.58, 1.));
79 		EXPECT (f.getPosition (0) == 0.f);
80 		EXPECT (f.getPosition (25) < 0.25f);
81 		EXPECT (f.getPosition (50) == 0.5f);
82 		EXPECT (f.getPosition (75) > 0.75f);
83 		EXPECT (f.getPosition (100) == 1.0f);
84 	);
85 );
86 
87 } // VSTGUI
88