1 /*
2  * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, Hardware
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "gtest/gtest.h"
17 #include "drawing_brush.h"
18 #include "drawing_font.h"
19 #include "drawing_point.h"
20 #include "drawing_text_typography.h"
21 #include "drawing_font_collection.h"
22 
23 using namespace testing;
24 using namespace testing::ext;
25 
26 namespace OHOS {
27 namespace Rosen {
28 namespace Drawing {
29 class NativeFontTest : public testing::Test {
30 public:
31     static void SetUpTestCase();
32     static void TearDownTestCase();
33     void SetUp() override;
34     void TearDown() override;
35 };
36 
SetUpTestCase()37 void NativeFontTest::SetUpTestCase() {}
TearDownTestCase()38 void NativeFontTest::TearDownTestCase() {}
SetUp()39 void NativeFontTest::SetUp() {}
TearDown()40 void NativeFontTest::TearDown() {}
41 
42 /*
43  * @tc.name: NativeFontTest_GetMetrics001
44  * @tc.desc: test for GetMetrics.
45  * @tc.size  : MediumTest
46  * @tc.type  : Function
47  * @tc.level : Level 1
48  */
HWTEST_F(NativeFontTest, NativeFontTest_GetMetrics001, TestSize.Level1)49 HWTEST_F(NativeFontTest, NativeFontTest_GetMetrics001, TestSize.Level1)
50 {
51     OH_Drawing_Font* font = OH_Drawing_FontCreate();
52     EXPECT_NE(font, nullptr);
53     OH_Drawing_Font_Metrics cFontMetrics;
54     EXPECT_TRUE(OH_Drawing_FontGetMetrics(font, &cFontMetrics) >= 0);
55     EXPECT_TRUE(OH_Drawing_FontGetMetrics(font, nullptr) < 0);
56     EXPECT_TRUE(OH_Drawing_FontGetMetrics(nullptr, nullptr) < 0);
57     OH_Drawing_FontDestroy(font);
58 }
59 
60 /*
61  * @tc.name: NativeFontTest_IsAndSetBaselineSnap002
62  * @tc.desc: test for SetBaselineSnap and IsBaselineSnap.
63  * @tc.size  : MediumTest
64  * @tc.type  : Function
65  * @tc.level : Level 1
66  */
HWTEST_F(NativeFontTest, NativeFontTest_IsAndSetBaselineSnap002, TestSize.Level1)67 HWTEST_F(NativeFontTest, NativeFontTest_IsAndSetBaselineSnap002, TestSize.Level1)
68 {
69     OH_Drawing_Font* font = OH_Drawing_FontCreate();
70     EXPECT_NE(font, nullptr);
71     OH_Drawing_FontSetBaselineSnap(nullptr, true);
72     EXPECT_EQ(OH_Drawing_FontIsBaselineSnap(nullptr), false);
73     OH_Drawing_FontSetBaselineSnap(nullptr, false);
74     EXPECT_EQ(OH_Drawing_FontIsBaselineSnap(nullptr), false);
75     OH_Drawing_FontSetBaselineSnap(font, true);
76     EXPECT_EQ(OH_Drawing_FontIsBaselineSnap(font), true);
77     OH_Drawing_FontSetBaselineSnap(font, false);
78     EXPECT_EQ(OH_Drawing_FontIsBaselineSnap(font), false);
79     OH_Drawing_FontDestroy(font);
80 }
81 
82 /*
83  * @tc.name: NativeFontTest_IsAndSetSubpixel003
84  * @tc.desc: test for SetSubpixel and IsSubpixel.
85  * @tc.size  : MediumTest
86  * @tc.type  : Function
87  * @tc.level : Level 1
88  */
HWTEST_F(NativeFontTest, NativeFontTest_IsAndSetSubpixel003, TestSize.Level1)89 HWTEST_F(NativeFontTest, NativeFontTest_IsAndSetSubpixel003, TestSize.Level1)
90 {
91     OH_Drawing_Font* font = OH_Drawing_FontCreate();
92     EXPECT_NE(font, nullptr);
93     OH_Drawing_FontSetSubpixel(nullptr, false);
94     EXPECT_EQ(OH_Drawing_FontIsSubpixel(nullptr), false);
95     OH_Drawing_FontSetSubpixel(nullptr, true);
96     EXPECT_EQ(OH_Drawing_FontIsSubpixel(nullptr), false);
97     OH_Drawing_FontSetSubpixel(font, true);
98     EXPECT_EQ(OH_Drawing_FontIsSubpixel(font), true);
99     OH_Drawing_FontSetSubpixel(font, false);
100     EXPECT_EQ(OH_Drawing_FontIsSubpixel(font), false);
101     OH_Drawing_FontDestroy(font);
102 }
103 
104 /*
105  * @tc.name: NativeFontTest_TextToGlyphs004
106  * @tc.desc: test for TextToGlyphs.
107  * @tc.size  : MediumTest
108  * @tc.type  : Function
109  * @tc.level : Level 1
110  */
HWTEST_F(NativeFontTest, NativeFontTest_TextToGlyphs004, TestSize.Level1)111 HWTEST_F(NativeFontTest, NativeFontTest_TextToGlyphs004, TestSize.Level1)
112 {
113     OH_Drawing_Font* font = OH_Drawing_FontCreate();
114     OH_Drawing_FontSetTextSize(font, 100); // 100 means font text size
115     EXPECT_NE(font, nullptr);
116     const char *str = "hello world";
117     uint32_t count = 0;
118     count = OH_Drawing_FontCountText(font, str, strlen(str), OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
119     EXPECT_EQ(11, count); // 11 means str length
120 
121     uint16_t glyphs[50] = {0}; // 50 means glyphs array number
122     int glyphsCount = 0;
123     glyphsCount = OH_Drawing_FontTextToGlyphs(font, str, 0,
124         OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8, glyphs, 0);
125     EXPECT_EQ(0, glyphsCount);
126 
127     glyphsCount = OH_Drawing_FontTextToGlyphs(font, str, strlen(str),
128         OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8, glyphs, count);
129     EXPECT_EQ(11, glyphsCount); // 11 means glyphsCount
130 
131     float widths[50] = {0.f}; // 50 means widths array number
132     OH_Drawing_FontGetWidths(font, glyphs, glyphsCount, widths);
133     EXPECT_EQ(58.0, widths[0]); // 58.0 means glyphs[0] width
134     OH_Drawing_FontDestroy(font);
135 }
136 
137 /*
138  * @tc.name: NativeFontTest_SetAndGetScaleX005
139  * @tc.desc: test for SetAndGetScaleX.
140  * @tc.size  : MediumTest
141  * @tc.type  : Function
142  * @tc.level : Level 1
143  */
HWTEST_F(NativeFontTest, NativeFontTest_SetAndGetScaleX005, TestSize.Level1)144 HWTEST_F(NativeFontTest, NativeFontTest_SetAndGetScaleX005, TestSize.Level1)
145 {
146     OH_Drawing_Font* font = OH_Drawing_FontCreate();
147     EXPECT_NE(font, nullptr);
148     OH_Drawing_FontSetScaleX(nullptr, 2);
149     EXPECT_TRUE(OH_Drawing_FontGetScaleX(nullptr) == -1);
150     EXPECT_TRUE(OH_Drawing_FontGetScaleX(font) == 1);
151     OH_Drawing_FontSetScaleX(font, 2);
152     EXPECT_TRUE(OH_Drawing_FontGetScaleX(font) == 2);
153     OH_Drawing_FontDestroy(font);
154 }
155 
156 /*
157  * @tc.name: NativeFontTest_GetAndSetEdging006
158  * @tc.desc: test for GetAndSetEdging.
159  * @tc.size  : MediumTest
160  * @tc.type  : Function
161  * @tc.level : Level 1
162  */
HWTEST_F(NativeFontTest, NativeFontTest_GetAndSetEdging006, TestSize.Level1)163 HWTEST_F(NativeFontTest, NativeFontTest_GetAndSetEdging006, TestSize.Level1)
164 {
165     OH_Drawing_Font* font = OH_Drawing_FontCreate();
166     EXPECT_NE(font, nullptr);
167     EXPECT_EQ(OH_Drawing_FontGetEdging(font), OH_Drawing_FontEdging::FONT_EDGING_ANTI_ALIAS);
168     EXPECT_EQ(OH_Drawing_FontGetEdging(nullptr), OH_Drawing_FontEdging::FONT_EDGING_ALIAS);
169     OH_Drawing_FontSetEdging(nullptr, OH_Drawing_FontEdging::FONT_EDGING_ALIAS);
170     EXPECT_EQ(OH_Drawing_FontGetEdging(font), OH_Drawing_FontEdging::FONT_EDGING_ANTI_ALIAS);
171     OH_Drawing_FontSetEdging(font, OH_Drawing_FontEdging::FONT_EDGING_ALIAS);
172     EXPECT_EQ(OH_Drawing_FontGetEdging(font), OH_Drawing_FontEdging::FONT_EDGING_ALIAS);
173     OH_Drawing_FontSetEdging(font, OH_Drawing_FontEdging::FONT_EDGING_ANTI_ALIAS);
174     EXPECT_EQ(OH_Drawing_FontGetEdging(font), OH_Drawing_FontEdging::FONT_EDGING_ANTI_ALIAS);
175     OH_Drawing_FontSetEdging(font, OH_Drawing_FontEdging::FONT_EDGING_SUBPIXEL_ANTI_ALIAS);
176     EXPECT_EQ(OH_Drawing_FontGetEdging(font), OH_Drawing_FontEdging::FONT_EDGING_SUBPIXEL_ANTI_ALIAS);
177     OH_Drawing_FontDestroy(font);
178 }
179 
180 /*
181  * @tc.name: NativeFontTest_GetAndSetForceAutoHinting007
182  * @tc.desc: test for GetAndSetForceAutoHinting.
183  * @tc.size  : MediumTest
184  * @tc.type  : Function
185  * @tc.level : Level 1
186  */
HWTEST_F(NativeFontTest, NativeFontTest_GetAndSetForceAutoHinting007, TestSize.Level1)187 HWTEST_F(NativeFontTest, NativeFontTest_GetAndSetForceAutoHinting007, TestSize.Level1)
188 {
189     OH_Drawing_Font* font = OH_Drawing_FontCreate();
190     EXPECT_NE(font, nullptr);
191     EXPECT_EQ(OH_Drawing_FontIsForceAutoHinting(nullptr), false);
192     OH_Drawing_FontSetForceAutoHinting(nullptr, true);
193     EXPECT_EQ(OH_Drawing_FontIsForceAutoHinting(font), false);
194     OH_Drawing_FontSetForceAutoHinting(font, true);
195     EXPECT_EQ(OH_Drawing_FontIsForceAutoHinting(font), true);
196     OH_Drawing_FontSetForceAutoHinting(font, false);
197     EXPECT_EQ(OH_Drawing_FontIsForceAutoHinting(font), false);
198     OH_Drawing_FontDestroy(font);
199 }
200 
201 /*
202  * @tc.name: NativeFontTest_GetAndSetHinting008
203  * @tc.desc: test for GetHinting and SetHinting.
204  * @tc.size  : MediumTest
205  * @tc.type  : Function
206  * @tc.level : Level 1
207  */
HWTEST_F(NativeFontTest, NativeFontTest_GetAndSetHinting008, TestSize.Level1)208 HWTEST_F(NativeFontTest, NativeFontTest_GetAndSetHinting008, TestSize.Level1)
209 {
210     OH_Drawing_Font* font = OH_Drawing_FontCreate();
211     EXPECT_NE(font, nullptr);
212     EXPECT_TRUE(OH_Drawing_FontGetHinting(nullptr) == OH_Drawing_FontHinting::FONT_HINTING_NONE);
213     OH_Drawing_FontSetHinting(font, OH_Drawing_FontHinting::FONT_HINTING_NONE);
214     EXPECT_TRUE(OH_Drawing_FontGetHinting(font) == OH_Drawing_FontHinting::FONT_HINTING_NONE);
215     OH_Drawing_FontSetHinting(font, OH_Drawing_FontHinting::FONT_HINTING_SLIGHT);
216     EXPECT_TRUE(OH_Drawing_FontGetHinting(font) == OH_Drawing_FontHinting::FONT_HINTING_SLIGHT);
217     OH_Drawing_FontSetHinting(font, OH_Drawing_FontHinting::FONT_HINTING_SLIGHT);
218     EXPECT_TRUE(OH_Drawing_FontGetHinting(font) == OH_Drawing_FontHinting::FONT_HINTING_SLIGHT);
219     OH_Drawing_FontDestroy(font);
220 }
221 
222 /*
223  * @tc.name: NativeFontTest_GetAndSetEmbeddedBitmaps009
224  * @tc.desc: test for GetEmbeddedBitmaps and SetEmbeddedBitmaps.
225  * @tc.size  : MediumTest
226  * @tc.type  : Function
227  * @tc.level : Level 1
228  */
HWTEST_F(NativeFontTest, NativeFontTest_GetAndSetEmbeddedBitmaps009, TestSize.Level1)229 HWTEST_F(NativeFontTest, NativeFontTest_GetAndSetEmbeddedBitmaps009, TestSize.Level1)
230 {
231     OH_Drawing_Font* font = OH_Drawing_FontCreate();
232     EXPECT_NE(font, nullptr);
233     EXPECT_TRUE(OH_Drawing_FontIsEmbeddedBitmaps(nullptr) == false);
234     OH_Drawing_FontSetEmbeddedBitmaps(font, true);
235     EXPECT_TRUE(OH_Drawing_FontIsEmbeddedBitmaps(font) == true);
236     OH_Drawing_FontSetEmbeddedBitmaps(font, false);
237     EXPECT_TRUE(OH_Drawing_FontIsEmbeddedBitmaps(font) == false);
238     OH_Drawing_FontDestroy(font);
239 }
240 
241 /*
242  * @tc.name: NativeFontTest_GetTextSize010
243  * @tc.desc: test for GetTextSize.
244  * @tc.size  : MediumTest
245  * @tc.type  : Function
246  * @tc.level : Level 1
247  */
HWTEST_F(NativeFontTest, NativeFontTest_GetTextSize010, TestSize.Level1)248 HWTEST_F(NativeFontTest, NativeFontTest_GetTextSize010, TestSize.Level1)
249 {
250     OH_Drawing_Font* font = OH_Drawing_FontCreate();
251     EXPECT_NE(font, nullptr);
252     OH_Drawing_FontSetTextSize(font, 100);
253     float size = OH_Drawing_FontGetTextSize(font);
254     EXPECT_EQ(size, 100);
255     OH_Drawing_FontDestroy(font);
256 }
257 
258 /*
259  * @tc.name: NativeFontTest_GetTextSkewX011
260  * @tc.desc: test for GetTextSkewX.
261  * @tc.size  : MediumTest
262  * @tc.type  : Function
263  * @tc.level : Level 1
264  */
HWTEST_F(NativeFontTest, NativeFontTest_GetTextSkewX011, TestSize.Level1)265 HWTEST_F(NativeFontTest, NativeFontTest_GetTextSkewX011, TestSize.Level1)
266 {
267     OH_Drawing_Font* font = OH_Drawing_FontCreate();
268     EXPECT_NE(font, nullptr);
269     OH_Drawing_FontSetTextSkewX(font, 10);
270     float size = OH_Drawing_FontGetTextSkewX(font);
271     EXPECT_EQ(size, 10);
272     OH_Drawing_FontDestroy(font);
273 }
274 
275 /*
276  * @tc.name: NativeFontTest_IsLinearText012
277  * @tc.desc: test for IsLinearText.
278  * @tc.size  : MediumTest
279  * @tc.type  : Function
280  * @tc.level : Level 1
281  */
HWTEST_F(NativeFontTest, NativeFontTest_IsLinearText012, TestSize.Level1)282 HWTEST_F(NativeFontTest, NativeFontTest_IsLinearText012, TestSize.Level1)
283 {
284     OH_Drawing_Font* font = OH_Drawing_FontCreate();
285     EXPECT_NE(font, nullptr);
286     bool ret = OH_Drawing_FontIsLinearText(font);
287     EXPECT_EQ(ret, false);
288     OH_Drawing_FontSetLinearText(font, true);
289     ret = OH_Drawing_FontIsLinearText(font);
290     EXPECT_EQ(ret, true);
291     OH_Drawing_FontDestroy(font);
292 }
293 
294 /*
295  * @tc.name: NativeFontTest_SetFakeBoldText013
296  * @tc.desc: test for SetFakeBoldText.
297  * @tc.size  : MediumTest
298  * @tc.type  : Function
299  * @tc.level : Level 1
300  */
HWTEST_F(NativeFontTest, NativeFontTest_SetFakeBoldText013, TestSize.Level1)301 HWTEST_F(NativeFontTest, NativeFontTest_SetFakeBoldText013, TestSize.Level1)
302 {
303     OH_Drawing_Font* font = OH_Drawing_FontCreate();
304     EXPECT_NE(font, nullptr);
305     bool ret = OH_Drawing_FontIsFakeBoldText(font);
306     EXPECT_EQ(ret, false);
307     OH_Drawing_FontSetFakeBoldText(font, true);
308     ret = OH_Drawing_FontIsFakeBoldText(font);
309     EXPECT_EQ(ret, true);
310     OH_Drawing_FontDestroy(font);
311 }
312 
313 /*
314  * @tc.name: NativeFontTest_FontMeasureText014
315  * @tc.desc: test for FontMeasureText.
316  * @tc.type: FUNC
317  * @tc.require: AR000GTO5R
318  */
HWTEST_F(NativeFontTest, NativeFontTest_FontMeasureText014, TestSize.Level1)319 HWTEST_F(NativeFontTest, NativeFontTest_FontMeasureText014, TestSize.Level1)
320 {
321     OH_Drawing_Font* font = OH_Drawing_FontCreate();
322     EXPECT_NE(font, nullptr);
323     OH_Drawing_FontSetTextSize(font, 50);
324     const char* str = "hello world";
325     float textWidth = 0.f;
326     OH_Drawing_ErrorCode drawingErrorCode = OH_DRAWING_SUCCESS;
327     drawingErrorCode = OH_Drawing_FontMeasureText(nullptr, str, strlen(str),
328                                                   OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8, nullptr, &textWidth);
329     EXPECT_EQ(drawingErrorCode, OH_DRAWING_ERROR_INVALID_PARAMETER);
330     EXPECT_EQ(textWidth, 0.f);
331     drawingErrorCode = OH_Drawing_FontMeasureText(font, str, 0, OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8,
332                                                   nullptr, &textWidth);
333     EXPECT_EQ(drawingErrorCode, OH_DRAWING_ERROR_INVALID_PARAMETER);
334     EXPECT_EQ(textWidth, 0.f);
335     drawingErrorCode = OH_Drawing_FontMeasureText(font, str, strlen(str), OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8,
336                                                   nullptr, &textWidth);
337     EXPECT_EQ(drawingErrorCode, OH_DRAWING_SUCCESS);
338     EXPECT_EQ(textWidth, 254.0); // 254.0 is textWidth
339 
340     OH_Drawing_FontDestroy(font);
341 }
342 
343 
344 /*
345  * @tc.name: NativeFontTest_FontMeasureText015
346  * @tc.desc: test for the textbox.
347  * @tc.type: FUNC
348  */
HWTEST_F(NativeFontTest, NativeFontTest_FontMeasureText015, TestSize.Level1)349 HWTEST_F(NativeFontTest, NativeFontTest_FontMeasureText015, TestSize.Level1)
350 {
351     OH_Drawing_TypographyStyle* typoStyle = OH_Drawing_CreateTypographyStyle();
352     OH_Drawing_TypographyCreate* handler = OH_Drawing_CreateTypographyHandler(typoStyle,
353         OH_Drawing_CreateFontCollection());
354     OH_Drawing_Typography* typography = OH_Drawing_CreateTypography(handler);
355     OH_Drawing_TextBox* textBox = OH_Drawing_TypographyGetRectsForPlaceholders(typography);
356     EXPECT_EQ(textBox == nullptr, false);
357     OH_Drawing_DestroyTypographyStyle(typoStyle);
358     OH_Drawing_DestroyTypographyHandler(handler);
359     OH_Drawing_DestroyTypography(typography);
360     OH_Drawing_TypographyDestroyTextBox(textBox);
361 }
362 
363 /*
364  * @tc.name: NativeFontTest_FontMeasureText016
365  * @tc.desc: test for the textshadow.
366  * @tc.type: FUNC
367  */
HWTEST_F(NativeFontTest, NativeFontTest_FontMeasureText016, TestSize.Level1)368 HWTEST_F(NativeFontTest, NativeFontTest_FontMeasureText016, TestSize.Level1)
369 {
370     OH_Drawing_TextShadow* shadow = OH_Drawing_CreateTextShadow();
371     uint32_t color = 0;
372     OH_Drawing_Point* offset = OH_Drawing_PointCreate(0, 0);
373     double blurRadius = 0.0;
374     OH_Drawing_SetTextShadow(shadow, color, offset, blurRadius);
375     OH_Drawing_DestroyTextShadow(shadow);
376     OH_Drawing_PointDestroy(offset);
377     EXPECT_TRUE(shadow != nullptr);
378 }
379 
380 /*
381  * @tc.name: NativeFontTest_FontMeasureText017
382  * @tc.desc: test for the fontVariation.
383  * @tc.type: FUNC
384  */
HWTEST_F(NativeFontTest, NativeFontTest_FontMeasureText017, TestSize.Level1)385 HWTEST_F(NativeFontTest, NativeFontTest_FontMeasureText017, TestSize.Level1)
386 {
387     OH_Drawing_TextStyle* txtStyle = OH_Drawing_CreateTextStyle();
388     EXPECT_EQ(txtStyle == nullptr, false);
389     const char* key = "宋体";
390     int value = 1;
391     OH_Drawing_TextStyleAddFontFeature(txtStyle, key, value);
392     OH_Drawing_TextStyleAddFontVariation(txtStyle, key, value);
393     EXPECT_EQ(OH_Drawing_TextStyleGetFontFeatureSize(txtStyle), 1);
394     OH_Drawing_FontCollection* fontCollection = OH_Drawing_CreateFontCollection();
395     OH_Drawing_ClearFontCaches(fontCollection);
396     EXPECT_EQ(fontCollection == nullptr, false);
397     OH_Drawing_DestroyFontCollection(fontCollection);
398     OH_Drawing_DestroyTextStyle(txtStyle);
399 }
400 
401 } // namespace Drawing
402 } // namespace Rosen
403 } // namespace OHOS