1e0dac50fSopenharmony_ci/*
2e0dac50fSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3e0dac50fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e0dac50fSopenharmony_ci * you may not use this file except in compliance with the License.
5e0dac50fSopenharmony_ci * You may obtain a copy of the License at
6e0dac50fSopenharmony_ci *
7e0dac50fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e0dac50fSopenharmony_ci *
9e0dac50fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e0dac50fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e0dac50fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e0dac50fSopenharmony_ci * See the License for the specific language governing permissions and
13e0dac50fSopenharmony_ci * limitations under the License.
14e0dac50fSopenharmony_ci */
15e0dac50fSopenharmony_ci
16e0dac50fSopenharmony_ci#include <gtest/gtest.h>
17e0dac50fSopenharmony_ci
18e0dac50fSopenharmony_ci#include "wm_math.h"
19e0dac50fSopenharmony_ci
20e0dac50fSopenharmony_ciusing namespace testing;
21e0dac50fSopenharmony_ciusing namespace testing::ext;
22e0dac50fSopenharmony_ci
23e0dac50fSopenharmony_cinamespace OHOS {
24e0dac50fSopenharmony_cinamespace Rosen {
25e0dac50fSopenharmony_ciusing namespace TransformHelper;
26e0dac50fSopenharmony_ciclass WmMathTest : public testing::Test {
27e0dac50fSopenharmony_cipublic:
28e0dac50fSopenharmony_ci    static void SetUpTestCase();
29e0dac50fSopenharmony_ci    static void TearDownTestCase();
30e0dac50fSopenharmony_ci    virtual void SetUp() override;
31e0dac50fSopenharmony_ci    virtual void TearDown() override;
32e0dac50fSopenharmony_ci};
33e0dac50fSopenharmony_ci
34e0dac50fSopenharmony_civoid WmMathTest::SetUpTestCase()
35e0dac50fSopenharmony_ci{
36e0dac50fSopenharmony_ci}
37e0dac50fSopenharmony_ci
38e0dac50fSopenharmony_civoid WmMathTest::TearDownTestCase()
39e0dac50fSopenharmony_ci{
40e0dac50fSopenharmony_ci}
41e0dac50fSopenharmony_ci
42e0dac50fSopenharmony_civoid WmMathTest::SetUp()
43e0dac50fSopenharmony_ci{
44e0dac50fSopenharmony_ci}
45e0dac50fSopenharmony_ci
46e0dac50fSopenharmony_civoid WmMathTest::TearDown()
47e0dac50fSopenharmony_ci{
48e0dac50fSopenharmony_ci}
49e0dac50fSopenharmony_ci
50e0dac50fSopenharmony_cinamespace {
51e0dac50fSopenharmony_ci/**
52e0dac50fSopenharmony_ci * @tc.name: MathHalper
53e0dac50fSopenharmony_ci * @tc.desc: MathHalper test
54e0dac50fSopenharmony_ci * @tc.type: FUNC
55e0dac50fSopenharmony_ci */
56e0dac50fSopenharmony_ciHWTEST_F(WmMathTest, MathHalper, Function | SmallTest | Level2)
57e0dac50fSopenharmony_ci{
58e0dac50fSopenharmony_ci    {
59e0dac50fSopenharmony_ci        const float t = 0.5f;
60e0dac50fSopenharmony_ci        ASSERT_EQ(true, MathHelper::NearZero(0));
61e0dac50fSopenharmony_ci        ASSERT_EQ(true, MathHelper::NearZero(t * MathHelper::NAG_ZERO));
62e0dac50fSopenharmony_ci        ASSERT_EQ(true, MathHelper::NearZero(t * MathHelper::POS_ZERO));
63e0dac50fSopenharmony_ci    }
64e0dac50fSopenharmony_ci    {
65e0dac50fSopenharmony_ci        float radians = MathHelper::PI, degrees = 180.f;
66e0dac50fSopenharmony_ci        ASSERT_EQ(true, MathHelper::NearZero(MathHelper::ToDegrees(radians) - degrees));
67e0dac50fSopenharmony_ci        ASSERT_EQ(true, MathHelper::NearZero(MathHelper::ToRadians(degrees) - radians));
68e0dac50fSopenharmony_ci    }
69e0dac50fSopenharmony_ci    {
70e0dac50fSopenharmony_ci        int a = 1, b = 2, c = 3, d = 4;
71e0dac50fSopenharmony_ci        ASSERT_EQ(true, MathHelper::Max(a, b, c) == c);
72e0dac50fSopenharmony_ci        ASSERT_EQ(true, MathHelper::Min(a, b, c) == a);
73e0dac50fSopenharmony_ci        ASSERT_EQ(true, MathHelper::Max(a, b, c, d) == d);
74e0dac50fSopenharmony_ci        ASSERT_EQ(true, MathHelper::Min(a, b, c, d) == a);
75e0dac50fSopenharmony_ci        ASSERT_EQ(true, MathHelper::Clamp(a, b, c) == b);
76e0dac50fSopenharmony_ci        ASSERT_EQ(true, MathHelper::Clamp(b, a, c) == b);
77e0dac50fSopenharmony_ci        ASSERT_EQ(true, MathHelper::Clamp(c, a, b) == b);
78e0dac50fSopenharmony_ci    }
79e0dac50fSopenharmony_ci}
80e0dac50fSopenharmony_ci
81e0dac50fSopenharmony_ci/**
82e0dac50fSopenharmony_ci * @tc.name: TransformMatrix
83e0dac50fSopenharmony_ci * @tc.desc: Create transform matrix
84e0dac50fSopenharmony_ci *           Get scale component from transform matrix
85e0dac50fSopenharmony_ci *           Get translation component from transform matrix
86e0dac50fSopenharmony_ci * @tc.type: FUNC
87e0dac50fSopenharmony_ci */
88e0dac50fSopenharmony_ciHWTEST_F(WmMathTest, TransformMatrix, Function | SmallTest | Level2)
89e0dac50fSopenharmony_ci{
90e0dac50fSopenharmony_ci    Vector3 scale(1.5f, 0.7f, 2.2f), translation(100.f, 132.f, 20.f);
91e0dac50fSopenharmony_ci    Matrix4 transformMat = CreateScale(scale.x_, scale.y_, scale.z_);
92e0dac50fSopenharmony_ci    float theta = 2.34f;
93e0dac50fSopenharmony_ci    transformMat *= CreateRotationY(theta);
94e0dac50fSopenharmony_ci    transformMat *= CreateTranslation(translation);
95e0dac50fSopenharmony_ci    Vector3 scaleComp = transformMat.GetScale();
96e0dac50fSopenharmony_ci    Vector3 translationComp = transformMat.GetTranslation();
97e0dac50fSopenharmony_ci    ASSERT_EQ(true, MathHelper::NearZero((scale - scaleComp).Length()));
98e0dac50fSopenharmony_ci    ASSERT_EQ(true, MathHelper::NearZero((translation - translationComp).Length()));
99e0dac50fSopenharmony_ci}
100e0dac50fSopenharmony_ci/**
101e0dac50fSopenharmony_ci * @tc.name: TransformWithPerspDiv
102e0dac50fSopenharmony_ci * @tc.desc: Create transform matrix
103e0dac50fSopenharmony_ci *           Get scale component from transform matrix
104e0dac50fSopenharmony_ci *           Get translation component from transform matrix
105e0dac50fSopenharmony_ci * @tc.type: FUNC
106e0dac50fSopenharmony_ci */
107e0dac50fSopenharmony_ciHWTEST_F(WmMathTest, TransformWithPerspDiv, Function | SmallTest | Level2)
108e0dac50fSopenharmony_ci{
109e0dac50fSopenharmony_ci    Vector3 vec(1.0, 1.0, 1.0);
110e0dac50fSopenharmony_ci    Matrix4 mat = Matrix4::Identity;
111e0dac50fSopenharmony_ci    auto result = TransformWithPerspDiv(vec, mat, 0.5);
112e0dac50fSopenharmony_ci    auto expect = vec * 2;
113e0dac50fSopenharmony_ci    ASSERT_EQ(expect.x_, result.x_);
114e0dac50fSopenharmony_ci    ASSERT_EQ(expect.y_, result.y_);
115e0dac50fSopenharmony_ci    ASSERT_EQ(expect.z_, result.z_);
116e0dac50fSopenharmony_ci
117e0dac50fSopenharmony_ci    result = TransformWithPerspDiv(vec, mat, 0);
118e0dac50fSopenharmony_ci    ASSERT_EQ(vec.x_, result.x_);
119e0dac50fSopenharmony_ci    ASSERT_EQ(vec.y_, result.y_);
120e0dac50fSopenharmony_ci    ASSERT_EQ(vec.z_, result.z_);
121e0dac50fSopenharmony_ci}
122e0dac50fSopenharmony_ci
123e0dac50fSopenharmony_ci/**
124e0dac50fSopenharmony_ci * @tc.name: Invert
125e0dac50fSopenharmony_ci * @tc.desc:
126e0dac50fSopenharmony_ci * @tc.type: FUNC
127e0dac50fSopenharmony_ci */
128e0dac50fSopenharmony_ciHWTEST_F(WmMathTest, Invert, Function | SmallTest | Level2)
129e0dac50fSopenharmony_ci{
130e0dac50fSopenharmony_ci    Matrix4 mat;
131e0dac50fSopenharmony_ci    mat.mat_[0][0] = 0.f;
132e0dac50fSopenharmony_ci    mat.mat_[1][0] = -1.0f;
133e0dac50fSopenharmony_ci    mat.Invert();
134e0dac50fSopenharmony_ci    ASSERT_EQ(false, MathHelper::NearZero(0.f - mat.mat_[1][0]));
135e0dac50fSopenharmony_ci}
136e0dac50fSopenharmony_ci
137e0dac50fSopenharmony_ci/**
138e0dac50fSopenharmony_ci * @tc.name: Invert02
139e0dac50fSopenharmony_ci * @tc.desc:
140e0dac50fSopenharmony_ci * @tc.type: FUNC
141e0dac50fSopenharmony_ci */
142e0dac50fSopenharmony_ciHWTEST_F(WmMathTest, Invert02, Function | SmallTest | Level2)
143e0dac50fSopenharmony_ci{
144e0dac50fSopenharmony_ci    Matrix4 mat;
145e0dac50fSopenharmony_ci    mat.mat_[0][0] = 10.0f;
146e0dac50fSopenharmony_ci    mat.mat_[1][0] = -1.0f;
147e0dac50fSopenharmony_ci    mat.Invert();
148e0dac50fSopenharmony_ci    ASSERT_EQ(false, MathHelper::NearZero(0.f - mat.mat_[1][0]));
149e0dac50fSopenharmony_ci}
150e0dac50fSopenharmony_ci
151e0dac50fSopenharmony_ci/**
152e0dac50fSopenharmony_ci * @tc.name: Invert02
153e0dac50fSopenharmony_ci * @tc.desc:
154e0dac50fSopenharmony_ci * @tc.type: FUNC
155e0dac50fSopenharmony_ci */
156e0dac50fSopenharmony_ciHWTEST_F(WmMathTest, Invert03, Function | SmallTest | Level2)
157e0dac50fSopenharmony_ci{
158e0dac50fSopenharmony_ci    Matrix4 mat;
159e0dac50fSopenharmony_ci    mat.mat_[0][0] = 0.f;
160e0dac50fSopenharmony_ci    mat.mat_[1][0] = 0.f;
161e0dac50fSopenharmony_ci    mat.Invert();
162e0dac50fSopenharmony_ci    ASSERT_EQ(false, MathHelper::NearZero(0.f - mat.mat_[1][0]));
163e0dac50fSopenharmony_ci}
164e0dac50fSopenharmony_ci
165e0dac50fSopenharmony_ci/**
166e0dac50fSopenharmony_ci * @tc.name: Invert02
167e0dac50fSopenharmony_ci * @tc.desc:
168e0dac50fSopenharmony_ci * @tc.type: FUNC
169e0dac50fSopenharmony_ci */
170e0dac50fSopenharmony_ciHWTEST_F(WmMathTest, Invert04, Function | SmallTest | Level2)
171e0dac50fSopenharmony_ci{
172e0dac50fSopenharmony_ci    Matrix4 mat;
173e0dac50fSopenharmony_ci    mat.mat_[0][0] = 10.0f;
174e0dac50fSopenharmony_ci    mat.mat_[1][0] = 0.f;
175e0dac50fSopenharmony_ci    mat.Invert();
176e0dac50fSopenharmony_ci    ASSERT_EQ(false, MathHelper::NearZero(0.f - mat.mat_[1][0]));
177e0dac50fSopenharmony_ci}
178e0dac50fSopenharmony_ci}
179e0dac50fSopenharmony_ci} // namespace Rosen
180e0dac50fSopenharmony_ci} // namespace OHOS