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 "drawing_bitmap.h"
19#include "drawing_brush.h"
20#include "drawing_canvas.h"
21#include "drawing_color.h"
22#include "drawing_color_filter.h"
23#include "drawing_filter.h"
24#include "drawing_font.h"
25#include "drawing_image.h"
26#include "drawing_mask_filter.h"
27#include "drawing_matrix.h"
28#include "drawing_memory_stream.h"
29#include "drawing_path.h"
30#include "drawing_pen.h"
31#include "drawing_point.h"
32#include "drawing_rect.h"
33#include "drawing_region.h"
34#include "drawing_round_rect.h"
35#include "drawing_sampling_options.h"
36#include "drawing_shader_effect.h"
37#include "drawing_text_blob.h"
38#include "drawing_typeface.h"
39
40using namespace testing;
41using namespace testing::ext;
42
43namespace OHOS {
44namespace Rosen {
45namespace Drawing {
46class DrawingNativeTextBlobTest : public testing::Test {};
47
48/*
49 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0100
50 * @tc.name: testTextBlobBuilderCreateDestroyNormal
51 * @tc.desc: test for testTextBlobBuilderCreateDestroyNormal.
52 * @tc.size  : SmallTest
53 * @tc.type  : Function
54 * @tc.level : Level 0
55 */
56HWTEST_F(DrawingNativeTextBlobTest, testTextBlobBuilderCreateDestroyNormal, TestSize.Level0) {
57    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
58    EXPECT_NE(nullptr, canvas);
59    // 1. Use OH_Drawing_TextBlobBuilderCreate and OH_Drawing_CanvasDrawTextBlob together
60    OH_Drawing_TextBlobBuilder *builder = OH_Drawing_TextBlobBuilderCreate();
61    OH_Drawing_TextBlob *textBlob = OH_Drawing_TextBlobBuilderMake(builder);
62    OH_Drawing_CanvasDrawTextBlob(canvas, textBlob, 0, 0);
63    if (0) {
64        // todo cpp crash
65        // 2. OH_Drawing_TextBlobBuilderDestroy
66        OH_Drawing_TextBlobBuilderDestroy(builder);
67    }
68    OH_Drawing_CanvasDestroy(canvas);
69}
70
71/*
72 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0101
73 * @tc.name: testTextBlobBuilderCreateDestroyNull
74 * @tc.desc: test for testTextBlobBuilderCreateDestroyNull.
75 * @tc.size  : SmallTest
76 * @tc.type  : Function
77 * @tc.level : Level 3
78 */
79HWTEST_F(DrawingNativeTextBlobTest, testTextBlobBuilderCreateDestroyNull, TestSize.Level3) {
80    // 1. OH_Drawing_TextBlobBuilderDestroy with nullptr parameter
81    OH_Drawing_TextBlobBuilderDestroy(nullptr);
82}
83
84/*
85 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0102
86 * @tc.name: testTextBlobBuilderCreateDestroyMultipleCalls
87 * @tc.desc: test for testTextBlobBuilderCreateDestroyMultipleCalls.
88 * @tc.size  : SmallTest
89 * @tc.type  : Function
90 * @tc.level : Level 3
91 */
92HWTEST_F(DrawingNativeTextBlobTest, testTextBlobBuilderCreateDestroyMultipleCalls, TestSize.Level3) {
93    OH_Drawing_TextBlobBuilder *builders[10];
94    // 1. Call OH_Drawing_TextBlobBuilderCreate 10 times
95    for (int i = 0; i < 10; i++) {
96        builders[i] = OH_Drawing_TextBlobBuilderCreate();
97        EXPECT_NE(nullptr, builders[i]);
98    }
99    // 2. Call OH_Drawing_TextBlobBuilderDestroy 10 times
100    for (int i = 0; i < 10; i++) {
101        if (0) {
102            // todo cpp crash
103            OH_Drawing_TextBlobBuilderDestroy(builders[i]);
104        }
105    }
106    // 3. Call OH_Drawing_TextBlobBuilderCreate and OH_Drawing_TextBlobBuilderDestroy alternately 10 times
107    for (int i = 0; i < 10; i++) {
108        OH_Drawing_TextBlobBuilder *builder = OH_Drawing_TextBlobBuilderCreate();
109        EXPECT_NE(nullptr, builder);
110        if (0) {
111            // todo cpp crash
112            OH_Drawing_TextBlobBuilderDestroy(builder);
113        }
114    }
115}
116
117/*
118 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0200
119 * @tc.name: testTextBlobCreateFromTextNormal
120 * @tc.desc: test for testTextBlobCreateFromTextNormal.
121 * @tc.size  : SmallTest
122 * @tc.type  : Function
123 * @tc.level : Level 0
124 */
125HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromTextNormal, TestSize.Level0) {
126    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
127    EXPECT_NE(nullptr, canvas);
128    // 1. Traverse the enumeration values of OH_Drawing_TextEncoding and use OH_Drawing_CanvasDrawTextBlob in
129    // combination
130    const char *str = "123456";
131    OH_Drawing_Font *font = OH_Drawing_FontCreate();
132    EXPECT_NE(font, nullptr);
133    OH_Drawing_Typeface *typeSurface = OH_Drawing_TypefaceCreateDefault();
134    OH_Drawing_FontSetTypeface(font, typeSurface);
135    OH_Drawing_TextEncoding encodeArray[] = {
136        TEXT_ENCODING_UTF8,
137        TEXT_ENCODING_UTF16,
138        TEXT_ENCODING_UTF32,
139        TEXT_ENCODING_GLYPH_ID,
140    };
141    for (OH_Drawing_TextEncoding encode : encodeArray) {
142        size_t byteLength = 0;
143        if (encode == TEXT_ENCODING_UTF8) {
144            byteLength = strlen(str);
145        } else if (encode == TEXT_ENCODING_UTF16) {
146            byteLength = strlen(str) * 2;
147        } else if (encode == TEXT_ENCODING_UTF32) {
148            byteLength = strlen(str) * 4;
149        } else if (encode == TEXT_ENCODING_GLYPH_ID) {
150            byteLength = strlen(str) * 16;
151        }
152        OH_Drawing_TextBlob *textBlob = OH_Drawing_TextBlobCreateFromText(str, byteLength, font, encode);
153        OH_Drawing_CanvasDrawTextBlob(canvas, textBlob, 0, 0);
154    }
155    // 2. free memory
156    OH_Drawing_FontDestroy(font);
157    OH_Drawing_TypefaceDestroy(typeSurface);
158    OH_Drawing_CanvasDestroy(canvas);
159}
160
161/*
162 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0201
163 * @tc.name: testTextBlobCreateFromTextNull
164 * @tc.desc: test for testTextBlobCreateFromTextNull.
165 * @tc.size  : SmallTest
166 * @tc.type  : Function
167 * @tc.level : Level 3
168 */
169HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromTextNull, TestSize.Level3) {
170    const char *str = "123456";
171    OH_Drawing_Font *font = OH_Drawing_FontCreate();
172    EXPECT_NE(font, nullptr);
173    OH_Drawing_Typeface *typeSurface = OH_Drawing_TypefaceCreateDefault();
174    OH_Drawing_FontSetTypeface(font, typeSurface);
175    // 1. OH_Drawing_TextBlobCreateFromText with the first parameter being nullptr, check the error code with
176    // OH_Drawing_ErrorCodeGet
177    OH_Drawing_TextBlob *textBlob1 = OH_Drawing_TextBlobCreateFromText(nullptr, strlen(str), font, TEXT_ENCODING_UTF8);
178    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
179    // 2. OH_Drawing_TextBlobCreateFromText with the second parameter being empty, check the error code with
180    // OH_Drawing_ErrorCodeGet
181    OH_Drawing_TextBlob *textBlob2 = OH_Drawing_TextBlobCreateFromText(str, 0, font, TEXT_ENCODING_UTF8);
182    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
183    // 3. OH_Drawing_TextBlobCreateFromText with the third parameter being nullptr, check the error code with
184    // OH_Drawing_ErrorCodeGet
185    OH_Drawing_TextBlob *textBlob3 = OH_Drawing_TextBlobCreateFromText(str, strlen(str), nullptr, TEXT_ENCODING_UTF8);
186    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
187    // 4. OH_Drawing_TextBlobCreateFromText with the first parameter being a string
188    OH_Drawing_TextBlob *textBlob4 = OH_Drawing_TextBlobCreateFromText("123456", 6, font, TEXT_ENCODING_UTF8);
189    // 5. Free memory
190    OH_Drawing_FontDestroy(font);
191    OH_Drawing_TypefaceDestroy(typeSurface);
192    OH_Drawing_TextBlobDestroy(textBlob1);
193    OH_Drawing_TextBlobDestroy(textBlob2);
194    OH_Drawing_TextBlobDestroy(textBlob3);
195    OH_Drawing_TextBlobDestroy(textBlob4);
196}
197
198/*
199 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0203
200 * @tc.name: testTextBlobCreateFromTextMultipleCalls
201 * @tc.desc: test for testTextBlobCreateFromTextMultipleCalls.
202 * @tc.size  : SmallTest
203 * @tc.type  : Function
204 * @tc.level : Level 3
205 */
206HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromTextMultipleCalls, TestSize.Level3) {
207    const char *strs[] = {
208        "Hello World", "你好世界", "Hello 世界", "Hello 世界123", "Hello $#@!", "繁體中文",
209    };
210    OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
211    EXPECT_NE(nullptr, canvas);
212    OH_Drawing_Font *font = OH_Drawing_FontCreate();
213    EXPECT_NE(font, nullptr);
214    OH_Drawing_Typeface *typeSurface = OH_Drawing_TypefaceCreateDefault();
215    OH_Drawing_FontSetTypeface(font, typeSurface);
216    // 1. Call OH_Drawing_TextBlobCreateFromText 10 times (passing in different types of strings with different lengths,
217    // such as Chinese, English, special characters, numbers, traditional Chinese characters, etc.) and use
218    // OH_Drawing_CanvasDrawTextBlob in combination
219    for (int i = 0; i < 10; i++) {
220        const char *str = strs[i % 6];
221        OH_Drawing_TextBlob *textBlob = OH_Drawing_TextBlobCreateFromText(str, strlen(str), font, TEXT_ENCODING_UTF8);
222        OH_Drawing_CanvasDrawTextBlob(canvas, textBlob, 0, 0);
223        OH_Drawing_TextBlobDestroy(textBlob);
224    }
225    // 2. Free memory
226    OH_Drawing_FontDestroy(font);
227    OH_Drawing_TypefaceDestroy(typeSurface);
228    OH_Drawing_CanvasDestroy(canvas);
229}
230
231/*
232 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0204
233 * @tc.name: testTextBlobCreateFromTextAbnormal
234 * @tc.desc: test for testTextBlobCreateFromTextAbnormal.
235 * @tc.size  : SmallTest
236 * @tc.type  : Function
237 * @tc.level : Level 3
238 */
239HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromTextAbnormal, TestSize.Level3) {
240    const char *str = "123456";
241    OH_Drawing_Font *font = OH_Drawing_FontCreate();
242    EXPECT_NE(font, nullptr);
243    OH_Drawing_Typeface *typeSurface = OH_Drawing_TypefaceCreateDefault();
244    OH_Drawing_FontSetTypeface(font, typeSurface);
245    // 1. OH_Drawing_TextBlobCreateFromText interface with OH_Drawing_TextEncoding out of range, check the error code
246    // with OH_Drawing_ErrorCodeGet
247    OH_Drawing_TextBlob *textBlob =
248        OH_Drawing_TextBlobCreateFromText(str, strlen(str), font, static_cast<OH_Drawing_TextEncoding>(-1));
249    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE);
250    // 2. Free memory
251    OH_Drawing_FontDestroy(font);
252    OH_Drawing_TextBlobDestroy(textBlob);
253    OH_Drawing_TypefaceDestroy(typeSurface);
254}
255
256/*
257 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0300
258 * @tc.name: testTextBlobCreateFromPosTextNormal
259 * @tc.desc: test for testTextBlobCreateFromPosTextNormal.
260 * @tc.size  : SmallTest
261 * @tc.type  : Function
262 * @tc.level : Level 0
263 */
264HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromPosTextNormal, TestSize.Level0) {
265    const char *str = "123456";
266    OH_Drawing_Font *font = OH_Drawing_FontCreate();
267    EXPECT_NE(font, nullptr);
268    OH_Drawing_Typeface *typeSurface = OH_Drawing_TypefaceCreateDefault();
269    OH_Drawing_FontSetTypeface(font, typeSurface);
270    // 1. Traverse the enumeration values of OH_Drawing_TextEncoding and use OH_Drawing_CanvasDrawTextBlob in
271    // combination
272    size_t byteLength = strlen(str);
273    int count = OH_Drawing_FontCountText(font, str, byteLength, TEXT_ENCODING_UTF8);
274    OH_Drawing_Point2D pts[count];
275    OH_Drawing_TextBlobCreateFromPosText(str, count, &pts[0], font, TEXT_ENCODING_UTF8);
276    // 2. Free memory
277    OH_Drawing_FontDestroy(font);
278    OH_Drawing_TypefaceDestroy(typeSurface);
279}
280
281/*
282 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0301
283 * @tc.name: testTextBlobCreateFromPosTextNull
284 * @tc.desc: test for testTextBlobCreateFromPosTextNull.
285 * @tc.size  : SmallTest
286 * @tc.type  : Function
287 * @tc.level : Level 3
288 */
289HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromPosTextNull, TestSize.Level3) {
290    const char *str = "123456";
291    OH_Drawing_Font *font = OH_Drawing_FontCreate();
292    EXPECT_NE(font, nullptr);
293    OH_Drawing_Typeface *typeSurface = OH_Drawing_TypefaceCreateDefault();
294    OH_Drawing_FontSetTypeface(font, typeSurface);
295    int count = OH_Drawing_FontCountText(font, str, strlen(str), TEXT_ENCODING_UTF8);
296    OH_Drawing_Point2D pts[count];
297    // 1. OH_Drawing_TextBlobCreateFromPosText with the first parameter being nullptr, check the error code with
298    // OH_Drawing_ErrorCodeGet
299    OH_Drawing_TextBlobCreateFromPosText(nullptr, strlen(str), &pts[0], font, TEXT_ENCODING_UTF8);
300    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
301    // 2. OH_Drawing_TextBlobCreateFromPosText with the second parameter being empty, check the error code with
302    // OH_Drawing_ErrorCodeGet
303    OH_Drawing_TextBlobCreateFromPosText(str, 0, &pts[0], font, TEXT_ENCODING_UTF8);
304    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
305    // 3. OH_Drawing_TextBlobCreateFromPosText with the third parameter being nullptr, check the error code with
306    // OH_Drawing_ErrorCodeGet
307    OH_Drawing_TextBlobCreateFromPosText(str, strlen(str), nullptr, font, TEXT_ENCODING_UTF8);
308    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
309    // 4. OH_Drawing_TextBlobCreateFromPosText with the first parameter being a string
310    OH_Drawing_TextBlobCreateFromPosText("123456", 6, &pts[0], font, TEXT_ENCODING_UTF8);
311    // 5. OH_Drawing_TextBlobCreateFromPosText with the fourth parameter being nullptr, check the error code with
312    // OH_Drawing_ErrorCodeGet
313    OH_Drawing_TextBlobCreateFromPosText(str, strlen(str), &pts[0], nullptr, TEXT_ENCODING_UTF8);
314    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
315    // 6. Free memory
316    OH_Drawing_FontDestroy(font);
317    OH_Drawing_TypefaceDestroy(typeSurface);
318}
319
320/*
321 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0302
322 * @tc.name: testTextBlobCreateFromPosTextMultipleCalls
323 * @tc.desc: test for testTextBlobCreateFromPosTextMultipleCalls.
324 * @tc.size  : SmallTest
325 * @tc.type  : Function
326 * @tc.level : Level 3
327 */
328HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromPosTextMultipleCalls, TestSize.Level3) {
329    const char *strs[] = {
330        "Hello World", "你好世界", "Hello 世界", "Hello 世界123", "Hello $#@!", "繁體中文",
331    };
332    OH_Drawing_Font *font = OH_Drawing_FontCreate();
333    EXPECT_NE(font, nullptr);
334    OH_Drawing_Typeface *typeSurface = OH_Drawing_TypefaceCreateDefault();
335    OH_Drawing_FontSetTypeface(font, typeSurface);
336    // 1. Call OH_Drawing_TextBlobCreateFromPosText 10 times (passing in different types of strings with different
337    // lengths, such as Chinese, English, special characters, numbers, traditional Chinese characters, etc.) and use
338    // OH_Drawing_CanvasDrawTextBlob in combination
339    for (int i = 0; i < 10; i++) {
340        const char *str = strs[i % 6];
341        int count = OH_Drawing_FontCountText(font, str, strlen(str), TEXT_ENCODING_UTF8);
342        OH_Drawing_Point2D pts[count];
343        OH_Drawing_TextBlobCreateFromPosText(str, strlen(str), &pts[0], font, TEXT_ENCODING_UTF8);
344    }
345    // 2. Free memory
346    OH_Drawing_FontDestroy(font);
347    OH_Drawing_TypefaceDestroy(typeSurface);
348}
349
350/*
351 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0303
352 * @tc.name: testTextBlobCreateFromPosTextAbnormal
353 * @tc.desc: test for testTextBlobCreateFromPosTextAbnormal.
354 * @tc.size  : SmallTest
355 * @tc.type  : Function
356 * @tc.level : Level 3
357 */
358HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromPosTextAbnormal, TestSize.Level3) {
359    const char *str = "123456";
360    OH_Drawing_Font *font = OH_Drawing_FontCreate();
361    EXPECT_NE(font, nullptr);
362    OH_Drawing_Typeface *typeSurface = OH_Drawing_TypefaceCreateDefault();
363    OH_Drawing_FontSetTypeface(font, typeSurface);
364    int count = OH_Drawing_FontCountText(font, str, strlen(str), TEXT_ENCODING_UTF8);
365    OH_Drawing_Point2D pts[count];
366    // 1. Call OH_Drawing_TextBlobCreateFromPosText interface with OH_Drawing_TextEncoding out of range, check the error
367    // code with OH_Drawing_ErrorCodeGet
368    OH_Drawing_TextBlobCreateFromPosText(str, strlen(str), &pts[0], font, static_cast<OH_Drawing_TextEncoding>(-1));
369    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE);
370    // 2. Free memory
371    OH_Drawing_FontDestroy(font);
372    OH_Drawing_TypefaceDestroy(typeSurface);
373}
374
375/*
376 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0400
377 * @tc.name: testTextBlobCreateFromStringNormal
378 * @tc.desc: test for testTextBlobCreateFromStringNormal.
379 * @tc.size  : SmallTest
380 * @tc.type  : Function
381 * @tc.level : Level 0
382 */
383HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromStringNormal, TestSize.Level0) {
384    const char *str = "123456";
385    OH_Drawing_Font *font = OH_Drawing_FontCreate();
386    EXPECT_NE(font, nullptr);
387    OH_Drawing_Typeface *typeSurface = OH_Drawing_TypefaceCreateDefault();
388    OH_Drawing_FontSetTypeface(font, typeSurface);
389    OH_Drawing_TextEncoding encodeArray[] = {
390        TEXT_ENCODING_UTF8,
391        TEXT_ENCODING_UTF16,
392        TEXT_ENCODING_UTF32,
393        TEXT_ENCODING_GLYPH_ID,
394    };
395    // 1. Traverse the enumeration values of OH_Drawing_TextEncoding and use OH_Drawing_CanvasDrawTextBlob in
396    // combination
397    for (OH_Drawing_TextEncoding encode : encodeArray) {
398        OH_Drawing_TextBlob *textBlob = OH_Drawing_TextBlobCreateFromString(str, font, encode);
399        OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
400        EXPECT_NE(nullptr, canvas);
401        OH_Drawing_CanvasDrawTextBlob(canvas, textBlob, 0, 0);
402        OH_Drawing_CanvasDestroy(canvas);
403    }
404    // 2. Free memory
405    OH_Drawing_FontDestroy(font);
406    OH_Drawing_TypefaceDestroy(typeSurface);
407}
408
409/*
410 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0401
411 * @tc.name: testTextBlobCreateFromStringNull
412 * @tc.desc: test for testTextBlobCreateFromStringNull.
413 * @tc.size  : SmallTest
414 * @tc.type  : Function
415 * @tc.level : Level 3
416 */
417HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromStringNull, TestSize.Level3) {
418    const char *str = "123456";
419    OH_Drawing_Font *font = OH_Drawing_FontCreate();
420    EXPECT_NE(font, nullptr);
421    OH_Drawing_Typeface *typeSurface = OH_Drawing_TypefaceCreateDefault();
422    OH_Drawing_FontSetTypeface(font, typeSurface);
423    // 1. OH_Drawing_TextBlobCreateFromString with the first parameter being nullptr, check the error code with
424    // OH_Drawing_ErrorCodeGet
425    OH_Drawing_TextBlob *textBlob1 = OH_Drawing_TextBlobCreateFromString(nullptr, font, TEXT_ENCODING_UTF8);
426    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
427    // 2. OH_Drawing_TextBlobCreateFromString with the second parameter being nullptr, check the error code with
428    // OH_Drawing_ErrorCodeGet
429    OH_Drawing_TextBlob *textBlob2 = OH_Drawing_TextBlobCreateFromString(str, nullptr, TEXT_ENCODING_UTF8);
430    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
431    // 3. OH_Drawing_TextBlobCreateFromPosText with the first parameter being a string
432    OH_Drawing_TextBlob *textBlob3 = OH_Drawing_TextBlobCreateFromString("123456", font, TEXT_ENCODING_UTF8);
433    // 4. Free memory
434    OH_Drawing_FontDestroy(font);
435    OH_Drawing_TextBlobDestroy(textBlob1);
436    OH_Drawing_TextBlobDestroy(textBlob2);
437    OH_Drawing_TextBlobDestroy(textBlob3);
438    OH_Drawing_TypefaceDestroy(typeSurface);
439}
440
441/*
442 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0402
443 * @tc.name: testTextBlobCreateFromStringMultipleCalls
444 * @tc.desc: test for testTextBlobCreateFromStringMultipleCalls.
445 * @tc.size  : SmallTest
446 * @tc.type  : Function
447 * @tc.level : Level 3
448 */
449HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromStringMultipleCalls, TestSize.Level3) {
450    const char *strs[] = {
451        "Hello World", "你好世界", "Hello 世界", "Hello 世界123", "Hello $#@!", "繁體中文",
452    };
453    OH_Drawing_Font *font = OH_Drawing_FontCreate();
454    EXPECT_NE(font, nullptr);
455    OH_Drawing_Typeface *typeSurface = OH_Drawing_TypefaceCreateDefault();
456    OH_Drawing_FontSetTypeface(font, typeSurface);
457    // 1. Call OH_Drawing_TextBlobCreateFromString 10 times (passing in strings of different lengths and types, such as
458    // Chinese, English, special characters, numbers, traditional Chinese characters, etc.) and use
459    // OH_Drawing_CanvasDrawTextBlob in combination
460    for (int i = 0; i < 10; i++) {
461        const char *str = strs[i % 6];
462        OH_Drawing_TextBlob *textBlob = OH_Drawing_TextBlobCreateFromString(str, font, TEXT_ENCODING_UTF8);
463        OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
464        EXPECT_NE(nullptr, canvas);
465        OH_Drawing_CanvasDrawTextBlob(canvas, textBlob, 0, 0);
466        OH_Drawing_CanvasDestroy(canvas);
467    }
468    // 2. Free memory
469    OH_Drawing_FontDestroy(font);
470    OH_Drawing_TypefaceDestroy(typeSurface);
471}
472
473/*
474 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0403
475 * @tc.name: testTextBlobCreateFromStringAbnormal
476 * @tc.desc: test for testTextBlobCreateFromStringAbnormal.
477 * @tc.size  : SmallTest
478 * @tc.type  : Function
479 * @tc.level : Level 3
480 */
481HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromStringAbnormal, TestSize.Level3) {
482    const char *str = "123456";
483    OH_Drawing_Font *font = OH_Drawing_FontCreate();
484    EXPECT_NE(font, nullptr);
485    OH_Drawing_Typeface *typeSurface = OH_Drawing_TypefaceCreateDefault();
486    OH_Drawing_FontSetTypeface(font, typeSurface);
487    // 1. Call OH_Drawing_TextBlobCreateFromString interface with OH_Drawing_TextEncoding out of range, check the error
488    // code with OH_Drawing_ErrorCodeGet
489    OH_Drawing_TextBlob *textBlob =
490        OH_Drawing_TextBlobCreateFromString(str, font, static_cast<OH_Drawing_TextEncoding>(-1));
491    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE);
492    // 2. Free memory
493    OH_Drawing_FontDestroy(font);
494    OH_Drawing_TextBlobDestroy(textBlob);
495    OH_Drawing_TypefaceDestroy(typeSurface);
496}
497
498/*
499 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0500
500 * @tc.name: testTextBlobGetBoundsNormal
501 * @tc.desc: test for testTextBlobGetBoundsNormal.
502 * @tc.size  : SmallTest
503 * @tc.type  : Function
504 * @tc.level : Level 0
505 */
506HWTEST_F(DrawingNativeTextBlobTest, testTextBlobGetBoundsNormal, TestSize.Level0) {
507    // 1、创建OH_Drawing_TextBlob、OH_Drawing_Rect
508    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 0, 0);
509    EXPECT_NE(rect, nullptr);
510    OH_Drawing_Font *font = OH_Drawing_FontCreate();
511    EXPECT_NE(font, nullptr);
512    const char *str = "123456";
513    OH_Drawing_TextBlob *textBlob =
514        OH_Drawing_TextBlobCreateFromString(str, font, OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
515    // 2. Call OH_Drawing_TextBlobGetBounds
516    OH_Drawing_TextBlobGetBounds(textBlob, rect);
517    float left = OH_Drawing_RectGetLeft(rect);
518    float right = OH_Drawing_RectGetRight(rect);
519    EXPECT_EQ(right - left > 0, true);
520    // 3. Free memory
521    OH_Drawing_RectDestroy(rect);
522    OH_Drawing_FontDestroy(font);
523    OH_Drawing_TextBlobDestroy(textBlob);
524}
525
526/*
527 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0501
528 * @tc.name: testTextBlobGetBoundsNull
529 * @tc.desc: test for testTextBlobGetBoundsNull.
530 * @tc.size  : SmallTest
531 * @tc.type  : Function
532 * @tc.level : Level 3
533 */
534HWTEST_F(DrawingNativeTextBlobTest, testTextBlobGetBoundsNull, TestSize.Level3) {
535    // 1. Create OH_Drawing_TextBlob and OH_Drawing_Rect
536    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 0, 0);
537    EXPECT_NE(rect, nullptr);
538    OH_Drawing_Font *font = OH_Drawing_FontCreate();
539    EXPECT_NE(font, nullptr);
540    const char *str = "123456";
541    OH_Drawing_TextBlob *textBlob =
542        OH_Drawing_TextBlobCreateFromString(str, font, OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
543    // 2. Pass nullptr as the first parameter to OH_Drawing_TextBlobGetBounds and check the error code with
544    // OH_Drawing_ErrorCodeGet
545    OH_Drawing_TextBlobGetBounds(nullptr, rect);
546    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
547    // 3. Pass nullptr as the second parameter to OH_Drawing_TextBlobGetBounds and check the error code with
548    // OH_Drawing_ErrorCodeGet
549    OH_Drawing_TextBlobGetBounds(textBlob, nullptr);
550    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
551    // 4. Free memory
552    OH_Drawing_RectDestroy(rect);
553    OH_Drawing_FontDestroy(font);
554    OH_Drawing_TextBlobDestroy(textBlob);
555}
556
557/*
558 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0502
559 * @tc.name: testTextBlobGetBoundsMultipleCalls
560 * @tc.desc: test for testTextBlobGetBoundsMultipleCalls.
561 * @tc.size  : SmallTest
562 * @tc.type  : Function
563 * @tc.level : Level 3
564 */
565HWTEST_F(DrawingNativeTextBlobTest, testTextBlobGetBoundsMultipleCalls, TestSize.Level3) {
566    // 1. Create OH_Drawing_TextBlob and OH_Drawing_Rect
567    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 0, 0);
568    EXPECT_NE(rect, nullptr);
569    OH_Drawing_Font *font = OH_Drawing_FontCreate();
570    EXPECT_NE(font, nullptr);
571    // 2. Call OH_Drawing_TextBlobGetBounds 10 times (passing in strings of different lengths and types, such as
572    // Chinese, English, special characters, numbers, traditional Chinese characters, etc.)
573    const char *strs[] = {
574        "Hello World", "你好世界", "Hello 世界", "Hello 世界123", "Hello $#@!", "繁體中文",
575    };
576    for (int i = 0; i < 10; i++) {
577        const char *str = strs[i % 6];
578        OH_Drawing_TextBlob *textBlob =
579            OH_Drawing_TextBlobCreateFromString(str, font, OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
580        OH_Drawing_TextBlobGetBounds(textBlob, rect);
581        float left = OH_Drawing_RectGetLeft(rect);
582        float right = OH_Drawing_RectGetRight(rect);
583        EXPECT_EQ(right - left > 0, true);
584        OH_Drawing_TextBlobDestroy(textBlob);
585    }
586    // 3. Free memory
587    OH_Drawing_RectDestroy(rect);
588    OH_Drawing_FontDestroy(font);
589}
590
591/*
592 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0503
593 * @tc.name: testTextBlobGetBoundsAbnormal
594 * @tc.desc: test for testTextBlobGetBoundsAbnormal.
595 * @tc.size  : SmallTest
596 * @tc.type  : Function
597 * @tc.level : Level 3
598 */
599HWTEST_F(DrawingNativeTextBlobTest, testTextBlobGetBoundsAbnormal, TestSize.Level3) {
600    // 1. Create OH_Drawing_TextBlob and OH_Drawing_Rect
601    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(-1, -1, -1, -1);
602    EXPECT_NE(rect, nullptr);
603    OH_Drawing_Font *font = OH_Drawing_FontCreate();
604    EXPECT_NE(font, nullptr);
605    const char *str = "123456";
606    OH_Drawing_TextBlob *textBlob =
607        OH_Drawing_TextBlobCreateFromString(str, font, OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
608    // 2. Call OH_Drawing_TextBlobGetBounds with rect initialized with negative values
609    OH_Drawing_TextBlobGetBounds(textBlob, rect);
610    float left = OH_Drawing_RectGetLeft(rect);
611    float right = OH_Drawing_RectGetRight(rect);
612    EXPECT_EQ(right - left > 0, true);
613    // 3. Free memory
614    OH_Drawing_RectDestroy(rect);
615    OH_Drawing_FontDestroy(font);
616    OH_Drawing_TextBlobDestroy(textBlob);
617}
618
619/*
620 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0600
621 * @tc.name: testTextBlobUniqueIDNormal
622 * @tc.desc: test for testTextBlobUniqueIDNormal.
623 * @tc.size  : SmallTest
624 * @tc.type  : Function
625 * @tc.level : Level 0
626 */
627HWTEST_F(DrawingNativeTextBlobTest, testTextBlobUniqueIDNormal, TestSize.Level0) {
628    // 1. Create OH_Drawing_TextBlob
629    OH_Drawing_Font *font = OH_Drawing_FontCreate();
630    EXPECT_NE(font, nullptr);
631    const char *str = "123456";
632    OH_Drawing_TextBlob *textBlob =
633        OH_Drawing_TextBlobCreateFromString(str, font, OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
634    // 2. Call OH_Drawing_TextBlobUniqueID
635    uint32_t ret = OH_Drawing_TextBlobUniqueID(textBlob);
636    EXPECT_EQ(ret > 0, true);
637    // 3. Free memory
638    OH_Drawing_FontDestroy(font);
639    OH_Drawing_TextBlobDestroy(textBlob);
640}
641
642/*
643 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0601
644 * @tc.name: testTextBlobUniqueIDNull
645 * @tc.desc: test for testTextBlobUniqueIDNull.
646 * @tc.size  : SmallTest
647 * @tc.type  : Function
648 * @tc.level : Level 3
649 */
650HWTEST_F(DrawingNativeTextBlobTest, testTextBlobUniqueIDNull, TestSize.Level3) {
651    // 1. Create OH_Drawing_TextBlob
652    OH_Drawing_Font *font = OH_Drawing_FontCreate();
653    EXPECT_NE(font, nullptr);
654    const char *str = "123456";
655    OH_Drawing_TextBlob *textBlob =
656        OH_Drawing_TextBlobCreateFromString(str, font, OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
657    // 2. Pass nullptr as the parameter to OH_Drawing_TextBlobUniqueID and check the error code with
658    // OH_Drawing_ErrorCodeGet
659    OH_Drawing_TextBlobUniqueID(nullptr);
660    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
661    // 3. Free memory
662    OH_Drawing_FontDestroy(font);
663    OH_Drawing_TextBlobDestroy(textBlob);
664}
665
666/*
667 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0602
668 * @tc.name: testTextBlobUniqueIDMultipleCalls
669 * @tc.desc: test for testTextBlobUniqueIDMultipleCalls.
670 * @tc.size  : SmallTest
671 * @tc.type  : Function
672 * @tc.level : Level 3
673 */
674HWTEST_F(DrawingNativeTextBlobTest, testTextBlobUniqueIDMultipleCalls, TestSize.Level3) {
675    // 1. Create OH_Drawing_TextBlob
676    OH_Drawing_Font *font = OH_Drawing_FontCreate();
677    EXPECT_NE(font, nullptr);
678    const char *strs[] = {
679        "Hello World", "你好世界", "Hello 世界", "Hello 世界123", "Hello $#@!", "繁體中文",
680    };
681    // 2. Call OH_Drawing_TextBlobUniqueID 10 times (passing in strings of different lengths and types, such as Chinese,
682    // English, special characters, numbers, traditional Chinese characters, etc.)
683    for (int i = 0; i < 10; i++) {
684        const char *str = strs[i % 6];
685        OH_Drawing_TextBlob *textBlob =
686            OH_Drawing_TextBlobCreateFromString(str, font, OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
687        uint32_t ret = OH_Drawing_TextBlobUniqueID(textBlob);
688        EXPECT_EQ(ret > 0, true);
689        OH_Drawing_TextBlobDestroy(textBlob);
690    }
691    // 3. Free memory
692    OH_Drawing_FontDestroy(font);
693}
694
695/*
696 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0700
697 * @tc.name: testTextBlobBuilderAllocRunPosNormal
698 * @tc.desc: test for testTextBlobBuilderAllocRunPosNormal.
699 * @tc.size  : SmallTest
700 * @tc.type  : Function
701 * @tc.level : Level 0
702 */
703HWTEST_F(DrawingNativeTextBlobTest, testTextBlobBuilderAllocRunPosNormal, TestSize.Level0) {
704    // 1. Create OH_Drawing_TextBlobBuilder, OH_Drawing_Font, OH_Drawing_Rect
705    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 0, 0);
706    EXPECT_NE(rect, nullptr);
707    OH_Drawing_Font *font = OH_Drawing_FontCreate();
708    EXPECT_NE(font, nullptr);
709    OH_Drawing_TextBlobBuilder *builder = OH_Drawing_TextBlobBuilderCreate();
710    // 2. OH_Drawing_TextBlobBuilderAllocRunPos
711    const OH_Drawing_RunBuffer *runBuffer = OH_Drawing_TextBlobBuilderAllocRunPos(builder, font, 9, rect);
712    EXPECT_NE(runBuffer, nullptr);
713    // 3. Free memory
714    OH_Drawing_RectDestroy(rect);
715    OH_Drawing_FontDestroy(font);
716    if (0) {
717        // todo cpp crash
718        OH_Drawing_TextBlobBuilderDestroy(builder);
719    }
720}
721
722/*
723 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0701
724 * @tc.name: testTextBlobBuilderAllocRunPosNull
725 * @tc.desc: test for testTextBlobBuilderAllocRunPosNull.
726 * @tc.size  : SmallTest
727 * @tc.type  : Function
728 * @tc.level : Level 3
729 */
730HWTEST_F(DrawingNativeTextBlobTest, testTextBlobBuilderAllocRunPosNull, TestSize.Level3) {
731    // 1. Create OH_Drawing_TextBlobBuilder, OH_Drawing_Font, OH_Drawing_Rect
732    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 0, 0);
733    EXPECT_NE(rect, nullptr);
734    OH_Drawing_Font *font = OH_Drawing_FontCreate();
735    EXPECT_NE(font, nullptr);
736    OH_Drawing_TextBlobBuilder *builder = OH_Drawing_TextBlobBuilderCreate();
737    // 2. Call OH_Drawing_TextBlobBuilderAllocRunPos with the first parameter as nullptr and check the error code with
738    // OH_Drawing_ErrorCodeGet
739    OH_Drawing_TextBlobBuilderAllocRunPos(nullptr, font, 9, rect);
740    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
741    // 3. Call OH_Drawing_TextBlobBuilderAllocRunPos with the second parameter as nullptr and check the error code with
742    // OH_Drawing_ErrorCodeGet
743    OH_Drawing_TextBlobBuilderAllocRunPos(builder, nullptr, 9, rect);
744    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
745    // 4. Call OH_Drawing_TextBlobBuilderAllocRunPos with the third parameter as nullptr and check the error code with
746    // OH_Drawing_ErrorCodeGet
747    OH_Drawing_TextBlobBuilderAllocRunPos(builder, font, 0, rect);
748    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
749    // 5. Call OH_Drawing_TextBlobBuilderAllocRunPos with the fourth parameter as nullptr and check the error code with
750    // OH_Drawing_ErrorCodeGet
751    OH_Drawing_TextBlobBuilderAllocRunPos(builder, font, 9, nullptr);
752    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
753    // 6. Free memory
754    OH_Drawing_RectDestroy(rect);
755    OH_Drawing_FontDestroy(font);
756    if (0) {
757        // todo cpp crash
758        OH_Drawing_TextBlobBuilderDestroy(builder);
759    }
760}
761
762/*
763 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0702
764 * @tc.name: testTextBlobBuilderAllocRunPosMultipleCalls
765 * @tc.desc: test for testTextBlobBuilderAllocRunPosMultipleCalls.
766 * @tc.size  : SmallTest
767 * @tc.type  : Function
768 * @tc.level : Level 3
769 */
770HWTEST_F(DrawingNativeTextBlobTest, testTextBlobBuilderAllocRunPosMultipleCalls, TestSize.Level3) {
771    OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 0, 0);
772    EXPECT_NE(rect, nullptr);
773    OH_Drawing_Font *font = OH_Drawing_FontCreate();
774    EXPECT_NE(font, nullptr);
775    OH_Drawing_TextBlobBuilder *builder = OH_Drawing_TextBlobBuilderCreate();
776    // 1. Call OH_Drawing_TextBlobBuilderAllocRunPos 10 times
777    for (int i = 0; i < 10; i++) {
778        const OH_Drawing_RunBuffer *runBuffer = OH_Drawing_TextBlobBuilderAllocRunPos(builder, font, 9, rect);
779        EXPECT_NE(runBuffer, nullptr);
780    }
781    // 2. Call OH_Drawing_TextBlobBuilderMake and then call OH_Drawing_TextBlobBuilderAllocRunPos again
782    OH_Drawing_TextBlobBuilderMake(builder);
783    const OH_Drawing_RunBuffer *runBuffer = OH_Drawing_TextBlobBuilderAllocRunPos(builder, font, 9, rect);
784    EXPECT_NE(runBuffer, nullptr);
785    // 3. Free memory
786    OH_Drawing_RectDestroy(rect);
787    OH_Drawing_FontDestroy(font);
788    if (0) {
789        // todo cpp crash
790        OH_Drawing_TextBlobBuilderDestroy(builder);
791    }
792}
793
794/*
795 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0800
796 * @tc.name: testTextBlobBuilderMakeNormal
797 * @tc.desc: test for testTextBlobBuilderMakeNormal.
798 * @tc.size  : SmallTest
799 * @tc.type  : Function
800 * @tc.level : Level 0
801 */
802HWTEST_F(DrawingNativeTextBlobTest, testTextBlobBuilderMakeNormal, TestSize.Level0) {
803    // 1. Create OH_Drawing_TextBlobBuilder
804    OH_Drawing_TextBlobBuilder *builder = OH_Drawing_TextBlobBuilderCreate();
805    // 2. Call OH_Drawing_TextBlobBuilderMake
806    OH_Drawing_TextBlob *textBlob = OH_Drawing_TextBlobBuilderMake(builder);
807    // 3. Free memory
808    OH_Drawing_TextBlobDestroy(textBlob);
809    if (0) {
810        // todo cpp crash
811        OH_Drawing_TextBlobBuilderDestroy(builder);
812    }
813}
814
815/*
816 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0801
817 * @tc.name: testTextBlobBuilderMakeNull
818 * @tc.desc: test for testTextBlobBuilderMakeNull.
819 * @tc.size  : SmallTest
820 * @tc.type  : Function
821 * @tc.level : Level 3
822 */
823HWTEST_F(DrawingNativeTextBlobTest, testTextBlobBuilderMakeNull, TestSize.Level3) {
824    // 1. Call OH_Drawing_TextBlobBuilderMake with nullptr as the parameter and check the error code with
825    // OH_Drawing_ErrorCodeGet
826    OH_Drawing_TextBlobBuilderMake(nullptr);
827    // 1. No crash, error code returns OH_DRAWING_ERROR_INVALID_PARAMETER
828    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
829}
830
831/*
832 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0802
833 * @tc.name: testTextBlobBuilderMakeMultipleCalls
834 * @tc.desc: test for testTextBlobBuilderMakeMultipleCalls.
835 * @tc.size  : SmallTest
836 * @tc.type  : Function
837 * @tc.level : Level 3
838 */
839HWTEST_F(DrawingNativeTextBlobTest, testTextBlobBuilderMakeMultipleCalls, TestSize.Level3) {
840    // 1. Create OH_Drawing_TextBlobBuilder
841    OH_Drawing_TextBlobBuilder *builder = OH_Drawing_TextBlobBuilderCreate();
842    // 2. Call OH_Drawing_TextBlobBuilderMake 10 times
843    for (int i = 0; i < 10; i++) {
844        OH_Drawing_TextBlob *textBlob = OH_Drawing_TextBlobBuilderMake(builder);
845        OH_Drawing_TextBlobDestroy(textBlob);
846    }
847    // 3. Free memory
848    if (0) {
849        // todo cpp crash
850        OH_Drawing_TextBlobBuilderDestroy(builder);
851    }
852}
853
854/*
855 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0800
856 * @tc.name: testTextBlobDestroyNormal
857 * @tc.desc: test for testTextBlobDestroyNormal.
858 * @tc.size  : SmallTest
859 * @tc.type  : Function
860 * @tc.level : Level 0
861 */
862HWTEST_F(DrawingNativeTextBlobTest, testTextBlobDestroyNormal, TestSize.Level0) {
863    const char *str = "123456";
864    OH_Drawing_Font *font = OH_Drawing_FontCreate();
865    EXPECT_NE(font, nullptr);
866    OH_Drawing_Typeface *typeSurface = OH_Drawing_TypefaceCreateDefault();
867    OH_Drawing_FontSetTypeface(font, typeSurface);
868    // 1. Create OH_Drawing_TextBlob
869    OH_Drawing_TextBlob *textBlob = OH_Drawing_TextBlobCreateFromString(str, font, TEXT_ENCODING_UTF8);
870    // 2. OH_Drawing_TextBlobDestroy
871    OH_Drawing_TextBlobDestroy(textBlob);
872}
873
874/*
875 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_TEXTBLOB_0801
876 * @tc.name: testTextBlobDestroyNull
877 * @tc.desc: test for testTextBlobDestroyNull.
878 * @tc.size  : SmallTest
879 * @tc.type  : Function
880 * @tc.level : Level 3
881 */
882HWTEST_F(DrawingNativeTextBlobTest, testTextBlobDestroyNull, TestSize.Level3) {
883    // 1. OH_Drawing_TextBlobDestroy with null parameter
884    OH_Drawing_TextBlobDestroy(nullptr);
885}
886
887} // namespace Drawing
888} // namespace Rosen
889} // namespace OHOS