1/*
2 * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development 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 "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 "utils/scalar.h"
23#include "gtest/gtest.h"
24#include <random>
25
26using namespace testing;
27using namespace testing::ext;
28
29namespace OHOS {
30namespace Rosen {
31namespace Drawing {
32class DrawingNativeRoundRectTest : public testing::Test {};
33
34/*
35 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_ROUND_RECT_0100
36 * @tc.name: testRoundRectCreateNormal
37 * @tc.desc: test for testRoundRectCreateNormal.
38 * @tc.size  : SmallTest
39 * @tc.type  : Function
40 * @tc.level : Level 0
41 */
42HWTEST_F(DrawingNativeRoundRectTest, testRoundRectCreateNormal, TestSize.Level0) {
43    // 1. OH_Drawing_RoundRectCreate
44    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
45    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 20, 20);
46    // 2. Free memory
47    OH_Drawing_RoundRectDestroy(roundRect);
48    OH_Drawing_RectDestroy(rect);
49}
50
51/*
52 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_ROUND_RECT_0101
53 * @tc.name: testRoundRectCreateNull
54 * @tc.desc: test for testRoundRectCreateNull.
55 * @tc.size  : SmallTest
56 * @tc.type  : Function
57 * @tc.level : Level 3
58 */
59HWTEST_F(DrawingNativeRoundRectTest, testRoundRectCreateNull, TestSize.Level3) {
60    // 1. OH_Drawing_RoundRectCreate with nullptr as the first parameter, check the error code using
61    // OH_Drawing_ErrorCodeGet
62    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
63    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(nullptr, 20, 20);
64    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
65    // 2. OH_Drawing_RoundRectCreate with 0 as the second parameter
66    OH_Drawing_RoundRect *roundRect2 = OH_Drawing_RoundRectCreate(rect, 0, 20);
67    // 3. OH_Drawing_RoundRectCreate with 0 as the third parameter
68    OH_Drawing_RoundRect *roundRect3 = OH_Drawing_RoundRectCreate(rect, 20, 0);
69    // 4. Free memory
70    OH_Drawing_RoundRectDestroy(roundRect);
71    OH_Drawing_RoundRectDestroy(roundRect2);
72    OH_Drawing_RoundRectDestroy(roundRect3);
73    OH_Drawing_RectDestroy(rect);
74}
75
76/*
77 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_ROUND_RECT_0102
78 * @tc.name: testRoundRectCreateAbnormal
79 * @tc.desc: test for testRoundRectCreateAbnormal.
80 * @tc.size  : SmallTest
81 * @tc.type  : Function
82 * @tc.level : Level 3
83 */
84HWTEST_F(DrawingNativeRoundRectTest, testRoundRectCreateAbnormal, TestSize.Level3) {
85    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
86    // 1. OH_Drawing_RoundRectCreate with a negative value for the second parameter xRad
87    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, -20, 20);
88    // 2. OH_Drawing_RoundRectCreate with a negative value for the third parameter yRad
89    OH_Drawing_RoundRect *roundRect2 = OH_Drawing_RoundRectCreate(rect, 20, -20);
90    // 3. Free memory
91    OH_Drawing_RoundRectDestroy(roundRect);
92    OH_Drawing_RoundRectDestroy(roundRect2);
93    OH_Drawing_RectDestroy(rect);
94}
95
96/*
97 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_ROUND_RECT_0103
98 * @tc.name: testRoundRectCreateMaximum
99 * @tc.desc: test for testRoundRectCreateMaximum.
100 * @tc.size  : SmallTest
101 * @tc.type  : Function
102 * @tc.level : Level 3
103 */
104HWTEST_F(DrawingNativeRoundRectTest, testRoundRectCreateMaximum, TestSize.Level3) {
105    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
106    // 1. OH_Drawing_RoundRectCreate with the second parameter xRad as the maximum value
107    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, FLT_MAX, 20);
108    // 2. OH_Drawing_RoundRectCreate with the third parameter yRad as the maximum value
109    OH_Drawing_RoundRect *roundRect2 = OH_Drawing_RoundRectCreate(rect, 20, FLT_MAX);
110    // 3. Free memory
111    OH_Drawing_RoundRectDestroy(roundRect);
112    OH_Drawing_RoundRectDestroy(roundRect2);
113    OH_Drawing_RectDestroy(rect);
114}
115
116/*
117 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_ROUND_RECT_0104
118 * @tc.name: testRoundRectCreateMultipleCalls
119 * @tc.desc: test for testRoundRectCreateMultipleCalls.
120 * @tc.size  : SmallTest
121 * @tc.type  : Function
122 * @tc.level : Level 3
123 */
124HWTEST_F(DrawingNativeRoundRectTest, testRoundRectCreateMultipleCalls, TestSize.Level3) {
125    // 1. Call OH_Drawing_RoundRectCreate 10 times
126    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
127    for (int i = 0; i < 10; i++) {
128        OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 20, 20);
129        EXPECT_NE(roundRect, nullptr);
130        OH_Drawing_RoundRectDestroy(roundRect);
131    }
132}
133
134/*
135 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_ROUND_RECT_0200
136 * @tc.name: testRoundRectSetGetCornerNormal
137 * @tc.desc: test for testRoundRectSetGetCornerNormal.
138 * @tc.size  : SmallTest
139 * @tc.type  : Function
140 * @tc.level : Level 0
141 */
142HWTEST_F(DrawingNativeRoundRectTest, testRoundRectSetGetCornerNormal, TestSize.Level0) {
143    // 1. OH_Drawing_RoundRectCreate
144    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
145    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 20, 20);
146    // 2. Enumerate OH_Drawing_RoundRectSetCorner and OH_Drawing_RoundRectGetCorner with OH_Drawing_CornerPos values
147    OH_Drawing_CornerPos posArray[] = {
148        CORNER_POS_TOP_LEFT,
149        CORNER_POS_TOP_RIGHT,
150        CORNER_POS_BOTTOM_RIGHT,
151        CORNER_POS_BOTTOM_LEFT,
152    };
153    for (OH_Drawing_CornerPos pos : posArray) {
154        OH_Drawing_RoundRectSetCorner(roundRect, pos, {10.0f, 10.0f});
155        OH_Drawing_Corner_Radii radii = OH_Drawing_RoundRectGetCorner(roundRect, pos);
156        EXPECT_EQ(IsScalarAlmostEqual(radii.x, 10.0f), true);
157        EXPECT_EQ(IsScalarAlmostEqual(radii.y, 10.0f), true);
158    }
159    // 3. OH_Drawing_RoundRectSetCorner with integer values for x and y radii, and call OH_Drawing_RoundRectGetCorner to
160    // retrieve the values
161    OH_Drawing_RoundRectSetCorner(roundRect, CORNER_POS_TOP_LEFT, {10, 10});
162    OH_Drawing_Corner_Radii radii = OH_Drawing_RoundRectGetCorner(roundRect, CORNER_POS_TOP_LEFT);
163    EXPECT_EQ(IsScalarAlmostEqual(radii.x, 10), true);
164    EXPECT_EQ(IsScalarAlmostEqual(radii.y, 10), true);
165    // 4. OH_Drawing_RoundRectSetCorner with decimal values for x and y radii, and call OH_Drawing_RoundRectGetCorner to
166    // retrieve the values
167    OH_Drawing_RoundRectSetCorner(roundRect, CORNER_POS_TOP_LEFT, {10.1f, 10.1f});
168    OH_Drawing_Corner_Radii radii2 = OH_Drawing_RoundRectGetCorner(roundRect, CORNER_POS_TOP_LEFT);
169    EXPECT_EQ(IsScalarAlmostEqual(radii2.x, 10.1f), true);
170    EXPECT_EQ(IsScalarAlmostEqual(radii2.y, 10.1f), true);
171    // 5. Free memory
172    OH_Drawing_RoundRectDestroy(roundRect);
173    OH_Drawing_RectDestroy(rect);
174}
175
176/*
177 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_ROUND_RECT_0201
178 * @tc.name: testRoundRectSetGetCornerNull
179 * @tc.desc: test for testRoundRectSetGetCornerNull.
180 * @tc.size  : SmallTest
181 * @tc.type  : Function
182 * @tc.level : Level 3
183 */
184HWTEST_F(DrawingNativeRoundRectTest, testRoundRectSetGetCornerNull, TestSize.Level3) {
185    // 1. OH_Drawing_RoundRectCreate
186    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
187    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 20, 20);
188    // 2. OH_Drawing_RoundRectSetCorner with nullptr as the first parameter, check the error code using
189    // OH_Drawing_ErrorCodeGet
190    OH_Drawing_RoundRectSetCorner(nullptr, CORNER_POS_TOP_LEFT, {10.0f, 10.0f});
191    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
192    // 3. OH_Drawing_RoundRectSetCorner with 0 as the third parameter
193    OH_Drawing_RoundRectSetCorner(roundRect, CORNER_POS_TOP_LEFT, {0, 0});
194    // 4. OH_Drawing_RoundRectGetCorner with nullptr as the first parameter, check the error code using
195    // OH_Drawing_ErrorCodeGet
196    OH_Drawing_RoundRectGetCorner(nullptr, CORNER_POS_TOP_LEFT);
197    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
198    // 5. Free memory
199    OH_Drawing_RoundRectDestroy(roundRect);
200    OH_Drawing_RectDestroy(rect);
201}
202
203/*
204 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_ROUND_RECT_0202
205 * @tc.name: testRoundRectSetGetCornerAbnormal
206 * @tc.desc: test for testRoundRectSetGetCornerAbnormal.
207 * @tc.size  : SmallTest
208 * @tc.type  : Function
209 * @tc.level : Level 3
210 */
211HWTEST_F(DrawingNativeRoundRectTest, testRoundRectSetGetCornerAbnormal, TestSize.Level3) {
212    // 1. OH_Drawing_RoundRectCreate
213    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
214    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 20, 20);
215    // 2. OH_Drawing_RoundRectSetCorner with negative value for x-axis in OH_Drawing_Corner_Radii, followed by
216    // OH_Drawing_RoundRectGetCorner
217    OH_Drawing_RoundRectSetCorner(roundRect, CORNER_POS_TOP_LEFT, {-10.0f, 10.0f});
218    OH_Drawing_Corner_Radii radii = OH_Drawing_RoundRectGetCorner(roundRect, CORNER_POS_TOP_LEFT);
219    EXPECT_EQ(IsScalarAlmostEqual(radii.x, -10.0f), true);
220    EXPECT_EQ(IsScalarAlmostEqual(radii.y, 10.0f), true);
221    // 3. OH_Drawing_RoundRectSetCorner with negative value for y-axis in OH_Drawing_Corner_Radii, followed by
222    // OH_Drawing_RoundRectGetCorner
223    OH_Drawing_RoundRectSetCorner(roundRect, CORNER_POS_TOP_LEFT, {10.0f, -10.0f});
224    OH_Drawing_Corner_Radii radii2 = OH_Drawing_RoundRectGetCorner(roundRect, CORNER_POS_TOP_LEFT);
225    EXPECT_EQ(IsScalarAlmostEqual(radii2.x, 10.0f), true);
226    EXPECT_EQ(IsScalarAlmostEqual(radii2.y, -10.0f), true);
227    // 4. Free memory
228    OH_Drawing_RoundRectDestroy(roundRect);
229    OH_Drawing_RectDestroy(rect);
230}
231
232/*
233 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_ROUND_RECT_0203
234 * @tc.name: testRoundRectSetGetCornerMaximum
235 * @tc.desc: test for testRoundRectSetGetCornerMaximum.
236 * @tc.size  : SmallTest
237 * @tc.type  : Function
238 * @tc.level : Level 3
239 */
240HWTEST_F(DrawingNativeRoundRectTest, testRoundRectSetGetCornerMaximum, TestSize.Level3) {
241    // 1. OH_Drawing_RoundRectCreate
242    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
243    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 20, 20);
244    // 2. Call OH_Drawing_RoundRectSetCorner with the maximum value for the x-axis in OH_Drawing_Corner_Radii, followed
245    // by OH_Drawing_RoundRectGetCorner
246    OH_Drawing_RoundRectSetCorner(roundRect, CORNER_POS_TOP_LEFT, {FLT_MAX, 10.0f});
247    OH_Drawing_Corner_Radii radii = OH_Drawing_RoundRectGetCorner(roundRect, CORNER_POS_TOP_LEFT);
248    EXPECT_EQ(IsScalarAlmostEqual(radii.x, FLT_MAX), true);
249    EXPECT_EQ(IsScalarAlmostEqual(radii.y, 10.0f), true);
250    // 3. Call OH_Drawing_RoundRectSetCorner with the maximum value for the y-axis in OH_Drawing_Corner_Radii, followed
251    // by OH_Drawing_RoundRectGetCorner
252    OH_Drawing_RoundRectSetCorner(roundRect, CORNER_POS_TOP_LEFT, {10.0f, FLT_MAX});
253    OH_Drawing_Corner_Radii radii2 = OH_Drawing_RoundRectGetCorner(roundRect, CORNER_POS_TOP_LEFT);
254    EXPECT_EQ(IsScalarAlmostEqual(radii2.x, 10.0f), true);
255    EXPECT_EQ(IsScalarAlmostEqual(radii2.y, FLT_MAX), true);
256    // 4. Free memory
257    OH_Drawing_RoundRectDestroy(roundRect);
258    OH_Drawing_RectDestroy(rect);
259}
260
261/*
262 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_ROUND_RECT_0204
263 * @tc.name: testRoundRectSetGetCornerMultipleCalls
264 * @tc.desc: test for testRoundRectSetGetCornerMultipleCalls.
265 * @tc.size  : SmallTest
266 * @tc.type  : Function
267 * @tc.level : Level 3
268 */
269HWTEST_F(DrawingNativeRoundRectTest, testRoundRectSetGetCornerMultipleCalls, TestSize.Level3) {
270    // 1. OH_Drawing_RoundRectCreate
271    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
272    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 20, 20);
273    // 2. OH_Drawing_RoundRectSetCorner (pass random values for x-axis and y-axis radii, and a random enum value for
274    // OH_Drawing_CornerPos), followed by calling OH_Drawing_RoundRectGetCorner
275    std::random_device rd;
276    std::mt19937 gen(rd());
277    std::uniform_real_distribution<float> dis(0, 100);
278    std::uniform_int_distribution<int> dis2(0, 3);
279    for (int i = 0; i < 10; i++) {
280        float x = dis(gen);
281        float y = dis(gen);
282        OH_Drawing_CornerPos pos = static_cast<OH_Drawing_CornerPos>(dis2(gen));
283        OH_Drawing_RoundRectSetCorner(roundRect, pos, {x, y});
284        OH_Drawing_Corner_Radii radii = OH_Drawing_RoundRectGetCorner(roundRect, pos);
285        EXPECT_EQ(IsScalarAlmostEqual(radii.x, x), true);
286        EXPECT_EQ(IsScalarAlmostEqual(radii.y, y), true);
287    }
288    // 3. Free memory
289    OH_Drawing_RoundRectDestroy(roundRect);
290    OH_Drawing_RectDestroy(rect);
291}
292
293/*
294 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_ROUND_RECT_0205
295 * @tc.name: testRoundRectGetCornerWhenNoSet
296 * @tc.desc: test for testRoundRectGetCornerWhenNoSet.
297 * @tc.size  : SmallTest
298 * @tc.type  : Function
299 * @tc.level : Level 2
300 */
301HWTEST_F(DrawingNativeRoundRectTest, testRoundRectGetCornerWhenNoSet, TestSize.Level2) {
302    // 1. OH_Drawing_RoundRectCreate
303    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
304    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 20, 20);
305    // 2. Call OH_Drawing_RoundRectGetCorner directly
306    OH_Drawing_Corner_Radii radii = OH_Drawing_RoundRectGetCorner(roundRect, CORNER_POS_TOP_LEFT);
307    EXPECT_EQ(IsScalarAlmostEqual(radii.x, 20), true);
308    EXPECT_EQ(IsScalarAlmostEqual(radii.y, 20), true);
309    // 3. Free memory
310    OH_Drawing_RoundRectDestroy(roundRect);
311    OH_Drawing_RectDestroy(rect);
312}
313
314/*
315 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_ROUND_RECT_0300
316 * @tc.name: testRoundRectDestroyNormal
317 * @tc.desc: test for testRoundRectDestroyNormal.
318 * @tc.size  : SmallTest
319 * @tc.type  : Function
320 * @tc.level : Level 0
321 */
322HWTEST_F(DrawingNativeRoundRectTest, testRoundRectDestroyNormal, TestSize.Level0) {
323    // 1. OH_Drawing_RoundRectCreate
324    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
325    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 20, 20);
326    // 2. OH_Drawing_RoundRectDestroy
327    OH_Drawing_RoundRectDestroy(roundRect);
328    OH_Drawing_RectDestroy(rect);
329}
330
331/*
332 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_ROUND_RECT_0301
333 * @tc.name: testRoundRectDestroyNull
334 * @tc.desc: test for testRoundRectDestroyNull.
335 * @tc.size  : SmallTest
336 * @tc.type  : Function
337 * @tc.level : Level 3
338 */
339HWTEST_F(DrawingNativeRoundRectTest, testRoundRectDestroyNull, TestSize.Level3) {
340    // 1. OH_Drawing_RoundRectDestroy with nullptr as the parameter
341    OH_Drawing_RoundRectDestroy(nullptr);
342}
343
344/*
345 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_ROUND_RECT_0400
346 * @tc.name: testRoundRectOffsetNormal
347 * @tc.desc: test for testRoundRectOffsetNormal.
348 * @tc.size  : SmallTest
349 * @tc.type  : Function
350 * @tc.level : Level 0
351 */
352HWTEST_F(DrawingNativeRoundRectTest, testRoundRectOffsetNormal, TestSize.Level0) {
353    //1. OH_Drawing_RoundRectCreate with the second parameter as integar values
354    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
355    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 20, 20);
356    //2. OH_Drawing_RoundRectCreate with the second parameter as floating-point values
357    OH_Drawing_RoundRect *roundRect1 = OH_Drawing_RoundRectCreate(rect, 20.f, 20);
358    //3. OH_Drawing_RoundRectCreate with the first parameter as integar values
359    OH_Drawing_RoundRect *roundRect2 = OH_Drawing_RoundRectCreate(rect, 20, 20);
360    //4. OH_Drawing_RoundRectCreate with the first parameter as floating-point values
361    OH_Drawing_Rect *rect1 = OH_Drawing_RectCreate(0.f, 0.f, 100.f, 100.f);
362    OH_Drawing_RoundRect *roundRect3 = OH_Drawing_RoundRectCreate(rect1, 20, 20);
363    OH_Drawing_RoundRectDestroy(roundRect);
364    OH_Drawing_RoundRectDestroy(roundRect1);
365    OH_Drawing_RoundRectDestroy(roundRect2);
366    OH_Drawing_RoundRectDestroy(roundRect3);
367}
368
369/*
370 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_ROUND_RECT_0401
371 * @tc.name: testRoundRectOffsetNull
372 * @tc.desc: test for testRoundRectOffsetNull.
373 * @tc.size  : SmallTest
374 * @tc.type  : Function
375 * @tc.level : Level 3
376 */
377HWTEST_F(DrawingNativeRoundRectTest, testRoundRectOffsetNull, TestSize.Level3) {
378    // 1. Call OH_Drawing_RoundRectOffset with nullptr as the first parameter, check the error code using
379    // OH_Drawing_ErrorCodeGet
380    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
381    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 20, 20);
382    OH_Drawing_RoundRectOffset(nullptr, 1.0f, 1.0f);
383    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_Drawing_ErrorCode::OH_DRAWING_ERROR_INVALID_PARAMETER);
384    // 2. Call OH_Drawing_RoundRectOffset with 0 as the second parameter, check the error code using
385    // OH_Drawing_ErrorCodeGet
386    OH_Drawing_RoundRectOffset(roundRect, 0, 1.0f);
387    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_Drawing_ErrorCode::OH_DRAWING_ERROR_INVALID_PARAMETER);
388    // 3. Call OH_Drawing_RoundRectOffset with 0 as the third parameter, check the error code using
389    // OH_Drawing_ErrorCodeGet
390    OH_Drawing_RoundRectOffset(roundRect, 1.0f, 0);
391    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_Drawing_ErrorCode::OH_DRAWING_ERROR_INVALID_PARAMETER);
392    //4. free memory
393    OH_Drawing_RoundRectDestroy(roundRect);
394    OH_Drawing_RectDestroy(rect);
395}
396
397/*
398 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_ROUND_RECT_0402
399 * @tc.name: testRoundRectOffsetMultipleCalls
400 * @tc.desc: test for testRoundRectOffsetMultipleCalls.
401 * @tc.size  : SmallTest
402 * @tc.type  : Function
403 * @tc.level : Level 3
404 */
405HWTEST_F(DrawingNativeRoundRectTest, testRoundRectOffsetMultipleCalls, TestSize.Level3) {
406    //1. Call OH_Drawing_RoundRectCreate with random values
407    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
408    std::random_device rd;
409    std::mt19937 gen(rd());
410    std::uniform_real_distribution<float> dis(0, 100);
411    for (int i = 0; i < 10; i++) {
412        OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, dis(gen), dis(gen));
413        OH_Drawing_RoundRectDestroy(roundRect);
414    }
415    //2. free memory
416    OH_Drawing_RectDestroy(rect);
417}
418
419} // namespace Drawing
420} // namespace Rosen
421} // namespace OHOS