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 "gtest/gtest.h"
17
18#include "DrawingNativeCanvasCommon.h"
19#include "drawing_bitmap.h"
20#include "drawing_brush.h"
21#include "drawing_canvas.h"
22#include "drawing_color.h"
23#include "drawing_color_filter.h"
24#include "drawing_filter.h"
25#include "drawing_font.h"
26#include "drawing_image.h"
27#include "drawing_mask_filter.h"
28#include "drawing_matrix.h"
29#include "drawing_memory_stream.h"
30#include "drawing_path.h"
31#include "drawing_pen.h"
32#include "drawing_point.h"
33#include "drawing_rect.h"
34#include "drawing_region.h"
35#include "drawing_round_rect.h"
36#include "drawing_sampling_options.h"
37#include "drawing_shader_effect.h"
38#include "drawing_text_blob.h"
39#include "drawing_typeface.h"
40
41using namespace testing;
42using namespace testing::ext;
43
44namespace OHOS {
45namespace Rosen {
46namespace Drawing {
47
48/*
49 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_1900
50 * @tc.name: testCanvasDrawOvalNormal
51 * @tc.desc: test for testCanvasDrawOvalNormal.
52 * @tc.size  : SmallTest
53 * @tc.type  : Function
54 * @tc.level : Level 0
55 */
56HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawOvalNormal, TestSize.Level0) {
57    // 1. Create OH_Drawing_Canvas
58    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
59
60    // 2. Create OH_Drawing_Rect
61    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
62
63    // 3. Draw oval on canvas
64    OH_Drawing_CanvasDrawOval(canvas, rect);
65
66    // 4. Free memory
67    OH_Drawing_CanvasDestroy(canvas);
68    OH_Drawing_RectDestroy(rect);
69}
70
71/*
72 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_1901
73 * @tc.name: testCanvasDrawOvalNull
74 * @tc.desc: test for testCanvasDrawOvalNull.
75 * @tc.size  : SmallTest
76 * @tc.type  : Function
77 * @tc.level : Level 3
78 */
79HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawOvalNull, TestSize.Level3) {
80    // 1. Create OH_Drawing_Canvas
81    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
82    // 2. Create OH_Drawing_Rect
83    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 200, 200);
84    // 3. OH_Drawing_CanvasDrawOval with nullptr as the first parameter
85    OH_Drawing_CanvasDrawOval(nullptr, rect);
86    // 4. OH_Drawing_CanvasDrawOval with OH_Drawing_Rect created with 0 for left, top, right, and bottom
87    OH_Drawing_Rect *rect2 = OH_Drawing_RectCreate(0, 200, 200, 200);
88    OH_Drawing_CanvasDrawOval(canvas, rect2);
89    rect2 = OH_Drawing_RectCreate(200, 0, 200, 200);
90    OH_Drawing_CanvasDrawOval(canvas, rect2);
91    rect2 = OH_Drawing_RectCreate(200, 200, 0, 200);
92    OH_Drawing_CanvasDrawOval(canvas, rect2);
93    rect2 = OH_Drawing_RectCreate(200, 200, 200, 0);
94    OH_Drawing_CanvasDrawOval(canvas, rect2);
95    // 5. OH_Drawing_CanvasDrawOval with OH_Drawing_Rect created with all 0 values
96    OH_Drawing_Rect *rect3 = OH_Drawing_RectCreate(0, 0, 0, 0);
97    OH_Drawing_CanvasDrawOval(canvas, rect3);
98    // 6. OH_Drawing_CanvasDrawOval with nullptr as the second parameter
99    OH_Drawing_CanvasDrawOval(canvas, nullptr);
100    // 7. Free memory
101    OH_Drawing_CanvasDestroy(canvas);
102    OH_Drawing_RectDestroy(rect);
103    OH_Drawing_RectDestroy(rect2);
104    OH_Drawing_RectDestroy(rect3);
105}
106
107/*
108 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_1902
109 * @tc.name: testCanvasDrawOvalAbnormal
110 * @tc.desc: test for testCanvasDrawOvalAbnormal.
111 * @tc.size  : SmallTest
112 * @tc.type  : Function
113 * @tc.level : Level 3
114 */
115HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawOvalAbnormal, TestSize.Level3) {
116    // 1. OH_Drawing_CanvasCreate
117    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
118    // 2. Create OH_Drawing_Rect with left, top, right, and bottom values as negative numbers
119    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(-100, 100, 200, 200);
120    OH_Drawing_CanvasDrawOval(canvas, rect);
121    rect = OH_Drawing_RectCreate(100, -100, 200, 200);
122    OH_Drawing_CanvasDrawOval(canvas, rect);
123    rect = OH_Drawing_RectCreate(100, 100, -200, 200);
124    OH_Drawing_CanvasDrawOval(canvas, rect);
125    rect = OH_Drawing_RectCreate(100, 100, 200, -200);
126    OH_Drawing_CanvasDrawOval(canvas, rect);
127    // 3. Create OH_Drawing_Rect with the horizontal coordinate of the top-left corner equal to the horizontal
128    // coordinate of the bottom-right corner, or the vertical coordinate of the top-left corner equal to the vertical
129    // coordinate of the bottom-right corner
130    OH_Drawing_Rect *rect2 = OH_Drawing_RectCreate(100, 0, 100, 100);
131    OH_Drawing_CanvasDrawOval(canvas, rect2);
132    OH_Drawing_Rect *rect3 = OH_Drawing_RectCreate(0, 100, 100, 100);
133    OH_Drawing_CanvasDrawOval(canvas, rect3);
134    // 4. Create OH_Drawing_Rect with the top-left corner coordinates equal to the bottom-right corner coordinates
135    OH_Drawing_Rect *rect4 = OH_Drawing_RectCreate(100, 100, 100, 100);
136    OH_Drawing_CanvasDrawOval(canvas, rect4);
137    // 5. Create OH_Drawing_Rect with the top-left corner coordinates greater than the bottom-right corner coordinates
138    OH_Drawing_Rect *rect5 = OH_Drawing_RectCreate(200, 200, 100, 100);
139    OH_Drawing_CanvasDrawOval(canvas, rect5);
140    // 6. Free memory
141    OH_Drawing_CanvasDestroy(canvas);
142    OH_Drawing_RectDestroy(rect);
143    OH_Drawing_RectDestroy(rect2);
144    OH_Drawing_RectDestroy(rect3);
145    OH_Drawing_RectDestroy(rect4);
146    OH_Drawing_RectDestroy(rect5);
147}
148
149/*
150 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_1903
151 * @tc.name: testCanvasDrawOvalMaximum
152 * @tc.desc: test for testCanvasDrawOvalMaximum.
153 * @tc.size  : SmallTest
154 * @tc.type  : Function
155 * @tc.level : Level 3
156 */
157HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawOvalMaximum, TestSize.Level3) {
158    // 1. OH_Drawing_CanvasCreate
159    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
160    // 2. Create OH_Drawing_Rect with FLT_MAX as the values for left, top, right, and bottom
161    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(FLT_MAX, 0, 0, 0);
162    OH_Drawing_CanvasDrawOval(canvas, rect);
163    rect = OH_Drawing_RectCreate(0, FLT_MAX, 0, 0);
164    OH_Drawing_CanvasDrawOval(canvas, rect);
165    rect = OH_Drawing_RectCreate(0, 0, FLT_MAX, 0);
166    OH_Drawing_CanvasDrawOval(canvas, rect);
167    rect = OH_Drawing_RectCreate(0, 0, 0, FLT_MAX);
168    OH_Drawing_CanvasDrawOval(canvas, rect);
169    // 3. Free memory
170    OH_Drawing_CanvasDestroy(canvas);
171    OH_Drawing_RectDestroy(rect);
172}
173
174/*
175 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_1904
176 * @tc.name: testCanvasDrawOvalInputDestroyed
177 * @tc.desc: test for testCanvasDrawOvalInputDestroyed.
178 * @tc.size  : SmallTest
179 * @tc.type  : Function
180 * @tc.level : Level 3
181 */
182HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawOvalInputDestroyed, TestSize.Level3) {
183    // Deprecated
184}
185
186/*
187 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2000
188 * @tc.name: testCanvasDrawArcNormal
189 * @tc.desc: test for testCanvasDrawArcNormal.
190 * @tc.size  : SmallTest
191 * @tc.type  : Function
192 * @tc.level : Level 0
193 */
194HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawArcNormal, TestSize.Level0) {
195    // 1. OH_Drawing_CanvasCreate
196    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
197    // 2. OH_Drawing_RectCreate
198    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
199    // 3. OH_Drawing_CanvasDrawArc with startAngle iterating over 0°, 180°, and 360°
200    float startAngles[] = {0.0f, 180.0f, 360.0f};
201    for (float startAngle : startAngles) {
202        OH_Drawing_CanvasDrawArc(canvas, rect, startAngle, 90.0f);
203    }
204    // 4. OH_Drawing_CanvasDrawArc with sweepAngle iterating over 0°, 180°, and 360°
205    float sweepAngles[] = {0.0f, 180.0f, 360.0f};
206    for (float sweepAngle : sweepAngles) {
207        OH_Drawing_CanvasDrawArc(canvas, rect, 0.0f, sweepAngle);
208    }
209    // 5. Free memory
210    OH_Drawing_CanvasDestroy(canvas);
211    OH_Drawing_RectDestroy(rect);
212}
213
214/*
215 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2001
216 * @tc.name: testCanvasDrawArcNull
217 * @tc.desc: test for testCanvasDrawArcNull.
218 * @tc.size  : SmallTest
219 * @tc.type  : Function
220 * @tc.level : Level 3
221 */
222HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawArcNull, TestSize.Level3) {
223    // 1. OH_Drawing_CanvasCreate
224    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
225    // 2. OH_Drawing_RectCreate
226    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
227    // 3. OH_Drawing_CanvasDrawArc with nullptr as the first parameter
228    OH_Drawing_CanvasDrawArc(nullptr, rect, 0.0f, 90.0f);
229    // 4. OH_Drawing_CanvasDrawArc with OH_Drawing_Rect created with 0 for left, top, right, and bottom
230    OH_Drawing_Rect *rect2 = OH_Drawing_RectCreate(0, 100, 200, 200);
231    OH_Drawing_CanvasDrawArc(canvas, rect2, 0.0f, 90.0f);
232    rect2 = OH_Drawing_RectCreate(100, 0, 200, 200);
233    OH_Drawing_CanvasDrawArc(canvas, rect2, 0.0f, 90.0f);
234    rect2 = OH_Drawing_RectCreate(100, 100, 0, 200);
235    OH_Drawing_CanvasDrawArc(canvas, rect2, 0.0f, 90.0f);
236    rect2 = OH_Drawing_RectCreate(100, 100, 200, 0);
237    OH_Drawing_CanvasDrawArc(canvas, rect2, 0.0f, 90.0f);
238    // 5. OH_Drawing_CanvasDrawArc with OH_Drawing_Rect created with all 0 values
239    OH_Drawing_Rect *rect3 = OH_Drawing_RectCreate(0, 0, 0, 0);
240    OH_Drawing_CanvasDrawArc(canvas, rect3, 0.0f, 90.0f);
241    // 6. OH_Drawing_CanvasDrawArc with nullptr as the second parameter
242    OH_Drawing_CanvasDrawArc(canvas, nullptr, 0.0f, 90.0f);
243    // 7. Free memory
244    OH_Drawing_CanvasDestroy(canvas);
245    OH_Drawing_RectDestroy(rect);
246    OH_Drawing_RectDestroy(rect2);
247    OH_Drawing_RectDestroy(rect3);
248}
249
250/*
251 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2002
252 * @tc.name: testCanvasDrawArcAbnormal
253 * @tc.desc: test for testCanvasDrawArcAbnormal.
254 * @tc.size  : SmallTest
255 * @tc.type  : Function
256 * @tc.level : Level 3
257 */
258HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawArcAbnormal, TestSize.Level3) {
259    // 1. OH_Drawing_CanvasCreate
260    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
261    // 2. OH_Drawing_CanvasDrawArc with OH_Drawing_Rect created with negative values for left, top, right, and bottom
262    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(-100, -100, -200, -200);
263    OH_Drawing_CanvasDrawArc(canvas, rect, 0.0f, 90.0f);
264    rect = OH_Drawing_RectCreate(-100, 100, 200, 200);
265    OH_Drawing_CanvasDrawArc(canvas, rect, 0.0f, 90.0f);
266    rect = OH_Drawing_RectCreate(100, -100, 200, 200);
267    OH_Drawing_CanvasDrawArc(canvas, rect, 0.0f, 90.0f);
268    rect = OH_Drawing_RectCreate(100, 100, -200, 200);
269    OH_Drawing_CanvasDrawArc(canvas, rect, 0.0f, 90.0f);
270    rect = OH_Drawing_RectCreate(100, 100, 200, -200);
271    OH_Drawing_CanvasDrawArc(canvas, rect, 0.0f, 90.0f);
272    // 3. OH_Drawing_CanvasDrawArc with OH_Drawing_Rect created with the horizontal coordinate of the top-left corner
273    // equal to the horizontal coordinate of the bottom-right corner, or the vertical coordinate of the top-left corner
274    // equal to the vertical coordinate of the bottom-right corner
275    OH_Drawing_Rect *rect2 = OH_Drawing_RectCreate(100, 0, 100, 100);
276    OH_Drawing_CanvasDrawArc(canvas, rect2, 0.0f, 90.0f);
277    OH_Drawing_Rect *rect3 = OH_Drawing_RectCreate(0, 100, 100, 100);
278    OH_Drawing_CanvasDrawArc(canvas, rect3, 0.0f, 90.0f);
279    // 4. OH_Drawing_CanvasDrawArc with OH_Drawing_Rect created with the top-left corner coordinates equal to the
280    // bottom-right corner coordinates
281    OH_Drawing_Rect *rect4 = OH_Drawing_RectCreate(100, 100, 100, 100);
282    OH_Drawing_CanvasDrawArc(canvas, rect4, 0.0f, 90.0f);
283    // 5. OH_Drawing_CanvasDrawArc with OH_Drawing_Rect created with the top-left corner coordinates greater than the
284    // bottom-right corner coordinates
285    OH_Drawing_Rect *rect5 = OH_Drawing_RectCreate(200, 200, 100, 100);
286    OH_Drawing_CanvasDrawArc(canvas, rect5, 0.0f, 90.0f);
287    // 6. OH_Drawing_CanvasDrawArc with negative startAngle
288    OH_Drawing_CanvasDrawArc(canvas, rect, -90.0f, 90.0f);
289    // 7. OH_Drawing_CanvasDrawArc with startAngle greater than 360°
290    OH_Drawing_CanvasDrawArc(canvas, rect, 400.0f, 90.0f);
291    // 8. OH_Drawing_CanvasDrawArc with negative sweepAngle
292    OH_Drawing_CanvasDrawArc(canvas, rect, 0.0f, -90.0f);
293    // 9. OH_Drawing_CanvasDrawArc with sweepAngle greater than 360°
294    OH_Drawing_CanvasDrawArc(canvas, rect, 0.0f, 400.0f);
295    // 10. Free memory
296    OH_Drawing_CanvasDestroy(canvas);
297    OH_Drawing_RectDestroy(rect);
298    OH_Drawing_RectDestroy(rect2);
299    OH_Drawing_RectDestroy(rect3);
300    OH_Drawing_RectDestroy(rect4);
301    OH_Drawing_RectDestroy(rect5);
302}
303
304/*
305 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2003
306 * @tc.name: testCanvasDrawArcMaximum
307 * @tc.desc: test for testCanvasDrawArcMaximum.
308 * @tc.size  : SmallTest
309 * @tc.type  : Function
310 * @tc.level : Level 3
311 */
312HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawArcMaximum, TestSize.Level3) {
313    // 1. OH_Drawing_CanvasCreate
314    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
315    // 2. OH_Drawing_CanvasDrawArc with OH_Drawing_Rect created with FLT_MAX as the values for left, top, right, and
316    // bottom
317    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(FLT_MAX, 0, 0, 0);
318    OH_Drawing_CanvasDrawArc(canvas, rect, 0.0f, 90.0f);
319    OH_Drawing_RectDestroy(rect);
320    rect = OH_Drawing_RectCreate(0, FLT_MAX, 0, 0);
321    OH_Drawing_CanvasDrawArc(canvas, rect, 0.0f, 90.0f);
322    OH_Drawing_RectDestroy(rect);
323    rect = OH_Drawing_RectCreate(0, 0, FLT_MAX, 0);
324    OH_Drawing_CanvasDrawArc(canvas, rect, 0.0f, 90.0f);
325    OH_Drawing_RectDestroy(rect);
326    rect = OH_Drawing_RectCreate(0, 0, 0, FLT_MAX);
327    OH_Drawing_CanvasDrawArc(canvas, rect, 0.0f, 90.0f);
328    OH_Drawing_RectDestroy(rect);
329    // 3. OH_Drawing_CanvasDrawArc with startAngle FLT_MAX
330    rect = OH_Drawing_RectCreate(0, 0, 100, 100);
331    OH_Drawing_CanvasDrawArc(canvas, rect, FLT_MAX, 90.0f);
332    OH_Drawing_RectDestroy(rect);
333    // 4. OH_Drawing_CanvasDrawArc with sweepAngle FLT_MAX
334    rect = OH_Drawing_RectCreate(0, 0, 100, 100);
335    OH_Drawing_CanvasDrawArc(canvas, rect, 0.0f, FLT_MAX);
336    OH_Drawing_RectDestroy(rect);
337    // 5. Free memory
338    OH_Drawing_CanvasDestroy(canvas);
339}
340
341/*
342 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2004
343 * @tc.name: testCanvasDrawArcInputDestroyed
344 * @tc.desc: test for testCanvasDrawArcInputDestroyed.
345 * @tc.size  : SmallTest
346 * @tc.type  : Function
347 * @tc.level : Level 3
348 */
349HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawArcInputDestroyed, TestSize.Level3) {
350    // Deprecated
351}
352
353/*
354 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2100
355 * @tc.name: testCanvasDrawRoundRectNormal
356 * @tc.desc: test for testCanvasDrawRoundRectNormal.
357 * @tc.size  : SmallTest
358 * @tc.type  : Function
359 * @tc.level : Level 0
360 */
361HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawRoundRectNormal, TestSize.Level0) {
362    // 1. OH_Drawing_CanvasCreate
363    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
364
365    // 2. OH_Drawing_RoundRectCreate
366    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(10, 100, 200, 300);
367    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 1.0f, 1.0f);
368
369    // 3. OH_Drawing_CanvasDrawRoundRect
370    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
371
372    // 4. Free memory
373    OH_Drawing_CanvasDestroy(canvas);
374    OH_Drawing_RectDestroy(rect);
375    OH_Drawing_RoundRectDestroy(roundRect);
376}
377
378/*
379 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2101
380 * @tc.name: testCanvasDrawRoundRectNull
381 * @tc.desc: test for testCanvasDrawRoundRectNull.
382 * @tc.size  : SmallTest
383 * @tc.type  : Function
384 * @tc.level : Level 3
385 */
386HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawRoundRectNull, TestSize.Level3) {
387    // 1. OH_Drawing_CanvasCreate
388    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
389
390    // 2. OH_Drawing_RoundRectCreate
391    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(10, 100, 200, 300);
392    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 1.0f, 1.0f);
393
394    // 3. OH_Drawing_CanvasDrawRoundRect with the first parameter being nullptr
395    OH_Drawing_CanvasDrawRoundRect(nullptr, roundRect);
396
397    // 4. OH_Drawing_CanvasDrawRoundRect with the second parameter being nullptr
398    OH_Drawing_CanvasDrawRoundRect(canvas, nullptr);
399
400    // 5. OH_Drawing_CanvasDrawRoundRect with the second parameter OH_Drawing_RoundRectCreate created with rect having 0
401    // in any of the four positions
402    OH_Drawing_Rect *rect2 = OH_Drawing_RectCreate(0, 100, 200, 300);
403    OH_Drawing_RoundRect *roundRect2 = OH_Drawing_RoundRectCreate(rect2, 1.0f, 1.0f);
404    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect2);
405
406    OH_Drawing_Rect *rect3 = OH_Drawing_RectCreate(10, 0, 200, 300);
407    OH_Drawing_RoundRect *roundRect3 = OH_Drawing_RoundRectCreate(rect3, 1.0f, 1.0f);
408    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect3);
409
410    OH_Drawing_Rect *rect4 = OH_Drawing_RectCreate(10, 100, 0, 300);
411    OH_Drawing_RoundRect *roundRect4 = OH_Drawing_RoundRectCreate(rect4, 1.0f, 1.0f);
412    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect4);
413
414    OH_Drawing_Rect *rect5 = OH_Drawing_RectCreate(10, 100, 200, 0);
415    OH_Drawing_RoundRect *roundRect5 = OH_Drawing_RoundRectCreate(rect5, 1.0f, 1.0f);
416    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect5);
417
418    // 6. OH_Drawing_CanvasDrawRoundRect with the second parameter OH_Drawing_RoundRectCreate created with rect having
419    // all positions as 0
420    OH_Drawing_Rect *rect6 = OH_Drawing_RectCreate(0, 0, 0, 0);
421    OH_Drawing_RoundRect *roundRect6 = OH_Drawing_RoundRectCreate(rect6, 1.0f, 1.0f);
422    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect6);
423
424    // 7. OH_Drawing_CanvasDrawRoundRect with the second parameter OH_Drawing_RoundRectCreate created with xRad as 0
425    OH_Drawing_Rect *rect7 = OH_Drawing_RectCreate(10, 100, 200, 300);
426    OH_Drawing_RoundRect *roundRect7 = OH_Drawing_RoundRectCreate(rect7, 0.0f, 1.0f);
427    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect7);
428
429    // 8. OH_Drawing_CanvasDrawRoundRect with the second parameter OH_Drawing_RoundRectCreate created with yRad as 0
430    OH_Drawing_Rect *rect8 = OH_Drawing_RectCreate(10, 100, 200, 300);
431    OH_Drawing_RoundRect *roundRect8 = OH_Drawing_RoundRectCreate(rect8, 1.0f, 0.0f);
432    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect8);
433
434    // 9. Free memory
435    OH_Drawing_CanvasDestroy(canvas);
436    OH_Drawing_RectDestroy(rect);
437    OH_Drawing_RoundRectDestroy(roundRect);
438    OH_Drawing_RectDestroy(rect2);
439    OH_Drawing_RoundRectDestroy(roundRect2);
440    OH_Drawing_RectDestroy(rect3);
441    OH_Drawing_RoundRectDestroy(roundRect3);
442    OH_Drawing_RectDestroy(rect4);
443    OH_Drawing_RoundRectDestroy(roundRect4);
444    OH_Drawing_RectDestroy(rect5);
445    OH_Drawing_RoundRectDestroy(roundRect5);
446    OH_Drawing_RectDestroy(rect6);
447    OH_Drawing_RoundRectDestroy(roundRect6);
448    OH_Drawing_RectDestroy(rect7);
449    OH_Drawing_RoundRectDestroy(roundRect7);
450    OH_Drawing_RectDestroy(rect8);
451    OH_Drawing_RoundRectDestroy(roundRect8);
452}
453
454/*
455 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2102
456 * @tc.name: testCanvasDrawRoundRectAbnormal
457 * @tc.desc: test for testCanvasDrawRoundRectAbnormal.
458 * @tc.size  : SmallTest
459 * @tc.type  : Function
460 * @tc.level : Level 3
461 */
462HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawRoundRectAbnormal, TestSize.Level3) {
463    // 1. OH_Drawing_CanvasCreate
464    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
465
466    // 2. OH_Drawing_CanvasDrawRoundRect with OH_Drawing_RoundRectCreate creating rect with left, top, right, bottom
467    // being set to negative numbers
468    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(-10, 100, 200, 300);
469    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 0.0f, 1.0f);
470    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
471
472    rect = OH_Drawing_RectCreate(10, -100, 200, 300);
473    roundRect = OH_Drawing_RoundRectCreate(rect, 0.0f, 1.0f);
474    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
475
476    rect = OH_Drawing_RectCreate(10, 100, -200, 300);
477    roundRect = OH_Drawing_RoundRectCreate(rect, 0.0f, 1.0f);
478    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
479
480    rect = OH_Drawing_RectCreate(10, 100, 200, -300);
481    roundRect = OH_Drawing_RoundRectCreate(rect, 0.0f, 1.0f);
482    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
483
484    // 3. OH_Drawing_CanvasDrawRoundRect with OH_Drawing_CanvasDrawRoundRect creating rect with the horizontal
485    // coordinate of the top-left corner equal to the horizontal coordinate of the bottom-right corner, or the vertical
486    // coordinate of the top-left corner equal to the vertical coordinate of the bottom-right corner
487    rect = OH_Drawing_RectCreate(100, 0, 100, 100);
488    roundRect = OH_Drawing_RoundRectCreate(rect, 0.0f, 1.0f);
489    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
490
491    rect = OH_Drawing_RectCreate(0, 100, 100, 100);
492    roundRect = OH_Drawing_RoundRectCreate(rect, 0.0f, 1.0f);
493    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
494
495    // 4. OH_Drawing_CanvasDrawRoundRect with OH_Drawing_RoundRectCreate creating rect with the top-left corner
496    // coordinates equal to the bottom-right corner coordinates
497    rect = OH_Drawing_RectCreate(100, 100, 100, 100);
498    roundRect = OH_Drawing_RoundRectCreate(rect, 0.0f, 1.0f);
499    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
500
501    // 5. OH_Drawing_CanvasDrawRoundRect with OH_Drawing_RoundRectCreate creating rect with the top-left corner
502    // coordinates greater than the bottom-right corner coordinates
503    rect = OH_Drawing_RectCreate(200, 200, 100, 100);
504    roundRect = OH_Drawing_RoundRectCreate(rect, 0.0f, 1.0f);
505    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
506
507    // 6. OH_Drawing_CanvasDrawRoundRect with the second parameter OH_Drawing_RoundRectCreate creating roundRect with a
508    // negative xRad
509    rect = OH_Drawing_RectCreate(10, 100, 200, 300);
510    roundRect = OH_Drawing_RoundRectCreate(rect, -1.0f, 1.0f);
511    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
512
513    // 7. OH_Drawing_CanvasDrawRoundRect with the second parameter OH_Drawing_RoundRectCreate creating roundRect with a
514    // negative yRad
515    rect = OH_Drawing_RectCreate(10, 100, 200, 300);
516    roundRect = OH_Drawing_RoundRectCreate(rect, 0.0f, -1.0f);
517    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
518
519    // 8. Free memory
520    OH_Drawing_CanvasDestroy(canvas);
521    OH_Drawing_RectDestroy(rect);
522    OH_Drawing_RoundRectDestroy(roundRect);
523}
524
525/*
526 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2103
527 * @tc.name: testCanvasDrawRoundRectMaximum
528 * @tc.desc: test for testCanvasDrawRoundRectMaximum.
529 * @tc.size  : SmallTest
530 * @tc.type  : Function
531 * @tc.level : Level 3
532 */
533HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawRoundRectMaximum, TestSize.Level3) {
534    // 1. OH_Drawing_CanvasCreate
535    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
536    // 2. OH_Drawing_CanvasDrawRoundRect with OH_Drawing_RoundRectCreate creating rect with left, top, right, bottom
537    // being set to FLT_MAX
538    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(FLT_MAX, 100, 200, 300);
539    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 1.0f, 1.0f);
540    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
541
542    rect = OH_Drawing_RectCreate(10, FLT_MAX, 200, 300);
543    roundRect = OH_Drawing_RoundRectCreate(rect, 1.0f, 1.0f);
544    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
545
546    rect = OH_Drawing_RectCreate(10, 100, FLT_MAX, 300);
547    roundRect = OH_Drawing_RoundRectCreate(rect, 1.0f, 1.0f);
548    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
549
550    rect = OH_Drawing_RectCreate(10, 100, 200, FLT_MAX);
551    roundRect = OH_Drawing_RoundRectCreate(rect, 1.0f, 1.0f);
552    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
553
554    // 3. OH_Drawing_CanvasDrawRoundRect with the second parameter OH_Drawing_RoundRectCreate created with xRad being
555    // set to FLT_MAX
556    rect = OH_Drawing_RectCreate(10, 100, 200, 300);
557    roundRect = OH_Drawing_RoundRectCreate(rect, FLT_MAX, 1.0f);
558    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
559
560    // 4. OH_Drawing_CanvasDrawRoundRect with the second parameter OH_Drawing_RoundRectCreate created with yRad being
561    // set to FLT_MAX
562    rect = OH_Drawing_RectCreate(10, 100, 200, 300);
563    roundRect = OH_Drawing_RoundRectCreate(rect, 1.0f, FLT_MAX);
564    OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
565
566    // 5. Free memory
567    OH_Drawing_CanvasDestroy(canvas);
568    OH_Drawing_RectDestroy(rect);
569    OH_Drawing_RoundRectDestroy(roundRect);
570}
571
572/*
573 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2104
574 * @tc.name: testCanvasDrawRoundRectInputDestroyed
575 * @tc.desc: test for testCanvasDrawRoundRectInputDestroyed.
576 * @tc.size  : SmallTest
577 * @tc.type  : Function
578 * @tc.level : Level 3
579 */
580HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawRoundRectInputDestroyed, TestSize.Level3) {
581    // Deprecated
582}
583
584/*
585 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2200
586 * @tc.name: testCanvasDrawTextBlobNormal
587 * @tc.desc: test for testCanvasDrawTextBlobNormal.
588 * @tc.size  : SmallTest
589 * @tc.type  : Function
590 * @tc.level : Level 0
591 */
592HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawTextBlobNormal, TestSize.Level0) {
593    // 1. OH_Drawing_CanvasCreate
594    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
595
596    // 2. OH_Drawing_TextBlobCreateFromText
597    const char *str = "123456";
598
599    OH_Drawing_Font *font = OH_Drawing_FontCreate();
600    OH_Drawing_TextBlob *textBlob =
601        OH_Drawing_TextBlobCreateFromText(str, strlen(str), font, OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
602    // 3. OH_Drawing_CanvasDrawTextBlob
603    OH_Drawing_CanvasDrawTextBlob(canvas, textBlob, 10, 10);
604    // 4. Free memory
605    OH_Drawing_TextBlobDestroy(textBlob);
606
607    OH_Drawing_CanvasDestroy(canvas);
608}
609
610/*
611 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2201
612 * @tc.name: testCanvasDrawTextBlobNull
613 * @tc.desc: test for testCanvasDrawTextBlobNull.
614 * @tc.size  : SmallTest
615 * @tc.type  : Function
616 * @tc.level : Level 3
617 */
618HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawTextBlobNull, TestSize.Level3) {
619    // 1. OH_Drawing_CanvasCreate
620    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
621    // 2. OH_Drawing_TextBlobCreateFromString
622    const char *str = "123456";
623
624    OH_Drawing_Font *font = OH_Drawing_FontCreate();
625    OH_Drawing_TextBlob *textBlob =
626        OH_Drawing_TextBlobCreateFromText(str, strlen(str), font, OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
627    // 3. OH_Drawing_CanvasDrawTextBlob with the first parameter being nullptr
628    OH_Drawing_CanvasDrawTextBlob(nullptr, textBlob, 10, 10);
629    // 4. OH_Drawing_CanvasDrawTextBlob with the second parameter being nullptr
630    OH_Drawing_CanvasDrawTextBlob(canvas, nullptr, 10, 10);
631    // 5. OH_Drawing_CanvasDrawTextBlob with the third parameter being 0
632    OH_Drawing_CanvasDrawTextBlob(canvas, textBlob, 0, 10);
633    // 6. OH_Drawing_CanvasDrawTextBlob with the fourth parameter being 0
634    OH_Drawing_CanvasDrawTextBlob(canvas, textBlob, 10, 0);
635    // 7. Free memory
636    OH_Drawing_TextBlobDestroy(textBlob);
637
638    OH_Drawing_CanvasDestroy(canvas);
639}
640
641/*
642 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2202
643 * @tc.name: testCanvasDrawTextBlobAbnormal
644 * @tc.desc: test for testCanvasDrawTextBlobAbnormal.
645 * @tc.size  : SmallTest
646 * @tc.type  : Function
647 * @tc.level : Level 3
648 */
649HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawTextBlobAbnormal, TestSize.Level3) {
650    // 1. OH_Drawing_CanvasCreate
651    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
652    // 2. Create OH_Drawing_TextBlob from text
653    const char *str = "123456";
654    OH_Drawing_Font *font = OH_Drawing_FontCreate();
655    OH_Drawing_TextBlob *textBlob =
656        OH_Drawing_TextBlobCreateFromText(str, strlen(str), font, OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
657    // 3. Draw OH_Drawing_TextBlob on canvas with x-coordinate of the bottom left corner of the text object set to a
658    // negative value
659    OH_Drawing_CanvasDrawTextBlob(canvas, textBlob, -10, 10);
660    // 4. Draw OH_Drawing_TextBlob on canvas with y-coordinate of the bottom left corner of the text object set to a
661    // negative value
662    OH_Drawing_CanvasDrawTextBlob(canvas, textBlob, 10, -10);
663    // 5. Release memory
664    OH_Drawing_TextBlobDestroy(textBlob);
665    OH_Drawing_CanvasDestroy(canvas);
666}
667
668/*
669 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2203
670 * @tc.name: testCanvasDrawTextBlobMaximum
671 * @tc.desc: test for testCanvasDrawTextBlobMaximum.
672 * @tc.size  : SmallTest
673 * @tc.type  : Function
674 * @tc.level : Level 3
675 */
676HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawTextBlobMaximum, TestSize.Level3) {
677    // 1. Create OH_Drawing_Canvas
678    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
679    // 2. Create OH_Drawing_TextBlob from text
680    const char *str = "123456";
681    OH_Drawing_Font *font = OH_Drawing_FontCreate();
682    OH_Drawing_TextBlob *textBlob =
683        OH_Drawing_TextBlobCreateFromText(str, strlen(str), font, OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
684    // 3. Draw OH_Drawing_TextBlob on canvas with x-coordinate of the bottom left corner of the text object set to
685    // maximum value
686    OH_Drawing_CanvasDrawTextBlob(canvas, textBlob, FLT_MAX, 10);
687    // 4. Draw OH_Drawing_TextBlob on canvas with y-coordinate of the bottom left corner of the text object set to
688    // maximum value
689    OH_Drawing_CanvasDrawTextBlob(canvas, textBlob, 10, FLT_MAX);
690    // 5. Release memory
691    OH_Drawing_TextBlobDestroy(textBlob);
692    // 5. Release memory
693    OH_Drawing_CanvasDestroy(canvas);
694}
695
696/*
697 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2204
698 * @tc.name: testCanvasDrawTextBlobInputDestroyed
699 * @tc.desc: test for testCanvasDrawTextBlobInputDestroyed.
700 * @tc.size  : SmallTest
701 * @tc.type  : Function
702 * @tc.level : Level 3
703 */
704HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawTextBlobInputDestroyed, TestSize.Level3) {
705    // Deprecated
706}
707
708/*
709 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2300
710 * @tc.name: testCanvasClipRectNormal
711 * @tc.desc: test for testCanvasClipRectNormal.
712 * @tc.size  : SmallTest
713 * @tc.type  : Function
714 * @tc.level : Level 0
715 */
716HWTEST_F(DrawingNativeCanvasTest, testCanvasClipRectNormal, TestSize.Level0) {
717    // 1. OH_Drawing_CanvasCreate
718    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
719    // 2. OH_Drawing_RectCreate
720    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(10, 10, 100, 100);
721    // 3. OH_Drawing_CanvasClipRect with clipOp and doAntiAlias parameters, iterate through enum values
722    OH_Drawing_CanvasClipOp clipOp[] = {OH_Drawing_CanvasClipOp::DIFFERENCE, OH_Drawing_CanvasClipOp::INTERSECT};
723    bool doAntiAlias[] = {true, false};
724    for (int i = 0; i < 2; i++) {
725        for (int j = 0; j < 2; j++) {
726            OH_Drawing_CanvasClipRect(canvas, rect, clipOp[i], doAntiAlias[j]);
727        }
728    }
729    // 4. Free memory
730    OH_Drawing_CanvasDestroy(canvas);
731}
732
733/*
734 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2301
735 * @tc.name: testCanvasClipRectNull
736 * @tc.desc: test for testCanvasClipRectNull.
737 * @tc.size  : SmallTest
738 * @tc.type  : Function
739 * @tc.level : Level 3
740 */
741HWTEST_F(DrawingNativeCanvasTest, testCanvasClipRectNull, TestSize.Level3) {
742    // 1. OH_Drawing_CanvasCreate
743    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
744    // 2. OH_Drawing_RectCreate
745    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(10, 10, 100, 100);
746    // 3. OH_Drawing_CanvasClipRect with the first parameter being nullptr
747    OH_Drawing_CanvasClipRect(nullptr, rect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
748    // 4. OH_Drawing_CanvasClipRect with the second parameter OH_Drawing_Rect created with left, top, right, and bottom
749    // values being 0
750    OH_Drawing_Rect *rect2 = OH_Drawing_RectCreate(0, 10, 100, 100);
751    OH_Drawing_CanvasClipRect(canvas, rect2, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
752    rect2 = OH_Drawing_RectCreate(10, 0, 100, 100);
753    OH_Drawing_CanvasClipRect(canvas, rect2, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
754    rect2 = OH_Drawing_RectCreate(10, 10, 0, 100);
755    OH_Drawing_CanvasClipRect(canvas, rect2, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
756    rect2 = OH_Drawing_RectCreate(10, 10, 100, 0);
757    OH_Drawing_CanvasClipRect(canvas, rect2, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
758    // 5. OH_Drawing_CanvasClipRect with the second parameter OH_Drawing_Rect created with all values being 0
759    OH_Drawing_Rect *rect3 = OH_Drawing_RectCreate(0, 0, 0, 0);
760    OH_Drawing_CanvasClipRect(canvas, rect3, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
761    // 6. OH_Drawing_CanvasClipRect with the second parameter being nullptr
762    OH_Drawing_CanvasClipRect(canvas, nullptr, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
763    // 7. Free memory
764    OH_Drawing_CanvasDestroy(canvas);
765    OH_Drawing_RectDestroy(rect);
766    OH_Drawing_RectDestroy(rect2);
767    OH_Drawing_RectDestroy(rect3);
768}
769
770/*
771 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2302
772 * @tc.name: testCanvasClipRectAbnormal
773 * @tc.desc: test for testCanvasClipRectAbnormal.
774 * @tc.size  : SmallTest
775 * @tc.type  : Function
776 * @tc.level : Level 3
777 */
778HWTEST_F(DrawingNativeCanvasTest, testCanvasClipRectAbnormal, TestSize.Level3) {
779    // 1. OH_Drawing_CanvasCreate
780    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
781    // 2. OH_Drawing_CanvasClipRect with OH_Drawing_Rect created with negative values for left, top, right, and bottom
782    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(-10, 10, 100, 100);
783    OH_Drawing_CanvasClipRect(canvas, rect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
784    rect = OH_Drawing_RectCreate(10, -10, 100, 100);
785    OH_Drawing_CanvasClipRect(canvas, rect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
786    rect = OH_Drawing_RectCreate(10, 10, -100, 100);
787    OH_Drawing_CanvasClipRect(canvas, rect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
788    rect = OH_Drawing_RectCreate(10, 10, 100, -100);
789    OH_Drawing_CanvasClipRect(canvas, rect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
790    // 3. OH_Drawing_CanvasClipRect with OH_Drawing_Rect created where the x-coordinate of the top-left corner is equal
791    // to the x-coordinate of the bottom-right corner, or the y-coordinate of the top-left corner is equal to the
792    // y-coordinate of the bottom-right corner
793    rect = OH_Drawing_RectCreate(100, 10, 100, 100);
794    OH_Drawing_CanvasClipRect(canvas, rect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
795    rect = OH_Drawing_RectCreate(10, 100, 100, 100);
796    OH_Drawing_CanvasClipRect(canvas, rect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
797    // 4. OH_Drawing_CanvasClipRect with OH_Drawing_Rect created where the top-left corner coordinates are equal to the
798    // bottom-right corner coordinates
799    rect = OH_Drawing_RectCreate(100, 100, 100, 100);
800    OH_Drawing_CanvasClipRect(canvas, rect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
801    // 5. OH_Drawing_CanvasClipRect with OH_Drawing_Rect created where the top-left corner coordinates are greater than
802    // the bottom-right corner coordinates
803    rect = OH_Drawing_RectCreate(200, 200, 100, 100);
804    OH_Drawing_CanvasClipRect(canvas, rect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
805    // 6. Release memory
806    OH_Drawing_CanvasDestroy(canvas);
807    OH_Drawing_RectDestroy(rect);
808}
809
810/*
811 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2303
812 * @tc.name: testCanvasClipRectMaximum
813 * @tc.desc: test for testCanvasClipRectMaximum.
814 * @tc.size  : SmallTest
815 * @tc.type  : Function
816 * @tc.level : Level 3
817 */
818HWTEST_F(DrawingNativeCanvasTest, testCanvasClipRectMaximum, TestSize.Level3) {
819    // 1. OH_Drawing_CanvasCreate
820    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
821    // 2. OH_Drawing_CanvasClipRect with OH_Drawing_Rect created with extreme values for left, top, right, and bottom
822    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(FLT_MAX, 10, 100, 100);
823    OH_Drawing_CanvasClipRect(canvas, rect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
824    rect = OH_Drawing_RectCreate(10, FLT_MAX, 100, 100);
825    OH_Drawing_CanvasClipRect(canvas, rect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
826    rect = OH_Drawing_RectCreate(10, 10, FLT_MAX, 100);
827    OH_Drawing_CanvasClipRect(canvas, rect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
828    rect = OH_Drawing_RectCreate(10, 10, 100, FLT_MAX);
829    OH_Drawing_CanvasClipRect(canvas, rect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
830    // 3. Release memory
831    OH_Drawing_CanvasDestroy(canvas);
832    OH_Drawing_RectDestroy(rect);
833}
834
835/*
836 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2304
837 * @tc.name: testCanvasClipRectInputDestroyed
838 * @tc.desc: test for testCanvasClipRectInputDestroyed.
839 * @tc.size  : SmallTest
840 * @tc.type  : Function
841 * @tc.level : Level 3
842 */
843HWTEST_F(DrawingNativeCanvasTest, testCanvasClipRectInputDestroyed, TestSize.Level3) {
844    // Deprecated
845}
846
847/*
848 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2400
849 * @tc.name: testCanvasClipRoundRectNormal
850 * @tc.desc: test for testCanvasClipRoundRectNormal.
851 * @tc.size  : SmallTest
852 * @tc.type  : Function
853 * @tc.level : Level 0
854 */
855HWTEST_F(DrawingNativeCanvasTest, testCanvasClipRoundRectNormal, TestSize.Level0) {
856    // 1. OH_Drawing_CanvasCreate
857    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
858    // 2. OH_Drawing_RoundRectCreate
859    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(10, 10, 100, 100);
860    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 10, 10);
861    // 3. OH_Drawing_CanvasClipRoundRect with parameters clipOp and doAntiAlias, iterate through the enumeration values
862    OH_Drawing_CanvasClipOp clipOp[] = {OH_Drawing_CanvasClipOp::DIFFERENCE, OH_Drawing_CanvasClipOp::INTERSECT};
863    bool doAntiAlias[] = {true, false};
864    for (int i = 0; i < 2; i++) {
865        for (int j = 0; j < 2; j++) {
866            OH_Drawing_CanvasClipRoundRect(canvas, roundRect, clipOp[i], doAntiAlias[j]);
867        }
868    }
869    // 4. Free memory
870    OH_Drawing_CanvasDestroy(canvas);
871    OH_Drawing_RectDestroy(rect);
872}
873
874/*
875 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2401
876 * @tc.name: testCanvasClipRoundRectNull
877 * @tc.desc: test for testCanvasClipRoundRectNull.
878 * @tc.size  : SmallTest
879 * @tc.type  : Function
880 * @tc.level : Level 3
881 */
882HWTEST_F(DrawingNativeCanvasTest, testCanvasClipRoundRectNull, TestSize.Level3) {
883    // 1. OH_Drawing_CanvasCreate
884    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
885    // 2. OH_Drawing_RoundRectCreate
886    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(10, 10, 100, 100);
887    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 10, 10);
888    // 3. OH_Drawing_CanvasClipRoundRect with the first parameter being null
889    OH_Drawing_CanvasClipRoundRect(nullptr, roundRect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
890    // 4. OH_Drawing_CanvasClipRoundRect with the second parameter being null
891    OH_Drawing_CanvasClipRoundRect(canvas, nullptr, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
892    // 5. OH_Drawing_CanvasClipRoundRect with the second parameter OH_Drawing_RoundRectCreate created with rect's left,
893    // top, right, and bottom values all set to 0
894    OH_Drawing_Rect *rect2 = OH_Drawing_RectCreate(0, 10, 100, 100);
895    OH_Drawing_RoundRect *roundRect2 = OH_Drawing_RoundRectCreate(rect2, 10, 10);
896    OH_Drawing_CanvasClipRoundRect(canvas, roundRect2, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
897    rect2 = OH_Drawing_RectCreate(10, 0, 100, 100);
898    roundRect2 = OH_Drawing_RoundRectCreate(rect2, 10, 10);
899    OH_Drawing_CanvasClipRoundRect(canvas, roundRect2, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
900    rect2 = OH_Drawing_RectCreate(10, 10, 0, 100);
901    roundRect2 = OH_Drawing_RoundRectCreate(rect2, 10, 10);
902    OH_Drawing_CanvasClipRoundRect(canvas, roundRect2, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
903    rect2 = OH_Drawing_RectCreate(10, 10, 100, 0);
904    roundRect2 = OH_Drawing_RoundRectCreate(rect2, 10, 10);
905    OH_Drawing_CanvasClipRoundRect(canvas, roundRect2, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
906    // 6. OH_Drawing_CanvasClipRoundRect with the second parameter OH_Drawing_RoundRectCreate created with all rect's
907    // left, top, right, and bottom values set to 0
908    rect2 = OH_Drawing_RectCreate(0, 0, 0, 0);
909    roundRect2 = OH_Drawing_RoundRectCreate(rect2, 10, 10);
910    OH_Drawing_CanvasClipRoundRect(canvas, roundRect2, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
911    // 7. OH_Drawing_CanvasClipRoundRect with the second parameter OH_Drawing_RoundRectCreate created with xRad set to 0
912    rect2 = OH_Drawing_RectCreate(10, 10, 100, 100);
913    roundRect2 = OH_Drawing_RoundRectCreate(rect2, 0, 10);
914    OH_Drawing_CanvasClipRoundRect(canvas, roundRect2, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
915    // 8. OH_Drawing_CanvasClipRoundRect with the second parameter OH_Drawing_RoundRectCreate created with yRad set to 0
916    rect2 = OH_Drawing_RectCreate(10, 10, 100, 100);
917    roundRect2 = OH_Drawing_RoundRectCreate(rect2, 10, 0);
918    OH_Drawing_CanvasClipRoundRect(canvas, roundRect2, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
919    // 9. Release memory
920    OH_Drawing_CanvasDestroy(canvas);
921    OH_Drawing_RectDestroy(rect);
922    OH_Drawing_RectDestroy(rect2);
923    OH_Drawing_RoundRectDestroy(roundRect);
924    OH_Drawing_RoundRectDestroy(roundRect2);
925}
926
927/*
928 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2402
929 * @tc.name: testCanvasClipRoundRectAbnormal
930 * @tc.desc: test for testCanvasClipRoundRectAbnormal.
931 * @tc.size  : SmallTest
932 * @tc.type  : Function
933 * @tc.level : Level 3
934 */
935HWTEST_F(DrawingNativeCanvasTest, testCanvasClipRoundRectAbnormal, TestSize.Level3) {
936    // 1. OH_Drawing_CanvasCreate
937    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
938    // 2. OH_Drawing_CanvasClipRoundRect, pass negative values for left, top, right, and bottom when creating
939    // OH_Drawing_RoundRect
940    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(-10, 10, 100, 100);
941    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 10, 10);
942    OH_Drawing_CanvasClipRoundRect(canvas, roundRect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
943    rect = OH_Drawing_RectCreate(10, -10, 100, 100);
944    roundRect = OH_Drawing_RoundRectCreate(rect, 10, 10);
945    OH_Drawing_CanvasClipRoundRect(canvas, roundRect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
946    rect = OH_Drawing_RectCreate(10, 10, -100, 100);
947    roundRect = OH_Drawing_RoundRectCreate(rect, 10, 10);
948    OH_Drawing_CanvasClipRoundRect(canvas, roundRect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
949    rect = OH_Drawing_RectCreate(10, 10, 100, -100);
950    roundRect = OH_Drawing_RoundRectCreate(rect, 10, 10);
951    OH_Drawing_CanvasClipRoundRect(canvas, roundRect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
952
953    // 3. OH_Drawing_CanvasClipRoundRect, pass OH_Drawing_RoundRect with left-top coordinates equal to right-bottom
954    // coordinates
955    rect = OH_Drawing_RectCreate(100, 10, 100, 100);
956    roundRect = OH_Drawing_RoundRectCreate(rect, 10, 10);
957    OH_Drawing_CanvasClipRoundRect(canvas, roundRect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
958    rect = OH_Drawing_RectCreate(10, 100, 100, 100);
959    roundRect = OH_Drawing_RoundRectCreate(rect, 10, 10);
960    OH_Drawing_CanvasClipRoundRect(canvas, roundRect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
961
962    // 4. OH_Drawing_CanvasClipRoundRect, pass OH_Drawing_RoundRect with left-top coordinates equal to right-bottom
963    // coordinates
964    rect = OH_Drawing_RectCreate(100, 100, 100, 100);
965    roundRect = OH_Drawing_RoundRectCreate(rect, 10, 10);
966    OH_Drawing_CanvasClipRoundRect(canvas, roundRect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
967
968    // 5. OH_Drawing_CanvasClipRoundRect, pass OH_Drawing_RoundRect with left-top coordinates greater than right-bottom
969    // coordinates
970    rect = OH_Drawing_RectCreate(200, 200, 100, 100);
971    roundRect = OH_Drawing_RoundRectCreate(rect, 10, 10);
972    OH_Drawing_CanvasClipRoundRect(canvas, roundRect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
973
974    // 6. OH_Drawing_CanvasClipRoundRect, pass OH_Drawing_RoundRect with negative xRad
975    rect = OH_Drawing_RectCreate(10, 10, 100, 100);
976    roundRect = OH_Drawing_RoundRectCreate(rect, -10, 10);
977    OH_Drawing_CanvasClipRoundRect(canvas, roundRect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
978
979    // 7. OH_Drawing_CanvasClipRoundRect, pass OH_Drawing_RoundRect with negative yRad
980    rect = OH_Drawing_RectCreate(10, 10, 100, 100);
981    roundRect = OH_Drawing_RoundRectCreate(rect, 10, -10);
982    OH_Drawing_CanvasClipRoundRect(canvas, roundRect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
983
984    // 8. Release memory
985    OH_Drawing_CanvasDestroy(canvas);
986    OH_Drawing_RectDestroy(rect);
987    OH_Drawing_RoundRectDestroy(roundRect);
988}
989
990/*
991 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2403
992 * @tc.name: testCanvasClipRoundRectMaximum
993 * @tc.desc: test for testCanvasClipRoundRectMaximum.
994 * @tc.size  : SmallTest
995 * @tc.type  : Function
996 * @tc.level : Level 3
997 */
998HWTEST_F(DrawingNativeCanvasTest, testCanvasClipRoundRectMaximum, TestSize.Level3) {
999    // 1. OH_Drawing_CanvasCreate
1000    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1001    // 2. OH_Drawing_CanvasClipRoundRect, pass extreme values for left, top, right, and bottom when creating
1002    // OH_Drawing_RoundRect
1003    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(FLT_MAX, 10, 100, 100);
1004    OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 10, 10);
1005    OH_Drawing_CanvasClipRoundRect(canvas, roundRect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
1006    rect = OH_Drawing_RectCreate(10, FLT_MAX, 100, 100);
1007    roundRect = OH_Drawing_RoundRectCreate(rect, 10, 10);
1008    OH_Drawing_CanvasClipRoundRect(canvas, roundRect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
1009    rect = OH_Drawing_RectCreate(10, 10, FLT_MAX, 100);
1010    roundRect = OH_Drawing_RoundRectCreate(rect, 10, 10);
1011    OH_Drawing_CanvasClipRoundRect(canvas, roundRect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
1012    rect = OH_Drawing_RectCreate(10, 10, 100, FLT_MAX);
1013    roundRect = OH_Drawing_RoundRectCreate(rect, 10, 10);
1014    OH_Drawing_CanvasClipRoundRect(canvas, roundRect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
1015    // 3. OH_Drawing_CanvasClipRoundRect, pass FLT_MAX for xRad when creating OH_Drawing_RoundRect
1016    rect = OH_Drawing_RectCreate(10, 10, 100, 100);
1017    roundRect = OH_Drawing_RoundRectCreate(rect, FLT_MAX, 10);
1018    OH_Drawing_CanvasClipRoundRect(canvas, roundRect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
1019    // 4. OH_Drawing_CanvasClipRoundRect, pass FLT_MAX for yRad when creating OH_Drawing_RoundRect
1020    rect = OH_Drawing_RectCreate(10, 10, 100, 100);
1021    roundRect = OH_Drawing_RoundRectCreate(rect, 10, FLT_MAX);
1022    OH_Drawing_CanvasClipRoundRect(canvas, roundRect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
1023    // 5. Free memory
1024    OH_Drawing_CanvasDestroy(canvas);
1025    OH_Drawing_RectDestroy(rect);
1026    OH_Drawing_RoundRectDestroy(roundRect);
1027}
1028
1029/*
1030 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2404
1031 * @tc.name: testCanvasClipRoundRectInputDestroyed
1032 * @tc.desc: test for testCanvasClipRoundRectInputDestroyed.
1033 * @tc.size  : SmallTest
1034 * @tc.type  : Function
1035 * @tc.level : Level 3
1036 */
1037HWTEST_F(DrawingNativeCanvasTest, testCanvasClipRoundRectInputDestroyed, TestSize.Level3) {
1038    // Deprecated
1039}
1040
1041/*
1042 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2500
1043 * @tc.name: testCanvasClipPathNormal
1044 * @tc.desc: test for testCanvasClipPathNormal.
1045 * @tc.size  : SmallTest
1046 * @tc.type  : Function
1047 * @tc.level : Level 0
1048 */
1049HWTEST_F(DrawingNativeCanvasTest, testCanvasClipPathNormal, TestSize.Level0) {
1050    // 1. OH_Drawing_CanvasCreate
1051    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1052    // 2. OH_Drawing_PathCreate
1053    OH_Drawing_Path *path = OH_Drawing_PathCreate();
1054    OH_Drawing_PathMoveTo(path, 0, 0);
1055    OH_Drawing_PathLineTo(path, 100, 0);
1056    OH_Drawing_PathLineTo(path, 100, 100);
1057    OH_Drawing_PathLineTo(path, 0, 100);
1058    OH_Drawing_PathClose(path);
1059    // 3. OH_Drawing_PathAddRect
1060    OH_Drawing_PathAddRect(path, 10, 10, 100, 100, OH_Drawing_PathDirection::PATH_DIRECTION_CW);
1061    // 4. OH_Drawing_CanvasClipPath
1062    OH_Drawing_CanvasClipOp clipOp[] = {OH_Drawing_CanvasClipOp::DIFFERENCE, OH_Drawing_CanvasClipOp::INTERSECT};
1063    bool doAntiAlias[] = {true, false};
1064    for (int i = 0; i < 2; i++) {
1065        for (int j = 0; j < 2; j++) {
1066            OH_Drawing_CanvasClipPath(canvas, path, clipOp[i], doAntiAlias[j]);
1067        }
1068    }
1069    // 5. Free memory
1070    OH_Drawing_PathDestroy(path);
1071    OH_Drawing_CanvasDestroy(canvas);
1072}
1073
1074/*
1075 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2501
1076 * @tc.name: testCanvasClipPathNull
1077 * @tc.desc: test for testCanvasClipPathNull.
1078 * @tc.size  : SmallTest
1079 * @tc.type  : Function
1080 * @tc.level : Level 3
1081 */
1082HWTEST_F(DrawingNativeCanvasTest, testCanvasClipPathNull, TestSize.Level3) {
1083    // 1. OH_Drawing_CanvasCreate
1084    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1085    // 2. OH_Drawing_PathCreate
1086    OH_Drawing_Path *path = OH_Drawing_PathCreate();
1087    OH_Drawing_PathMoveTo(path, 0, 0);
1088    OH_Drawing_PathLineTo(path, 100, 0);
1089    OH_Drawing_PathLineTo(path, 100, 100);
1090    OH_Drawing_PathLineTo(path, 0, 100);
1091    OH_Drawing_PathClose(path);
1092    // 3. OH_Drawing_PathAddRect
1093    OH_Drawing_PathAddRect(path, 10, 10, 100, 100, OH_Drawing_PathDirection::PATH_DIRECTION_CW);
1094    // 4. OH_Drawing_CanvasClipPath with the first parameter being null
1095    OH_Drawing_CanvasClipPath(nullptr, path, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
1096    // 5. OH_Drawing_CanvasClipPath with the second parameter being null
1097    OH_Drawing_CanvasClipPath(canvas, nullptr, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
1098    // 6. OH_Drawing_CanvasClipPath with the second parameter being an empty path
1099    OH_Drawing_Path *path2 = OH_Drawing_PathCreate();
1100    OH_Drawing_CanvasClipPath(canvas, path2, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
1101    // 7. Free memory
1102    OH_Drawing_PathDestroy(path);
1103    OH_Drawing_PathDestroy(path2);
1104    OH_Drawing_CanvasDestroy(canvas);
1105}
1106
1107/*
1108 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2502
1109 * @tc.name: testCanvasClipPathInputDestroyed
1110 * @tc.desc: test for testCanvasClipPathInputDestroyed.
1111 * @tc.size  : SmallTest
1112 * @tc.type  : Function
1113 * @tc.level : Level 3
1114 */
1115HWTEST_F(DrawingNativeCanvasTest, testCanvasClipPathInputDestroyed, TestSize.Level3) {
1116    // Deprecated
1117}
1118
1119/*
1120 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2600
1121 * @tc.name: testCanvasRotateNormal
1122 * @tc.desc: test for testCanvasRotateNormal.
1123 * @tc.size  : SmallTest
1124 * @tc.type  : Function
1125 * @tc.level : Level 0
1126 */
1127HWTEST_F(DrawingNativeCanvasTest, testCanvasRotateNormal, TestSize.Level0) {
1128    // 1. OH_Drawing_CanvasCreate
1129    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1130    // 2. OH_Drawing_CanvasRotate, rotate degrees with values 0, 180, 360
1131    float degrees[] = {0, 180, 360};
1132    for (int i = 0; i < 3; i++) {
1133        OH_Drawing_CanvasRotate(canvas, degrees[i], 10, 10);
1134    }
1135    // 3. Call drawing class interface to draw a rectangle
1136    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(10, 10, 100, 100);
1137    OH_Drawing_CanvasDrawRect(canvas, rect);
1138    // 4. Free memory
1139    OH_Drawing_CanvasDestroy(canvas);
1140}
1141
1142/*
1143 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2601
1144 * @tc.name: testCanvasRotateNull
1145 * @tc.desc: test for testCanvasRotateNull.
1146 * @tc.size  : SmallTest
1147 * @tc.type  : Function
1148 * @tc.level : Level 3
1149 */
1150HWTEST_F(DrawingNativeCanvasTest, testCanvasRotateNull, TestSize.Level3) {
1151    // 1. OH_Drawing_CanvasCreate
1152    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1153    // 2. OH_Drawing_CanvasRotate with the first parameter being null
1154    OH_Drawing_CanvasRotate(nullptr, 0, 10, 10);
1155    // 3. OH_Drawing_CanvasRotate with the third parameter being 0
1156    OH_Drawing_CanvasRotate(canvas, 0, 0, 10);
1157    // 4. OH_Drawing_CanvasRotate with the fourth parameter being 0
1158    OH_Drawing_CanvasRotate(canvas, 0, 10, 0);
1159    // 5. Free memory
1160    OH_Drawing_CanvasDestroy(canvas);
1161}
1162
1163/*
1164 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2602
1165 * @tc.name: testCanvasRotateAbnormal
1166 * @tc.desc: test for testCanvasRotateAbnormal.
1167 * @tc.size  : SmallTest
1168 * @tc.type  : Function
1169 * @tc.level : Level 3
1170 */
1171HWTEST_F(DrawingNativeCanvasTest, testCanvasRotateAbnormal, TestSize.Level3) {
1172    // 1. OH_Drawing_CanvasCreate
1173    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1174    // 2. OH_Drawing_CanvasRotate with negative degrees input
1175    OH_Drawing_CanvasRotate(canvas, -180, 10, 10);
1176    // 3. OH_Drawing_CanvasRotate with degrees input greater than 360
1177    OH_Drawing_CanvasRotate(canvas, 370, 10, 10);
1178    // 4. OH_Drawing_CanvasRotate with negative px input for rotation center
1179    OH_Drawing_CanvasRotate(canvas, 180, -10, 10);
1180    // 5. OH_Drawing_CanvasRotate with negative py input for rotation center
1181    OH_Drawing_CanvasRotate(canvas, 180, 10, -10);
1182    // 6. Free memory
1183    OH_Drawing_CanvasDestroy(canvas);
1184}
1185
1186/*
1187 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2603
1188 * @tc.name: testCanvasRotateMaximum
1189 * @tc.desc: test for testCanvasRotateMaximum.
1190 * @tc.size  : SmallTest
1191 * @tc.type  : Function
1192 * @tc.level : Level 3
1193 */
1194HWTEST_F(DrawingNativeCanvasTest, testCanvasRotateMaximum, TestSize.Level3) {
1195    // 1. OH_Drawing_CanvasCreate
1196    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1197    // 2. OH_Drawing_CanvasRotate with maximum rotation angle degrees input
1198    OH_Drawing_CanvasRotate(canvas, FLT_MAX, 10, 10);
1199    // 3. OH_Drawing_CanvasRotate with maximum x-coordinate px input for rotation center
1200    OH_Drawing_CanvasRotate(canvas, 180, FLT_MAX, 10);
1201    // 4. OH_Drawing_CanvasRotate with maximum y-coordinate py input for rotation center
1202    OH_Drawing_CanvasRotate(canvas, 180, 10, FLT_MAX);
1203    // 5. Free memory
1204    OH_Drawing_CanvasDestroy(canvas);
1205}
1206
1207/*
1208 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2604
1209 * @tc.name: testCanvasRotateInputDestroyed
1210 * @tc.desc: test for testCanvasRotateInputDestroyed.
1211 * @tc.size  : SmallTest
1212 * @tc.type  : Function
1213 * @tc.level : Level 3
1214 */
1215HWTEST_F(DrawingNativeCanvasTest, testCanvasRotateInputDestroyed, TestSize.Level3) {
1216    // Deprecated
1217}
1218
1219/*
1220 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2605
1221 * @tc.name: testCanvasRotateMultipleCalls
1222 * @tc.desc: test for testCanvasRotateMultipleCalls.
1223 * @tc.size  : SmallTest
1224 * @tc.type  : Function
1225 * @tc.level : Level 3
1226 */
1227HWTEST_F(DrawingNativeCanvasTest, testCanvasRotateMultipleCalls, TestSize.Level3) {
1228    // 1. OH_Drawing_CanvasCreate
1229    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1230    // 2. Call OH_Drawing_CanvasRotate 10 times, each time with different rotation angles and rotation center
1231    // coordinates
1232    for (int i = 0; i < 10; i++) {
1233        OH_Drawing_CanvasRotate(canvas, i * 10, i * 10, i * 10);
1234        // 3. Call drawing class interface
1235        OH_Drawing_Rect *rect = OH_Drawing_RectCreate(10, 10, 100, 100);
1236        OH_Drawing_CanvasDrawRect(canvas, rect);
1237        OH_Drawing_RectDestroy(rect);
1238    }
1239    // 4. Free memory
1240    OH_Drawing_CanvasDestroy(canvas);
1241}
1242
1243/*
1244 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2700
1245 * @tc.name: testCanvasTranslateNormal
1246 * @tc.desc: test for testCanvasTranslateNormal.
1247 * @tc.size  : SmallTest
1248 * @tc.type  : Function
1249 * @tc.level : Level 0
1250 */
1251HWTEST_F(DrawingNativeCanvasTest, testCanvasTranslateNormal, TestSize.Level0) {
1252    // 1. OH_Drawing_CanvasCreate
1253    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1254    // 2. OH_Drawing_CanvasTranslate
1255    OH_Drawing_CanvasTranslate(canvas, 10, 10);
1256    // 3. Call drawing class interface to draw a rectangle
1257    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(10, 10, 100, 100);
1258    OH_Drawing_CanvasDrawRect(canvas, rect);
1259    // 4. Free memory
1260    OH_Drawing_RectDestroy(rect);
1261    OH_Drawing_CanvasDestroy(canvas);
1262}
1263
1264/*
1265 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2701
1266 * @tc.name: testCanvasTranslateNull
1267 * @tc.desc: test for testCanvasTranslateNull.
1268 * @tc.size  : SmallTest
1269 * @tc.type  : Function
1270 * @tc.level : Level 3
1271 */
1272HWTEST_F(DrawingNativeCanvasTest, testCanvasTranslateNull, TestSize.Level3) {
1273    // 1. OH_Drawing_CanvasCreate
1274    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1275    // 2. OH_Drawing_CanvasTranslate with the first parameter being null
1276    OH_Drawing_CanvasTranslate(nullptr, 10, 10);
1277    // 3. OH_Drawing_CanvasTranslate with the second parameter being 0
1278    OH_Drawing_CanvasTranslate(canvas, 0, 10);
1279    // 4. OH_Drawing_CanvasTranslate with the third parameter being 0
1280    OH_Drawing_CanvasTranslate(canvas, 10, 0);
1281    // 5. Free memory
1282    OH_Drawing_CanvasDestroy(canvas);
1283}
1284
1285/*
1286 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2702
1287 * @tc.name: testCanvasTranslateAbnormal
1288 * @tc.desc: test for testCanvasTranslateAbnormal.
1289 * @tc.size  : SmallTest
1290 * @tc.type  : Function
1291 * @tc.level : Level 3
1292 */
1293HWTEST_F(DrawingNativeCanvasTest, testCanvasTranslateAbnormal, TestSize.Level3) {
1294    // 1. OH_Drawing_CanvasCreate
1295    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1296    // 2. OH_Drawing_CanvasTranslate with negative movement distance dx in the x-axis direction
1297    OH_Drawing_CanvasTranslate(canvas, -10, 10);
1298    // 3. OH_Drawing_CanvasTranslate with negative movement distance dy in the y-axis direction
1299    OH_Drawing_CanvasTranslate(canvas, 10, -10);
1300    // 4. Free memory
1301    OH_Drawing_CanvasDestroy(canvas);
1302}
1303
1304/*
1305 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2703
1306 * @tc.name: testCanvasTranslateMaximum
1307 * @tc.desc: test for testCanvasTranslateMaximum.
1308 * @tc.size  : SmallTest
1309 * @tc.type  : Function
1310 * @tc.level : Level 3
1311 */
1312HWTEST_F(DrawingNativeCanvasTest, testCanvasTranslateMaximum, TestSize.Level3) {
1313    // 1. OH_Drawing_CanvasCreate
1314    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1315    // 2. OH_Drawing_CanvasTranslate with the movement distance dx in the x-axis direction being the maximum value
1316    OH_Drawing_CanvasTranslate(canvas, FLT_MAX, 10);
1317    // 3. OH_Drawing_CanvasTranslate with the movement distance dy in the y-axis direction being the maximum value
1318    OH_Drawing_CanvasTranslate(canvas, 10, FLT_MAX);
1319    // 4. Free memory
1320    OH_Drawing_CanvasDestroy(canvas);
1321}
1322
1323/*
1324 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2704
1325 * @tc.name: testCanvasTranslateInputDestroyed
1326 * @tc.desc: test for testCanvasTranslateInputDestroyed.
1327 * @tc.size  : SmallTest
1328 * @tc.type  : Function
1329 * @tc.level : Level 3
1330 */
1331HWTEST_F(DrawingNativeCanvasTest, testCanvasTranslateInputDestroyed, TestSize.Level3) {
1332    // Deprecated
1333}
1334
1335/*
1336 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2705
1337 * @tc.name: testCanvasTranslateMultipleCalls
1338 * @tc.desc: test for testCanvasTranslateMultipleCalls.
1339 * @tc.size  : SmallTest
1340 * @tc.type  : Function
1341 * @tc.level : Level 3
1342 */
1343HWTEST_F(DrawingNativeCanvasTest, testCanvasTranslateMultipleCalls, TestSize.Level3) {
1344    // 1. OH_Drawing_CanvasCreate
1345    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1346    // 2. Call OH_Drawing_CanvasTranslate 10 times, each time with different movement distances
1347    for (int i = 0; i < 10; i++) {
1348        OH_Drawing_CanvasTranslate(canvas, i * 10, i * 10);
1349        // 3. Call drawing class interface
1350        OH_Drawing_Rect *rect = OH_Drawing_RectCreate(10, 10, 100, 100);
1351        OH_Drawing_CanvasDrawRect(canvas, rect);
1352        OH_Drawing_RectDestroy(rect);
1353    }
1354    // 4. Free memory
1355    OH_Drawing_CanvasDestroy(canvas);
1356}
1357
1358/*
1359 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2800
1360 * @tc.name: testCanvasScaleNormal
1361 * @tc.desc: test for testCanvasScaleNormal.
1362 * @tc.size  : SmallTest
1363 * @tc.type  : Function
1364 * @tc.level : Level 0
1365 */
1366HWTEST_F(DrawingNativeCanvasTest, testCanvasScaleNormal, TestSize.Level0) {
1367    // 1. Create a canvas
1368    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1369
1370    // 2. Scale the canvas
1371    OH_Drawing_CanvasScale(canvas, 2.0, 2.0);
1372
1373    // 3. Call drawing class interface
1374    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(10, 10, 100, 100);
1375    OH_Drawing_CanvasDrawRect(canvas, rect);
1376    OH_Drawing_RectDestroy(rect);
1377
1378    // 4. Free memory
1379    OH_Drawing_CanvasDestroy(canvas);
1380}
1381
1382/*
1383 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2801
1384 * @tc.name: testCanvasScaleNull
1385 * @tc.desc: test for testCanvasScaleNull.
1386 * @tc.size  : SmallTest
1387 * @tc.type  : Function
1388 * @tc.level : Level 3
1389 */
1390HWTEST_F(DrawingNativeCanvasTest, testCanvasScaleNull, TestSize.Level3) {
1391    // 1. Create a canvas
1392    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1393
1394    // 2. Scale the canvas, with the first parameter being null
1395    OH_Drawing_CanvasScale(NULL, 2.0, 2.0);
1396
1397    // 3. Scale the canvas, with the second parameter being 0
1398    OH_Drawing_CanvasScale(canvas, 0, 2.0);
1399
1400    // 4. Scale the canvas, with the third parameter being 0
1401    OH_Drawing_CanvasScale(canvas, 2.0, 0);
1402
1403    // 5. Free memory
1404    OH_Drawing_CanvasDestroy(canvas);
1405}
1406
1407/*
1408 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2802
1409 * @tc.name: testCanvasScaleAbnormal
1410 * @tc.desc: test for testCanvasScaleAbnormal.
1411 * @tc.size  : SmallTest
1412 * @tc.type  : Function
1413 * @tc.level : Level 3
1414 */
1415HWTEST_F(DrawingNativeCanvasTest, testCanvasScaleAbnormal, TestSize.Level3) {
1416    // 1. Create a canvas
1417    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1418
1419    // 2. Scale the canvas, with a negative scale ratio in the x-axis
1420    OH_Drawing_CanvasScale(canvas, -2.0, 2.0);
1421
1422    // 3. Scale the canvas, with a negative scale ratio in the y-axis
1423    OH_Drawing_CanvasScale(canvas, 2.0, -2.0);
1424
1425    // 4. Free memory
1426    OH_Drawing_CanvasDestroy(canvas);
1427}
1428
1429/*
1430 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2803
1431 * @tc.name: testCanvasScaleMaximum
1432 * @tc.desc: test for testCanvasScaleMaximum.
1433 * @tc.size  : SmallTest
1434 * @tc.type  : Function
1435 * @tc.level : Level 3
1436 */
1437HWTEST_F(DrawingNativeCanvasTest, testCanvasScaleMaximum, TestSize.Level3) {
1438    // 1. Create a canvas
1439    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1440
1441    // 2. Scale the canvas, with the maximum scale ratio in the x-axis
1442    OH_Drawing_CanvasScale(canvas, DBL_MAX, 2.0);
1443
1444    // 3. Scale the canvas, with the maximum scale ratio in the y-axis
1445    OH_Drawing_CanvasScale(canvas, 2.0, DBL_MAX);
1446
1447    // 4. Free memory
1448    OH_Drawing_CanvasDestroy(canvas);
1449}
1450
1451/*
1452 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2804
1453 * @tc.name: testCanvasScaleInputDestroyed
1454 * @tc.desc: test for testCanvasScaleInputDestroyed.
1455 * @tc.size  : SmallTest
1456 * @tc.type  : Function
1457 * @tc.level : Level 3
1458 */
1459HWTEST_F(DrawingNativeCanvasTest, testCanvasScaleInputDestroyed, TestSize.Level3) {
1460    // Deprecated
1461}
1462
1463/*
1464 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2805
1465 * @tc.name: testCanvasScaleMultipleCalls
1466 * @tc.desc: test for testCanvasScaleMultipleCalls.
1467 * @tc.size  : SmallTest
1468 * @tc.type  : Function
1469 * @tc.level : Level 3
1470 */
1471HWTEST_F(DrawingNativeCanvasTest, testCanvasScaleMultipleCalls, TestSize.Level3) {
1472    // 1. Create a canvas
1473    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1474
1475    // 2. Call OH_Drawing_CanvasScale 10 times, each time with different compression ratios
1476    for (int i = 1; i <= 10; i++) {
1477        OH_Drawing_CanvasScale(canvas, i * 1.0, i * 1.0);
1478    }
1479
1480    // 3. Call drawing class interface
1481    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(10, 10, 100, 100);
1482    OH_Drawing_CanvasDrawRect(canvas, rect);
1483    OH_Drawing_RectDestroy(rect);
1484
1485    // 4. Free memory
1486    OH_Drawing_CanvasDestroy(canvas);
1487}
1488
1489} // namespace Drawing
1490} // namespace Rosen
1491} // namespace OHOS