1 /*
2 * Copyright (c) 2024 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, Hardware
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 "drawing_color.h"
17 #include "drawing_error_code.h"
18 #include "drawing_filter.h"
19 #include "drawing_mask_filter.h"
20 #include "drawing_rect.h"
21 #include "drawing_round_rect.h"
22 #include "gtest/gtest.h"
23
24 #include "utils/round_rect.h"
25 #include "utils/scalar.h"
26
27 #ifdef RS_ENABLE_VK
28 #include "platform/ohos/backend/rs_vulkan_context.h"
29 #endif
30
31 using namespace testing;
32 using namespace testing::ext;
33
34 namespace OHOS {
35 namespace Rosen {
36 namespace Drawing {
37 class NativeDrawingRoundRectTest : public testing::Test {
38 public:
39 static void SetUpTestCase();
40 static void TearDownTestCase();
41 void SetUp() override;
42 void TearDown() override;
43 };
44
SetUpTestCase()45 void NativeDrawingRoundRectTest::SetUpTestCase()
46 {
47 #ifdef RS_ENABLE_VK
48 RsVulkanContext::SetRecyclable(false);
49 #endif
50 }
TearDownTestCase()51 void NativeDrawingRoundRectTest::TearDownTestCase() {}
SetUp()52 void NativeDrawingRoundRectTest::SetUp() {}
TearDown()53 void NativeDrawingRoundRectTest::TearDown() {}
54
55 constexpr uint32_t FOUR = 4;
56 constexpr int32_t MINUS_ONE = -1;
57
58 /*
59 * @tc.name: NativeDrawingRectTest_CCornerPosCastToCornerPos001
60 * @tc.desc: test CCornerPosCastToCornerPos
61 * @tc.type: FUNC
62 * @tc.require: AR000GTO5R
63 */
64 HWTEST_F(NativeDrawingRoundRectTest, CCornerPosCastToCornerPos001, TestSize.Level1)
65 {
66 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(100, 100, 200, 200);
67 OH_Drawing_RoundRect* roundRect = OH_Drawing_RoundRectCreate(rect, 200, 200);
68 ASSERT_NE(nullptr, roundRect);
69
70 OH_Drawing_Corner_Radii radius = { 10, 10 };
71
72 OH_Drawing_RoundRectSetCorner(nullptr, OH_Drawing_CornerPos::CORNER_POS_TOP_LEFT, radius);
73 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
74 OH_Drawing_RoundRectSetCorner(roundRect, static_cast<OH_Drawing_CornerPos>(FOUR), radius);
75 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE);
76 OH_Drawing_RoundRectSetCorner(roundRect, static_cast<OH_Drawing_CornerPos>(MINUS_ONE), radius);
77 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE);
78 OH_Drawing_RoundRectSetCorner(roundRect, OH_Drawing_CornerPos::CORNER_POS_TOP_LEFT, radius);
79
80 OH_Drawing_RoundRectGetCorner(nullptr, OH_Drawing_CornerPos::CORNER_POS_TOP_LEFT);
81 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
82 OH_Drawing_RoundRectGetCorner(roundRect, static_cast<OH_Drawing_CornerPos>(FOUR));
83 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE);
84 OH_Drawing_RoundRectGetCorner(roundRect, static_cast<OH_Drawing_CornerPos>(MINUS_ONE));
85 EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE);
86 OH_Drawing_Corner_Radii retrievedRadius;
87 retrievedRadius = OH_Drawing_RoundRectGetCorner(roundRect, OH_Drawing_CornerPos::CORNER_POS_TOP_LEFT);
88 ASSERT_FLOAT_EQ(retrievedRadius.x, radius.x);
89 ASSERT_FLOAT_EQ(retrievedRadius.y, radius.y);
90
91 OH_Drawing_RoundRectDestroy(roundRect);
92 OH_Drawing_RectDestroy(rect);
93 }
94
95 /*
96 * @tc.name: NativeDrawingRectTest_CCornerPosCastToCornerPos002
97 * @tc.desc: test CCornerPosCastToCornerPos
98 * @tc.type: FUNC
99 * @tc.require: AR000GTO5R
100 */
101 HWTEST_F(NativeDrawingRoundRectTest, CCornerPosCastToCornerPos002, TestSize.Level1)
102 {
103 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(100, 100, 200, 200);
104 OH_Drawing_RoundRect* roundRect = OH_Drawing_RoundRectCreate(rect, 200, 200);
105 ASSERT_NE(nullptr, roundRect);
106
107 OH_Drawing_Corner_Radii radius = { 10, 10 };
108
109 OH_Drawing_RoundRectSetCorner(roundRect, OH_Drawing_CornerPos::CORNER_POS_TOP_RIGHT, radius);
110
111 OH_Drawing_Corner_Radii retrievedRadius;
112
113 retrievedRadius = OH_Drawing_RoundRectGetCorner(roundRect, OH_Drawing_CornerPos::CORNER_POS_TOP_RIGHT);
114 ASSERT_FLOAT_EQ(retrievedRadius.x, radius.x);
115 ASSERT_FLOAT_EQ(retrievedRadius.y, radius.y);
116
117 OH_Drawing_RoundRectDestroy(roundRect);
118 OH_Drawing_RectDestroy(rect);
119 }
120
121 /*
122 * @tc.name: NativeDrawingRectTest_CCornerPosCastToCornerPos003
123 * @tc.desc: test CCornerPosCastToCornerPos
124 * @tc.type: FUNC
125 * @tc.require: AR000GTO5R
126 */
127 HWTEST_F(NativeDrawingRoundRectTest, CCornerPosCastToCornerPos003, TestSize.Level1)
128 {
129 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(100, 100, 200, 200);
130 OH_Drawing_RoundRect* roundRect = OH_Drawing_RoundRectCreate(rect, 200, 200);
131 ASSERT_NE(nullptr, roundRect);
132
133 OH_Drawing_Corner_Radii radius = { 10, 10 };
134
135 OH_Drawing_RoundRectSetCorner(roundRect, OH_Drawing_CornerPos::CORNER_POS_BOTTOM_RIGHT, radius);
136
137 OH_Drawing_Corner_Radii retrievedRadius;
138
139 retrievedRadius = OH_Drawing_RoundRectGetCorner(roundRect, OH_Drawing_CornerPos::CORNER_POS_BOTTOM_RIGHT);
140 ASSERT_FLOAT_EQ(retrievedRadius.x, radius.x);
141 ASSERT_FLOAT_EQ(retrievedRadius.y, radius.y);
142
143 OH_Drawing_RoundRectDestroy(roundRect);
144 OH_Drawing_RectDestroy(rect);
145 }
146
147 /*
148 * @tc.name: NativeDrawingRectTest_CCornerPosCastToCornerPos004
149 * @tc.desc: test CCornerPosCastToCornerPos
150 * @tc.type: FUNC
151 * @tc.require: AR000GTO5R
152 */
153 HWTEST_F(NativeDrawingRoundRectTest, CCornerPosCastToCornerPos004, TestSize.Level1)
154 {
155 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(100, 100, 200, 200);
156 OH_Drawing_RoundRect* roundRect = OH_Drawing_RoundRectCreate(rect, 200, 200);
157 ASSERT_NE(nullptr, roundRect);
158
159 OH_Drawing_Corner_Radii radius = { 10, 10 };
160
161 OH_Drawing_RoundRectSetCorner(roundRect, OH_Drawing_CornerPos::CORNER_POS_BOTTOM_LEFT, radius);
162
163 OH_Drawing_Corner_Radii retrievedRadius;
164
165 retrievedRadius = OH_Drawing_RoundRectGetCorner(roundRect, OH_Drawing_CornerPos::CORNER_POS_BOTTOM_LEFT);
166 ASSERT_FLOAT_EQ(retrievedRadius.x, radius.x);
167 ASSERT_FLOAT_EQ(retrievedRadius.y, radius.y);
168
169 OH_Drawing_RoundRectDestroy(roundRect);
170 OH_Drawing_RectDestroy(rect);
171 }
172
173 /*
174 * @tc.name: NativeDrawingRectTest_OH_Drawing_RoundRectGetCorner005
175 * @tc.desc: test OH_Drawing_RoundRectGetCorner
176 * @tc.type: FUNC
177 * @tc.require: AR000GTO5R
178 */
179 HWTEST_F(NativeDrawingRoundRectTest, OH_Drawing_RoundRectGetCorner005, TestSize.Level1)
180 {
181 OH_Drawing_RoundRect* nullRoundRect = nullptr;
182
183 OH_Drawing_Corner_Radii radii =
184 OH_Drawing_RoundRectGetCorner(nullRoundRect, OH_Drawing_CornerPos::CORNER_POS_TOP_LEFT);
185
186 ASSERT_FLOAT_EQ(radii.x, 0);
187 ASSERT_FLOAT_EQ(radii.y, 0);
188 }
189
190 /*
191 * @tc.name: NativeDrawingRoundRectTest_RoundRectOffset006
192 * @tc.desc: test for test for Translates RoundRect by (dx, dy).
193 * @tc.type: FUNC
194 * @tc.require: AR000GTO5R
195 */
196 HWTEST_F(NativeDrawingRoundRectTest, NativeDrawingRoundRectTest_RoundRectOffset006, TestSize.Level1)
197 {
198 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(10, 100, 200, 300);
199 OH_Drawing_RoundRect* roundRect = OH_Drawing_RoundRectCreate(rect, 25, 25); // 25: xRad, 25: yRad
200 float dx = 10.0f, dy = 10.0f; //10.0f: X-axis offset, 10.0f: Y-axis offset
201
202 EXPECT_EQ(OH_Drawing_RoundRectOffset(nullptr, dx, dy), OH_DRAWING_ERROR_INVALID_PARAMETER);
203 EXPECT_EQ(OH_Drawing_RoundRectOffset(roundRect, dx, dy), OH_DRAWING_SUCCESS);
204
205 OH_Drawing_RectDestroy(rect);
206 OH_Drawing_RoundRectDestroy(roundRect);
207 }
208
209 /**
210 * @tc.name: NativeDrawingRoundRectTest_RoundRectCopy007
211 * @tc.desc: test for sets create roundRect by copy.
212 * @tc.type: FUNC
213 * @tc.require: AR20240104201189
214 */
215 HWTEST_F(NativeDrawingRoundRectTest, NativeDrawingMatrixTest_OH_Drawing_RoundRectCopy001, TestSize.Level1)
216 {
217 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(100, 100, 200, 200);
218 const OH_Drawing_RoundRect* roundRect = OH_Drawing_RoundRectCreate(rect, 200, 200);
219 ASSERT_TRUE(roundRect != nullptr);
220 OH_Drawing_RoundRect* roundRect2 = OH_Drawing_RoundRectCopy(roundRect);
221 ASSERT_TRUE(roundRect2 != nullptr);
222
223 OH_Drawing_RoundRect* roundRect3 = OH_Drawing_RoundRectCopy(nullptr);
224 ASSERT_TRUE(roundRect3 == nullptr);
225
226 OH_Drawing_RectDestroy(rect);
227 OH_Drawing_RoundRectDestroy(const_cast<OH_Drawing_RoundRect*>(roundRect));
228 OH_Drawing_RoundRectDestroy(roundRect2);
229 OH_Drawing_RoundRectDestroy(roundRect3);
230 }
231
232 } // namespace Drawing
233 } // namespace Rosen
234 } // namespace OHOS