• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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, 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 #include <hb.h>
18 
19 #include "measurer_impl.h"
20 #include "param_test_macros.h"
21 #include "texgine_exception.h"
22 
23 using namespace testing;
24 using namespace testing::ext;
25 using namespace OHOS::Rosen;
26 
27 struct hb_buffer_t {};
28 struct hb_unicode_funcs_t {};
29 struct hb_font_t {};
30 struct hb_face_t {};
31 
32 struct MockVars {
33     size_t calledHBFontCreate = 0;
34     std::unique_ptr<hb_buffer_t> retvalBufferCreate = std::make_unique<hb_buffer_t>();
35     std::unique_ptr<hb_unicode_funcs_t> retvalUnicodeFuncsCreate = std::make_unique<hb_unicode_funcs_t>();
36     size_t calledUnicodeScript = 0;
37     std::vector<hb_script_t> retvalUnicodeScript = {HB_SCRIPT_INVALID};
38     std::unique_ptr<hb_font_t> retvalFontCreate = std::make_unique<hb_font_t>();
39     std::unique_ptr<hb_face_t> retvalFaceCreate = std::make_unique<hb_face_t>();
40     std::vector<hb_glyph_info_t> retvalGetGlyphInfo = {{}};
41     std::vector<hb_glyph_position_t> retvalGetGlyphPosition = {{}};
42     int retvalGetUnitsPerEm = 1;
43     bool retvalHBFeatureFromString = true;
44     bool retvalIsWhitespace = false;
45     bool retvalTypefaceHas = true;
46     size_t retvalGetTableSize = 1;
47     size_t retvalGetTableData = 1;
48 
49     std::shared_ptr<TextEngine::Typeface> typeface =
50         std::make_shared<TextEngine::Typeface>(std::make_shared<TextEngine::TexgineTypeface>());
51 } g_measurerMockvars;
52 
53 std::list<TextEngine::MeasuringRun> mRuns = {};
54 
hb_blob_create(const char *,unsigned int,hb_memory_mode_t,void *,hb_destroy_func_t)55 hb_blob_t *hb_blob_create(const char *, unsigned int, hb_memory_mode_t, void *, hb_destroy_func_t)
56 {
57     return hb_blob_get_empty();
58 }
59 
hb_unicode_funcs_create(hb_unicode_funcs_t *)60 hb_unicode_funcs_t *hb_unicode_funcs_create(hb_unicode_funcs_t *)
61 {
62     return g_measurerMockvars.retvalUnicodeFuncsCreate.get();
63 }
64 
hb_unicode_script(hb_unicode_funcs_t *,hb_codepoint_t)65 hb_script_t hb_unicode_script(hb_unicode_funcs_t *, hb_codepoint_t)
66 {
67     assert(g_measurerMockvars.retvalUnicodeScript.size() > g_measurerMockvars.calledUnicodeScript);
68     return g_measurerMockvars.retvalUnicodeScript[g_measurerMockvars.calledUnicodeScript++];
69 }
70 
hb_feature_from_string(const char *,int,hb_feature_t *)71 hb_bool_t hb_feature_from_string(const char *, int, hb_feature_t *)
72 {
73     return g_measurerMockvars.retvalHBFeatureFromString;
74 }
75 
hb_buffer_create()76 hb_buffer_t *hb_buffer_create()
77 {
78     return g_measurerMockvars.retvalBufferCreate.get();
79 }
80 
hb_buffer_destroy(hb_buffer_t *)81 void hb_buffer_destroy(hb_buffer_t *)
82 {
83 }
84 
hb_font_destroy(hb_font_t *)85 void hb_font_destroy(hb_font_t *)
86 {
87 }
88 
hb_face_destroy(hb_face_t *)89 void hb_face_destroy(hb_face_t *)
90 {
91 }
92 
hb_buffer_add_utf16(hb_buffer_t *,const uint16_t *,int32_t,uint32_t,int32_t)93 void hb_buffer_add_utf16(hb_buffer_t *, const uint16_t *, int32_t, uint32_t, int32_t)
94 {
95 }
96 
hb_buffer_set_direction(hb_buffer_t *,hb_direction_t)97 void hb_buffer_set_direction(hb_buffer_t *, hb_direction_t)
98 {
99 }
100 
hb_buffer_set_unicode_funcs(hb_buffer_t *,hb_unicode_funcs_t *)101 void hb_buffer_set_unicode_funcs(hb_buffer_t *, hb_unicode_funcs_t*)
102 {
103 }
104 
hb_icu_get_unicode_funcs()105 hb_unicode_funcs_t *hb_icu_get_unicode_funcs()
106 {
107     return nullptr;
108 }
109 
hb_buffer_set_script(hb_buffer_t *,hb_script_t)110 void hb_buffer_set_script(hb_buffer_t *, hb_script_t)
111 {
112 }
113 
hb_buffer_set_language(hb_buffer_t *,hb_language_t)114 void hb_buffer_set_language(hb_buffer_t *, hb_language_t)
115 {
116 }
117 
hb_face_create_for_tables(hb_reference_table_func_t,void *,hb_destroy_func_t)118 hb_face_t *hb_face_create_for_tables(hb_reference_table_func_t, void *, hb_destroy_func_t)
119 {
120     return g_measurerMockvars.retvalFaceCreate.get();
121 }
122 
hb_font_create(hb_face_t * face)123 hb_font_t *hb_font_create(hb_face_t *face)
124 {
125     g_measurerMockvars.calledHBFontCreate++;
126     return g_measurerMockvars.retvalFontCreate.get();
127 }
128 
hb_shape(hb_font_t *,hb_buffer_t *,const hb_feature_t *,unsigned int)129 void hb_shape(hb_font_t *, hb_buffer_t *, const hb_feature_t *, unsigned int)
130 {
131 }
132 
hb_buffer_get_glyph_infos(hb_buffer_t * buffer,unsigned int * length)133 hb_glyph_info_t *hb_buffer_get_glyph_infos(hb_buffer_t *buffer, unsigned int *length)
134 {
135     *length = g_measurerMockvars.retvalGetGlyphInfo.size();
136     return g_measurerMockvars.retvalGetGlyphInfo.data();
137 }
138 
hb_buffer_get_glyph_positions(hb_buffer_t * buffer,unsigned int * length)139 hb_glyph_position_t *hb_buffer_get_glyph_positions(hb_buffer_t *buffer, unsigned int *length)
140 {
141     return g_measurerMockvars.retvalGetGlyphPosition.data();
142 }
143 
u_isWhitespace(UChar32 c)144 U_CAPI UBool U_EXPORT2 u_isWhitespace(UChar32 c)
145 {
146     return g_measurerMockvars.retvalIsWhitespace;
147 }
148 
149 namespace OHOS {
150 namespace Rosen {
151 namespace TextEngine {
152 #ifndef USE_ROSEN_DRAWING
GetTableSize(uint32_t tag) const153 size_t TexgineTypeface::GetTableSize(uint32_t tag) const
154 {
155     return g_measurerMockvars.retvalGetTableSize;
156 }
157 
GetTableData(uint32_t tag,size_t offset,size_t length,void * data) const158 size_t TexgineTypeface::GetTableData(uint32_t tag, size_t offset, size_t length, void *data) const
159 {
160     return g_measurerMockvars.retvalGetTableData;
161 }
162 
GetUnitsPerEm() const163 int TexgineTypeface::GetUnitsPerEm() const
164 {
165     return g_measurerMockvars.retvalGetUnitsPerEm;
166 }
167 #endif
168 
GetBoundary(const std::vector<uint16_t> & u16str,bool)169 std::vector<Boundary> WordBreaker::GetBoundary(const std::vector<uint16_t> &u16str, bool)
170 {
171     return {};
172 }
173 
Has(uint32_t ch)174 bool Typeface::Has(uint32_t ch)
175 {
176     return g_measurerMockvars.retvalTypefaceHas;
177 }
178 
GetTypefaceForChar(const uint32_t & ch,FontStyles & style,const std::string & script,const std::string & locale) const179 std::shared_ptr<Typeface> FontCollection::GetTypefaceForChar(const uint32_t &ch,
180     FontStyles &style, const std::string &script, const std::string &locale) const
181 {
182     return g_measurerMockvars.typeface;
183 }
184 
InitMiMockVars(MockVars vars,std::list<struct MeasuringRun> runs)185 void InitMiMockVars(MockVars vars, std::list<struct MeasuringRun> runs)
186 {
187     g_measurerMockvars = std::move(vars);
188     mRuns.clear();
189     mRuns.insert(mRuns.begin(), runs.begin(), runs.end());
190 }
191 
192 class MeasurerImplTest : public testing::Test {
193 public:
MeasurerImplTest()194     MeasurerImplTest()
195     {
196         normalff_.SetFeature("ftag", 1);
197     }
198 
199     std::vector<uint16_t> text_ = {0};
200     FontCollection fontCollection_ = std::vector<std::shared_ptr<VariantFontStyleSet>>{};
201     FontFeatures emptyff_;
202     FontFeatures normalff_;
203     CharGroups charGroups_;
204 };
205 
206 /**
207  * @tc.name: HbFaceReferenceTableTypeface
208  * @tc.desc: Verify the HbFaceReferenceTableTypeface
209  * @tc.type:FUNC
210  */
211 HWTEST_F(MeasurerImplTest, HbFaceReferenceTableTypeface, TestSize.Level1)
212 {
213     EXPECT_EQ(HbFaceReferenceTableTypeface({}, {}, nullptr), nullptr);
214 }
215 
216 /**
217  * @tc.name: Create
218  * @tc.desc: Verify the Create
219  * @tc.type:FUNC
220  */
221 HWTEST_F(MeasurerImplTest, Create, TestSize.Level1)
222 {
223     EXPECT_NE(MeasurerImpl::Create({}, fontCollection_), nullptr);
224 }
225 
226 /**
227  * @tc.name: Measure1
228  * @tc.desc: Verify the Measure
229  * @tc.type:FUNC
230  */
231 HWTEST_F(MeasurerImplTest, Measure1, TestSize.Level1)
232 {
233     size_t ret = 0;
234     InitMiMockVars({.retvalBufferCreate = nullptr}, {});
235     uint16_t testText = 2;
236     text_ = {testText};
237     MeasurerImpl mi(text_, fontCollection_);
238     int begin = 0;
239     int end = 1;
240     mi.SetRange(begin, end);
241     mi.SetFontFeatures(emptyff_);
242 
243     EXPECT_EQ(mi.Measure(charGroups_), 1);
244     EXPECT_EQ(g_measurerMockvars.calledHBFontCreate, ret);
245 }
246 
247 /**
248  * @tc.name: Measure2
249  * @tc.desc: Verify the Measure
250  * @tc.type:FUNC
251  */
252 HWTEST_F(MeasurerImplTest, Measure2, TestSize.Level1)
253 {
254     size_t ret = 1;
255     InitMiMockVars({}, {});
256     uint16_t testText = 2;
257     text_ = {testText};
258     MeasurerImpl mi(text_, fontCollection_);
259     int begin = 0;
260     int end = 1;
261     mi.SetRange(begin, end);
262     mi.SetFontFeatures(emptyff_);
263 
264     EXPECT_EQ(mi.Measure(charGroups_), 0);
265     EXPECT_EQ(g_measurerMockvars.calledHBFontCreate, ret);
266     ret++;
267     EXPECT_EQ(mi.Measure(charGroups_), 0);
268     EXPECT_EQ(g_measurerMockvars.calledHBFontCreate, ret);
269 }
270 
271 /**
272  * @tc.name: Measure3
273  * @tc.desc: Verify the Measure
274  * @tc.type:FUNC
275  */
276 HWTEST_F(MeasurerImplTest, Measure3, TestSize.Level1)
277 {
278     size_t ret = 1;
279     InitMiMockVars({}, {});
280     text_ = {3};
281     MeasurerImpl mi(text_, fontCollection_);
282     mi.SetRange(0, 1);
283     mi.SetFontFeatures(normalff_);
284 
285     EXPECT_EQ(mi.Measure(charGroups_), 0);
286     EXPECT_EQ(g_measurerMockvars.calledHBFontCreate, ret);
287 }
288 
289 /**
290  * @tc.name: SeekTypeface1
291  * @tc.desc: Verify the SeekTypeface
292  * @tc.type:FUNC
293  */
294 HWTEST_F(MeasurerImplTest, SeekTypeface1, TestSize.Level1)
295 {
296     InitMiMockVars({.typeface = nullptr}, {{.start = 0, .end = 1}});
297     text_ = {'a'};
298     MeasurerImpl mi(text_, fontCollection_);
299     mi.SetRange(0, 1);
300 
301     std::list<struct MeasuringRun> runs;
302     mi.SeekTypeface(mRuns);
303     EXPECT_EQ(mRuns.size(), 1);
304     EXPECT_EQ(mRuns.front().typeface, nullptr);
305 }
306 
307 /**
308  * @tc.name: SeekTypeface2
309  * @tc.desc: Verify the SeekTypeface
310  * @tc.type:FUNC
311  */
312 HWTEST_F(MeasurerImplTest, SeekTypeface2, TestSize.Level1)
313 {
314     InitMiMockVars({}, {{.start = 0, .end = 2}});
315     text_ = {'a', 'b'};
316     MeasurerImpl mi(text_, fontCollection_);
317     mi.SetRange(0, 2);
318 
319     mi.SeekTypeface(mRuns);
320     EXPECT_EQ(mRuns.size(), 1);
321     EXPECT_EQ(mRuns.front().typeface, g_measurerMockvars.typeface);
322 }
323 
324 /**
325  * @tc.name: SeekTypeface3
326  * @tc.desc: Verify the SeekTypeface
327  * @tc.type:FUNC
328  */
329 HWTEST_F(MeasurerImplTest, SeekTypeface3, TestSize.Level1)
330 {
331     InitMiMockVars({.retvalTypefaceHas = false}, {{.start = 0, .end = 2}});
332     text_ = {'a', 'b'};
333     MeasurerImpl mi(text_, fontCollection_);
334     mi.SetRange(0, 2);
335     mi.SeekTypeface(mRuns);
336     EXPECT_EQ(mRuns.size(), 2);
337     EXPECT_EQ(mRuns.front().typeface, g_measurerMockvars.typeface);
338 }
339 
340 /**
341  * @tc.name: SeekTypeface4
342  * @tc.desc: Verify the SeekTypeface
343  * @tc.type:FUNC
344  */
345 HWTEST_F(MeasurerImplTest, SeekTypeface4, TestSize.Level1)
346 {
347     InitMiMockVars({.retvalTypefaceHas = false}, {{.start = 0, .end = 2}});
348     text_ = {'a'};
349     MeasurerImpl mi(text_, fontCollection_);
350     mi.SetRange(0, 2);
351     mi.SeekTypeface(mRuns);
352     EXPECT_EQ(mRuns.size(), 1);
353     EXPECT_EQ(mRuns.front().typeface, nullptr);
354 }
355 
356 /**
357  * @tc.name: SeekScript1
358  * @tc.desc: Verify the SeekScript
359  * @tc.type:FUNC
360  */
361 HWTEST_F(MeasurerImplTest, SeekScript1, TestSize.Level1)
362 {
363     InitMiMockVars({.retvalUnicodeFuncsCreate = nullptr}, {});
364     MeasurerImpl mi(text_, fontCollection_);
365     ASSERT_EXCEPTION(ExceptionType::API_FAILED, mi.SeekScript(mRuns));
366 }
367 
368 /**
369  * @tc.name: SeekScript2
370  * @tc.desc: Verify the SeekScript
371  * @tc.type:FUNC
372  */
373 HWTEST_F(MeasurerImplTest, SeekScript2, TestSize.Level1)
374 {
375     InitMiMockVars({.retvalUnicodeScript = {HB_SCRIPT_HAN}}, {{.start = 0, .end = 1}});
376     MeasurerImpl mi(text_, fontCollection_);
377 
378     ASSERT_EXCEPTION(ExceptionType::ERROR_STATUS, mi.SeekScript(mRuns));
379 }
380 
381 /**
382  * @tc.name: SeekScript3
383  * @tc.desc: Verify the SeekScript
384  * @tc.type:FUNC
385  */
386 HWTEST_F(MeasurerImplTest, SeekScript3, TestSize.Level1)
387 {
388     InitMiMockVars({.retvalUnicodeScript = {HB_SCRIPT_HAN}}, {});
389     text_ = {'a'};
390     MeasurerImpl mi(text_, fontCollection_);
391     mi.SetRange(0, 1);
392 
393     EXPECT_NE(mRuns.front().script, HB_SCRIPT_HAN);
394     mi.SeekScript(mRuns);
395     EXPECT_EQ(mRuns.size(), 1);
396     EXPECT_EQ(mRuns.front().script, HB_SCRIPT_HAN);
397 }
398 
399 /**
400  * @tc.name: SeekScript4
401  * @tc.desc: Verify the SeekScript
402  * @tc.type:FUNC
403  */
404 HWTEST_F(MeasurerImplTest, SeekScript4, TestSize.Level1)
405 {
406     InitMiMockVars({.retvalUnicodeScript = {HB_SCRIPT_HAN, HB_SCRIPT_INHERITED}}, {});
407     text_ = {'a', 'b'};
408     MeasurerImpl mi(text_, fontCollection_);
409     mi.SetRange(0, 2);
410 
411     mi.SeekScript(mRuns);
412     EXPECT_EQ(mRuns.size(), 1);
413     EXPECT_EQ(mRuns.front().script, HB_SCRIPT_HAN);
414 
415     InitMiMockVars({.retvalUnicodeScript = {HB_SCRIPT_HAN, HB_SCRIPT_COMMON}}, {});
416     mi.SeekScript(mRuns);
417     EXPECT_EQ(mRuns.size(), 1);
418     EXPECT_EQ(mRuns.front().script, HB_SCRIPT_HAN);
419 }
420 
421 /**
422  * @tc.name: Shape1
423  * @tc.desc: Verify the Shape
424  * @tc.type:FUNC
425  */
426 HWTEST_F(MeasurerImplTest, Shape1, TestSize.Level1)
427 {
428     size_t ret = 0;
429     InitMiMockVars({}, {});
430     MeasurerImpl mi(text_, fontCollection_);
431 
432     std::list<struct MeasuringRun> runs;
433     EXPECT_EQ(mi.Shape(charGroups_, runs, {}), 0);
434     EXPECT_EQ(g_measurerMockvars.calledHBFontCreate, ret);
435 }
436 
437 /**
438  * @tc.name: Shape2
439  * @tc.desc: Verify the Shape
440  * @tc.type:FUNC
441  */
442 HWTEST_F(MeasurerImplTest, Shape2, TestSize.Level1)
443 {
444     InitMiMockVars({}, {});
445     MeasurerImpl mi(text_, fontCollection_);
446 
447     std::list<struct MeasuringRun> runs;
448     runs.push_back({.start = 0, .end = 0});
449     ASSERT_EXCEPTION(ExceptionType::ERROR_STATUS, mi.Shape(charGroups_, runs, {}));
450 }
451 
452 /**
453  * @tc.name: Shape3
454  * @tc.desc: Verify the Shape
455  * @tc.type:FUNC
456  */
457 HWTEST_F(MeasurerImplTest, Shape3, TestSize.Level1)
458 {
459     size_t ret = 0;
460     InitMiMockVars({}, {});
461     MeasurerImpl mi(text_, fontCollection_);
462 
463     std::list<struct MeasuringRun> runs;
464     runs.push_back({.start = 0, .end = 1, .typeface = nullptr});
465     EXPECT_EQ(mi.Shape(charGroups_, runs, {}), 1);
466     EXPECT_EQ(g_measurerMockvars.calledHBFontCreate, ret);
467 }
468 
469 /**
470  * @tc.name: Shape4
471  * @tc.desc: Verify the Shape
472  * @tc.type:FUNC
473  */
474 HWTEST_F(MeasurerImplTest, Shape4, TestSize.Level1)
475 {
476     size_t ret = 0;
477     InitMiMockVars({.retvalBufferCreate = nullptr}, {});
478     MeasurerImpl mi(text_, fontCollection_);
479 
480     std::list<struct MeasuringRun> runs;
481     runs.push_back({.start = 0, .end = 1, .typeface = g_measurerMockvars.typeface});
482     EXPECT_EQ(mi.Shape(charGroups_, runs, {}), 1);
483     EXPECT_EQ(g_measurerMockvars.calledHBFontCreate, ret);
484 }
485 
486 /**
487  * @tc.name: Shape5
488  * @tc.desc: Verify the Shape
489  * @tc.type:FUNC
490  */
491 HWTEST_F(MeasurerImplTest, Shape5, TestSize.Level1)
492 {
493     size_t ret = 0;
494     InitMiMockVars({.retvalFaceCreate = nullptr}, {});
495     MeasurerImpl mi(text_, fontCollection_);
496 
497     std::list<struct MeasuringRun> runs;
498     runs.push_back({.start = 0, .end = 1, .typeface = g_measurerMockvars.typeface});
499     EXPECT_EQ(mi.Shape(charGroups_, runs, {}), 1);
500     EXPECT_EQ(g_measurerMockvars.calledHBFontCreate, ret);
501 }
502 
503 /**
504  * @tc.name: Shape6
505  * @tc.desc: Verify the Shape
506  * @tc.type:FUNC
507  */
508 HWTEST_F(MeasurerImplTest, Shape6, TestSize.Level1)
509 {
510     size_t ret = 1;
511     InitMiMockVars({.retvalFontCreate = nullptr}, {});
512     MeasurerImpl mi(text_, fontCollection_);
513 
514     std::list<struct MeasuringRun> runs;
515     runs.push_back({.start = 0, .end = 1, .typeface = g_measurerMockvars.typeface});
516     EXPECT_EQ(mi.Shape(charGroups_, runs, {}), 1);
517     EXPECT_EQ(g_measurerMockvars.calledHBFontCreate, ret);
518 }
519 
520 /**
521  * @tc.name: Shape8
522  * @tc.desc: Verify the Shape
523  * @tc.type:FUNC
524  */
525 HWTEST_F(MeasurerImplTest, Shape8, TestSize.Level1)
526 {
527     size_t ret = 1;
528     InitMiMockVars({.retvalGetGlyphPosition = {}}, {});
529     MeasurerImpl mi(text_, fontCollection_);
530     mi.SetFontFeatures(normalff_);
531 
532     std::list<struct MeasuringRun> runs;
533     runs.push_back({.start = 0, .end = 1, .typeface = g_measurerMockvars.typeface});
534     EXPECT_EQ(mi.Shape(charGroups_, runs, {}), 1);
535     EXPECT_EQ(g_measurerMockvars.calledHBFontCreate, ret);
536 }
537 
538 /**
539  * @tc.name: Shape9
540  * @tc.desc: Verify the Shape
541  * @tc.type:FUNC
542  */
543 HWTEST_F(MeasurerImplTest, Shape9, TestSize.Level1)
544 {
545     size_t ret = 1;
546     InitMiMockVars({.retvalGetUnitsPerEm = 0}, {});
547     MeasurerImpl mi(text_, fontCollection_);
548     mi.SetFontFeatures(normalff_);
549 
550     std::list<struct MeasuringRun> runs;
551     runs.push_back({.start = 0, .end = 1, .typeface = g_measurerMockvars.typeface});
552     EXPECT_EQ(mi.Shape(charGroups_, runs, {}), 0);
553     EXPECT_EQ(g_measurerMockvars.calledHBFontCreate, ret);
554 }
555 
556 /**
557  * @tc.name: Shape10
558  * @tc.desc: Verify the Shape
559  * @tc.type:FUNC
560  */
561 HWTEST_F(MeasurerImplTest, Shape10, TestSize.Level1)
562 {
563     InitMiMockVars({.retvalIsWhitespace = true}, {});
564     g_measurerMockvars.retvalGetGlyphPosition[0].x_advance = 10;
565     text_ = {'a'};
566     MeasurerImpl mi(text_, fontCollection_);
567     mi.SetFontFeatures(normalff_);
568 
569     std::list<struct MeasuringRun> runs;
570     runs.push_back({.start = 0, .end = 1, .typeface = g_measurerMockvars.typeface});
571     EXPECT_EQ(mi.Shape(charGroups_, runs, {}), 0);
572     EXPECT_EQ(charGroups_.GetSize(), 1);
573     EXPECT_GT(charGroups_.Get(0).invisibleWidth, charGroups_.Get(0).visibleWidth);
574 }
575 
576 /**
577  * @tc.name: Shape11
578  * @tc.desc: Verify the Shape
579  * @tc.type:FUNC
580  */
581 HWTEST_F(MeasurerImplTest, Shape11, TestSize.Level1)
582 {
583     InitMiMockVars({}, {});
584     text_ = {'a', 'b'};
585     MeasurerImpl mi(text_, fontCollection_);
586     mi.SetFontFeatures(normalff_);
587     mi.SetRTL(true);
588 
589     std::list<struct MeasuringRun> runs;
590     runs.push_back({.start = 0, .end = 1, .typeface = g_measurerMockvars.typeface});
591     runs.push_back({.start = 1, .end = 2, .typeface = g_measurerMockvars.typeface});
592     EXPECT_EQ(mi.Shape(charGroups_, runs, {}), 0);
593     EXPECT_EQ(charGroups_.GetSize(), 2);
594 }
595 
596 /**
597  * @tc.name: Shape12
598  * @tc.desc: Verify the Shape
599  * @tc.type:FUNC
600  */
601 HWTEST_F(MeasurerImplTest, Shape12, TestSize.Level1)
602 {
603     InitMiMockVars({.retvalGetGlyphInfo = {{.cluster = 0}, {.cluster = 1}},
604                   .retvalGetGlyphPosition = {{}, {}}}, {});
605     text_ = {'a', 'b'};
606     MeasurerImpl mi(text_, fontCollection_);
607     mi.SetFontFeatures(normalff_);
608     mi.SetSpacing(5, 10);
609 
610     std::list<struct MeasuringRun> runs;
611     runs.push_back({.start = 0, .end = 2, .typeface = g_measurerMockvars.typeface});
612     std::vector<Boundary> boundaries;
613     boundaries.emplace_back(0, 2);
614     EXPECT_EQ(mi.Shape(charGroups_, runs, boundaries), 0);
615     EXPECT_EQ(charGroups_.GetSize(), 2);
616 
617     // 5: invisibleWidth, spacing
618     EXPECT_EQ(charGroups_.Get(0).invisibleWidth, 5);
619     EXPECT_EQ(charGroups_.Get(1).invisibleWidth, 5);
620 }
621 
622 /**
623  * @tc.name: GenerateHBFeatures1
624  * @tc.desc: Verify the GenerateHBFeatures
625  * @tc.type:FUNC
626  */
627 HWTEST_F(MeasurerImplTest, GenerateHBFeatures1, TestSize.Level1)
628 {
629     InitMiMockVars({}, {});
630     MeasurerImpl mi(text_, fontCollection_);
631     std::vector<hb_feature_t> features;
632     mi.GenerateHBFeatures(features, nullptr);
633     EXPECT_EQ(features.size(), 0);
634 }
635 
636 /**
637  * @tc.name: GenerateHBFeatures2
638  * @tc.desc: Verify the GenerateHBFeatures
639  * @tc.type:FUNC
640  */
641 HWTEST_F(MeasurerImplTest, GenerateHBFeatures2, TestSize.Level1)
642 {
643     InitMiMockVars({}, {});
644     MeasurerImpl mi(text_, fontCollection_);
645     std::vector<hb_feature_t> features;
646     mi.GenerateHBFeatures(features, &emptyff_);
647     EXPECT_EQ(features.size(), 0);
648 }
649 
650 /**
651  * @tc.name: GenerateHBFeatures3
652  * @tc.desc: Verify the GenerateHBFeatures
653  * @tc.type:FUNC
654  */
655 HWTEST_F(MeasurerImplTest, GenerateHBFeatures3, TestSize.Level1)
656 {
657     InitMiMockVars({.retvalHBFeatureFromString = false}, {});
658     MeasurerImpl mi(text_, fontCollection_);
659     std::vector<hb_feature_t> features;
660     mi.GenerateHBFeatures(features, &normalff_);
661     EXPECT_EQ(features.size(), 0);
662     EXPECT_EQ(normalff_.GetFeatures().size(), 1);
663 }
664 
665 /**
666  * @tc.name: GenerateHBFeatures4
667  * @tc.desc: Verify the GenerateHBFeatures
668  * @tc.type:FUNC
669  */
670 HWTEST_F(MeasurerImplTest, GenerateHBFeatures4, TestSize.Level1)
671 {
672     InitMiMockVars({}, {});
673     MeasurerImpl mi(text_, fontCollection_);
674     std::vector<hb_feature_t> features;
675     mi.GenerateHBFeatures(features, &normalff_);
676     EXPECT_EQ(features.size(), 1);
677     EXPECT_EQ(normalff_.GetFeatures().size(), 1);
678 }
679 } // namespace TextEngine
680 } // namespace Rosen
681 } // namespace OHOS
682