2 * Copyright (c) 2022 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
22 #include <dali-toolkit-test-suite-utils.h>
23 #include <dali-toolkit/dali-toolkit.h>
24 #include <dali-toolkit/internal/text/layouts/layout-engine.h>
25 #include <dali-toolkit/internal/text/layouts/layout-parameters.h>
26 #include <dali-toolkit/internal/text/text-run-container.h>
27 #include <toolkit-text-utils.h>
30 using namespace Toolkit;
33 // Tests the LayoutEngine methods.
35 //////////////////////////////////////////////////////////
39 const std::string DEFAULT_FONT_DIR("/resources/fonts");
43 std::string description;
46 unsigned int numberOfFonts;
47 FontDescriptionRun* fontDescriptions;
49 unsigned int totalNumberOfGlyphs;
51 unsigned int numberOfLines;
53 Layout::Engine::Type layout;
54 unsigned int startIndex;
55 unsigned int numberOfGlyphs;
58 float characterSpacing;
61 void Print(const LineRun& line)
63 std::cout << " glyph run, index : " << line.glyphRun.glyphIndex << ", num glyphs : " << line.glyphRun.numberOfGlyphs << std::endl;
64 std::cout << " character run, index : " << line.characterRun.characterIndex << ", num chars : " << line.characterRun.numberOfCharacters << std::endl;
65 std::cout << " width : " << floor(line.width) << std::endl;
66 std::cout << " ascender : " << line.ascender << std::endl;
67 std::cout << " descender : " << line.descender << std::endl;
68 std::cout << " extraLength : " << line.extraLength << std::endl;
69 std::cout << " alignmentOffset : " << line.alignmentOffset << std::endl;
70 std::cout << " direction : " << line.direction << std::endl;
71 std::cout << " ellipsis : " << line.ellipsis << std::endl;
74 bool LayoutTextTest(const LayoutTextData& data)
77 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
78 fontClient.SetDpi(96u, 96u);
80 char* pathNamePtr = get_current_dir_name();
81 const std::string pathName(pathNamePtr);
84 fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf");
85 fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf");
86 fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf");
87 fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHindiRegular.ttf");
89 // 1) Create the model.
94 Vector<FontDescriptionRun> fontDescriptionRuns;
95 if(0u != data.numberOfFonts)
97 fontDescriptionRuns.Insert(fontDescriptionRuns.End(),
98 data.fontDescriptions,
99 data.fontDescriptions + data.numberOfFonts);
102 LayoutOptions options;
103 options.align = false;
104 CreateTextModel(data.text,
114 Toolkit::DevelText::EllipsisPosition::END,
116 data.characterSpacing);
118 LogicalModelPtr logicalModel = textModel->mLogicalModel;
119 VisualModelPtr visualModel = textModel->mVisualModel;
121 // 2) Clear the layout.
122 Vector<LineRun>& lines = visualModel->mLines;
124 const Length numberOfCharacters = logicalModel->mText.Count();
125 const bool isLastNewParagraph = (0u == numberOfCharacters) ? false : TextAbstraction::IsNewParagraph(*(logicalModel->mText.Begin() + (numberOfCharacters - 1u)));
126 const GlyphIndex lastGlyphIndex = data.startIndex + data.numberOfGlyphs - 1u;
127 const bool removeLastLine = isLastNewParagraph && (lastGlyphIndex + 1u == visualModel->mGlyphs.Count());
129 LineIndex startRemoveIndex = 0u;
131 if(0u != lines.Count())
133 startRemoveIndex = lines.Count();
134 LineIndex endRemoveIndex = startRemoveIndex;
135 ClearGlyphRuns(data.startIndex,
136 lastGlyphIndex + (removeLastLine ? 1u : 0u),
141 // Update the character runs of the lines.
142 const CharacterIndex* const glyphsToCharactersBuffer = visualModel->mGlyphsToCharacters.Begin();
143 const Length* const charactersPerGlyph = visualModel->mCharactersPerGlyph.Begin();
144 const CharacterIndex startCharacterIndex = *(glyphsToCharactersBuffer + data.startIndex);
145 const CharacterIndex lastCharacterIndex = *(glyphsToCharactersBuffer + lastGlyphIndex) + *(charactersPerGlyph + lastGlyphIndex) - 1u;
146 ClearCharacterRuns(startCharacterIndex,
147 lastCharacterIndex + (removeLastLine ? 1u : 0u),
152 lines.Erase(lines.Begin() + startRemoveIndex,
153 lines.Begin() + endRemoveIndex);
156 Vector<Vector2>& glyphPositions = visualModel->mGlyphPositions;
158 glyphPositions.Erase(glyphPositions.Begin() + data.startIndex,
159 glyphPositions.Begin() + data.startIndex + data.numberOfGlyphs);
162 Layout::Engine engine;
163 engine.SetMetrics(metrics);
164 engine.SetLayout(data.layout);
166 textModel->mHorizontalAlignment = Text::HorizontalAlignment::BEGIN;
167 textModel->mLineWrapMode = LineWrap::WORD;
168 textModel->mIgnoreSpacesAfterText = true;
169 //textModel->mMatchSystemLanguageDirection = false;
170 Layout::Parameters layoutParameters(data.textArea,
173 layoutParameters.isLastNewParagraph = isLastNewParagraph;
175 // The initial glyph and the number of glyphs to layout.
176 layoutParameters.startGlyphIndex = data.startIndex;
177 layoutParameters.numberOfGlyphs = data.numberOfGlyphs;
178 layoutParameters.startLineIndex = startRemoveIndex;
179 layoutParameters.estimatedNumberOfLines = logicalModel->mParagraphInfo.Count();
181 layoutSize = Vector2::ZERO;
183 bool isAutoScroll = false;
184 const bool updated = engine.LayoutText(layoutParameters,
188 DevelText::EllipsisPosition::END);
190 // 4) Compare the results.
192 if(updated != data.updated)
194 std::cout << " Different updated bool : " << updated << ", expected : " << data.updated << std::endl;
198 if(layoutSize != data.layoutSize)
200 std::cout << " Different layout size : " << layoutSize << ", expected : " << data.layoutSize << std::endl;
204 for(unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index)
206 const Vector2& position = *(glyphPositions.Begin() + index);
208 if(fabsf(std::round(position.x) - std::round(*(data.positions + 2u * index))) > Math::MACHINE_EPSILON_1000)
210 std::cout << " Different position for glyph " << index << " x : " << position.x << ", expected : " << *(data.positions + 2u * index) << std::endl;
213 if(fabsf(position.y - *(data.positions + 2u * index + 1u)) > Math::MACHINE_EPSILON_1000)
215 std::cout << " Different position for glyph " << index << " y : " << position.y << ", expected : " << *(data.positions + 2u * index + 1u) << std::endl;
220 if(lines.Count() != data.numberOfLines)
222 std::cout << " Different number of lines : " << lines.Count() << ", expected : " << data.numberOfLines << std::endl;
226 for(unsigned int index = 0u; index < data.numberOfLines; ++index)
228 const LineRun& line = *(lines.Begin() + index);
229 const LineRun& expectedLine = *(data.lines + index);
231 if(line.glyphRun.glyphIndex != expectedLine.glyphRun.glyphIndex)
233 std::cout << " Different line info for line : " << index << std::endl;
235 std::cout << " expected" << std::endl;
239 if(line.glyphRun.numberOfGlyphs != expectedLine.glyphRun.numberOfGlyphs)
241 std::cout << " Different line info for line : " << index << std::endl;
243 std::cout << " expected" << std::endl;
248 if(line.characterRun.characterIndex != expectedLine.characterRun.characterIndex)
250 std::cout << " Different line info for line : " << index << std::endl;
252 std::cout << " expected" << std::endl;
256 if(line.characterRun.numberOfCharacters != expectedLine.characterRun.numberOfCharacters)
258 std::cout << " Different line info for line : " << index << std::endl;
260 std::cout << " expected" << std::endl;
265 if(fabsf(floor(line.width) - expectedLine.width) > Math::MACHINE_EPSILON_1)
267 std::cout << " Different line info for line : " << index << std::endl;
269 std::cout << " expected" << std::endl;
274 if(fabsf(line.ascender - expectedLine.ascender) > Math::MACHINE_EPSILON_1)
276 std::cout << " Different line info for line : " << index << std::endl;
278 std::cout << " expected" << std::endl;
283 if(fabsf(line.descender - expectedLine.descender) > Math::MACHINE_EPSILON_1)
285 std::cout << " Different line info for line : " << index << std::endl;
287 std::cout << " expected" << std::endl;
292 if(fabsf(line.extraLength - expectedLine.extraLength) > Math::MACHINE_EPSILON_1)
294 std::cout << " Different line info for line : " << index << std::endl;
296 std::cout << " expected" << std::endl;
301 if(line.ellipsis != expectedLine.ellipsis)
303 std::cout << " Different line info for line : " << index << std::endl;
305 std::cout << " expected" << std::endl;
310 // Do not compare the alignment offset as it's not calculated in the layout.
311 // Do not compare the line direction as it's not set in the layout.
317 ////////////////////////////////////////////////////////
321 //////////////////////////////////////////////////////////
323 // UtcDaliTextCharacterSpacingSingleLineTextArea1
324 // UtcDaliTextCharacterSpacingSingleLineTextArea2
325 // UtcDaliTextCharacterSpacingSingleLineTextArea3
326 // UtcDaliTextCharacterSpacingMultilineText1
327 // UtcDaliTextCharacterSpacingMultilineText2
329 //////////////////////////////////////////////////////////
331 int UtcDaliTextCharacterSpacingSingleLineTextArea1(void)
333 ToolkitTestApplication application;
334 tet_infoline(" UtcDaliTextCharacterSpacingSingleLineTextArea1");
336 // Will layout the text in single line as it can be scrolled.
338 const std::string fontFamily("TizenSans");
340 // Set a known font description
341 FontDescriptionRun fontDescriptionRun;
342 fontDescriptionRun.characterRun.characterIndex = 0u;
343 fontDescriptionRun.characterRun.numberOfCharacters = 11u;
344 fontDescriptionRun.familyLength = fontFamily.size();
345 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
346 memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength);
347 fontDescriptionRun.familyDefined = true;
348 fontDescriptionRun.weightDefined = false;
349 fontDescriptionRun.widthDefined = false;
350 fontDescriptionRun.slantDefined = false;
351 fontDescriptionRun.sizeDefined = false;
353 Vector<FontDescriptionRun> fontDescriptionRuns;
354 fontDescriptionRuns.PushBack(fontDescriptionRun);
355 Size textArea(1.f, 1.f);
357 //******* characterSpacing = 0.0f *******//
358 float positions[] = {
359 0.f, -12.f, 10.f, -9.f, 19.875f, -13.f, 23.8906f, -13.f, 26.9062f, -9.f, 36.1875f, -0.f, 40.1875f, -9.f, 52.1562f, -9.f, 62.4375f, -9.f, 68.5f, -13.f, 71.5156f, -13.f};
360 Size layoutSize(81.f, 20.f);
361 //************************************//
363 struct LineRun line =
375 Vector<LineRun> lines;
376 lines.PushBack(line);
378 LayoutTextData data =
380 "Layout text in a small area",
384 fontDescriptionRuns.Begin(),
390 Layout::Engine::SINGLE_LINE_BOX,
397 if(!LayoutTextTest(data))
399 tet_result(TET_FAIL);
402 tet_result(TET_PASS);
406 int UtcDaliTextCharacterSpacingSingleLineTextArea2(void)
408 ToolkitTestApplication application;
409 tet_infoline(" UtcDaliTextCharacterSpacingSingleLineTextArea2");
411 // Will layout the text in single line as it can be scrolled.
413 const std::string fontFamily("TizenSans");
415 // Set a known font description
416 FontDescriptionRun fontDescriptionRun;
417 fontDescriptionRun.characterRun.characterIndex = 0u;
418 fontDescriptionRun.characterRun.numberOfCharacters = 11u;
419 fontDescriptionRun.familyLength = fontFamily.size();
420 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
421 memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength);
422 fontDescriptionRun.familyDefined = true;
423 fontDescriptionRun.weightDefined = false;
424 fontDescriptionRun.widthDefined = false;
425 fontDescriptionRun.slantDefined = false;
426 fontDescriptionRun.sizeDefined = false;
428 Vector<FontDescriptionRun> fontDescriptionRuns;
429 fontDescriptionRuns.PushBack(fontDescriptionRun);
430 Size textArea(1.f, 1.f);
432 //******* characterSpacing = 2.0f *******//
433 float positions[] = {
434 0.f, -12.f, 12.f, -9.f, 23.875f, -13.f, 29.8906f, -13.f, 34.9062f, -9.f, 46.1875f, -0.f, 52.1875f, -9.f, 66.1562f, -9.f, 78.4375f, -9.f, 86.5f, -13.f, 91.5156f, -13.f};
435 Size layoutSize(101.f, 20.f);
436 //************************************//
438 struct LineRun line =
450 Vector<LineRun> lines;
451 lines.PushBack(line);
453 LayoutTextData data =
455 "Layout text in a small area",
459 fontDescriptionRuns.Begin(),
465 Layout::Engine::SINGLE_LINE_BOX,
472 if(!LayoutTextTest(data))
474 tet_result(TET_FAIL);
477 tet_result(TET_PASS);
481 int UtcDaliTextCharacterSpacingSingleLineTextArea3(void)
483 ToolkitTestApplication application;
484 tet_infoline(" UtcDaliTextCharacterSpacingSingleLineTextArea3");
486 // Will layout the text in single line as it can be scrolled.
488 const std::string fontFamily("TizenSans");
490 // Set a known font description
491 FontDescriptionRun fontDescriptionRun;
492 fontDescriptionRun.characterRun.characterIndex = 0u;
493 fontDescriptionRun.characterRun.numberOfCharacters = 11u;
494 fontDescriptionRun.familyLength = fontFamily.size();
495 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
496 memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength);
497 fontDescriptionRun.familyDefined = true;
498 fontDescriptionRun.weightDefined = false;
499 fontDescriptionRun.widthDefined = false;
500 fontDescriptionRun.slantDefined = false;
501 fontDescriptionRun.sizeDefined = false;
503 Vector<FontDescriptionRun> fontDescriptionRuns;
504 fontDescriptionRuns.PushBack(fontDescriptionRun);
505 Size textArea(1.f, 1.f);
507 //******* characterSpacing = 4.0f *******//
508 float positions[] = {
509 0.f, -12.f, 14.f, -9.f, 27.875f, -13.f, 35.8906f, -13.f, 42.9062f, -9.f, 56.1875f, -0.f, 64.1875f, -9.f, 80.1562f, -9.f, 94.4375f, -9.f, 104.5f, -13.f, 111.5156f, -13.f};
510 Size layoutSize(121.f, 20.f);
511 //************************************//
513 struct LineRun line =
525 Vector<LineRun> lines;
526 lines.PushBack(line);
528 LayoutTextData data =
530 "Layout text in a small area",
534 fontDescriptionRuns.Begin(),
540 Layout::Engine::SINGLE_LINE_BOX,
547 if(!LayoutTextTest(data))
549 tet_result(TET_FAIL);
552 tet_result(TET_PASS);
556 int UtcDaliTextCharacterSpacingMultilineText1(void)
558 ToolkitTestApplication application;
559 tet_infoline(" UtcDaliTextCharacterSpacingMultilineText1");
561 // Layout some lines of left to right text.
563 const std::string fontFamily("TizenSans");
565 // Set a known font description
566 FontDescriptionRun fontDescriptionRun1;
567 fontDescriptionRun1.characterRun.characterIndex = 0u;
568 fontDescriptionRun1.characterRun.numberOfCharacters = 18u;
569 fontDescriptionRun1.familyLength = fontFamily.size();
570 fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
571 memcpy(fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength);
572 fontDescriptionRun1.familyDefined = true;
573 fontDescriptionRun1.weightDefined = false;
574 fontDescriptionRun1.widthDefined = false;
575 fontDescriptionRun1.slantDefined = false;
576 fontDescriptionRun1.sizeDefined = false;
578 FontDescriptionRun fontDescriptionRun2;
579 fontDescriptionRun2.characterRun.characterIndex = 18u;
580 fontDescriptionRun2.characterRun.numberOfCharacters = 31u;
581 fontDescriptionRun2.familyLength = fontFamily.size();
582 fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
583 memcpy(fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength);
584 fontDescriptionRun2.familyDefined = true;
585 fontDescriptionRun2.weightDefined = false;
586 fontDescriptionRun2.widthDefined = false;
587 fontDescriptionRun2.slantDefined = false;
588 fontDescriptionRun2.sizeDefined = false;
590 Vector<FontDescriptionRun> fontDescriptionRuns;
591 fontDescriptionRuns.PushBack(fontDescriptionRun1);
592 fontDescriptionRuns.PushBack(fontDescriptionRun2);
593 Size textArea(100.f, 300.f);
594 Size layoutSize(98.f, 97.f);
597 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -2.f, 45.f, -12.f, 0.f, -12.f, 7.92188f, -9.f, 18.f, -9.f, 27.2031f, -9.f, 38.f, -9.f, 47.f, -11.f, 53.f, -0.f, 0.f, -12.f, 11.1562f, -12.f, 15.f, -12.f, 26.f, -9.f, 36.4844f, -9.f, 42.f, -9.f, 52.5469f, -9.f, 61.6875f, -11.f, 67.9688f, -0.f, 0.f, -12.f, 4.f, -12.f, 9.f, -9.f, 18.0469f, -9.f, 27.8906f, -9.f, 36.f, -0.f, 41.3281f, -9.f, 51.125f, -12.f, 57.f, -0.f, 62.f, -11.f, 68.1406f, -9.f, 77.7031f, -9.f, 87.f, -11.f, 94.4531f, -2.f};
598 struct LineRun line0 =
610 struct LineRun line1 =
622 struct LineRun line2 =
634 struct LineRun line3 =
646 struct LineRun line4 =
658 Vector<LineRun> lines;
659 lines.PushBack(line0);
660 lines.PushBack(line1);
661 lines.PushBack(line2);
662 lines.PushBack(line3);
663 lines.PushBack(line4);
665 LayoutTextData data =
667 "Layout simple multiline text",
668 "Hello world demo.\n"
669 "Layout different lines of text.",
672 fontDescriptionRuns.Begin(),
678 Layout::Engine::MULTI_LINE_BOX,
685 if(!LayoutTextTest(data))
687 tet_result(TET_FAIL);
690 tet_result(TET_PASS);
694 int UtcDaliTextCharacterSpacingMultilineText2(void)
696 ToolkitTestApplication application;
697 tet_infoline(" UtcDaliTextCharacterSpacingMultilineText2");
699 // Layout some lines of left to right text.
701 const std::string fontFamily("TizenSans");
703 // Set a known font description
704 FontDescriptionRun fontDescriptionRun1;
705 fontDescriptionRun1.characterRun.characterIndex = 0u;
706 fontDescriptionRun1.characterRun.numberOfCharacters = 18u;
707 fontDescriptionRun1.familyLength = fontFamily.size();
708 fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
709 memcpy(fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength);
710 fontDescriptionRun1.familyDefined = true;
711 fontDescriptionRun1.weightDefined = false;
712 fontDescriptionRun1.widthDefined = false;
713 fontDescriptionRun1.slantDefined = false;
714 fontDescriptionRun1.sizeDefined = false;
716 FontDescriptionRun fontDescriptionRun2;
717 fontDescriptionRun2.characterRun.characterIndex = 18u;
718 fontDescriptionRun2.characterRun.numberOfCharacters = 31u;
719 fontDescriptionRun2.familyLength = fontFamily.size();
720 fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
721 memcpy(fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength);
722 fontDescriptionRun2.familyDefined = true;
723 fontDescriptionRun2.weightDefined = false;
724 fontDescriptionRun2.widthDefined = false;
725 fontDescriptionRun2.slantDefined = false;
726 fontDescriptionRun2.sizeDefined = false;
728 Vector<FontDescriptionRun> fontDescriptionRuns;
729 fontDescriptionRuns.PushBack(fontDescriptionRun1);
730 fontDescriptionRuns.PushBack(fontDescriptionRun2);
731 Size textArea(100.f, 300.f);
732 Size layoutSize(82.f, 136.f);
735 0.f, -12.f, 12.f, -9.f, 24.f, -13.f, 30.f, -13.f, 35.f, -9.f, 46.f, -0.f, 0.f, -9.f, 13.9688f, -9.f, 26.25f, -9.f, 34.3125f, -13.f, 39.3281f, -13.f, 50.6406f, -0.f, 0.f, -13.f, 11.3125f, -9.f, 22.7031f, -9.f, 37.5625, -9.f, 48.8438f, -2.f, 54.8125, -12.f, 0.f, -12.f, 9.92188f, -9.f, 21.7344, -9.f, 33.2031f, -9.f, 46.f, -9.f, 57.1406f, -11.f, 65.4219f, -0.f, 0.f, -12.f, 13.1562f, -12.f, 18.6094f, -12.f, 31.6406f, -9.f, 44.4844f, -9.f, 51.7031f, -9.f, 64.5469f, -9.f, 75.6875f, -11.f, 83.9688, -0.f, 0.f, -12.f, 6.45312f, -12.f, 12.9062f, -9.f, 24.0469f, -9.f, 35.8906f, -9.f, 46.2344f, -0.f, 53.3281f, -9.f, 65.125f, -12.f, 72.7656f, -0.f, 0.f, -11.f, 8.28125f, -9.f, 19.8438f, -9.f, 31.3125f, -11.f, 40.5938f, -2.f};
736 struct LineRun line0 =
748 struct LineRun line1 =
760 struct LineRun line2 =
772 struct LineRun line3 =
784 struct LineRun line4 =
796 struct LineRun line5 =
808 struct LineRun line6 =
820 Vector<LineRun> lines;
821 lines.PushBack(line0);
822 lines.PushBack(line1);
823 lines.PushBack(line2);
824 lines.PushBack(line3);
825 lines.PushBack(line4);
826 lines.PushBack(line5);
827 lines.PushBack(line6);
829 LayoutTextData data =
831 "Layout simple multiline text",
832 "Hello world demo.\n"
833 "Layout different lines of text.",
836 fontDescriptionRuns.Begin(),
842 Layout::Engine::MULTI_LINE_BOX,
849 if(!LayoutTextTest(data))
851 tet_result(TET_FAIL);
854 tet_result(TET_PASS);