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 
40 using namespace testing;
41 using namespace testing::ext;
42 
43 namespace OHOS {
44 namespace Rosen {
45 namespace Drawing {
46 class 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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobBuilderCreateDestroyNormal, TestSize.Level0)56 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobBuilderCreateDestroyNull, TestSize.Level3)79 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobBuilderCreateDestroyMultipleCalls, TestSize.Level3)92 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromTextNormal, TestSize.Level0)125 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromTextNull, TestSize.Level3)169 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromTextMultipleCalls, TestSize.Level3)206 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromTextAbnormal, TestSize.Level3)239 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromPosTextNormal, TestSize.Level0)264 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromPosTextNull, TestSize.Level3)289 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromPosTextMultipleCalls, TestSize.Level3)328 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromPosTextAbnormal, TestSize.Level3)358 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromStringNormal, TestSize.Level0)383 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromStringNull, TestSize.Level3)417 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromStringMultipleCalls, TestSize.Level3)449 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobCreateFromStringAbnormal, TestSize.Level3)481 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobGetBoundsNormal, TestSize.Level0)506 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobGetBoundsNull, TestSize.Level3)534 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobGetBoundsMultipleCalls, TestSize.Level3)565 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobGetBoundsAbnormal, TestSize.Level3)599 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobUniqueIDNormal, TestSize.Level0)627 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobUniqueIDNull, TestSize.Level3)650 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobUniqueIDMultipleCalls, TestSize.Level3)674 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobBuilderAllocRunPosNormal, TestSize.Level0)703 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobBuilderAllocRunPosNull, TestSize.Level3)730 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobBuilderAllocRunPosMultipleCalls, TestSize.Level3)770 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobBuilderMakeNormal, TestSize.Level0)802 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobBuilderMakeNull, TestSize.Level3)823 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobBuilderMakeMultipleCalls, TestSize.Level3)839 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobDestroyNormal, TestSize.Level0)862 HWTEST_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  */
HWTEST_F(DrawingNativeTextBlobTest, testTextBlobDestroyNull, TestSize.Level3)882 HWTEST_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