1 /*
2  * Copyright (c) 2022 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 "base/memory/referenced.h"
19 // Add the following two macro definitions to test the private and protected method.
20 #define private public
21 #define protected public
22 #include "base/geometry/animatable_matrix4.h"
23 
24 using namespace testing;
25 using namespace testing::ext;
26 
27 namespace OHOS::Ace {
28 namespace {
29 const int32_t VALID_ROW0 = 0;
30 const int32_t VALID_COL0 = 0;
31 const double DEFAULT_DOUBLE0 = 0.0;
32 } // namespace
33 
34 class AnimatableMatrix4Test : public testing::Test {};
35 
36 /**
37  * @tc.name: AnimatableMatrix4Test001
38  * @tc.desc: Test the function operator= of the class AnimatableMatrix4.
39  * @tc.type: FUNC
40  */
41 HWTEST_F(AnimatableMatrix4Test, AnimatableMatrix4Test001, TestSize.Level1)
42 {
43     /**
44      * @tc.steps: Test the function operator= with given Matrix4 object.
45      */
46     AnimatableMatrix4 animatableMatrix4Obj1;
47     Matrix4 matrixObj1 = Matrix4::CreateIdentity();
48     animatableMatrix4Obj1 = matrixObj1;
49     EXPECT_TRUE(animatableMatrix4Obj1.IsIdentityMatrix());
50     matrixObj1.Set(VALID_ROW0, VALID_COL0, DEFAULT_DOUBLE0);
51 
52     /**
53      * @tc.steps: Test the function MoveTo with given Matrix4 object.
54      */
55     animatableMatrix4Obj1.MoveTo(matrixObj1);
56     EXPECT_DOUBLE_EQ(animatableMatrix4Obj1.Get(VALID_ROW0, VALID_COL0), DEFAULT_DOUBLE0);
57 
58     /**
59      * @tc.steps: Test the function operator= with given AnimatableMatrix4 object.
60      */
61     AnimatableMatrix4 animatableMatrix4Obj2;
62     animatableMatrix4Obj2 = animatableMatrix4Obj1;
63     EXPECT_DOUBLE_EQ(animatableMatrix4Obj2.Get(VALID_ROW0, VALID_COL0), DEFAULT_DOUBLE0);
64 }
65 
66 /**
67  * @tc.name: AnimatableMatrix4Test002
68  * @tc.desc: Test the function AnimateTo of the class AnimatableMatrix4.
69  * @tc.type: FUNC
70  */
71 HWTEST_F(AnimatableMatrix4Test, AnimatableMatrix4Test002, TestSize.Level1)
72 {
73     /**
74      * @tc.steps: initialize parameters.
75      */
76     AnimatableMatrix4 animatableMatrix4Obj1;
77     Matrix4 endValue = Matrix4::CreateIdentity();
78     EXPECT_TRUE(animatableMatrix4Obj1.isFirstAssign_);
79 
80     /**
81      * @tc.steps: Test the function AnimateTo firstly, enter the first if-branch.
82      */
83     animatableMatrix4Obj1.AnimateTo(endValue);
84     EXPECT_FALSE(animatableMatrix4Obj1.isFirstAssign_);
85     EXPECT_TRUE(animatableMatrix4Obj1.IsIdentityMatrix());
86     EXPECT_EQ(animatableMatrix4Obj1.animationController_, nullptr);
87 
88     /**
89      * @tc.steps: Test the function AnimateTo secondly, enter the second if-branch.
90      */
91     animatableMatrix4Obj1.AnimateTo(animatableMatrix4Obj1);
92     EXPECT_EQ(animatableMatrix4Obj1.animationController_, nullptr);
93 
94     /**
95      * @tc.steps: Test the function AnimateTo thirdly, the function will run until the end of it.
96      */
97     animatableMatrix4Obj1.AnimateTo(endValue);
98     EXPECT_EQ(animatableMatrix4Obj1.animationController_, nullptr);
99 }
100 
101 /**
102  * @tc.name: AnimatableMatrix4Test003
103  * @tc.desc: Test the function ResetController of the class AnimatableMatrix4.
104  * @tc.type: FUNC
105  */
106 HWTEST_F(AnimatableMatrix4Test, AnimatableMatrix4Test003, TestSize.Level1)
107 {
108     AnimatableMatrix4 animatableMatrix4Obj1;
109     animatableMatrix4Obj1.ResetController();
110     animatableMatrix4Obj1.animationController_ = CREATE_ANIMATOR(nullptr);
111     EXPECT_NE(animatableMatrix4Obj1.animationController_, nullptr);
112     animatableMatrix4Obj1.ResetController();
113     EXPECT_EQ(animatableMatrix4Obj1.animationController_, nullptr);
114 }
115 
116 /**
117  * @tc.name: AnimatableMatrix4Test004
118  * @tc.desc: Test the function OnAnimationCallback of the class AnimatableMatrix4.
119  * @tc.type: FUNC
120  */
121 HWTEST_F(AnimatableMatrix4Test, AnimatableMatrix4Test004, TestSize.Level1)
122 {
123     /**
124      * @tc.steps: initialize parameters.
125      */
126     TransformOperation transformOperation;
127     AnimatableMatrix4 animatableMatrix4Obj1;
128     animatableMatrix4Obj1.OnAnimationCallback(transformOperation);
129     bool flagEventCbk = false;
__anonbcba49cd0202() 130     animatableMatrix4Obj1.SetContextAndCallback(nullptr, [&flagEventCbk]() { flagEventCbk = true; });
131     /**
132      * @tc.steps: Set the animationCallback_ as the function which changes the value of flagEventCbk,
133      *            the value will be modified when the onReadyEvent is fired.
134      */
135     animatableMatrix4Obj1.OnAnimationCallback(transformOperation);
136     EXPECT_TRUE(flagEventCbk);
137 }
138 
139 /**
140  * @tc.name: AnimatableMatrix4Test005
141  * @tc.desc: Test the function ResetAnimatableMatrix of the class AnimatableMatrix4.
142  * @tc.type: FUNC
143  */
144 HWTEST_F(AnimatableMatrix4Test, AnimatableMatrix4Test005, TestSize.Level1)
145 {
146     AnimatableMatrix4 animatableMatrix4Obj1;
147     animatableMatrix4Obj1.isFirstAssign_ = false;
148     animatableMatrix4Obj1.ResetAnimatableMatrix();
149     EXPECT_TRUE(animatableMatrix4Obj1.isFirstAssign_);
150 }
151 
152 /**
153  * @tc.name: AnimatableMatrix4Test006
154  * @tc.desc: Test the function reload operator=
155  * @tc.type: FUNC
156  */
157 HWTEST_F(AnimatableMatrix4Test, AnimatableMatrix4Test006, TestSize.Level1)
158 {
159     AnimatableMatrix4 animatableMatrix4Obj1;
160     AnimatableMatrix4 animatableMatrix4Obj2;
161     // true true, both animationCallback_ and pipelineContext nullptr
162     animatableMatrix4Obj2 = animatableMatrix4Obj1;
163     // false true, animationCallback_ not nullptr, pipelineContext  nullptr
164     bool flagEventCbk = false;
__anonbcba49cd0302() 165     animatableMatrix4Obj2.SetContextAndCallback(nullptr, [&flagEventCbk]() { flagEventCbk = true; });
166     animatableMatrix4Obj2 = animatableMatrix4Obj1;
167 }
168 } // namespace OHOS::Ace
169