1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "gtest/gtest.h"
17 
18 #include "animation/rs_implicit_animator.h"
19 #include "animation/rs_motion_path_option.h"
20 #include "ui/rs_canvas_node.h"
21 #include "modifier/rs_property_modifier.h"
22 
23 using namespace testing;
24 using namespace testing::ext;
25 
26 namespace OHOS {
27 namespace Rosen {
28 class RSImplicitAnimatorTest : public testing::Test {
29 public:
30     static void SetUpTestCase();
31     static void TearDownTestCase();
32     void SetUp() override;
33     void TearDown() override;
34 
35     const std::string  ANIMATION_PATH = "L350 0 L150 100";
36     const Vector4f ANIMATION_START_BOUNDS = Vector4f(100.f, 100.f, 200.f, 300.f);
37     const Vector4f ANIMATION_END_BOUNDS = Vector4f(100.f, 100.f, 300.f, 300.f);
38 };
39 
SetUpTestCase()40 void RSImplicitAnimatorTest::SetUpTestCase() {}
TearDownTestCase()41 void RSImplicitAnimatorTest::TearDownTestCase() {}
SetUp()42 void RSImplicitAnimatorTest::SetUp() {}
TearDown()43 void RSImplicitAnimatorTest::TearDown() {}
44 
45 /**
46  * @tc.name: OpenImplicitAnimation001
47  * @tc.desc: Verify the OpenImplicitAnimation
48  * @tc.type:FUNC
49  */
50 HWTEST_F(RSImplicitAnimatorTest, GetBoundsTest, TestSize.Level1)
51 {
52     GTEST_LOG_(INFO) << "RSImplicitAnimatorTest OpenImplicitAnimation001 start";
53     RSAnimationTimingProtocol timingProtocol;
54     float mass = 0.5f;
55     float stiffness = 0.0f;
56     float damping = 0.5f;
57     float velocity = 1.0f;
58     auto timingCurve = RSAnimationTimingCurve::CreateInterpolatingSpring(mass, stiffness, damping, velocity);
59     auto implicitAnimator = std::make_shared<RSImplicitAnimator>();
60     implicitAnimator->OpenImplicitAnimation(RSAnimationTimingProtocol::DEFAULT, timingCurve);
61     EXPECT_TRUE(implicitAnimator != nullptr);
62     GTEST_LOG_(INFO) << "RSImplicitAnimatorTest OpenImplicitAnimation001 end";
63 }
64 
65 /**
66  * @tc.name: BeginImplicitDurationKeyFrameAnimation001
67  * @tc.desc: Verify the BeginImplicitDurationKeyFrameAnimation
68  * @tc.type:FUNC
69  */
70 HWTEST_F(RSImplicitAnimatorTest, BeginImplicitDurationKeyFrameAnimation001, TestSize.Level1)
71 {
72     GTEST_LOG_(INFO) << "RSImplicitAnimatorTest BeginImplicitDurationKeyFrameAnimation001 start";
73     int duration = 1000;
74     RSAnimationTimingProtocol timingProtocol;
75     float mass = 0.5f;
76     float stiffness = 0.0f;
77     float damping = 0.5f;
78     float velocity = 1.0f;
79     auto timingCurve = RSAnimationTimingCurve::CreateSpringCurve(velocity, mass, stiffness, damping);
80     auto implicitAnimator = std::make_shared<RSImplicitAnimator>();
81     implicitAnimator->BeginImplicitDurationKeyFrameAnimation(duration, timingCurve);
82 
83     implicitAnimator->OpenImplicitAnimation(RSAnimationTimingProtocol::DEFAULT, timingCurve);
84     implicitAnimator->BeginImplicitDurationKeyFrameAnimation(duration, timingCurve);
85 
86     RSAnimationTimingProtocol timingProtocol1(0);
87     auto timingCurve1 = RSAnimationTimingCurve::DEFAULT;
88     implicitAnimator->OpenImplicitAnimation(timingProtocol1, timingCurve1);
89     implicitAnimator->BeginImplicitDurationKeyFrameAnimation(duration, timingCurve1);
90 
91     implicitAnimator->OpenImplicitAnimation(timingProtocol, timingCurve1);
92     implicitAnimator->BeginImplicitDurationKeyFrameAnimation(duration, timingCurve1);
93     EXPECT_TRUE(implicitAnimator != nullptr);
94     GTEST_LOG_(INFO) << "RSImplicitAnimatorTest BeginImplicitDurationKeyFrameAnimation001 end";
95 }
96 
97 /**
98  * @tc.name: EndImplicitDurationKeyFrameAnimation001
99  * @tc.desc: Verify the EndImplicitDurationKeyFrameAnimation
100  * @tc.type:FUNC
101  */
102 HWTEST_F(RSImplicitAnimatorTest, EndImplicitDurationKeyFrameAnimation001, TestSize.Level1)
103 {
104     GTEST_LOG_(INFO) << "RSImplicitAnimatorTest EndImplicitDurationKeyFrameAnimation001 start";
105     int duration = 1000;
106     auto implicitAnimator = std::make_shared<RSImplicitAnimator>();
107     implicitAnimator->EndImplicitDurationKeyFrameAnimation();
108 
109     RSAnimationTimingProtocol timingProtocol;
110     auto timingCurve = RSAnimationTimingCurve::DEFAULT;
111     implicitAnimator->OpenImplicitAnimation(timingProtocol, timingCurve);
112     implicitAnimator->BeginImplicitDurationKeyFrameAnimation(duration, timingCurve);
113     implicitAnimator->EndImplicitDurationKeyFrameAnimation();
114     EXPECT_TRUE(implicitAnimator != nullptr);
115     GTEST_LOG_(INFO) << "RSImplicitAnimatorTest EndImplicitDurationKeyFrameAnimation001 end";
116 }
117 
118 /**
119  * @tc.name: EndImplicitPathAnimation001
120  * @tc.desc: Verify the EndImplicitPathAnimation
121  * @tc.type:FUNC
122  */
123 HWTEST_F(RSImplicitAnimatorTest, EndImplicitPathAnimation001, TestSize.Level1)
124 {
125     GTEST_LOG_(INFO) << "RSImplicitAnimatorTest EndImplicitPathAnimation001 start";
126     auto implicitAnimator = std::make_shared<RSImplicitAnimator>();
127     implicitAnimator->EndImplicitPathAnimation();
128 
129     auto motionPathOption = std::make_shared<RSMotionPathOption>(ANIMATION_PATH);
130     RSAnimationTimingProtocol timingProtocol;
131     auto timingCurve = RSAnimationTimingCurve::DEFAULT;
132     implicitAnimator->OpenImplicitAnimation(timingProtocol, timingCurve);
133     implicitAnimator->BeginImplicitPathAnimation(motionPathOption);
134     implicitAnimator->EndImplicitPathAnimation();
135     EXPECT_TRUE(implicitAnimator != nullptr);
136     GTEST_LOG_(INFO) << "RSImplicitAnimatorTest EndImplicitPathAnimation001 end";
137 }
138 
139 /**
140  * @tc.name: CancelImplicitAnimation001
141  * @tc.desc: Verify the CancelImplicitAnimation
142  * @tc.type:FUNC
143  */
144 HWTEST_F(RSImplicitAnimatorTest, CancelImplicitAnimation001, TestSize.Level1)
145 {
146     GTEST_LOG_(INFO) << "RSImplicitAnimatorTest CancelImplicitAnimation001 start";
147 
148     std::shared_ptr<RSCanvasNode> canvasNode = nullptr;
149     std::shared_ptr<RSAnimatableProperty<Vector2f>> property = nullptr;
150 
151     auto implicitAnimator = std::make_shared<RSImplicitAnimator>();
152     implicitAnimator->CancelImplicitAnimation(canvasNode, property);
153 
154     auto canvasNode1 = RSCanvasNode::Create();
155     std::shared_ptr<RSAnimatableProperty<Vector2f>> property1 = nullptr;
156     implicitAnimator->CancelImplicitAnimation(canvasNode1, property1);
157 
158     auto canvasNode2 = RSCanvasNode::Create();
159     auto property2 = std::make_shared<RSAnimatableProperty<Vector2f>>(Vector2f(0.f, 0.f));
160     implicitAnimator->CancelImplicitAnimation(canvasNode2, property2);
161 
162     auto property3 = std::make_shared<RSAnimatableProperty<Vector4f>>(ANIMATION_START_BOUNDS);
163     auto startProperty = std::make_shared<RSAnimatableProperty<Vector4f>>(ANIMATION_START_BOUNDS);
164     auto endProperty = std::make_shared<RSAnimatableProperty<Vector4f>>(ANIMATION_END_BOUNDS);
165     auto modifier3 = std::make_shared<RSBoundsModifier>(property3);
166     auto canvasNode3 = RSCanvasNode::Create();
167     canvasNode3->AddModifier(modifier3);
168 
169     auto timingCurve = RSAnimationTimingCurve::DEFAULT;
170     RSAnimationTimingProtocol timingProtocol3;
171     implicitAnimator->OpenImplicitAnimation(timingProtocol3, timingCurve);
172     implicitAnimator->CreateImplicitAnimation(canvasNode3, property3, nullptr, endProperty);
173     implicitAnimator->CreateImplicitAnimation(canvasNode3, property3, startProperty, nullptr);
174     implicitAnimator->CreateImplicitAnimation(canvasNode3, property3, startProperty, endProperty);
175     implicitAnimator->CancelImplicitAnimation(canvasNode3, property3);
176 
177     RSAnimationTimingProtocol timingProtocol4(0);
178     implicitAnimator->OpenImplicitAnimation(timingProtocol4, timingCurve);
179     implicitAnimator->CreateImplicitAnimation(canvasNode3, property3, startProperty, endProperty);
180     implicitAnimator->CancelImplicitAnimation(canvasNode3, property3);
181 
182     EXPECT_TRUE(implicitAnimator != nullptr);
183     GTEST_LOG_(INFO) << "RSImplicitAnimatorTest CancelImplicitAnimation001 end";
184 }
185 
186 /**
187  * @tc.name: CreateImplicitAnimationWithInitialVelocity001
188  * @tc.desc: Verify the CreateImplicitAnimationWithInitialVelocity
189  * @tc.type:FUNC
190  */
191 HWTEST_F(RSImplicitAnimatorTest, CreateImplicitAnimationWithInitialVelocity001, TestSize.Level1)
192 {
193     GTEST_LOG_(INFO) << "RSImplicitAnimatorTest CreateImplicitAnimationWithInitialVelocity001 start";
194     RSAnimationTimingProtocol timingProtocol;
195     auto timingCurve = RSAnimationTimingCurve::SPRING;
196     auto implicitAnimator = std::make_shared<RSImplicitAnimator>();
197 
198     std::shared_ptr<RSCanvasNode> node = nullptr;
199     std::shared_ptr<RSAnimatableProperty<Vector4f>> prop = nullptr;
200     std::shared_ptr<RSAnimatableProperty<Vector4f>> prop_start = nullptr;
201     std::shared_ptr<RSAnimatableProperty<Vector4f>> prop_end = nullptr;
202     auto velocity = std::make_shared<RSAnimatableProperty<float>>(1.0f);
203 
204     implicitAnimator->CreateImplicitAnimationWithInitialVelocity(node, prop, prop_start, prop_end, velocity);
205 
206     auto node1 = RSCanvasNode::Create();
207     implicitAnimator->OpenImplicitAnimation(RSAnimationTimingProtocol::DEFAULT, RSAnimationTimingCurve::DEFAULT);
208     implicitAnimator->CreateImplicitAnimationWithInitialVelocity(node1, prop, prop_start, prop_end, velocity);
209 
210     auto prop1 = std::make_shared<RSAnimatableProperty<Vector4f>>(ANIMATION_START_BOUNDS);
211     implicitAnimator->OpenImplicitAnimation(RSAnimationTimingProtocol::DEFAULT, RSAnimationTimingCurve::DEFAULT);
212     implicitAnimator->CreateImplicitAnimationWithInitialVelocity(node1, prop1, prop_start, prop_end, velocity);
213 
214     EXPECT_TRUE(implicitAnimator != nullptr);
215     GTEST_LOG_(INFO) << "RSImplicitAnimatorTest CreateImplicitAnimationWithInitialVelocity001 end";
216 }
217 
218 /**
219  * @tc.name: CreateImplicitAnimationWithInitialVelocity002
220  * @tc.desc: Verify the CreateImplicitAnimationWithInitialVelocity
221  * @tc.type:FUNC
222  */
223 HWTEST_F(RSImplicitAnimatorTest, CreateImplicitAnimationWithInitialVelocity002, TestSize.Level1)
224 {
225     GTEST_LOG_(INFO) << "RSImplicitAnimatorTest CreateImplicitAnimationWithInitialVelocity002 start";
226     RSAnimationTimingProtocol timingProtocol;
227     auto timingCurve = RSAnimationTimingCurve::SPRING;
228     auto implicitAnimator = std::make_shared<RSImplicitAnimator>();
229 
230     auto canvasNode = RSCanvasNode::Create();
231     auto property = std::make_shared<RSAnimatableProperty<Vector4f>>(ANIMATION_START_BOUNDS);
232     auto startProperty = std::make_shared<RSAnimatableProperty<Vector4f>>(ANIMATION_START_BOUNDS);
233     auto endProperty = std::make_shared<RSAnimatableProperty<Vector4f>>(ANIMATION_END_BOUNDS);
234     auto velocity = std::make_shared<RSAnimatableProperty<float>>(1.0f);
235     auto modifier = std::make_shared<RSBoundsModifier>(property);
236     canvasNode->AddModifier(modifier);
237 
238     implicitAnimator->OpenImplicitAnimation(RSAnimationTimingProtocol::DEFAULT, timingCurve);
239     implicitAnimator->CreateImplicitAnimationWithInitialVelocity(
240         canvasNode, property, startProperty, endProperty, velocity);
241 
242     bool flag = false;
__anon94e943670102() 243     std::function<void()> func = [&]() { flag = !flag; };
244     auto finishCallback = std::make_shared<AnimationFinishCallback>(func);
245     auto repeatCallback = std::make_shared<AnimationRepeatCallback>(func);
246 
247     implicitAnimator->OpenImplicitAnimation(
248         RSAnimationTimingProtocol::DEFAULT, timingCurve, std::move(finishCallback), nullptr);
249     implicitAnimator->CreateImplicitAnimationWithInitialVelocity(
250         canvasNode, property, startProperty, endProperty, velocity);
251 
252     implicitAnimator->OpenImplicitAnimation(
253         RSAnimationTimingProtocol::DEFAULT, timingCurve, std::move(finishCallback), std::move(repeatCallback));
254     implicitAnimator->CreateImplicitAnimationWithInitialVelocity(
255         canvasNode, property, startProperty, endProperty, velocity);
256 
257     EXPECT_TRUE(implicitAnimator != nullptr);
258     GTEST_LOG_(INFO) << "RSImplicitAnimatorTest CreateImplicitAnimationWithInitialVelocity002 end";
259 }
260 } // namespace Rosen
261 } // namespace OHOS
262