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