[dali_2.3.21] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-Text-Layout.cpp
1 /*
2  * Copyright (c) 2022 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 #include <stdlib.h>
19 #include <unistd.h>
20 #include <iostream>
21
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>
28
29 using namespace Dali;
30 using namespace Toolkit;
31 using namespace Text;
32
33 // Tests the LayoutEngine methods.
34
35 //////////////////////////////////////////////////////////
36
37 namespace
38 {
39 const std::string DEFAULT_FONT_DIR("/resources/fonts");
40
41 struct LayoutTextData
42 {
43   std::string                       description;
44   std::string                       text;
45   Size                              textArea;
46   unsigned int                      numberOfFonts;
47   FontDescriptionRun*               fontDescriptions;
48   Size                              layoutSize;
49   unsigned int                      totalNumberOfGlyphs;
50   float*                            positions;
51   unsigned int                      numberOfLines;
52   LineRun*                          lines;
53   Layout::Engine::Type              layout;
54   unsigned int                      startIndex;
55   unsigned int                      numberOfGlyphs;
56   bool                              ellipsis : 1;
57   DevelText::EllipsisPosition::Type ellipsisPosition;
58   bool                              updated : 1;
59 };
60
61 void Print(const LineRun& line)
62 {
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;
72 }
73
74 bool LayoutTextTest(const LayoutTextData& data)
75 {
76   // Load some fonts.
77   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
78   fontClient.SetDpi(96u, 96u);
79
80   char*             pathNamePtr = get_current_dir_name();
81   const std::string pathName(pathNamePtr);
82   free(pathNamePtr);
83
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");
88
89   // 1) Create the model.
90   ModelPtr   textModel;
91   MetricsPtr metrics;
92   Size       layoutSize;
93
94   Vector<FontDescriptionRun> fontDescriptionRuns;
95   if(0u != data.numberOfFonts)
96   {
97     fontDescriptionRuns.Insert(fontDescriptionRuns.End(),
98                                data.fontDescriptions,
99                                data.fontDescriptions + data.numberOfFonts);
100   }
101
102   LayoutOptions options;
103   options.align = false;
104   CreateTextModel(data.text,
105                   data.textArea,
106                   fontDescriptionRuns,
107                   options,
108                   layoutSize,
109                   textModel,
110                   metrics,
111                   false,
112                   LineWrap::WORD,
113                   false,
114                   Toolkit::DevelText::EllipsisPosition::END,
115                   0.0f, // lineSpacing
116                   0.0f  // characterSpacing
117   );
118
119   LogicalModelPtr logicalModel = textModel->mLogicalModel;
120   VisualModelPtr  visualModel  = textModel->mVisualModel;
121
122   // 2) Clear the layout.
123   Vector<LineRun>& lines = visualModel->mLines;
124
125   const Length     numberOfCharacters = logicalModel->mText.Count();
126   const bool       isLastNewParagraph = (0u == numberOfCharacters) ? false : TextAbstraction::IsNewParagraph(*(logicalModel->mText.Begin() + (numberOfCharacters - 1u)));
127   const GlyphIndex lastGlyphIndex     = data.startIndex + data.numberOfGlyphs - 1u;
128   const bool       removeLastLine     = isLastNewParagraph && (lastGlyphIndex + 1u == visualModel->mGlyphs.Count());
129
130   LineIndex startRemoveIndex = 0u;
131
132   if(0u != lines.Count())
133   {
134     startRemoveIndex         = lines.Count();
135     LineIndex endRemoveIndex = startRemoveIndex;
136     ClearGlyphRuns(data.startIndex,
137                    lastGlyphIndex + (removeLastLine ? 1u : 0u),
138                    lines,
139                    startRemoveIndex,
140                    endRemoveIndex);
141
142     // Update the character runs of the lines.
143     const CharacterIndex* const glyphsToCharactersBuffer = visualModel->mGlyphsToCharacters.Begin();
144     const Length* const         charactersPerGlyph       = visualModel->mCharactersPerGlyph.Begin();
145     const CharacterIndex        startCharacterIndex      = *(glyphsToCharactersBuffer + data.startIndex);
146     const CharacterIndex        lastCharacterIndex       = *(glyphsToCharactersBuffer + lastGlyphIndex) + *(charactersPerGlyph + lastGlyphIndex) - 1u;
147     ClearCharacterRuns(startCharacterIndex,
148                        lastCharacterIndex + (removeLastLine ? 1u : 0u),
149                        lines,
150                        startRemoveIndex,
151                        endRemoveIndex);
152
153     lines.Erase(lines.Begin() + startRemoveIndex,
154                 lines.Begin() + endRemoveIndex);
155   }
156
157   Vector<Vector2>& glyphPositions = visualModel->mGlyphPositions;
158
159   glyphPositions.Erase(glyphPositions.Begin() + data.startIndex,
160                        glyphPositions.Begin() + data.startIndex + data.numberOfGlyphs);
161
162   // 3) Layout
163   Layout::Engine engine;
164   engine.SetMetrics(metrics);
165   engine.SetLayout(data.layout);
166
167   textModel->mHorizontalAlignment   = Text::HorizontalAlignment::BEGIN;
168   textModel->mLineWrapMode          = LineWrap::WORD;
169   textModel->mIgnoreSpacesAfterText = true;
170   Layout::Parameters layoutParameters(data.textArea,
171                                       textModel);
172
173   layoutParameters.isLastNewParagraph = isLastNewParagraph;
174
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();
180
181   layoutSize = Vector2::ZERO;
182
183   bool       isAutoScroll                   = false;
184   bool       isAutoScrollMaxTextureExceeded = false;
185   bool       isHiddenInputEnabled           = false;
186   const bool updated                        = engine.LayoutText(layoutParameters,
187                                          layoutSize,
188                                          data.ellipsis,
189                                          isAutoScroll,
190                                          isAutoScrollMaxTextureExceeded,
191                                          isHiddenInputEnabled,
192                                          data.ellipsisPosition);
193
194   // 4) Compare the results.
195
196   if(updated != data.updated)
197   {
198     std::cout << "  Different updated bool : " << updated << ", expected : " << data.updated << std::endl;
199     return false;
200   }
201
202   if(layoutSize != data.layoutSize)
203   {
204     std::cout << "  Different layout size : " << layoutSize << ", expected : " << data.layoutSize << std::endl;
205     return false;
206   }
207
208   for(unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index)
209   {
210     const Vector2& position = *(glyphPositions.Begin() + index);
211
212     if(fabsf(std::round(position.x) - *(data.positions + 2u * index)) > Math::MACHINE_EPSILON_1000)
213     {
214       std::cout << "  Different position for glyph " << index << " x : " << position.x << ", expected : " << *(data.positions + 2u * index) << std::endl;
215       return false;
216     }
217     if(fabsf(position.y - *(data.positions + 2u * index + 1u)) > Math::MACHINE_EPSILON_1000)
218     {
219       std::cout << "  Different position for glyph " << index << " y : " << position.y << ", expected : " << *(data.positions + 2u * index + 1u) << std::endl;
220       return false;
221     }
222   }
223
224   if(lines.Count() != data.numberOfLines)
225   {
226     std::cout << "  Different number of lines : " << lines.Count() << ", expected : " << data.numberOfLines << std::endl;
227     return false;
228   }
229
230   for(unsigned int index = 0u; index < data.numberOfLines; ++index)
231   {
232     const LineRun& line         = *(lines.Begin() + index);
233     const LineRun& expectedLine = *(data.lines + index);
234
235     if(line.glyphRun.glyphIndex != expectedLine.glyphRun.glyphIndex)
236     {
237       std::cout << "  Different line info for line : " << index << std::endl;
238       Print(line);
239       std::cout << "  expected" << std::endl;
240       Print(expectedLine);
241       return false;
242     }
243     if(line.glyphRun.numberOfGlyphs != expectedLine.glyphRun.numberOfGlyphs)
244     {
245       std::cout << "  Different line info for line : " << index << std::endl;
246       Print(line);
247       std::cout << "  expected" << std::endl;
248       Print(expectedLine);
249       return false;
250     }
251
252     if(line.characterRun.characterIndex != expectedLine.characterRun.characterIndex)
253     {
254       std::cout << "  Different line info for line : " << index << std::endl;
255       Print(line);
256       std::cout << "  expected" << std::endl;
257       Print(expectedLine);
258       return false;
259     }
260     if(line.characterRun.numberOfCharacters != expectedLine.characterRun.numberOfCharacters)
261     {
262       std::cout << "  Different line info for line : " << index << std::endl;
263       Print(line);
264       std::cout << "  expected" << std::endl;
265       Print(expectedLine);
266       return false;
267     }
268
269     if(fabsf(floor(line.width) - expectedLine.width) > Math::MACHINE_EPSILON_1)
270     {
271       std::cout << "  Different line info for line : " << index << std::endl;
272       Print(line);
273       std::cout << "  expected" << std::endl;
274       Print(expectedLine);
275       return false;
276     }
277
278     if(fabsf(line.ascender - expectedLine.ascender) > Math::MACHINE_EPSILON_1)
279     {
280       std::cout << "  Different line info for line : " << index << std::endl;
281       Print(line);
282       std::cout << "  expected" << std::endl;
283       Print(expectedLine);
284       return false;
285     }
286
287     if(fabsf(line.descender - expectedLine.descender) > Math::MACHINE_EPSILON_1)
288     {
289       std::cout << "  Different line info for line : " << index << std::endl;
290       Print(line);
291       std::cout << "  expected" << std::endl;
292       Print(expectedLine);
293       return false;
294     }
295
296     if(fabsf(line.extraLength - expectedLine.extraLength) > Math::MACHINE_EPSILON_1)
297     {
298       std::cout << "  Different line info for line : " << index << std::endl;
299       Print(line);
300       std::cout << "  expected" << std::endl;
301       Print(expectedLine);
302       return false;
303     }
304
305     if(line.ellipsis != expectedLine.ellipsis)
306     {
307       std::cout << "  Different line info for line : " << index << std::endl;
308       Print(line);
309       std::cout << "  expected" << std::endl;
310       Print(expectedLine);
311       return false;
312     }
313     // Do not compare the alignment offset as it's not calculated in the layout.
314     // Do not compare the line direction as it's not set in the layout.
315   }
316
317   return true;
318 }
319
320 //////////////////////////////////////////////////////////
321
322 struct AlignData
323 {
324   std::string                     description;
325   std::string                     text;
326   Size                            textArea;
327   unsigned int                    numberOfFonts;
328   FontDescriptionRun*             fontDescriptions;
329   Text::HorizontalAlignment::Type horizontalAlignment;
330   Text::VerticalAlignment::Type   verticalAlignment;
331   unsigned int                    startIndex;
332   unsigned int                    numberOfCharacters;
333   unsigned int                    numberOfLines;
334   float*                          lineOffsets;
335   Dali::LayoutDirection::Type     layoutDirection;
336   bool                            matchSystemLanguageDirection;
337 };
338
339 bool AlignTest(const AlignData& data)
340 {
341   // Load some fonts.
342   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
343   fontClient.SetDpi(96u, 96u);
344
345   char*             pathNamePtr = get_current_dir_name();
346   const std::string pathName(pathNamePtr);
347   free(pathNamePtr);
348
349   fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf");
350   fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf");
351   fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf");
352
353   // 1) Create the model.
354   ModelPtr   textModel;
355   MetricsPtr metrics;
356   Size       layoutSize;
357
358   Vector<FontDescriptionRun> fontDescriptionRuns;
359   if(0u != data.numberOfFonts)
360   {
361     fontDescriptionRuns.Insert(fontDescriptionRuns.End(),
362                                data.fontDescriptions,
363                                data.fontDescriptions + data.numberOfFonts);
364   }
365
366   LayoutOptions options;
367   options.align = false;
368   CreateTextModel(data.text,
369                   data.textArea,
370                   fontDescriptionRuns,
371                   options,
372                   layoutSize,
373                   textModel,
374                   metrics,
375                   false,
376                   LineWrap::WORD,
377                   false,
378                   Toolkit::DevelText::EllipsisPosition::END,
379                   0.0f, // lineSpacing
380                   0.0f  // characterSpacing
381   );
382
383   LogicalModelPtr logicalModel = textModel->mLogicalModel;
384   VisualModelPtr  visualModel  = textModel->mVisualModel;
385
386   // Call the Align method.
387   Layout::Engine engine;
388   engine.SetMetrics(metrics);
389
390   float alignmentOffset = 0.f;
391   engine.Align(data.textArea,
392                data.startIndex,
393                data.numberOfCharacters,
394                data.horizontalAlignment,
395                visualModel->mLines,
396                alignmentOffset,
397                data.layoutDirection,
398                data.matchSystemLanguageDirection);
399
400   // Compare results.
401   if(data.numberOfLines != visualModel->mLines.Count())
402   {
403     std::cout << "  Different number of lines : " << visualModel->mLines.Count() << ", expected : " << data.numberOfLines << std::endl;
404     return false;
405   }
406
407   const LineRun* const linesBuffer = visualModel->mLines.Begin();
408   for(unsigned int index = 0u; index < data.numberOfLines; ++index)
409   {
410     const LineRun& line = *(linesBuffer + index);
411
412     if(line.alignmentOffset != *(data.lineOffsets + index))
413     {
414       std::cout << "  different line offset for index " << index << " : " << line.alignmentOffset << ", expected : " << *(data.lineOffsets + index) << std::endl;
415       return false;
416     }
417   }
418   return true;
419 }
420
421 } // namespace
422
423 //////////////////////////////////////////////////////////
424 //
425 // UtcDaliTextLayoutSetGetLayout
426 // UtcDaliTextLayoutSetGetTextEllipsisEnabled
427 // UtcDaliTextLayoutSetGetHorizontalAlignment
428 // UtcDaliTextLayoutSetGetVerticalAlignment
429 // UtcDaliTextLayoutSetGetCursorWidth
430 // UtcDaliTextLayoutNoText
431 // UtcDaliTextLayoutSmallTextArea01
432 // UtcDaliTextLayoutSmallTextArea02
433 // UtcDaliTextLayoutMultilineText01
434 // UtcDaliTextLayoutMultilineText02
435 // UtcDaliTextLayoutMultilineText03
436 // UtcDaliTextLayoutMultilineText04
437 // UtcDaliTextLayoutMultilineText05
438 // UtcDaliTextLayoutMultilineText06
439 // UtcDaliTextUpdateLayout01
440 // UtcDaliTextUpdateLayout02
441 // UtcDaliTextUpdateLayout03
442 // UtcDaliTextLayoutEllipsis01
443 // UtcDaliTextLayoutEllipsis02
444 // UtcDaliTextLayoutEllipsis03
445 // UtcDaliTextLayoutEllipsis04
446 // UtcDaliTextLayoutEllipsis04
447 // UtcDaliTextReorderLayout01
448 // UtcDaliTextReorderLayout02
449 // UtcDaliTextReorderLayout03
450 // UtcDaliTextReorderLayout04
451 // UtcDaliTextAlign01
452 // UtcDaliTextAlign02
453 // UtcDaliTextAlign03
454 // UtcDaliTextAlign04
455 // UtcDaliTextAlign05
456 // UtcDaliTextAlign06
457 // UtcDaliTextAlign07
458 // UtcDaliTextAlign08
459 // UtcDaliTextAlign09
460 //
461 //////////////////////////////////////////////////////////
462
463 int UtcDaliTextLayoutSetGetLayout(void)
464 {
465   ToolkitTestApplication application;
466   tet_infoline(" UtcDaliTextLayoutSetGetLayout");
467
468   Layout::Engine engine;
469
470   DALI_TEST_CHECK(Layout::Engine::SINGLE_LINE_BOX == engine.GetLayout());
471
472   engine.SetLayout(Layout::Engine::MULTI_LINE_BOX);
473   DALI_TEST_CHECK(Layout::Engine::MULTI_LINE_BOX == engine.GetLayout());
474
475   tet_result(TET_PASS);
476   END_TEST;
477 }
478
479 int UtcDaliTextLayoutSetGetCursorWidth(void)
480 {
481   ToolkitTestApplication application;
482   tet_infoline(" ");
483
484   Layout::Engine engine;
485
486   DALI_TEST_EQUALS(0, engine.GetCursorWidth(), TEST_LOCATION);
487
488   engine.SetCursorWidth(2);
489   DALI_TEST_EQUALS(2, engine.GetCursorWidth(), TEST_LOCATION);
490
491   tet_result(TET_PASS);
492   END_TEST;
493 }
494
495 int UtcDaliTextLayoutNoText(void)
496 {
497   ToolkitTestApplication application;
498   tet_infoline(" UtcDaliTextLayoutNoText");
499
500   Size           textArea(100.f, 60.f);
501   Size           layoutSize = Vector2::ZERO;
502   LayoutTextData data =
503     {
504       "No text",
505       "",
506       textArea,
507       0u,
508       NULL,
509       layoutSize,
510       0u,
511       NULL,
512       0u,
513       NULL,
514       Layout::Engine::MULTI_LINE_BOX,
515       0u,
516       0u,
517       false,
518       DevelText::EllipsisPosition::END,
519       false};
520
521   if(!LayoutTextTest(data))
522   {
523     tet_result(TET_FAIL);
524   }
525
526   tet_result(TET_PASS);
527   END_TEST;
528 }
529
530 int UtcDaliTextLayoutSmallTextArea01(void)
531 {
532   ToolkitTestApplication application;
533   tet_infoline(" UtcDaliTextLayoutSmallTextArea01");
534
535   // Won't layout the text in multi-line if the width is too small.
536
537   const std::string fontFamily("TizenSans");
538
539   // Set a known font description
540   FontDescriptionRun fontDescriptionRun;
541   fontDescriptionRun.characterRun.characterIndex     = 0u;
542   fontDescriptionRun.characterRun.numberOfCharacters = 11u;
543   fontDescriptionRun.familyLength                    = fontFamily.size();
544   fontDescriptionRun.familyName                      = new char[fontDescriptionRun.familyLength];
545   memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength);
546   fontDescriptionRun.familyDefined = true;
547   fontDescriptionRun.weightDefined = false;
548   fontDescriptionRun.widthDefined  = false;
549   fontDescriptionRun.slantDefined  = false;
550   fontDescriptionRun.sizeDefined   = false;
551
552   Vector<FontDescriptionRun> fontDescriptionRuns;
553   fontDescriptionRuns.PushBack(fontDescriptionRun);
554   Size           textArea(1.f, 1.f);
555   Size           layoutSize = Vector2::ZERO;
556   LayoutTextData data =
557     {
558       "Layout text in a small area",
559       "Hello world",
560       textArea,
561       1u,
562       fontDescriptionRuns.Begin(),
563       layoutSize,
564       0u,
565       NULL,
566       0u,
567       NULL,
568       Layout::Engine::MULTI_LINE_BOX,
569       0u,
570       11u,
571       false,
572       DevelText::EllipsisPosition::END,
573       false};
574
575   if(!LayoutTextTest(data))
576   {
577     tet_result(TET_FAIL);
578   }
579
580   tet_result(TET_PASS);
581   END_TEST;
582 }
583
584 int UtcDaliTextLayoutSmallTextArea02(void)
585 {
586   ToolkitTestApplication application;
587   tet_infoline(" UtcDaliTextLayoutSmallTextArea02");
588
589   // Will layout the text in single line as it can be scrolled.
590
591   const std::string fontFamily("TizenSans");
592
593   // Set a known font description
594   FontDescriptionRun fontDescriptionRun;
595   fontDescriptionRun.characterRun.characterIndex     = 0u;
596   fontDescriptionRun.characterRun.numberOfCharacters = 11u;
597   fontDescriptionRun.familyLength                    = fontFamily.size();
598   fontDescriptionRun.familyName                      = new char[fontDescriptionRun.familyLength];
599   memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength);
600   fontDescriptionRun.familyDefined = true;
601   fontDescriptionRun.weightDefined = false;
602   fontDescriptionRun.widthDefined  = false;
603   fontDescriptionRun.slantDefined  = false;
604   fontDescriptionRun.sizeDefined   = false;
605
606   Vector<FontDescriptionRun> fontDescriptionRuns;
607   fontDescriptionRuns.PushBack(fontDescriptionRun);
608   Size           textArea(1.f, 1.f);
609   Size           layoutSize(79.f, 20.f);
610   float          positions[] = {0.f, -12.f, 10.f, -9.f, 19.f, -13.f, 23.f, -13.f, 26.f, -9.f, 35.f, -0.f, 39.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f};
611   struct LineRun line =
612     {
613       {0u, 11u},
614       {0u, 11u},
615       79.f,
616       15.f,
617       -5.f,
618       0.f,
619       0.f,
620       0.f,
621       false,
622       false};
623   Vector<LineRun> lines;
624   lines.PushBack(line);
625
626   LayoutTextData data =
627     {
628       "Layout text in a small area",
629       "Hello world",
630       textArea,
631       1u,
632       fontDescriptionRuns.Begin(),
633       layoutSize,
634       11u,
635       positions,
636       1u,
637       lines.Begin(),
638       Layout::Engine::SINGLE_LINE_BOX,
639       0u,
640       11u,
641       false,
642       DevelText::EllipsisPosition::END,
643       true};
644
645   if(!LayoutTextTest(data))
646   {
647     tet_result(TET_FAIL);
648   }
649
650   tet_result(TET_PASS);
651   END_TEST;
652 }
653
654 int UtcDaliTextLayoutMultilineText01(void)
655 {
656   ToolkitTestApplication application;
657   tet_infoline(" UtcDaliTextLayoutMultilineText01");
658
659   // Layout some lines of left to right text.
660
661   const std::string fontFamily("TizenSans");
662
663   // Set a known font description
664   FontDescriptionRun fontDescriptionRun1;
665   fontDescriptionRun1.characterRun.characterIndex     = 0u;
666   fontDescriptionRun1.characterRun.numberOfCharacters = 18u;
667   fontDescriptionRun1.familyLength                    = fontFamily.size();
668   fontDescriptionRun1.familyName                      = new char[fontDescriptionRun1.familyLength];
669   memcpy(fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength);
670   fontDescriptionRun1.familyDefined = true;
671   fontDescriptionRun1.weightDefined = false;
672   fontDescriptionRun1.widthDefined  = false;
673   fontDescriptionRun1.slantDefined  = false;
674   fontDescriptionRun1.sizeDefined   = false;
675
676   FontDescriptionRun fontDescriptionRun2;
677   fontDescriptionRun2.characterRun.characterIndex     = 18u;
678   fontDescriptionRun2.characterRun.numberOfCharacters = 31u;
679   fontDescriptionRun2.familyLength                    = fontFamily.size();
680   fontDescriptionRun2.familyName                      = new char[fontDescriptionRun2.familyLength];
681   memcpy(fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength);
682   fontDescriptionRun2.familyDefined = true;
683   fontDescriptionRun2.weightDefined = false;
684   fontDescriptionRun2.widthDefined  = false;
685   fontDescriptionRun2.slantDefined  = false;
686   fontDescriptionRun2.sizeDefined   = false;
687
688   Vector<FontDescriptionRun> fontDescriptionRuns;
689   fontDescriptionRuns.PushBack(fontDescriptionRun1);
690   fontDescriptionRuns.PushBack(fontDescriptionRun2);
691   Size  textArea(100.f, 300.f);
692   Size  layoutSize(96.f, 97.f);
693   float positions[] =
694     {
695       0.f, -12.f, 10.f, -9.f, 19.f, -13.f, 23.f, -13.f, 26.f, -9.f, 35.f, -0.f, 39.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f, 0.f, -13.f, 9.f, -9.f, 18.f, -9.f, 31.f, -9.f, 40.f, -2.f, 44.f, -12.f, 0.f, -12.f, 8.f, -9.f, 18.f, -9.f, 27.f, -9.f, 38.f, -9.f, 47.f, -11.f, 53.f, -0.f, 0.f, -12.f, 11.f, -12.f, 14.f, -12.f, 25.f, -9.f, 36.f, -9.f, 41.f, -9.f, 52.f, -9.f, 61.f, -11.f, 67.f, -0.f, 0.f, -12.f, 4.f, -12.f, 8.f, -9.f, 17.f, -9.f, 27.f, -9.f, 35.f, -0.f, 40.f, -9.f, 50.f, -12.f, 56.f, -0.f, 61.f, -11.f, 67.f, -9.f, 77.f, -9.f, 86.f, -11.f, 93.f, -2.f
696     };
697
698   struct LineRun line0 =
699     {
700       {0u, 12u},
701       {0u, 12u},
702       79.f,
703       15.f,
704       -5.f,
705       4.f,
706       0.f,
707       0.f,
708       false,
709       false};
710   struct LineRun line1 =
711     {
712       {12u, 6u},
713       {12u, 6u},
714       43.f,
715       15.f,
716       -5.f,
717       0.f,
718       0.f,
719       0.f,
720       false,
721       false};
722   struct LineRun line2 =
723     {
724       {18u, 7u},
725       {18u, 7u},
726       53.f,
727       15.f,
728       -4.f,
729       5.f,
730       0.f,
731       0.f,
732       false,
733       false};
734   struct LineRun line3 =
735     {
736       {25u, 9u},
737       {25u, 10u},
738       67.f,
739       15.f,
740       -4.f,
741       5.f,
742       0.f,
743       0.f,
744       false,
745       false};
746   struct LineRun line4 =
747     {
748       {34u, 14u},
749       {35u, 14u},
750       96.f,
751       15.f,
752       -4.f,
753       0.f,
754       0.f,
755       0.f,
756       false,
757       false};
758   Vector<LineRun> lines;
759   lines.PushBack(line0);
760   lines.PushBack(line1);
761   lines.PushBack(line2);
762   lines.PushBack(line3);
763   lines.PushBack(line4);
764
765   LayoutTextData data =
766     {
767       "Layout simple multi-line text",
768       "Hello world demo.\n"
769       "Layout different lines of text.",
770       textArea,
771       1u,
772       fontDescriptionRuns.Begin(),
773       layoutSize,
774       48u,
775       positions,
776       5u,
777       lines.Begin(),
778       Layout::Engine::MULTI_LINE_BOX,
779       0u,
780       48u,
781       false,
782       DevelText::EllipsisPosition::END,
783       true};
784
785   if(!LayoutTextTest(data))
786   {
787     tet_result(TET_FAIL);
788   }
789
790   tet_result(TET_PASS);
791   END_TEST;
792 }
793
794 int UtcDaliTextLayoutMultilineText02(void)
795 {
796   ToolkitTestApplication application;
797   tet_infoline(" UtcDaliTextLayoutMultilineText02");
798
799   // Layout some lines of bidirectional text.
800
801   const std::string fontFamily1("TizenSans");
802
803   // Set a known font description
804   FontDescriptionRun fontDescriptionRun1;
805   fontDescriptionRun1.characterRun.characterIndex     = 0u;
806   fontDescriptionRun1.characterRun.numberOfCharacters = 17u;
807   fontDescriptionRun1.familyLength                    = fontFamily1.size();
808   fontDescriptionRun1.familyName                      = new char[fontDescriptionRun1.familyLength];
809   memcpy(fontDescriptionRun1.familyName, fontFamily1.c_str(), fontDescriptionRun1.familyLength);
810   fontDescriptionRun1.familyDefined = true;
811   fontDescriptionRun1.weightDefined = false;
812   fontDescriptionRun1.widthDefined  = false;
813   fontDescriptionRun1.slantDefined  = false;
814   fontDescriptionRun1.sizeDefined   = false;
815
816   const std::string fontFamily2("TizenSansHebrew");
817
818   // Set a known font description
819   FontDescriptionRun fontDescriptionRun2;
820   fontDescriptionRun2.characterRun.characterIndex     = 17u;
821   fontDescriptionRun2.characterRun.numberOfCharacters = 9u;
822   fontDescriptionRun2.familyLength                    = fontFamily2.size();
823   fontDescriptionRun2.familyName                      = new char[fontDescriptionRun2.familyLength];
824   memcpy(fontDescriptionRun2.familyName, fontFamily2.c_str(), fontDescriptionRun2.familyLength);
825   fontDescriptionRun2.familyDefined = true;
826   fontDescriptionRun2.weightDefined = false;
827   fontDescriptionRun2.widthDefined  = false;
828   fontDescriptionRun2.slantDefined  = false;
829   fontDescriptionRun2.sizeDefined   = false;
830
831   const std::string fontFamily3("TizenSans");
832
833   // Set a known font description
834   FontDescriptionRun fontDescriptionRun3;
835   fontDescriptionRun3.characterRun.characterIndex     = 26u;
836   fontDescriptionRun3.characterRun.numberOfCharacters = 2u;
837   fontDescriptionRun3.familyLength                    = fontFamily3.size();
838   fontDescriptionRun3.familyName                      = new char[fontDescriptionRun3.familyLength];
839   memcpy(fontDescriptionRun3.familyName, fontFamily3.c_str(), fontDescriptionRun3.familyLength);
840   fontDescriptionRun3.familyDefined = true;
841   fontDescriptionRun3.weightDefined = false;
842   fontDescriptionRun3.widthDefined  = false;
843   fontDescriptionRun3.slantDefined  = false;
844   fontDescriptionRun3.sizeDefined   = false;
845
846   const std::string fontFamily4("TizenSansHebrew");
847
848   // Set a known font description
849   FontDescriptionRun fontDescriptionRun4;
850   fontDescriptionRun4.characterRun.characterIndex     = 28u;
851   fontDescriptionRun4.characterRun.numberOfCharacters = 10u;
852   fontDescriptionRun4.familyLength                    = fontFamily4.size();
853   fontDescriptionRun4.familyName                      = new char[fontDescriptionRun4.familyLength];
854   memcpy(fontDescriptionRun4.familyName, fontFamily4.c_str(), fontDescriptionRun4.familyLength);
855   fontDescriptionRun4.familyDefined = true;
856   fontDescriptionRun4.weightDefined = false;
857   fontDescriptionRun4.widthDefined  = false;
858   fontDescriptionRun4.slantDefined  = false;
859   fontDescriptionRun4.sizeDefined   = false;
860
861   const std::string fontFamily5("TizenSans");
862
863   // Set a known font description
864   FontDescriptionRun fontDescriptionRun5;
865   fontDescriptionRun5.characterRun.characterIndex     = 38u;
866   fontDescriptionRun5.characterRun.numberOfCharacters = 17u;
867   fontDescriptionRun5.familyLength                    = fontFamily5.size();
868   fontDescriptionRun5.familyName                      = new char[fontDescriptionRun5.familyLength];
869   memcpy(fontDescriptionRun5.familyName, fontFamily5.c_str(), fontDescriptionRun5.familyLength);
870   fontDescriptionRun5.familyDefined = true;
871   fontDescriptionRun5.weightDefined = false;
872   fontDescriptionRun5.widthDefined  = false;
873   fontDescriptionRun5.slantDefined  = false;
874   fontDescriptionRun5.sizeDefined   = false;
875
876   Vector<FontDescriptionRun> fontDescriptionRuns;
877   fontDescriptionRuns.PushBack(fontDescriptionRun1);
878   fontDescriptionRuns.PushBack(fontDescriptionRun2);
879   fontDescriptionRuns.PushBack(fontDescriptionRun3);
880   fontDescriptionRuns.PushBack(fontDescriptionRun4);
881   fontDescriptionRuns.PushBack(fontDescriptionRun5);
882   Size  textArea(100.f, 300.f);
883   Size  layoutSize(79.f, 120.f);
884   float positions[] =
885   {
886     0.f, -12.f, 10.f, -9.f, 19.f, -13.f, 23.f, -13.f, 26.f, -9.f, 35.f, -0.f, 39.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f, 0.f, -13.f, 9.f, -9.f, 18.f, -9.f, 31.f, -9.f, 40.f, -0.f, 67.f, -10.f, 58.f, -13.f, 54.f, -10.f, 44.f, -10.f, 78.f, -0.f, 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -2.f, 36.f, -12.f, 63.f, -10.f, 54.f, -13.f, 50.f, -10.f, 40.f, -10.f, 36.f, -0.f, 27.f, -10.f, 23.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, 4.f, -13.f, 12.f, -9.f, 21.f, -13.f, 25.f, -13.f, 28.f, -9.f, 37.f, -0.f, 41.f, -9.f, 53.f, -9.f, 63.f, -9.f, 69.f, -13.f, 72.f, -13.f, 0.f, -0.f, 4.f, -13.f, 13.f, -9.f, 22.f, -9.f, 35.f, -9.f, 0.f, -2.f
887   };
888   struct LineRun line0 =
889     {
890       {0u, 12u},
891       {0u, 12u},
892       79.f,
893       15.f,
894       -5.f,
895       4.f,
896       0.f,
897       0.f,
898       false,
899       false};
900   struct LineRun line1 =
901     {
902       {12u, 10u},
903       {12u, 10u},
904       78.f,
905       15.f,
906       -5.f,
907       4.f,
908       0.f,
909       0.f,
910       false,
911       false};
912   struct LineRun line2 =
913     {
914       {22u, 6u},
915       {22u, 6u},
916       35.f,
917       15.f,
918       -5.f,
919       0.f,
920       0.f,
921       0.f,
922       false,
923       false};
924   struct LineRun line3 =
925     {
926       {28u, 10u},
927       {28u, 10u},
928       70.f,
929       15.f,
930       -5.f,
931       4.f,
932       0.f,
933       0.f,
934       true,
935       false};
936   struct LineRun line4 =
937     {
938       {38u, 12u},
939       {38u, 12u},
940       77.f,
941       15.f,
942       -5.f,
943       4.f,
944       0.f,
945       0.f,
946       true,
947       false};
948   struct LineRun line5 =
949     {
950       {50u, 5u},
951       {50u, 5u},
952       44.f,
953       15.f,
954       -5.f,
955       0.f,
956       0.f,
957       0.f,
958       true,
959       false};
960   Vector<LineRun> lines;
961   lines.PushBack(line0);
962   lines.PushBack(line1);
963   lines.PushBack(line2);
964   lines.PushBack(line3);
965   lines.PushBack(line4);
966   lines.PushBack(line5);
967
968   LayoutTextData data =
969     {
970       "Layout bidirectional text.",
971       "Hello world demo שלום עולם.\n"
972       "שלום עולם hello world demo.",
973       textArea,
974       5u,
975       fontDescriptionRuns.Begin(),
976       layoutSize,
977       55u,
978       positions,
979       6u,
980       lines.Begin(),
981       Layout::Engine::MULTI_LINE_BOX,
982       0u,
983       55u,
984       false,
985       DevelText::EllipsisPosition::END,
986       true};
987
988   if(!LayoutTextTest(data))
989   {
990     tet_result(TET_FAIL);
991   }
992
993   tet_result(TET_PASS);
994   END_TEST;
995 }
996
997 int UtcDaliTextLayoutMultilineText03(void)
998 {
999   ToolkitTestApplication application;
1000   tet_infoline(" UtcDaliTextLayoutMultilineText03");
1001
1002   // Layout a long word which doesn't fit in the width of the text area.
1003
1004   const std::string fontFamily("TizenSans");
1005
1006   // Set a known font description
1007   FontDescriptionRun fontDescriptionRun;
1008   fontDescriptionRun.characterRun.characterIndex     = 0u;
1009   fontDescriptionRun.characterRun.numberOfCharacters = 29u;
1010   fontDescriptionRun.familyLength                    = fontFamily.size();
1011   fontDescriptionRun.familyName                      = new char[fontDescriptionRun.familyLength];
1012   memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength);
1013   fontDescriptionRun.familyDefined = true;
1014   fontDescriptionRun.weightDefined = false;
1015   fontDescriptionRun.widthDefined  = false;
1016   fontDescriptionRun.slantDefined  = false;
1017   fontDescriptionRun.sizeDefined   = false;
1018
1019   Vector<FontDescriptionRun> fontDescriptionRuns;
1020   fontDescriptionRuns.PushBack(fontDescriptionRun);
1021   Size  textArea(100.f, 300.f);
1022   Size  layoutSize(96.f, 60.f);
1023   float positions[] =
1024     {
1025       0.f, -12.f, 10.f, -9.f, 19.f, -13.f, 23.f, -13.f, 26.f, -9.f, 35.f, -9.f, 47.f, -9.f, 57.f, -9.f, 63.f, -13.f, 66.f, -13.f, 75.f, -13.f, 84.f, -9.f, 0.f, -9.f, 13.f, -9.f, 23.f, -13.f, 31.f, -9.f, 40.f, -13.f, 44.f, -13.f, 47.f, -9.f, 56.f, -9.f, 68.f, -9.f, 78.f, -9.f, 84.f, -13.f, 87.f, -13.f, 0.f, -13.f, 9.f, -9.f, 18.f, -9.f, 31.f, -9.f, 40.f, -2.f
1026     };
1027   struct LineRun line0 =
1028     {
1029       {0u, 12u},
1030       {0u, 12u},
1031       92.f,
1032       15.f,
1033       -5.f,
1034       0.f,
1035       0.f,
1036       0.f,
1037       false,
1038       false};
1039   struct LineRun line1 =
1040     {
1041       {12u, 12u},
1042       {12u, 12u},
1043       96.f,
1044       15.f,
1045       -5.f,
1046       0.f,
1047       0.f,
1048       0.f,
1049       false,
1050       false};
1051   struct LineRun line2 =
1052     {
1053       {24u, 5u},
1054       {24u, 5u},
1055       43.f,
1056       15.f,
1057       -5.f,
1058       0.f,
1059       0.f,
1060       0.f,
1061       false,
1062       false};
1063   Vector<LineRun> lines;
1064   lines.PushBack(line0);
1065   lines.PushBack(line1);
1066   lines.PushBack(line2);
1067
1068   LayoutTextData data =
1069     {
1070       "Layout a long word which doesn't fit in the width of the text area.",
1071       "Helloworlddemohelloworlddemo.",
1072       textArea,
1073       1u,
1074       fontDescriptionRuns.Begin(),
1075       layoutSize,
1076       29u,
1077       positions,
1078       3u,
1079       lines.Begin(),
1080       Layout::Engine::MULTI_LINE_BOX,
1081       0u,
1082       29u,
1083       false,
1084       DevelText::EllipsisPosition::END,
1085       true};
1086
1087   if(!LayoutTextTest(data))
1088   {
1089     tet_result(TET_FAIL);
1090   }
1091
1092   tet_result(TET_PASS);
1093   END_TEST;
1094 }
1095
1096 int UtcDaliTextLayoutMultilineText04(void)
1097 {
1098   ToolkitTestApplication application;
1099   tet_infoline(" UtcDaliTextLayoutMultilineText04");
1100
1101   // Layout simple text ending with a \n. It has to add a void line at the end.
1102
1103   const std::string fontFamily("TizenSans");
1104
1105   // Set a known font description
1106   FontDescriptionRun fontDescriptionRun;
1107   fontDescriptionRun.characterRun.characterIndex     = 0u;
1108   fontDescriptionRun.characterRun.numberOfCharacters = 13u;
1109   fontDescriptionRun.familyLength                    = fontFamily.size();
1110   fontDescriptionRun.familyName                      = new char[fontDescriptionRun.familyLength];
1111   memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength);
1112   fontDescriptionRun.familyDefined = true;
1113   fontDescriptionRun.weightDefined = false;
1114   fontDescriptionRun.widthDefined  = false;
1115   fontDescriptionRun.slantDefined  = false;
1116   fontDescriptionRun.sizeDefined   = false;
1117
1118   Vector<FontDescriptionRun> fontDescriptionRuns;
1119   fontDescriptionRuns.PushBack(fontDescriptionRun);
1120   Size  textArea(100.f, 300.f);
1121   Size  layoutSize(82.f, 40.f);
1122   float positions[] =
1123     {
1124       0.f, -12.f, 10.f, -9.f, 19.f, -13.f, 23.f, -13.f, 26.f, -9.f, 35.f, -0.f, 39.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -2.f, 83.f, -12.f};
1125   struct LineRun line0 =
1126     {
1127       {0u, 13u},
1128       {0u, 13u},
1129       82.f,
1130       15.f,
1131       -5.f,
1132       0.f,
1133       0.f,
1134       false,
1135       false};
1136   struct LineRun line1 =
1137     {
1138       {13u, 0u},
1139       {13u, 0u},
1140       0.f,
1141       15.f,
1142       -5.f,
1143       0.f,
1144       0.f,
1145       0.f,
1146       false,
1147       false};
1148   Vector<LineRun> lines;
1149   lines.PushBack(line0);
1150   lines.PushBack(line1);
1151
1152   LayoutTextData data =
1153     {
1154       "Layout simple text ending with a \n.",
1155       "Hello world.\n",
1156       textArea,
1157       1u,
1158       fontDescriptionRuns.Begin(),
1159       layoutSize,
1160       13u,
1161       positions,
1162       2u,
1163       lines.Begin(),
1164       Layout::Engine::MULTI_LINE_BOX,
1165       0u,
1166       13u,
1167       false,
1168       DevelText::EllipsisPosition::END,
1169       true};
1170
1171   if(!LayoutTextTest(data))
1172   {
1173     tet_result(TET_FAIL);
1174   }
1175
1176   tet_result(TET_PASS);
1177   END_TEST;
1178 }
1179
1180 int UtcDaliTextLayoutMultilineText05(void)
1181 {
1182   ToolkitTestApplication application;
1183   tet_infoline(" UtcDaliTextLayoutMultilineText05");
1184
1185   // Layout simple text with one character with a different font size.
1186
1187   const std::string fontFamily("TizenSans");
1188
1189   // Set a known font description
1190   FontDescriptionRun fontDescriptionRun1;
1191   fontDescriptionRun1.characterRun.characterIndex     = 0u;
1192   fontDescriptionRun1.characterRun.numberOfCharacters = 6u;
1193   fontDescriptionRun1.familyLength                    = fontFamily.size();
1194   fontDescriptionRun1.familyName                      = new char[fontDescriptionRun1.familyLength];
1195   memcpy(fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength);
1196   fontDescriptionRun1.familyDefined = true;
1197   fontDescriptionRun1.weightDefined = false;
1198   fontDescriptionRun1.widthDefined  = false;
1199   fontDescriptionRun1.slantDefined  = false;
1200   fontDescriptionRun1.sizeDefined   = false;
1201
1202   FontDescriptionRun fontDescriptionRun2;
1203   fontDescriptionRun2.characterRun.characterIndex     = 6u;
1204   fontDescriptionRun2.characterRun.numberOfCharacters = 1u;
1205   fontDescriptionRun2.familyLength                    = fontFamily.size();
1206   fontDescriptionRun2.familyName                      = new char[fontDescriptionRun2.familyLength];
1207   memcpy(fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength);
1208   fontDescriptionRun2.size          = 1280u;
1209   fontDescriptionRun2.familyDefined = true;
1210   fontDescriptionRun2.weightDefined = false;
1211   fontDescriptionRun2.widthDefined  = false;
1212   fontDescriptionRun2.slantDefined  = false;
1213   fontDescriptionRun2.sizeDefined   = true;
1214
1215   FontDescriptionRun fontDescriptionRun3;
1216   fontDescriptionRun3.characterRun.characterIndex     = 7u;
1217   fontDescriptionRun3.characterRun.numberOfCharacters = 10u;
1218   fontDescriptionRun3.familyLength                    = fontFamily.size();
1219   fontDescriptionRun3.familyName                      = new char[fontDescriptionRun3.familyLength];
1220   memcpy(fontDescriptionRun3.familyName, fontFamily.c_str(), fontDescriptionRun3.familyLength);
1221   fontDescriptionRun3.familyDefined = true;
1222   fontDescriptionRun3.weightDefined = false;
1223   fontDescriptionRun3.widthDefined  = false;
1224   fontDescriptionRun3.slantDefined  = false;
1225   fontDescriptionRun3.sizeDefined   = false;
1226
1227   Vector<FontDescriptionRun> fontDescriptionRuns;
1228   fontDescriptionRuns.PushBack(fontDescriptionRun1);
1229   fontDescriptionRuns.PushBack(fontDescriptionRun2);
1230   fontDescriptionRuns.PushBack(fontDescriptionRun3);
1231   Size  textArea(100.f, 300.f);
1232   Size  layoutSize(87.f, 53.f);
1233   float positions[] =
1234     {
1235       0.f, -12.f, 10.f, -9.f, 19.f, -13.f, 23.f, -13.f, 26.f, -9.f, 35.f, -0.f, 39.f, -14.f, 59.f, -9.f, 69.f, -9.f, 75.f, -13.f, 78.f, -13.f, 87.f, -0.f, 0.f, -13.f, 9.f, -9.f, 18.f, -9.f, 31.f, -9.f, 40.f, -2.f
1236     };
1237   struct LineRun line0 =
1238     {
1239       {0u, 12u},
1240       {0u, 12u},
1241       87.f,
1242       25.f,
1243       -8.f,
1244       4.f,
1245       0.f,
1246       0.f,
1247       false,
1248       false};
1249   struct LineRun line1 =
1250     {
1251       {12u, 5u},
1252       {12u, 5u},
1253       43.f,
1254       15.f,
1255       -5.f,
1256       0.f,
1257       0.f,
1258       0.f,
1259       false,
1260       false};
1261   Vector<LineRun> lines;
1262   lines.PushBack(line0);
1263   lines.PushBack(line1);
1264
1265   LayoutTextData data =
1266     {
1267       "Layout simple text with one character with a different font size.",
1268       "Hello world demo.",
1269       textArea,
1270       3u,
1271       fontDescriptionRuns.Begin(),
1272       layoutSize,
1273       17u,
1274       positions,
1275       2u,
1276       lines.Begin(),
1277       Layout::Engine::MULTI_LINE_BOX,
1278       0u,
1279       17u,
1280       false,
1281       DevelText::EllipsisPosition::END,
1282       true};
1283
1284   if(!LayoutTextTest(data))
1285   {
1286     tet_result(TET_FAIL);
1287   }
1288
1289   tet_result(TET_PASS);
1290   END_TEST;
1291 }
1292
1293 int UtcDaliTextLayoutMultilineText06(void)
1294 {
1295   ToolkitTestApplication application;
1296   tet_infoline(" UtcDaliTextLayoutMultilineText06");
1297
1298   const std::string fontFamily("TizenSansHebrew");
1299
1300   // Set a known font description
1301   FontDescriptionRun fontDescriptionRun;
1302   fontDescriptionRun.characterRun.characterIndex     = 0u;
1303   fontDescriptionRun.characterRun.numberOfCharacters = 10u;
1304   fontDescriptionRun.familyLength                    = fontFamily.size();
1305   fontDescriptionRun.familyName                      = new char[fontDescriptionRun.familyLength];
1306   memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength);
1307   fontDescriptionRun.familyDefined = true;
1308   fontDescriptionRun.weightDefined = false;
1309   fontDescriptionRun.widthDefined  = false;
1310   fontDescriptionRun.slantDefined  = false;
1311   fontDescriptionRun.sizeDefined   = false;
1312
1313   Vector<FontDescriptionRun> fontDescriptionRuns;
1314   fontDescriptionRuns.PushBack(fontDescriptionRun);
1315
1316   Size  textArea(64.f, 100.f);
1317   Size  layoutSize(33.f, 40.f);
1318   float positions[] =
1319     {
1320       27.f, -13.f, 18.f, -10.f, 8.f, -10.f, 4.f, -10.f, 0.f, -0.f, 22.f, -10.f, 16.f, -10.f, 12.f, -10.f, 4.f, -10.f, 0.f, -10.f};
1321   struct LineRun line0 =
1322     {
1323       {0u, 5u},
1324       {0u, 5u},
1325       32.f,
1326       15.f,
1327       -5.f,
1328       4.f,
1329       0.f,
1330       0.f,
1331       true,
1332       false};
1333   struct LineRun line1 =
1334     {
1335       {5u, 5u},
1336       {5u, 5u},
1337       33.f,
1338       15.f,
1339       -5.f,
1340       0.f,
1341       0.f,
1342       0.f,
1343       true,
1344       false};
1345   Vector<LineRun> lines;
1346   lines.PushBack(line0);
1347   lines.PushBack(line1);
1348
1349   LayoutTextData data =
1350     {
1351       "Layout right to left text that doesn't fit in the text area after reordering.",
1352       "לכאן שנורו", // If this text is laid-out ltr the width is 64. When reordered, the length is 66. This might cause alignment issues.
1353       textArea,
1354       1u,
1355       fontDescriptionRuns.Begin(),
1356       layoutSize,
1357       10u,
1358       positions,
1359       2u,
1360       lines.Begin(),
1361       Layout::Engine::MULTI_LINE_BOX,
1362       0u,
1363       10u,
1364       false,
1365       DevelText::EllipsisPosition::END,
1366       true};
1367
1368   if(!LayoutTextTest(data))
1369   {
1370     tet_result(TET_FAIL);
1371   }
1372
1373   tet_result(TET_PASS);
1374   END_TEST;
1375 }
1376
1377 int UtcDaliTextLayoutMultilineText07(void)
1378 {
1379   ToolkitTestApplication application;
1380   tet_infoline(" UtcDaliTextLayoutMultilineText07");
1381
1382   const std::string fontFamily("TizenSansHebrew");
1383
1384   // Set a known font description
1385   FontDescriptionRun fontDescriptionRun;
1386   fontDescriptionRun.characterRun.characterIndex     = 0u;
1387   fontDescriptionRun.characterRun.numberOfCharacters = 9u;
1388   fontDescriptionRun.familyLength                    = fontFamily.size();
1389   fontDescriptionRun.familyName                      = new char[fontDescriptionRun.familyLength];
1390   memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength);
1391   fontDescriptionRun.familyDefined = true;
1392   fontDescriptionRun.weightDefined = false;
1393   fontDescriptionRun.widthDefined  = false;
1394   fontDescriptionRun.slantDefined  = false;
1395   fontDescriptionRun.sizeDefined   = false;
1396
1397   Vector<FontDescriptionRun> fontDescriptionRuns;
1398   fontDescriptionRuns.PushBack(fontDescriptionRun);
1399
1400   Size  textArea(26.f, 100.f);
1401   Size  layoutSize(23.f, 60.f);
1402   float positions[] =
1403     {
1404       10.f, -10.f, 4.f, -10.f, 0.f, -10.f, 13.f, -10.f, 9.f, -10.f, 0.f, -13.f, 14.f, -10.f, 4.f, -10.f, 0.f, -10.f};
1405   struct LineRun line0 =
1406     {
1407       {0u, 3u},
1408       {0u, 3u},
1409       21.f,
1410       15.f,
1411       -5.f,
1412       0.f,
1413       0.f,
1414       0.f,
1415       true,
1416       false};
1417   struct LineRun line1 =
1418     {
1419       {3u, 3u},
1420       {3u, 3u},
1421       21.f,
1422       15.f,
1423       -5.f,
1424       0.f,
1425       0.f,
1426       0.f,
1427       true,
1428       false};
1429   struct LineRun line2 =
1430     {
1431       {6u, 3u},
1432       {6u, 3u},
1433       23.f,
1434       15.f,
1435       -5.f,
1436       0.f,
1437       0.f,
1438       0.f,
1439       true,
1440       false};
1441   Vector<LineRun> lines;
1442   lines.PushBack(line0);
1443   lines.PushBack(line1);
1444   lines.PushBack(line2);
1445
1446   LayoutTextData data =
1447     {
1448       "Layout a single word of right to left text that doesn't fit in one single line. When layouting ltr a piece of word fits in the line but it doesn't after reordering.",
1449       "שנורולכאן", // If a piece of this text is laid-out ltr the width is 26. When reordered, the length is 27. This might cause alignment issues.
1450       textArea,
1451       1u,
1452       fontDescriptionRuns.Begin(),
1453       layoutSize,
1454       9u,
1455       positions,
1456       3u,
1457       lines.Begin(),
1458       Layout::Engine::MULTI_LINE_BOX,
1459       0u,
1460       9u,
1461       false,
1462       DevelText::EllipsisPosition::END,
1463       true};
1464
1465   if(!LayoutTextTest(data))
1466   {
1467     tet_result(TET_FAIL);
1468   }
1469
1470   tet_result(TET_PASS);
1471   END_TEST;
1472 }
1473
1474 int UtcDaliTextUpdateLayout01(void)
1475 {
1476   ToolkitTestApplication application;
1477   tet_infoline(" UtcDaliTextUpdateLayout01");
1478
1479   // Layout some lines of bidirectional text. Update the paragraphs at the beginning.
1480
1481   const std::string fontLatin("TizenSans");
1482   const std::string fontHebrew("TizenSansHebrew");
1483   const std::string fontArabic("TizenSansArabic");
1484
1485   // Set a known font description
1486   FontDescriptionRun fontDescriptionRun01;
1487   fontDescriptionRun01.characterRun.characterIndex     = 0u;
1488   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
1489   fontDescriptionRun01.familyLength                    = fontLatin.size();
1490   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
1491   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
1492   fontDescriptionRun01.familyDefined = true;
1493   fontDescriptionRun01.weightDefined = false;
1494   fontDescriptionRun01.widthDefined  = false;
1495   fontDescriptionRun01.slantDefined  = false;
1496   fontDescriptionRun01.sizeDefined   = false;
1497
1498   // Set a known font description
1499   FontDescriptionRun fontDescriptionRun02;
1500   fontDescriptionRun02.characterRun.characterIndex     = 17u;
1501   fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
1502   fontDescriptionRun02.familyLength                    = fontHebrew.size();
1503   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
1504   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
1505   fontDescriptionRun02.familyDefined = true;
1506   fontDescriptionRun02.weightDefined = false;
1507   fontDescriptionRun02.widthDefined  = false;
1508   fontDescriptionRun02.slantDefined  = false;
1509   fontDescriptionRun02.sizeDefined   = false;
1510
1511   // Set a known font description
1512   FontDescriptionRun fontDescriptionRun03;
1513   fontDescriptionRun03.characterRun.characterIndex     = 26u;
1514   fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
1515   fontDescriptionRun03.familyLength                    = fontLatin.size();
1516   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
1517   memcpy(fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength);
1518   fontDescriptionRun03.familyDefined = true;
1519   fontDescriptionRun03.weightDefined = false;
1520   fontDescriptionRun03.widthDefined  = false;
1521   fontDescriptionRun03.slantDefined  = false;
1522   fontDescriptionRun03.sizeDefined   = false;
1523
1524   // Set a known font description
1525   FontDescriptionRun fontDescriptionRun04;
1526   fontDescriptionRun04.characterRun.characterIndex     = 28u;
1527   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
1528   fontDescriptionRun04.familyLength                    = fontArabic.size();
1529   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
1530   memcpy(fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength);
1531   fontDescriptionRun04.familyDefined = true;
1532   fontDescriptionRun04.weightDefined = false;
1533   fontDescriptionRun04.widthDefined  = false;
1534   fontDescriptionRun04.slantDefined  = false;
1535   fontDescriptionRun04.sizeDefined   = false;
1536
1537   // Set a known font description
1538   FontDescriptionRun fontDescriptionRun05;
1539   fontDescriptionRun05.characterRun.characterIndex     = 42u;
1540   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
1541   fontDescriptionRun05.familyLength                    = fontLatin.size();
1542   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
1543   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
1544   fontDescriptionRun05.familyDefined = true;
1545   fontDescriptionRun05.weightDefined = false;
1546   fontDescriptionRun05.widthDefined  = false;
1547   fontDescriptionRun05.slantDefined  = false;
1548   fontDescriptionRun05.sizeDefined   = false;
1549
1550   // Set a known font description
1551   FontDescriptionRun fontDescriptionRun06;
1552   fontDescriptionRun06.characterRun.characterIndex     = 54u;
1553   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
1554   fontDescriptionRun06.familyLength                    = fontHebrew.size();
1555   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
1556   memcpy(fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength);
1557   fontDescriptionRun06.familyDefined = true;
1558   fontDescriptionRun06.weightDefined = false;
1559   fontDescriptionRun06.widthDefined  = false;
1560   fontDescriptionRun06.slantDefined  = false;
1561   fontDescriptionRun06.sizeDefined   = false;
1562
1563   // Set a known font description
1564   FontDescriptionRun fontDescriptionRun07;
1565   fontDescriptionRun07.characterRun.characterIndex     = 64u;
1566   fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
1567   fontDescriptionRun07.familyLength                    = fontHebrew.size();
1568   fontDescriptionRun07.familyName                      = new char[fontDescriptionRun07.familyLength];
1569   memcpy(fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength);
1570   fontDescriptionRun07.familyDefined = true;
1571   fontDescriptionRun07.weightDefined = false;
1572   fontDescriptionRun07.widthDefined  = false;
1573   fontDescriptionRun07.slantDefined  = false;
1574   fontDescriptionRun07.sizeDefined   = false;
1575
1576   // Set a known font description
1577   FontDescriptionRun fontDescriptionRun08;
1578   fontDescriptionRun08.characterRun.characterIndex     = 74u;
1579   fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
1580   fontDescriptionRun08.familyLength                    = fontLatin.size();
1581   fontDescriptionRun08.familyName                      = new char[fontDescriptionRun08.familyLength];
1582   memcpy(fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength);
1583   fontDescriptionRun08.familyDefined = true;
1584   fontDescriptionRun08.weightDefined = false;
1585   fontDescriptionRun08.widthDefined  = false;
1586   fontDescriptionRun08.slantDefined  = false;
1587   fontDescriptionRun08.sizeDefined   = false;
1588
1589   // Set a known font description
1590   FontDescriptionRun fontDescriptionRun09;
1591   fontDescriptionRun09.characterRun.characterIndex     = 92u;
1592   fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
1593   fontDescriptionRun09.familyLength                    = fontLatin.size();
1594   fontDescriptionRun09.familyName                      = new char[fontDescriptionRun09.familyLength];
1595   memcpy(fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength);
1596   fontDescriptionRun09.familyDefined = true;
1597   fontDescriptionRun09.weightDefined = false;
1598   fontDescriptionRun09.widthDefined  = false;
1599   fontDescriptionRun09.slantDefined  = false;
1600   fontDescriptionRun09.sizeDefined   = false;
1601
1602   // Set a known font description
1603   FontDescriptionRun fontDescriptionRun10;
1604   fontDescriptionRun10.characterRun.characterIndex     = 104u;
1605   fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
1606   fontDescriptionRun10.familyLength                    = fontArabic.size();
1607   fontDescriptionRun10.familyName                      = new char[fontDescriptionRun10.familyLength];
1608   memcpy(fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength);
1609   fontDescriptionRun10.familyDefined = true;
1610   fontDescriptionRun10.weightDefined = false;
1611   fontDescriptionRun10.widthDefined  = false;
1612   fontDescriptionRun10.slantDefined  = false;
1613   fontDescriptionRun10.sizeDefined   = false;
1614
1615   // Set a known font description
1616   FontDescriptionRun fontDescriptionRun11;
1617   fontDescriptionRun11.characterRun.characterIndex     = 118u;
1618   fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
1619   fontDescriptionRun11.familyLength                    = fontHebrew.size();
1620   fontDescriptionRun11.familyName                      = new char[fontDescriptionRun11.familyLength];
1621   memcpy(fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength);
1622   fontDescriptionRun11.familyDefined = true;
1623   fontDescriptionRun11.weightDefined = false;
1624   fontDescriptionRun11.widthDefined  = false;
1625   fontDescriptionRun11.slantDefined  = false;
1626   fontDescriptionRun11.sizeDefined   = false;
1627
1628   // Set a known font description
1629   FontDescriptionRun fontDescriptionRun12;
1630   fontDescriptionRun12.characterRun.characterIndex     = 128u;
1631   fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
1632   fontDescriptionRun12.familyLength                    = fontLatin.size();
1633   fontDescriptionRun12.familyName                      = new char[fontDescriptionRun12.familyLength];
1634   memcpy(fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength);
1635   fontDescriptionRun12.familyDefined = true;
1636   fontDescriptionRun12.weightDefined = false;
1637   fontDescriptionRun12.widthDefined  = false;
1638   fontDescriptionRun12.slantDefined  = false;
1639   fontDescriptionRun12.sizeDefined   = false;
1640
1641   // Set a known font description
1642   FontDescriptionRun fontDescriptionRun13;
1643   fontDescriptionRun13.characterRun.characterIndex     = 145u;
1644   fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
1645   fontDescriptionRun13.familyLength                    = fontHebrew.size();
1646   fontDescriptionRun13.familyName                      = new char[fontDescriptionRun13.familyLength];
1647   memcpy(fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength);
1648   fontDescriptionRun13.familyDefined = true;
1649   fontDescriptionRun13.weightDefined = false;
1650   fontDescriptionRun13.widthDefined  = false;
1651   fontDescriptionRun13.slantDefined  = false;
1652   fontDescriptionRun13.sizeDefined   = false;
1653
1654   // Set a known font description
1655   FontDescriptionRun fontDescriptionRun14;
1656   fontDescriptionRun14.characterRun.characterIndex     = 154u;
1657   fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
1658   fontDescriptionRun14.familyLength                    = fontLatin.size();
1659   fontDescriptionRun14.familyName                      = new char[fontDescriptionRun14.familyLength];
1660   memcpy(fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength);
1661   fontDescriptionRun14.familyDefined = true;
1662   fontDescriptionRun14.weightDefined = false;
1663   fontDescriptionRun14.widthDefined  = false;
1664   fontDescriptionRun14.slantDefined  = false;
1665   fontDescriptionRun14.sizeDefined   = false;
1666
1667   // Set a known font description
1668   FontDescriptionRun fontDescriptionRun15;
1669   fontDescriptionRun15.characterRun.characterIndex     = 156u;
1670   fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
1671   fontDescriptionRun15.familyLength                    = fontHebrew.size();
1672   fontDescriptionRun15.familyName                      = new char[fontDescriptionRun15.familyLength];
1673   memcpy(fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength);
1674   fontDescriptionRun15.familyDefined = true;
1675   fontDescriptionRun15.weightDefined = false;
1676   fontDescriptionRun15.widthDefined  = false;
1677   fontDescriptionRun15.slantDefined  = false;
1678   fontDescriptionRun15.sizeDefined   = false;
1679
1680   // Set a known font description
1681   FontDescriptionRun fontDescriptionRun16;
1682   fontDescriptionRun16.characterRun.characterIndex     = 166u;
1683   fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
1684   fontDescriptionRun16.familyLength                    = fontLatin.size();
1685   fontDescriptionRun16.familyName                      = new char[fontDescriptionRun16.familyLength];
1686   memcpy(fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength);
1687   fontDescriptionRun16.familyDefined = true;
1688   fontDescriptionRun16.weightDefined = false;
1689   fontDescriptionRun16.widthDefined  = false;
1690   fontDescriptionRun16.slantDefined  = false;
1691   fontDescriptionRun16.sizeDefined   = false;
1692
1693   // Set a known font description
1694   FontDescriptionRun fontDescriptionRun17;
1695   fontDescriptionRun17.characterRun.characterIndex     = 178u;
1696   fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
1697   fontDescriptionRun17.familyLength                    = fontArabic.size();
1698   fontDescriptionRun17.familyName                      = new char[fontDescriptionRun17.familyLength];
1699   memcpy(fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength);
1700   fontDescriptionRun17.familyDefined = true;
1701   fontDescriptionRun17.weightDefined = false;
1702   fontDescriptionRun17.widthDefined  = false;
1703   fontDescriptionRun17.slantDefined  = false;
1704   fontDescriptionRun17.sizeDefined   = false;
1705
1706   Vector<FontDescriptionRun> fontDescriptionRuns;
1707   fontDescriptionRuns.PushBack(fontDescriptionRun01);
1708   fontDescriptionRuns.PushBack(fontDescriptionRun02);
1709   fontDescriptionRuns.PushBack(fontDescriptionRun03);
1710   fontDescriptionRuns.PushBack(fontDescriptionRun04);
1711   fontDescriptionRuns.PushBack(fontDescriptionRun05);
1712   fontDescriptionRuns.PushBack(fontDescriptionRun06);
1713   fontDescriptionRuns.PushBack(fontDescriptionRun07);
1714   fontDescriptionRuns.PushBack(fontDescriptionRun08);
1715   fontDescriptionRuns.PushBack(fontDescriptionRun09);
1716   fontDescriptionRuns.PushBack(fontDescriptionRun10);
1717   fontDescriptionRuns.PushBack(fontDescriptionRun11);
1718   fontDescriptionRuns.PushBack(fontDescriptionRun12);
1719   fontDescriptionRuns.PushBack(fontDescriptionRun13);
1720   fontDescriptionRuns.PushBack(fontDescriptionRun14);
1721   fontDescriptionRuns.PushBack(fontDescriptionRun15);
1722   fontDescriptionRuns.PushBack(fontDescriptionRun16);
1723   fontDescriptionRuns.PushBack(fontDescriptionRun17);
1724   Size  textArea(100.f, 300.f);
1725   Size  layoutSize(99.f, 380.f);
1726   float positions[] =
1727     {
1728       0.f, -12.f, 10.f, -9.f, 19.f, -13.f, 23.f, -13.f, 26.f, -9.f, 35.f, -0.f, 39.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f, 0.f, -13.f, 9.f, -9.f, 18.f, -9.f, 31.f, -9.f, 40.f, -0.f, 67.f, -10.f, 58.f, -13.f, 54.f, -10.f, 44.f, -10.f, 78.f, -0.f, 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -2.f, 36.f, -12.f, 94.f, -8.f, 89.f, -6.f, 81.f, -8.f, 77.f, -7.f, 76.f, -11.f, 71.f, -0.f, 66.f, -7.f, 65.f, -11.f, 59.f, -11.f, 53.f, -8.f, 52.f, -11.f, 46.f, -11.f, 41.f, -8.f, 37.f, -0.f, 4.f, -13.f, 12.f, -9.f, 21.f, -13.f, 25.f, -13.f, 28.f, -9.f, 0.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 38.f, -0.f, 27.f, -10.f, 18.f, -13.f, 14.f, -10.f, 4.f, -10.f, 0.f, -0.f, 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 0.f, -0.f, 63.f, -10.f, 54.f, -13.f, 50.f, -10.f, 40.f, -10.f, 36.f, -0.f, 27.f, -10.f, 23.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, 4.f, -13.f, 12.f, -9.f, 21.f, -13.f, 25.f, -13.f, 28.f, -9.f, 37.f, -0.f, 41.f, -9.f, 53.f, -9.f, 63.f, -9.f, 69.f, -13.f, 72.f, -13.f, 0.f, -0.f, 4.f, -13.f, 13.f, -9.f, 22.f, -9.f, 35.f, -9.f, 0.f, -2.f, 0.f, -12.f, 0.f, -13.f, 8.f, -9.f, 17.f, -13.f, 21.f, -13.f, 24.f, -9.f, 33.f, -0.f, 37.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f, 91.f, -8.f, 86.f, -6.f, 78.f, -8.f, 74.f, -7.f, 73.f, -11.f, 68.f, -0.f, 63.f, -7.f, 62.f, -11.f, 56.f, -11.f, 50.f, -8.f, 49.f, -11.f, 43.f, -11.f, 38.f, -8.f, 34.f, -0.f, 23.f, -10.f, 14.f, -13.f, 10.f, -10.f, 0.f, -10.f, 98.f, -0.f, 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -0.f, 0.f, -12.f, 10.f, -9.f, 19.f, -13.f, 23.f, -13.f, 26.f, -9.f, 35.f, -0.f, 39.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f, 0.f, -13.f, 9.f, -9.f, 18.f, -9.f, 31.f, -9.f, 40.f, -0.f, 67.f, -10.f, 58.f, -13.f, 54.f, -10.f, 44.f, -10.f, 78.f, -0.f, 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -2.f, 36.f, -12.f, 63.f, -10.f, 54.f, -13.f, 50.f, -10.f, 40.f, -10.f, 36.f, -0.f, 27.f, -10.f, 23.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, 4.f, -13.f, 12.f, -9.f, 21.f, -13.f, 25.f, -13.f, 28.f, -9.f, 37.f, -0.f, 41.f, -9.f, 53.f, -9.f, 63.f, -9.f, 69.f, -13.f, 72.f, -13.f, 0.f, -0.f, 53.f, -8.f, 48.f, -6.f, 40.f, -8.f, 36.f, -7.f, 35.f, -11.f, 30.f, -0.f, 25.f, -7.f, 24.f, -11.f, 18.f, -11.f, 12.f, -8.f, 11.f, -11.f, 5.f, -11.f, 0.f, -8.f, 0.f, -0.f
1729     };
1730   struct LineRun line01 =
1731     {
1732       {0u, 12u},
1733       {0u, 12u},
1734       79.f,
1735       15.f,
1736       -5.f,
1737       4.f,
1738       0.f,
1739       0.f,
1740       false,
1741       false};
1742   struct LineRun line02 =
1743     {
1744       {12u, 10u},
1745       {12u, 10u},
1746       78.f,
1747       15.f,
1748       -5.f,
1749       4.f,
1750       0.f,
1751       0.f,
1752       false,
1753       false};
1754   struct LineRun line03 =
1755     {
1756       {22u, 6u},
1757       {22u, 6u},
1758       35.f,
1759       15.f,
1760       -5.f,
1761       0.f,
1762       0.f,
1763       0.f,
1764       false,
1765       false};
1766   struct LineRun line04 =
1767     {
1768       {28u, 20u},
1769       {28u, 20u},
1770       99.f,
1771       15.f,
1772       -5.f,
1773       4.f,
1774       0.f,
1775       0.f,
1776       true,
1777       false};
1778   struct LineRun line05 =
1779     {
1780       {48, 11u},
1781       {48, 11u},
1782       78.f,
1783       15.f,
1784       -5.f,
1785       4.f,
1786       0.f,
1787       0.f,
1788       true,
1789       false};
1790   struct LineRun line06 =
1791     {
1792       {59u, 5u},
1793       {59u, 5u},
1794       32.f,
1795       15.f,
1796       -5.f,
1797       0.f,
1798       0.f,
1799       0.f,
1800       true,
1801       false};
1802   struct LineRun line07 =
1803     {
1804       {64u, 10u},
1805       {64u, 10u},
1806       70.f,
1807       15.f,
1808       -5.f,
1809       4.f,
1810       0.f,
1811       0.f,
1812       true,
1813       false};
1814   struct LineRun line08 =
1815     {
1816       {74u, 12u},
1817       {74u, 12u},
1818       77.f,
1819       15.f,
1820       -5.f,
1821       4.f,
1822       0.f,
1823       0.f,
1824       true,
1825       false};
1826   struct LineRun line09 =
1827     {
1828       {86u, 6u},
1829       {86u, 6u},
1830       44.f,
1831       15.f,
1832       -5.f,
1833       0.f,
1834       0.f,
1835       0.f,
1836       false,
1837       false};
1838   struct LineRun line10 =
1839     {
1840       {92u, 12u},
1841       {92u, 12u},
1842       77.f,
1843       15.f,
1844       -5.f,
1845       4.f,
1846       0.f,
1847       0.f,
1848       false,
1849       false};
1850   struct LineRun line11 =
1851     {
1852       {104u, 19u},
1853       {104u, 19u},
1854       98.f,
1855       15.f,
1856       -5.f,
1857       4.f,
1858       0.f,
1859       0.f,
1860       false,
1861       false};
1862   struct LineRun line12 =
1863     {
1864       {123u, 5u},
1865       {123u, 5u},
1866       32.f,
1867       15.f,
1868       -5.f,
1869       0.f,
1870       0.f,
1871       0.f,
1872       false,
1873       false};
1874   struct LineRun line13 =
1875     {
1876       {128u, 12u},
1877       {128u, 12u},
1878       79.f,
1879       15.f,
1880       -5.f,
1881       4.f,
1882       0.f,
1883       0.f,
1884       false,
1885       false};
1886   struct LineRun line14 =
1887     {
1888       {140u, 10u},
1889       {140u, 10u},
1890       78.f,
1891       15.f,
1892       -5.f,
1893       4.f,
1894       0.f,
1895       0.f,
1896       false,
1897       false};
1898   struct LineRun line15 =
1899     {
1900       {150u, 6u},
1901       {150u, 6u},
1902       35.f,
1903       15.f,
1904       -5.f,
1905       0.f,
1906       0.f,
1907       0.f,
1908       false,
1909       false};
1910   struct LineRun line16 =
1911     {
1912       {156u, 10u},
1913       {156u, 10u},
1914       70.f,
1915       15.f,
1916       -5.f,
1917       4.f,
1918       0.f,
1919       0.f,
1920       true,
1921       false};
1922   struct LineRun line17 =
1923     {
1924       {166u, 12u},
1925       {166u, 12u},
1926       77.f,
1927       15.f,
1928       -5.f,
1929       4.f,
1930       0.f,
1931       0.f,
1932       false,
1933       false};
1934   struct LineRun line18 =
1935     {
1936       {178u, 14u},
1937       {178u, 14u},
1938       62.f,
1939       15.f,
1940       -5.f,
1941       0.f,
1942       0.f,
1943       0.f,
1944       false,
1945       false};
1946   struct LineRun line19 =
1947     {
1948       {192u, 0u},
1949       {192u, 0u},
1950       0.f,
1951       15.f,
1952       -5.f,
1953       0.f,
1954       0.f,
1955       0.f,
1956       false,
1957       false};
1958   Vector<LineRun> lines;
1959   lines.PushBack(line01);
1960   lines.PushBack(line02);
1961   lines.PushBack(line03);
1962   lines.PushBack(line04);
1963   lines.PushBack(line05);
1964   lines.PushBack(line06);
1965   lines.PushBack(line07);
1966   lines.PushBack(line08);
1967   lines.PushBack(line09);
1968   lines.PushBack(line10);
1969   lines.PushBack(line11);
1970   lines.PushBack(line12);
1971   lines.PushBack(line13);
1972   lines.PushBack(line14);
1973   lines.PushBack(line15);
1974   lines.PushBack(line16);
1975   lines.PushBack(line17);
1976   lines.PushBack(line18);
1977   lines.PushBack(line19);
1978
1979   LayoutTextData data =
1980     {
1981       "Layout bidirectional text.",
1982       "Hello world demo שלום עולם.\n"
1983       "مرحبا بالعالم hello world שלום עולם\n"
1984       "שלום עולם hello world demo.\n"
1985       "hello world مرحبا بالعالم שלום עולם\n"
1986       "Hello world demo שלום עולם.\n"
1987       "שלום עולם hello world مرحبا بالعالم\n",
1988       textArea,
1989       17u,
1990       fontDescriptionRuns.Begin(),
1991       layoutSize,
1992       192u,
1993       positions,
1994       19u,
1995       lines.Begin(),
1996       Layout::Engine::MULTI_LINE_BOX,
1997       0u,
1998       64u,
1999       false,
2000       DevelText::EllipsisPosition::END,
2001       true};
2002
2003   if(!LayoutTextTest(data))
2004   {
2005     tet_result(TET_FAIL);
2006   }
2007
2008   tet_result(TET_PASS);
2009   END_TEST;
2010 }
2011
2012 int UtcDaliTextUpdateLayout02(void)
2013 {
2014   ToolkitTestApplication application;
2015   tet_infoline(" UtcDaliTextUpdateLayout02");
2016
2017   // Layout some lines of bidirectional text. Update the paragraphs at the middle.
2018
2019   const std::string fontLatin("TizenSans");
2020   const std::string fontHebrew("TizenSansHebrew");
2021   const std::string fontArabic("TizenSansArabic");
2022
2023   // Set a known font description
2024   FontDescriptionRun fontDescriptionRun01;
2025   fontDescriptionRun01.characterRun.characterIndex     = 0u;
2026   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
2027   fontDescriptionRun01.familyLength                    = fontLatin.size();
2028   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
2029   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
2030   fontDescriptionRun01.familyDefined = true;
2031   fontDescriptionRun01.weightDefined = false;
2032   fontDescriptionRun01.widthDefined  = false;
2033   fontDescriptionRun01.slantDefined  = false;
2034   fontDescriptionRun01.sizeDefined   = false;
2035
2036   // Set a known font description
2037   FontDescriptionRun fontDescriptionRun02;
2038   fontDescriptionRun02.characterRun.characterIndex     = 17u;
2039   fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
2040   fontDescriptionRun02.familyLength                    = fontHebrew.size();
2041   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
2042   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
2043   fontDescriptionRun02.familyDefined = true;
2044   fontDescriptionRun02.weightDefined = false;
2045   fontDescriptionRun02.widthDefined  = false;
2046   fontDescriptionRun02.slantDefined  = false;
2047   fontDescriptionRun02.sizeDefined   = false;
2048
2049   // Set a known font description
2050   FontDescriptionRun fontDescriptionRun03;
2051   fontDescriptionRun03.characterRun.characterIndex     = 26u;
2052   fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
2053   fontDescriptionRun03.familyLength                    = fontLatin.size();
2054   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
2055   memcpy(fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength);
2056   fontDescriptionRun03.familyDefined = true;
2057   fontDescriptionRun03.weightDefined = false;
2058   fontDescriptionRun03.widthDefined  = false;
2059   fontDescriptionRun03.slantDefined  = false;
2060   fontDescriptionRun03.sizeDefined   = false;
2061
2062   // Set a known font description
2063   FontDescriptionRun fontDescriptionRun04;
2064   fontDescriptionRun04.characterRun.characterIndex     = 28u;
2065   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
2066   fontDescriptionRun04.familyLength                    = fontArabic.size();
2067   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
2068   memcpy(fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength);
2069   fontDescriptionRun04.familyDefined = true;
2070   fontDescriptionRun04.weightDefined = false;
2071   fontDescriptionRun04.widthDefined  = false;
2072   fontDescriptionRun04.slantDefined  = false;
2073   fontDescriptionRun04.sizeDefined   = false;
2074
2075   // Set a known font description
2076   FontDescriptionRun fontDescriptionRun05;
2077   fontDescriptionRun05.characterRun.characterIndex     = 42u;
2078   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
2079   fontDescriptionRun05.familyLength                    = fontLatin.size();
2080   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
2081   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
2082   fontDescriptionRun05.familyDefined = true;
2083   fontDescriptionRun05.weightDefined = false;
2084   fontDescriptionRun05.widthDefined  = false;
2085   fontDescriptionRun05.slantDefined  = false;
2086   fontDescriptionRun05.sizeDefined   = false;
2087
2088   // Set a known font description
2089   FontDescriptionRun fontDescriptionRun06;
2090   fontDescriptionRun06.characterRun.characterIndex     = 54u;
2091   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2092   fontDescriptionRun06.familyLength                    = fontHebrew.size();
2093   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
2094   memcpy(fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength);
2095   fontDescriptionRun06.familyDefined = true;
2096   fontDescriptionRun06.weightDefined = false;
2097   fontDescriptionRun06.widthDefined  = false;
2098   fontDescriptionRun06.slantDefined  = false;
2099   fontDescriptionRun06.sizeDefined   = false;
2100
2101   // Set a known font description
2102   FontDescriptionRun fontDescriptionRun07;
2103   fontDescriptionRun07.characterRun.characterIndex     = 64u;
2104   fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
2105   fontDescriptionRun07.familyLength                    = fontHebrew.size();
2106   fontDescriptionRun07.familyName                      = new char[fontDescriptionRun07.familyLength];
2107   memcpy(fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength);
2108   fontDescriptionRun07.familyDefined = true;
2109   fontDescriptionRun07.weightDefined = false;
2110   fontDescriptionRun07.widthDefined  = false;
2111   fontDescriptionRun07.slantDefined  = false;
2112   fontDescriptionRun07.sizeDefined   = false;
2113
2114   // Set a known font description
2115   FontDescriptionRun fontDescriptionRun08;
2116   fontDescriptionRun08.characterRun.characterIndex     = 74u;
2117   fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
2118   fontDescriptionRun08.familyLength                    = fontLatin.size();
2119   fontDescriptionRun08.familyName                      = new char[fontDescriptionRun08.familyLength];
2120   memcpy(fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength);
2121   fontDescriptionRun08.familyDefined = true;
2122   fontDescriptionRun08.weightDefined = false;
2123   fontDescriptionRun08.widthDefined  = false;
2124   fontDescriptionRun08.slantDefined  = false;
2125   fontDescriptionRun08.sizeDefined   = false;
2126
2127   // Set a known font description
2128   FontDescriptionRun fontDescriptionRun09;
2129   fontDescriptionRun09.characterRun.characterIndex     = 92u;
2130   fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
2131   fontDescriptionRun09.familyLength                    = fontLatin.size();
2132   fontDescriptionRun09.familyName                      = new char[fontDescriptionRun09.familyLength];
2133   memcpy(fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength);
2134   fontDescriptionRun09.familyDefined = true;
2135   fontDescriptionRun09.weightDefined = false;
2136   fontDescriptionRun09.widthDefined  = false;
2137   fontDescriptionRun09.slantDefined  = false;
2138   fontDescriptionRun09.sizeDefined   = false;
2139
2140   // Set a known font description
2141   FontDescriptionRun fontDescriptionRun10;
2142   fontDescriptionRun10.characterRun.characterIndex     = 104u;
2143   fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
2144   fontDescriptionRun10.familyLength                    = fontArabic.size();
2145   fontDescriptionRun10.familyName                      = new char[fontDescriptionRun10.familyLength];
2146   memcpy(fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength);
2147   fontDescriptionRun10.familyDefined = true;
2148   fontDescriptionRun10.weightDefined = false;
2149   fontDescriptionRun10.widthDefined  = false;
2150   fontDescriptionRun10.slantDefined  = false;
2151   fontDescriptionRun10.sizeDefined   = false;
2152
2153   // Set a known font description
2154   FontDescriptionRun fontDescriptionRun11;
2155   fontDescriptionRun11.characterRun.characterIndex     = 118u;
2156   fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
2157   fontDescriptionRun11.familyLength                    = fontHebrew.size();
2158   fontDescriptionRun11.familyName                      = new char[fontDescriptionRun11.familyLength];
2159   memcpy(fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength);
2160   fontDescriptionRun11.familyDefined = true;
2161   fontDescriptionRun11.weightDefined = false;
2162   fontDescriptionRun11.widthDefined  = false;
2163   fontDescriptionRun11.slantDefined  = false;
2164   fontDescriptionRun11.sizeDefined   = false;
2165
2166   // Set a known font description
2167   FontDescriptionRun fontDescriptionRun12;
2168   fontDescriptionRun12.characterRun.characterIndex     = 128u;
2169   fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
2170   fontDescriptionRun12.familyLength                    = fontLatin.size();
2171   fontDescriptionRun12.familyName                      = new char[fontDescriptionRun12.familyLength];
2172   memcpy(fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength);
2173   fontDescriptionRun12.familyDefined = true;
2174   fontDescriptionRun12.weightDefined = false;
2175   fontDescriptionRun12.widthDefined  = false;
2176   fontDescriptionRun12.slantDefined  = false;
2177   fontDescriptionRun12.sizeDefined   = false;
2178
2179   // Set a known font description
2180   FontDescriptionRun fontDescriptionRun13;
2181   fontDescriptionRun13.characterRun.characterIndex     = 145u;
2182   fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
2183   fontDescriptionRun13.familyLength                    = fontHebrew.size();
2184   fontDescriptionRun13.familyName                      = new char[fontDescriptionRun13.familyLength];
2185   memcpy(fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength);
2186   fontDescriptionRun13.familyDefined = true;
2187   fontDescriptionRun13.weightDefined = false;
2188   fontDescriptionRun13.widthDefined  = false;
2189   fontDescriptionRun13.slantDefined  = false;
2190   fontDescriptionRun13.sizeDefined   = false;
2191
2192   // Set a known font description
2193   FontDescriptionRun fontDescriptionRun14;
2194   fontDescriptionRun14.characterRun.characterIndex     = 154u;
2195   fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
2196   fontDescriptionRun14.familyLength                    = fontLatin.size();
2197   fontDescriptionRun14.familyName                      = new char[fontDescriptionRun14.familyLength];
2198   memcpy(fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength);
2199   fontDescriptionRun14.familyDefined = true;
2200   fontDescriptionRun14.weightDefined = false;
2201   fontDescriptionRun14.widthDefined  = false;
2202   fontDescriptionRun14.slantDefined  = false;
2203   fontDescriptionRun14.sizeDefined   = false;
2204
2205   // Set a known font description
2206   FontDescriptionRun fontDescriptionRun15;
2207   fontDescriptionRun15.characterRun.characterIndex     = 156u;
2208   fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
2209   fontDescriptionRun15.familyLength                    = fontHebrew.size();
2210   fontDescriptionRun15.familyName                      = new char[fontDescriptionRun15.familyLength];
2211   memcpy(fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength);
2212   fontDescriptionRun15.familyDefined = true;
2213   fontDescriptionRun15.weightDefined = false;
2214   fontDescriptionRun15.widthDefined  = false;
2215   fontDescriptionRun15.slantDefined  = false;
2216   fontDescriptionRun15.sizeDefined   = false;
2217
2218   // Set a known font description
2219   FontDescriptionRun fontDescriptionRun16;
2220   fontDescriptionRun16.characterRun.characterIndex     = 166u;
2221   fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
2222   fontDescriptionRun16.familyLength                    = fontLatin.size();
2223   fontDescriptionRun16.familyName                      = new char[fontDescriptionRun16.familyLength];
2224   memcpy(fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength);
2225   fontDescriptionRun16.familyDefined = true;
2226   fontDescriptionRun16.weightDefined = false;
2227   fontDescriptionRun16.widthDefined  = false;
2228   fontDescriptionRun16.slantDefined  = false;
2229   fontDescriptionRun16.sizeDefined   = false;
2230
2231   // Set a known font description
2232   FontDescriptionRun fontDescriptionRun17;
2233   fontDescriptionRun17.characterRun.characterIndex     = 178u;
2234   fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
2235   fontDescriptionRun17.familyLength                    = fontArabic.size();
2236   fontDescriptionRun17.familyName                      = new char[fontDescriptionRun17.familyLength];
2237   memcpy(fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength);
2238   fontDescriptionRun17.familyDefined = true;
2239   fontDescriptionRun17.weightDefined = false;
2240   fontDescriptionRun17.widthDefined  = false;
2241   fontDescriptionRun17.slantDefined  = false;
2242   fontDescriptionRun17.sizeDefined   = false;
2243
2244   Vector<FontDescriptionRun> fontDescriptionRuns;
2245   fontDescriptionRuns.PushBack(fontDescriptionRun01);
2246   fontDescriptionRuns.PushBack(fontDescriptionRun02);
2247   fontDescriptionRuns.PushBack(fontDescriptionRun03);
2248   fontDescriptionRuns.PushBack(fontDescriptionRun04);
2249   fontDescriptionRuns.PushBack(fontDescriptionRun05);
2250   fontDescriptionRuns.PushBack(fontDescriptionRun06);
2251   fontDescriptionRuns.PushBack(fontDescriptionRun07);
2252   fontDescriptionRuns.PushBack(fontDescriptionRun08);
2253   fontDescriptionRuns.PushBack(fontDescriptionRun09);
2254   fontDescriptionRuns.PushBack(fontDescriptionRun10);
2255   fontDescriptionRuns.PushBack(fontDescriptionRun11);
2256   fontDescriptionRuns.PushBack(fontDescriptionRun12);
2257   fontDescriptionRuns.PushBack(fontDescriptionRun13);
2258   fontDescriptionRuns.PushBack(fontDescriptionRun14);
2259   fontDescriptionRuns.PushBack(fontDescriptionRun15);
2260   fontDescriptionRuns.PushBack(fontDescriptionRun16);
2261   fontDescriptionRuns.PushBack(fontDescriptionRun17);
2262   Size  textArea(100.f, 300.f);
2263   Size  layoutSize(99.f, 380.f);
2264   float positions[] =
2265     {
2266       0.f, -12.f, 10.f, -9.f, 19.f, -13.f, 23.f, -13.f, 26.f, -9.f, 35.f, -0.f, 39.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f, 0.f, -13.f, 9.f, -9.f, 18.f, -9.f, 31.f, -9.f, 40.f, -0.f, 67.f, -10.f, 58.f, -13.f, 54.f, -10.f, 44.f, -10.f, 78.f, -0.f, 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -2.f, 36.f, -12.f, 94.f, -8.f, 89.f, -6.f, 81.f, -8.f, 77.f, -7.f, 76.f, -11.f, 71.f, -0.f, 66.f, -7.f, 65.f, -11.f, 59.f, -11.f, 53.f, -8.f, 52.f, -11.f, 46.f, -11.f, 41.f, -8.f, 37.f, -0.f, 4.f, -13.f, 12.f, -9.f, 21.f, -13.f, 25.f, -13.f, 28.f, -9.f, 0.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 38.f, -0.f, 27.f, -10.f, 18.f, -13.f, 14.f, -10.f, 4.f, -10.f, 0.f, -0.f, 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 0.f, -0.f, 63.f, -10.f, 54.f, -13.f, 50.f, -10.f, 40.f, -10.f, 36.f, -0.f, 27.f, -10.f, 23.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, 4.f, -13.f, 12.f, -9.f, 21.f, -13.f, 25.f, -13.f, 28.f, -9.f, 37.f, -0.f, 41.f, -9.f, 53.f, -9.f, 63.f, -9.f, 69.f, -13.f, 72.f, -13.f, 0.f, -0.f, 4.f, -13.f, 13.f, -9.f, 22.f, -9.f, 35.f, -9.f, 0.f, -2.f, 0.f, -12.f, 0.f, -13.f, 8.f, -9.f, 17.f, -13.f, 21.f, -13.f, 24.f, -9.f, 33.f, -0.f, 37.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f, 91.f, -8.f, 86.f, -6.f, 78.f, -8.f, 74.f, -7.f, 73.f, -11.f, 68.f, -0.f, 63.f, -7.f, 62.f, -11.f, 56.f, -11.f, 50.f, -8.f, 49.f, -11.f, 43.f, -11.f, 38.f, -8.f, 34.f, -0.f, 23.f, -10.f, 14.f, -13.f, 10.f, -10.f, 0.f, -10.f, 98.f, -0.f, 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -0.f, 0.f, -12.f, 10.f, -9.f, 19.f, -13.f, 23.f, -13.f, 26.f, -9.f, 35.f, -0.f, 39.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f, 0.f, -13.f, 9.f, -9.f, 18.f, -9.f, 31.f, -9.f, 40.f, -0.f, 67.f, -10.f, 58.f, -13.f, 54.f, -10.f, 44.f, -10.f, 78.f, -0.f, 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -2.f, 36.f, -12.f, 63.f, -10.f, 54.f, -13.f, 50.f, -10.f, 40.f, -10.f, 36.f, -0.f, 27.f, -10.f, 23.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, 4.f, -13.f, 12.f, -9.f, 21.f, -13.f, 25.f, -13.f, 28.f, -9.f, 37.f, -0.f, 41.f, -9.f, 53.f, -9.f, 63.f, -9.f, 69.f, -13.f, 72.f, -13.f, 0.f, -0.f, 53.f, -8.f, 48.f, -6.f, 40.f, -8.f, 36.f, -7.f, 35.f, -11.f, 30.f, -0.f, 25.f, -7.f, 24.f, -11.f, 18.f, -11.f, 12.f, -8.f, 11.f, -11.f, 5.f, -11.f, 0.f, -8.f, 0.f, -0.f
2267     };
2268   struct LineRun line01 =
2269     {
2270       {0u, 12u},
2271       {0u, 12u},
2272       79.f,
2273       15.f,
2274       -5.f,
2275       4.f,
2276       0.f,
2277       0.f,
2278       false,
2279       false};
2280   struct LineRun line02 =
2281     {
2282       {12u, 10u},
2283       {12u, 10u},
2284       78.f,
2285       15.f,
2286       -5.f,
2287       4.f,
2288       0.f,
2289       0.f,
2290       false,
2291       false};
2292   struct LineRun line03 =
2293     {
2294       {22u, 6u},
2295       {22u, 6u},
2296       35.f,
2297       15.f,
2298       -5.f,
2299       0.f,
2300       0.f,
2301       0.f,
2302       false,
2303       false};
2304   struct LineRun line04 =
2305     {
2306       {28u, 20u},
2307       {28u, 20u},
2308       99.f,
2309       15.f,
2310       -5.f,
2311       4.f,
2312       0.f,
2313       0.f,
2314       true,
2315       false};
2316   struct LineRun line05 =
2317     {
2318       {48u, 11u},
2319       {48u, 11u},
2320       78.f,
2321       15.f,
2322       -5.f,
2323       4.f,
2324       0.f,
2325       0.f,
2326       true,
2327       false};
2328   struct LineRun line06 =
2329     {
2330       {59u, 5u},
2331       {59u, 5u},
2332       32.f,
2333       15.f,
2334       -5.f,
2335       0.f,
2336       0.f,
2337       0.f,
2338       true,
2339       false};
2340   struct LineRun line07 =
2341     {
2342       {64u, 10u},
2343       {64u, 10u},
2344       70.f,
2345       15.f,
2346       -5.f,
2347       4.f,
2348       0.f,
2349       0.f,
2350       true,
2351       false};
2352   struct LineRun line08 =
2353     {
2354       {74u, 12u},
2355       {74u, 12u},
2356       77.f,
2357       15.f,
2358       -5.f,
2359       4.f,
2360       0.f,
2361       0.f,
2362       true,
2363       false};
2364   struct LineRun line09 =
2365     {
2366       {86u, 6u},
2367       {86u, 6u},
2368       44.f,
2369       15.f,
2370       -5.f,
2371       0.f,
2372       0.f,
2373       0.f,
2374       true,
2375       false};
2376   struct LineRun line10 =
2377     {
2378       {92u, 12u},
2379       {92u, 12u},
2380       77.f,
2381       15.f,
2382       -5.f,
2383       4.f,
2384       0.f,
2385       0.f,
2386       false,
2387       false};
2388   struct LineRun line11 =
2389     {
2390       {104u, 19u},
2391       {104u, 19u},
2392       98.f,
2393       15.f,
2394       -5.f,
2395       4.f,
2396       0.f,
2397       0.f,
2398       false,
2399       false};
2400   struct LineRun line12 =
2401     {
2402       {123u, 5u},
2403       {123u, 5u},
2404       32.f,
2405       15.f,
2406       -5.f,
2407       0.f,
2408       0.f,
2409       0.f,
2410       false,
2411       false};
2412   struct LineRun line13 =
2413     {
2414       {128u, 12u},
2415       {128u, 12u},
2416       79.f,
2417       15.f,
2418       -5.f,
2419       4.f,
2420       0.f,
2421       0.f,
2422       false,
2423       false};
2424   struct LineRun line14 =
2425     {
2426       {140u, 10u},
2427       {140u, 10u},
2428       78.f,
2429       15.f,
2430       -5.f,
2431       4.f,
2432       0.f,
2433       0.f,
2434       false,
2435       false};
2436   struct LineRun line15 =
2437     {
2438       {150u, 6u},
2439       {150u, 6u},
2440       35.f,
2441       15.f,
2442       -5.f,
2443       0.f,
2444       0.f,
2445       0.f,
2446       false,
2447       false};
2448   struct LineRun line16 =
2449     {
2450       {156u, 10u},
2451       {156u, 10u},
2452       70.f,
2453       15.f,
2454       -5.f,
2455       4.f,
2456       0.f,
2457       0.f,
2458       false,
2459       false};
2460   struct LineRun line17 =
2461     {
2462       {166u, 12u},
2463       {166u, 12u},
2464       77.f,
2465       15.f,
2466       -5.f,
2467       4.f,
2468       0.f,
2469       0.f,
2470       true,
2471       false};
2472   struct LineRun line18 =
2473     {
2474       {178u, 14u},
2475       {178u, 14u},
2476       62.f,
2477       15.f,
2478       -5.f,
2479       0.f,
2480       0.f,
2481       0.f,
2482       true,
2483       false};
2484   struct LineRun line19 =
2485     {
2486       {192u, 0u},
2487       {192u, 0u},
2488       0.f,
2489       15.f,
2490       -5.f,
2491       0.f,
2492       0.f,
2493       0.f,
2494       false,
2495       false};
2496   Vector<LineRun> lines;
2497   lines.PushBack(line01);
2498   lines.PushBack(line02);
2499   lines.PushBack(line03);
2500   lines.PushBack(line04);
2501   lines.PushBack(line05);
2502   lines.PushBack(line06);
2503   lines.PushBack(line07);
2504   lines.PushBack(line08);
2505   lines.PushBack(line09);
2506   lines.PushBack(line10);
2507   lines.PushBack(line11);
2508   lines.PushBack(line12);
2509   lines.PushBack(line13);
2510   lines.PushBack(line14);
2511   lines.PushBack(line15);
2512   lines.PushBack(line16);
2513   lines.PushBack(line17);
2514   lines.PushBack(line18);
2515   lines.PushBack(line19);
2516
2517   LayoutTextData data =
2518     {
2519       "Layout bidirectional text.",
2520       "Hello world demo שלום עולם.\n"
2521       "مرحبا بالعالم hello world שלום עולם\n"
2522       "שלום עולם hello world demo.\n"
2523       "hello world مرحبا بالعالم שלום עולם\n"
2524       "Hello world demo שלום עולם.\n"
2525       "שלום עולם hello world مرحبا بالعالم\n",
2526       textArea,
2527       17u,
2528       fontDescriptionRuns.Begin(),
2529       layoutSize,
2530       192u,
2531       positions,
2532       19u,
2533       lines.Begin(),
2534       Layout::Engine::MULTI_LINE_BOX,
2535       64u,
2536       64u,
2537       false,
2538       DevelText::EllipsisPosition::END,
2539       true};
2540
2541   if(!LayoutTextTest(data))
2542   {
2543     tet_result(TET_FAIL);
2544   }
2545
2546   tet_result(TET_PASS);
2547   END_TEST;
2548 }
2549
2550 int UtcDaliTextUpdateLayout03(void)
2551 {
2552   ToolkitTestApplication application;
2553   tet_infoline(" UtcDaliTextUpdateLayout03");
2554
2555   // Layout some lines of bidirectional text. Update the paragraphs at the middle.
2556
2557   const std::string fontLatin("TizenSans");
2558   const std::string fontHebrew("TizenSansHebrew");
2559   const std::string fontArabic("TizenSansArabic");
2560
2561   // Set a known font description
2562   FontDescriptionRun fontDescriptionRun01;
2563   fontDescriptionRun01.characterRun.characterIndex     = 0u;
2564   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
2565   fontDescriptionRun01.familyLength                    = fontLatin.size();
2566   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
2567   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
2568   fontDescriptionRun01.familyDefined = true;
2569   fontDescriptionRun01.weightDefined = false;
2570   fontDescriptionRun01.widthDefined  = false;
2571   fontDescriptionRun01.slantDefined  = false;
2572   fontDescriptionRun01.sizeDefined   = false;
2573
2574   // Set a known font description
2575   FontDescriptionRun fontDescriptionRun02;
2576   fontDescriptionRun02.characterRun.characterIndex     = 17u;
2577   fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
2578   fontDescriptionRun02.familyLength                    = fontHebrew.size();
2579   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
2580   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
2581   fontDescriptionRun02.familyDefined = true;
2582   fontDescriptionRun02.weightDefined = false;
2583   fontDescriptionRun02.widthDefined  = false;
2584   fontDescriptionRun02.slantDefined  = false;
2585   fontDescriptionRun02.sizeDefined   = false;
2586
2587   // Set a known font description
2588   FontDescriptionRun fontDescriptionRun03;
2589   fontDescriptionRun03.characterRun.characterIndex     = 26u;
2590   fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
2591   fontDescriptionRun03.familyLength                    = fontLatin.size();
2592   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
2593   memcpy(fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength);
2594   fontDescriptionRun03.familyDefined = true;
2595   fontDescriptionRun03.weightDefined = false;
2596   fontDescriptionRun03.widthDefined  = false;
2597   fontDescriptionRun03.slantDefined  = false;
2598   fontDescriptionRun03.sizeDefined   = false;
2599
2600   // Set a known font description
2601   FontDescriptionRun fontDescriptionRun04;
2602   fontDescriptionRun04.characterRun.characterIndex     = 28u;
2603   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
2604   fontDescriptionRun04.familyLength                    = fontArabic.size();
2605   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
2606   memcpy(fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength);
2607   fontDescriptionRun04.familyDefined = true;
2608   fontDescriptionRun04.weightDefined = false;
2609   fontDescriptionRun04.widthDefined  = false;
2610   fontDescriptionRun04.slantDefined  = false;
2611   fontDescriptionRun04.sizeDefined   = false;
2612
2613   // Set a known font description
2614   FontDescriptionRun fontDescriptionRun05;
2615   fontDescriptionRun05.characterRun.characterIndex     = 42u;
2616   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
2617   fontDescriptionRun05.familyLength                    = fontLatin.size();
2618   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
2619   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
2620   fontDescriptionRun05.familyDefined = true;
2621   fontDescriptionRun05.weightDefined = false;
2622   fontDescriptionRun05.widthDefined  = false;
2623   fontDescriptionRun05.slantDefined  = false;
2624   fontDescriptionRun05.sizeDefined   = false;
2625
2626   // Set a known font description
2627   FontDescriptionRun fontDescriptionRun06;
2628   fontDescriptionRun06.characterRun.characterIndex     = 54u;
2629   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2630   fontDescriptionRun06.familyLength                    = fontHebrew.size();
2631   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
2632   memcpy(fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength);
2633   fontDescriptionRun06.familyDefined = true;
2634   fontDescriptionRun06.weightDefined = false;
2635   fontDescriptionRun06.widthDefined  = false;
2636   fontDescriptionRun06.slantDefined  = false;
2637   fontDescriptionRun06.sizeDefined   = false;
2638
2639   // Set a known font description
2640   FontDescriptionRun fontDescriptionRun07;
2641   fontDescriptionRun07.characterRun.characterIndex     = 64u;
2642   fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
2643   fontDescriptionRun07.familyLength                    = fontHebrew.size();
2644   fontDescriptionRun07.familyName                      = new char[fontDescriptionRun07.familyLength];
2645   memcpy(fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength);
2646   fontDescriptionRun07.familyDefined = true;
2647   fontDescriptionRun07.weightDefined = false;
2648   fontDescriptionRun07.widthDefined  = false;
2649   fontDescriptionRun07.slantDefined  = false;
2650   fontDescriptionRun07.sizeDefined   = false;
2651
2652   // Set a known font description
2653   FontDescriptionRun fontDescriptionRun08;
2654   fontDescriptionRun08.characterRun.characterIndex     = 74u;
2655   fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
2656   fontDescriptionRun08.familyLength                    = fontLatin.size();
2657   fontDescriptionRun08.familyName                      = new char[fontDescriptionRun08.familyLength];
2658   memcpy(fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength);
2659   fontDescriptionRun08.familyDefined = true;
2660   fontDescriptionRun08.weightDefined = false;
2661   fontDescriptionRun08.widthDefined  = false;
2662   fontDescriptionRun08.slantDefined  = false;
2663   fontDescriptionRun08.sizeDefined   = false;
2664
2665   // Set a known font description
2666   FontDescriptionRun fontDescriptionRun09;
2667   fontDescriptionRun09.characterRun.characterIndex     = 92u;
2668   fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
2669   fontDescriptionRun09.familyLength                    = fontLatin.size();
2670   fontDescriptionRun09.familyName                      = new char[fontDescriptionRun09.familyLength];
2671   memcpy(fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength);
2672   fontDescriptionRun09.familyDefined = true;
2673   fontDescriptionRun09.weightDefined = false;
2674   fontDescriptionRun09.widthDefined  = false;
2675   fontDescriptionRun09.slantDefined  = false;
2676   fontDescriptionRun09.sizeDefined   = false;
2677
2678   // Set a known font description
2679   FontDescriptionRun fontDescriptionRun10;
2680   fontDescriptionRun10.characterRun.characterIndex     = 104u;
2681   fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
2682   fontDescriptionRun10.familyLength                    = fontArabic.size();
2683   fontDescriptionRun10.familyName                      = new char[fontDescriptionRun10.familyLength];
2684   memcpy(fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength);
2685   fontDescriptionRun10.familyDefined = true;
2686   fontDescriptionRun10.weightDefined = false;
2687   fontDescriptionRun10.widthDefined  = false;
2688   fontDescriptionRun10.slantDefined  = false;
2689   fontDescriptionRun10.sizeDefined   = false;
2690
2691   // Set a known font description
2692   FontDescriptionRun fontDescriptionRun11;
2693   fontDescriptionRun11.characterRun.characterIndex     = 118u;
2694   fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
2695   fontDescriptionRun11.familyLength                    = fontHebrew.size();
2696   fontDescriptionRun11.familyName                      = new char[fontDescriptionRun11.familyLength];
2697   memcpy(fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength);
2698   fontDescriptionRun11.familyDefined = true;
2699   fontDescriptionRun11.weightDefined = false;
2700   fontDescriptionRun11.widthDefined  = false;
2701   fontDescriptionRun11.slantDefined  = false;
2702   fontDescriptionRun11.sizeDefined   = false;
2703
2704   // Set a known font description
2705   FontDescriptionRun fontDescriptionRun12;
2706   fontDescriptionRun12.characterRun.characterIndex     = 128u;
2707   fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
2708   fontDescriptionRun12.familyLength                    = fontLatin.size();
2709   fontDescriptionRun12.familyName                      = new char[fontDescriptionRun12.familyLength];
2710   memcpy(fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength);
2711   fontDescriptionRun12.familyDefined = true;
2712   fontDescriptionRun12.weightDefined = false;
2713   fontDescriptionRun12.widthDefined  = false;
2714   fontDescriptionRun12.slantDefined  = false;
2715   fontDescriptionRun12.sizeDefined   = false;
2716
2717   // Set a known font description
2718   FontDescriptionRun fontDescriptionRun13;
2719   fontDescriptionRun13.characterRun.characterIndex     = 145u;
2720   fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
2721   fontDescriptionRun13.familyLength                    = fontHebrew.size();
2722   fontDescriptionRun13.familyName                      = new char[fontDescriptionRun13.familyLength];
2723   memcpy(fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength);
2724   fontDescriptionRun13.familyDefined = true;
2725   fontDescriptionRun13.weightDefined = false;
2726   fontDescriptionRun13.widthDefined  = false;
2727   fontDescriptionRun13.slantDefined  = false;
2728   fontDescriptionRun13.sizeDefined   = false;
2729
2730   // Set a known font description
2731   FontDescriptionRun fontDescriptionRun14;
2732   fontDescriptionRun14.characterRun.characterIndex     = 154u;
2733   fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
2734   fontDescriptionRun14.familyLength                    = fontLatin.size();
2735   fontDescriptionRun14.familyName                      = new char[fontDescriptionRun14.familyLength];
2736   memcpy(fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength);
2737   fontDescriptionRun14.familyDefined = true;
2738   fontDescriptionRun14.weightDefined = false;
2739   fontDescriptionRun14.widthDefined  = false;
2740   fontDescriptionRun14.slantDefined  = false;
2741   fontDescriptionRun14.sizeDefined   = false;
2742
2743   // Set a known font description
2744   FontDescriptionRun fontDescriptionRun15;
2745   fontDescriptionRun15.characterRun.characterIndex     = 156u;
2746   fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
2747   fontDescriptionRun15.familyLength                    = fontHebrew.size();
2748   fontDescriptionRun15.familyName                      = new char[fontDescriptionRun15.familyLength];
2749   memcpy(fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength);
2750   fontDescriptionRun15.familyDefined = true;
2751   fontDescriptionRun15.weightDefined = false;
2752   fontDescriptionRun15.widthDefined  = false;
2753   fontDescriptionRun15.slantDefined  = false;
2754   fontDescriptionRun15.sizeDefined   = false;
2755
2756   // Set a known font description
2757   FontDescriptionRun fontDescriptionRun16;
2758   fontDescriptionRun16.characterRun.characterIndex     = 166u;
2759   fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
2760   fontDescriptionRun16.familyLength                    = fontLatin.size();
2761   fontDescriptionRun16.familyName                      = new char[fontDescriptionRun16.familyLength];
2762   memcpy(fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength);
2763   fontDescriptionRun16.familyDefined = true;
2764   fontDescriptionRun16.weightDefined = false;
2765   fontDescriptionRun16.widthDefined  = false;
2766   fontDescriptionRun16.slantDefined  = false;
2767   fontDescriptionRun16.sizeDefined   = false;
2768
2769   // Set a known font description
2770   FontDescriptionRun fontDescriptionRun17;
2771   fontDescriptionRun17.characterRun.characterIndex     = 178u;
2772   fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
2773   fontDescriptionRun17.familyLength                    = fontArabic.size();
2774   fontDescriptionRun17.familyName                      = new char[fontDescriptionRun17.familyLength];
2775   memcpy(fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength);
2776   fontDescriptionRun17.familyDefined = true;
2777   fontDescriptionRun17.weightDefined = false;
2778   fontDescriptionRun17.widthDefined  = false;
2779   fontDescriptionRun17.slantDefined  = false;
2780   fontDescriptionRun17.sizeDefined   = false;
2781
2782   Vector<FontDescriptionRun> fontDescriptionRuns;
2783   fontDescriptionRuns.PushBack(fontDescriptionRun01);
2784   fontDescriptionRuns.PushBack(fontDescriptionRun02);
2785   fontDescriptionRuns.PushBack(fontDescriptionRun03);
2786   fontDescriptionRuns.PushBack(fontDescriptionRun04);
2787   fontDescriptionRuns.PushBack(fontDescriptionRun05);
2788   fontDescriptionRuns.PushBack(fontDescriptionRun06);
2789   fontDescriptionRuns.PushBack(fontDescriptionRun07);
2790   fontDescriptionRuns.PushBack(fontDescriptionRun08);
2791   fontDescriptionRuns.PushBack(fontDescriptionRun09);
2792   fontDescriptionRuns.PushBack(fontDescriptionRun10);
2793   fontDescriptionRuns.PushBack(fontDescriptionRun11);
2794   fontDescriptionRuns.PushBack(fontDescriptionRun12);
2795   fontDescriptionRuns.PushBack(fontDescriptionRun13);
2796   fontDescriptionRuns.PushBack(fontDescriptionRun14);
2797   fontDescriptionRuns.PushBack(fontDescriptionRun15);
2798   fontDescriptionRuns.PushBack(fontDescriptionRun16);
2799   fontDescriptionRuns.PushBack(fontDescriptionRun17);
2800   Size  textArea(100.f, 300.f);
2801   Size  layoutSize(99.f, 380.f);
2802   float positions[] =
2803     {
2804       0.f, -12.f, 10.f, -9.f, 19.f, -13.f, 23.f, -13.f, 26.f, -9.f, 35.f, -0.f, 39.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f, 0.f, -13.f, 9.f, -9.f, 18.f, -9.f, 31.f, -9.f, 40.f, -0.f, 67.f, -10.f, 58.f, -13.f, 54.f, -10.f, 44.f, -10.f, 78.f, -0.f, 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -2.f, 36.f, -12.f, 94.f, -8.f, 89.f, -6.f, 81.f, -8.f, 77.f, -7.f, 76.f, -11.f, 71.f, -0.f, 66.f, -7.f, 65.f, -11.f, 59.f, -11.f, 53.f, -8.f, 52.f, -11.f, 46.f, -11.f, 41.f, -8.f, 37.f, -0.f, 4.f, -13.f, 12.f, -9.f, 21.f, -13.f, 25.f, -13.f, 28.f, -9.f, 0.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 38.f, -0.f, 27.f, -10.f, 18.f, -13.f, 14.f, -10.f, 4.f, -10.f, 0.f, -0.f, 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 0.f, -0.f, 63.f, -10.f, 54.f, -13.f, 50.f, -10.f, 40.f, -10.f, 36.f, -0.f, 27.f, -10.f, 23.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, 4.f, -13.f, 12.f, -9.f, 21.f, -13.f, 25.f, -13.f, 28.f, -9.f, 37.f, -0.f, 41.f, -9.f, 53.f, -9.f, 63.f, -9.f, 69.f, -13.f, 72.f, -13.f, 0.f, -0.f, 4.f, -13.f, 13.f, -9.f, 22.f, -9.f, 35.f, -9.f, 0.f, -2.f, 0.f, -12.f, 0.f, -13.f, 8.f, -9.f, 17.f, -13.f, 21.f, -13.f, 24.f, -9.f, 33.f, -0.f, 37.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f, 91.f, -8.f, 86.f, -6.f, 78.f, -8.f, 74.f, -7.f, 73.f, -11.f, 68.f, -0.f, 63.f, -7.f, 62.f, -11.f, 56.f, -11.f, 50.f, -8.f, 49.f, -11.f, 43.f, -11.f, 38.f, -8.f, 34.f, -0.f, 23.f, -10.f, 14.f, -13.f, 10.f, -10.f, 0.f, -10.f, 98.f, -0.f, 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -0.f, 0.f, -12.f, 10.f, -9.f, 19.f, -13.f, 23.f, -13.f, 26.f, -9.f, 35.f, -0.f, 39.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f, 0.f, -13.f, 9.f, -9.f, 18.f, -9.f, 31.f, -9.f, 40.f, -0.f, 67.f, -10.f, 58.f, -13.f, 54.f, -10.f, 44.f, -10.f, 78.f, -0.f, 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -2.f, 36.f, -12.f, 63.f, -10.f, 54.f, -13.f, 50.f, -10.f, 40.f, -10.f, 36.f, -0.f, 27.f, -10.f, 23.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, 4.f, -13.f, 12.f, -9.f, 21.f, -13.f, 25.f, -13.f, 28.f, -9.f, 37.f, -0.f, 41.f, -9.f, 53.f, -9.f, 63.f, -9.f, 69.f, -13.f, 72.f, -13.f, 0.f, -0.f, 53.f, -8.f, 48.f, -6.f, 40.f, -8.f, 36.f, -7.f, 35.f, -11.f, 30.f, -0.f, 25.f, -7.f, 24.f, -11.f, 18.f, -11.f, 12.f, -8.f, 11.f, -11.f, 5.f, -11.f, 0.f, -8.f, 0.f, -0.f
2805     };
2806
2807   struct LineRun line01 =
2808     {
2809       {0u, 12u},
2810       {0u, 12u},
2811       79.f,
2812       15.f,
2813       -5.f,
2814       4.f,
2815       0.f,
2816       0.f,
2817       false,
2818       false};
2819   struct LineRun line02 =
2820     {
2821       {12u, 10u},
2822       {12u, 10u},
2823       78.f,
2824       15.f,
2825       -5.f,
2826       4.f,
2827       0.f,
2828       0.f,
2829       false,
2830       false};
2831   struct LineRun line03 =
2832     {
2833       {22u, 6u},
2834       {22u, 6u},
2835       35.f,
2836       15.f,
2837       -5.f,
2838       0.f,
2839       0.f,
2840       0.f,
2841       false,
2842       false};
2843   struct LineRun line04 =
2844     {
2845       {28u, 20u},
2846       {28u, 20u},
2847       99.f,
2848       15.f,
2849       -5.f,
2850       4.f,
2851       0.f,
2852       0.f,
2853       true,
2854       false};
2855   struct LineRun line05 =
2856     {
2857       {48u, 11u},
2858       {48u, 11u},
2859       78.f,
2860       15.f,
2861       -5.f,
2862       4.f,
2863       0.f,
2864       0.f,
2865       true,
2866       false};
2867   struct LineRun line06 =
2868     {
2869       {59u, 5u},
2870       {59u, 5u},
2871       32.f,
2872       15.f,
2873       -5.f,
2874       0.f,
2875       0.f,
2876       0.f,
2877       true,
2878       false};
2879   struct LineRun line07 =
2880     {
2881       {64u, 10u},
2882       {64u, 10u},
2883       70.f,
2884       15.f,
2885       -5.f,
2886       4.f,
2887       0.f,
2888       0.f,
2889       true,
2890       false};
2891   struct LineRun line08 =
2892     {
2893       {74u, 12u},
2894       {74u, 12u},
2895       77.f,
2896       15.f,
2897       -5.f,
2898       4.f,
2899       0.f,
2900       0.f,
2901       true,
2902       false};
2903   struct LineRun line09 =
2904     {
2905       {86u, 6u},
2906       {86u, 6u},
2907       44.f,
2908       15.f,
2909       -5.f,
2910       0.f,
2911       0.f,
2912       0.f,
2913       true,
2914       false};
2915   struct LineRun line10 =
2916     {
2917       {92u, 12u},
2918       {92u, 12u},
2919       77.f,
2920       15.f,
2921       -5.f,
2922       4.f,
2923       0.f,
2924       0.f,
2925       false,
2926       false};
2927   struct LineRun line11 =
2928     {
2929       {104u, 19u},
2930       {104u, 19u},
2931       98.f,
2932       15.f,
2933       -5.f,
2934       4.f,
2935       0.f,
2936       0.f,
2937       false,
2938       false};
2939   struct LineRun line12 =
2940     {
2941       {123u, 5u},
2942       {123u, 5u},
2943       32.f,
2944       15.f,
2945       -5.f,
2946       0.f,
2947       0.f,
2948       0.f,
2949       false,
2950       false};
2951   struct LineRun line13 =
2952     {
2953       {128u, 12u},
2954       {128u, 12u},
2955       79.f,
2956       15.f,
2957       -5.f,
2958       4.f,
2959       0.f,
2960       0.f,
2961       false,
2962       false};
2963   struct LineRun line14 =
2964     {
2965       {140u, 10u},
2966       {140u, 10u},
2967       78.f,
2968       15.f,
2969       -5.f,
2970       4.f,
2971       0.f,
2972       0.f,
2973       false,
2974       false};
2975   struct LineRun line15 =
2976     {
2977       {150u, 6u},
2978       {150u, 6u},
2979       35.f,
2980       15.f,
2981       -5.f,
2982       0.f,
2983       0.f,
2984       0.f,
2985       false,
2986       false};
2987   struct LineRun line16 =
2988     {
2989       {156u, 10u},
2990       {156u, 10u},
2991       70.f,
2992       15.f,
2993       -5.f,
2994       4.f,
2995       0.f,
2996       0.f,
2997       true,
2998       false};
2999   struct LineRun line17 =
3000     {
3001       {166u, 12u},
3002       {166u, 12u},
3003       77.f,
3004       15.f,
3005       -5.f,
3006       4.f,
3007       0.f,
3008       0.f,
3009       true,
3010       false};
3011   struct LineRun line18 =
3012     {
3013       {178u, 14u},
3014       {178u, 14u},
3015       62.f,
3016       15.f,
3017       -5.f,
3018       0.f,
3019       0.f,
3020       0.f,
3021       true,
3022       false};
3023   struct LineRun line19 =
3024     {
3025       {192u, 0u},
3026       {192u, 0u},
3027       0.f,
3028       15.f,
3029       -5.f,
3030       0.f,
3031       0.f,
3032       0.f,
3033       false,
3034       false};
3035   Vector<LineRun> lines;
3036   lines.PushBack(line01);
3037   lines.PushBack(line02);
3038   lines.PushBack(line03);
3039   lines.PushBack(line04);
3040   lines.PushBack(line05);
3041   lines.PushBack(line06);
3042   lines.PushBack(line07);
3043   lines.PushBack(line08);
3044   lines.PushBack(line09);
3045   lines.PushBack(line10);
3046   lines.PushBack(line11);
3047   lines.PushBack(line12);
3048   lines.PushBack(line13);
3049   lines.PushBack(line14);
3050   lines.PushBack(line15);
3051   lines.PushBack(line16);
3052   lines.PushBack(line17);
3053   lines.PushBack(line18);
3054   lines.PushBack(line19);
3055
3056   LayoutTextData data =
3057     {
3058       "Layout bidirectional text.",
3059       "Hello world demo שלום עולם.\n"
3060       "مرحبا بالعالم hello world שלום עולם\n"
3061       "שלום עולם hello world demo.\n"
3062       "hello world مرحبا بالعالم שלום עולם\n"
3063       "Hello world demo שלום עולם.\n"
3064       "שלום עולם hello world مرحبا بالعالم\n",
3065       textArea,
3066       17u,
3067       fontDescriptionRuns.Begin(),
3068       layoutSize,
3069       192u,
3070       positions,
3071       19u,
3072       lines.Begin(),
3073       Layout::Engine::MULTI_LINE_BOX,
3074       128u,
3075       64u,
3076       false,
3077       DevelText::EllipsisPosition::END,
3078       true};
3079
3080   if(!LayoutTextTest(data))
3081   {
3082     tet_result(TET_FAIL);
3083   }
3084
3085   tet_result(TET_PASS);
3086   END_TEST;
3087 }
3088
3089 int UtcDaliTextLayoutEllipsis01(void)
3090 {
3091   ToolkitTestApplication application;
3092   tet_infoline(" UtcDaliTextLayoutEllipsis01");
3093
3094   // Layout single-line LTR text with ellipsis.
3095
3096   const std::string fontLatin("TizenSans");
3097
3098   // Set a known font description
3099   FontDescriptionRun fontDescriptionRun01;
3100   fontDescriptionRun01.characterRun.characterIndex     = 0u;
3101   fontDescriptionRun01.characterRun.numberOfCharacters = 51u;
3102   fontDescriptionRun01.familyLength                    = fontLatin.size();
3103   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
3104   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
3105   fontDescriptionRun01.familyDefined = true;
3106   fontDescriptionRun01.weightDefined = false;
3107   fontDescriptionRun01.widthDefined  = false;
3108   fontDescriptionRun01.slantDefined  = false;
3109   fontDescriptionRun01.sizeDefined   = false;
3110
3111   Vector<FontDescriptionRun> fontDescriptionRuns;
3112   fontDescriptionRuns.PushBack(fontDescriptionRun01);
3113
3114   struct LineRun line01 =
3115     {
3116       {0u, 14u},
3117       {0u, 14u},
3118       100.f,
3119       15.f,
3120       -5.f,
3121       0.f,
3122       0.f,
3123       0.f,
3124       false,
3125       true};
3126   Vector<LineRun> lines;
3127   lines.PushBack(line01);
3128
3129   float positions[] =
3130     {
3131       0.f,
3132       -12.f,
3133       10.f,
3134       -9.f,
3135       19.f,
3136       -13.f,
3137       23.f,
3138       -13.f,
3139       26.f,
3140       -9.f,
3141       35.f,
3142       -0.f,
3143       39.f,
3144       -9.f,
3145       51.f,
3146       -9.f,
3147       61.f,
3148       -9.f,
3149       67.f,
3150       -13.f,
3151       70.f,
3152       -13.f,
3153       79.f,
3154       -0.f,
3155       83.f,
3156       -13.f,
3157     };
3158
3159   Size textArea(100.f, 50.f);
3160   Size layoutSize(100.f, 20.f);
3161
3162   LayoutTextData data =
3163     {
3164       "Layout single-line LTR text with ellipsis.",
3165       "Hello world demo hello world demo hello world demo.",
3166       textArea,
3167       1u,
3168       fontDescriptionRuns.Begin(),
3169       layoutSize,
3170       13u,
3171       positions,
3172       1u,
3173       lines.Begin(),
3174       Layout::Engine::SINGLE_LINE_BOX,
3175       0u,
3176       51u,
3177       true,
3178       DevelText::EllipsisPosition::END,
3179       true};
3180
3181   if(!LayoutTextTest(data))
3182   {
3183     tet_result(TET_FAIL);
3184   }
3185
3186   tet_result(TET_PASS);
3187   END_TEST;
3188 }
3189
3190 int UtcDaliTextLayoutEllipsis02(void)
3191 {
3192   ToolkitTestApplication application;
3193   tet_infoline(" UtcDaliTextLayoutEllipsis02");
3194
3195   // Layout multi-line LTR text with ellipsis.
3196
3197   const std::string fontLatin("TizenSans");
3198
3199   // Set a known font description
3200   FontDescriptionRun fontDescriptionRun01;
3201   fontDescriptionRun01.characterRun.characterIndex     = 0u;
3202   fontDescriptionRun01.characterRun.numberOfCharacters = 51u;
3203   fontDescriptionRun01.familyLength                    = fontLatin.size();
3204   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
3205   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
3206   fontDescriptionRun01.familyDefined = true;
3207   fontDescriptionRun01.weightDefined = false;
3208   fontDescriptionRun01.widthDefined  = false;
3209   fontDescriptionRun01.slantDefined  = false;
3210   fontDescriptionRun01.sizeDefined   = false;
3211
3212   Vector<FontDescriptionRun> fontDescriptionRuns;
3213   fontDescriptionRuns.PushBack(fontDescriptionRun01);
3214
3215   struct LineRun line01 =
3216     {
3217       {0u, 12u},
3218       {0u, 12u},
3219       79.f,
3220       15.f,
3221       -5.f,
3222       4.f,
3223       0.f,
3224       0.f,
3225       false,
3226       false};
3227   struct LineRun line02 =
3228     {
3229       {12u, 12u},
3230       {12u, 12u},
3231       94.f,
3232       15.f,
3233       -5.f,
3234       0.f,
3235       0.f,
3236       0.f,
3237       false,
3238       true};
3239   Vector<LineRun> lines;
3240   lines.PushBack(line01);
3241   lines.PushBack(line02);
3242
3243   float positions[] =
3244     {
3245       0.f, -12.f, 10.f, -9.f, 19.f, -13.f, 23.f, -13.f, 26.f, -9.f, 35.f, -0.f, 39.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f, 0.f, -13.f, 9.f, -9.f, 18.f, -9.f, 31.f, -9.f, 40.f, -0.f, 45.f, -13.f, 53.f, -9.f, 62.f, -13.f, 66.f, -13.f, 69.f, -9.f, 78.f, -0.f, 82.f, -9.f
3246     };
3247
3248   Size textArea(100.f, 50.f);
3249   Size layoutSize(100.f, 40.f);
3250
3251   LayoutTextData data =
3252     {
3253       "Layout multi-line LTR text with ellipsis.",
3254       "Hello world demo hello world demo hello world demo.",
3255       textArea,
3256       1u,
3257       fontDescriptionRuns.Begin(),
3258       layoutSize,
3259       24u,
3260       positions,
3261       2u,
3262       lines.Begin(),
3263       Layout::Engine::MULTI_LINE_BOX,
3264       0u,
3265       51u,
3266       true,
3267       DevelText::EllipsisPosition::END,
3268       true};
3269
3270   if(!LayoutTextTest(data))
3271   {
3272     tet_result(TET_FAIL);
3273   }
3274
3275   tet_result(TET_PASS);
3276   END_TEST;
3277 }
3278
3279 int UtcDaliTextLayoutEllipsis03(void)
3280 {
3281   ToolkitTestApplication application;
3282   tet_infoline(" UtcDaliTextLayoutEllipsis03");
3283
3284   // Layout single-line RTL text with ellipsis.
3285
3286   const std::string fontHebrew("TizenSansHebrew");
3287   const std::string fontArabic("TizenSansArabic");
3288
3289   // Set a known font description
3290   FontDescriptionRun fontDescriptionRun01;
3291   fontDescriptionRun01.characterRun.characterIndex     = 0u;
3292   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
3293   fontDescriptionRun01.familyLength                    = fontHebrew.size();
3294   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
3295   memcpy(fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength);
3296   fontDescriptionRun01.familyDefined = true;
3297   fontDescriptionRun01.weightDefined = false;
3298   fontDescriptionRun01.widthDefined  = false;
3299   fontDescriptionRun01.slantDefined  = false;
3300   fontDescriptionRun01.sizeDefined   = false;
3301
3302   FontDescriptionRun fontDescriptionRun02;
3303   fontDescriptionRun02.characterRun.characterIndex     = 10u;
3304   fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
3305   fontDescriptionRun02.familyLength                    = fontArabic.size();
3306   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
3307   memcpy(fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength);
3308   fontDescriptionRun02.familyDefined = true;
3309   fontDescriptionRun02.weightDefined = false;
3310   fontDescriptionRun02.widthDefined  = false;
3311   fontDescriptionRun02.slantDefined  = false;
3312   fontDescriptionRun02.sizeDefined   = false;
3313
3314   FontDescriptionRun fontDescriptionRun03;
3315   fontDescriptionRun03.characterRun.characterIndex     = 24u;
3316   fontDescriptionRun03.characterRun.numberOfCharacters = 10u;
3317   fontDescriptionRun03.familyLength                    = fontHebrew.size();
3318   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
3319   memcpy(fontDescriptionRun03.familyName, fontHebrew.c_str(), fontDescriptionRun03.familyLength);
3320   fontDescriptionRun03.familyDefined = true;
3321   fontDescriptionRun03.weightDefined = false;
3322   fontDescriptionRun03.widthDefined  = false;
3323   fontDescriptionRun03.slantDefined  = false;
3324   fontDescriptionRun03.sizeDefined   = false;
3325
3326   FontDescriptionRun fontDescriptionRun04;
3327   fontDescriptionRun04.characterRun.characterIndex     = 34u;
3328   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
3329   fontDescriptionRun04.familyLength                    = fontArabic.size();
3330   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
3331   memcpy(fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength);
3332   fontDescriptionRun04.familyDefined = true;
3333   fontDescriptionRun04.weightDefined = false;
3334   fontDescriptionRun04.widthDefined  = false;
3335   fontDescriptionRun04.slantDefined  = false;
3336   fontDescriptionRun04.sizeDefined   = false;
3337
3338   FontDescriptionRun fontDescriptionRun05;
3339   fontDescriptionRun05.characterRun.characterIndex     = 48u;
3340   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
3341   fontDescriptionRun05.familyLength                    = fontHebrew.size();
3342   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
3343   memcpy(fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength);
3344   fontDescriptionRun05.familyDefined = true;
3345   fontDescriptionRun05.weightDefined = false;
3346   fontDescriptionRun05.widthDefined  = false;
3347   fontDescriptionRun05.slantDefined  = false;
3348   fontDescriptionRun05.sizeDefined   = false;
3349
3350   FontDescriptionRun fontDescriptionRun06;
3351   fontDescriptionRun06.characterRun.characterIndex     = 58u;
3352   fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
3353   fontDescriptionRun06.familyLength                    = fontArabic.size();
3354   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
3355   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
3356   fontDescriptionRun06.familyDefined = true;
3357   fontDescriptionRun06.weightDefined = false;
3358   fontDescriptionRun06.widthDefined  = false;
3359   fontDescriptionRun06.slantDefined  = false;
3360   fontDescriptionRun06.sizeDefined   = false;
3361
3362   Vector<FontDescriptionRun> fontDescriptionRuns;
3363   fontDescriptionRuns.PushBack(fontDescriptionRun01);
3364   fontDescriptionRuns.PushBack(fontDescriptionRun02);
3365   fontDescriptionRuns.PushBack(fontDescriptionRun03);
3366   fontDescriptionRuns.PushBack(fontDescriptionRun04);
3367   fontDescriptionRuns.PushBack(fontDescriptionRun05);
3368   fontDescriptionRuns.PushBack(fontDescriptionRun06);
3369
3370   struct LineRun line01 =
3371     {
3372       {0u, 14u},
3373       {0u, 14u},
3374       98.f,
3375       15.f,
3376       -5.f,
3377       0.f,
3378       0.f,
3379       0.f,
3380       false,
3381       true};
3382   Vector<LineRun> lines;
3383   lines.PushBack(line01);
3384
3385   float positions[] =
3386     {
3387       87.f,
3388       -10.f,
3389       78.f,
3390       -13.f,
3391       74.f,
3392       -10.f,
3393       64.f,
3394       -10.f,
3395       60.f,
3396       -0.f,
3397       51.f,
3398       -10.f,
3399       47.f,
3400       -10.f,
3401       38.f,
3402       -13.f,
3403       28.f,
3404       -10.f,
3405       24.f,
3406       -0.f,
3407       17.f,
3408       -8.f,
3409       12.f,
3410       -6.f,
3411       4.f,
3412       -8.f,
3413       0.f,
3414       -7.f,
3415       77.f,
3416       -11.f,
3417       72.f,
3418       -0.f,
3419     };
3420
3421   Size textArea(100.f, 50.f);
3422   Size layoutSize(100.f, 20.f);
3423
3424   LayoutTextData data =
3425     {
3426       "Layout single-line RTL text with ellipsis.",
3427       "שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم.",
3428       textArea,
3429       6u,
3430       fontDescriptionRuns.Begin(),
3431       layoutSize,
3432       16u,
3433       positions,
3434       1u,
3435       lines.Begin(),
3436       Layout::Engine::SINGLE_LINE_BOX,
3437       0u,
3438       72u,
3439       true,
3440       DevelText::EllipsisPosition::END,
3441       true};
3442
3443   if(!LayoutTextTest(data))
3444   {
3445     tet_result(TET_FAIL);
3446   }
3447
3448   tet_result(TET_PASS);
3449   END_TEST;
3450 }
3451
3452 int UtcDaliTextLayoutEllipsis04(void)
3453 {
3454   ToolkitTestApplication application;
3455   tet_infoline(" UtcDaliTextLayoutEllipsis04");
3456
3457   // Layout multi-line RTL text with ellipsis.
3458
3459   const std::string fontHebrew("TizenSansHebrew");
3460   const std::string fontArabic("TizenSansArabic");
3461
3462   // Set a known font description
3463   FontDescriptionRun fontDescriptionRun01;
3464   fontDescriptionRun01.characterRun.characterIndex     = 0u;
3465   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
3466   fontDescriptionRun01.familyLength                    = fontHebrew.size();
3467   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
3468   memcpy(fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength);
3469   fontDescriptionRun01.familyDefined = true;
3470   fontDescriptionRun01.weightDefined = false;
3471   fontDescriptionRun01.widthDefined  = false;
3472   fontDescriptionRun01.slantDefined  = false;
3473   fontDescriptionRun01.sizeDefined   = false;
3474
3475   FontDescriptionRun fontDescriptionRun02;
3476   fontDescriptionRun02.characterRun.characterIndex     = 10u;
3477   fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
3478   fontDescriptionRun02.familyLength                    = fontArabic.size();
3479   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
3480   memcpy(fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength);
3481   fontDescriptionRun02.familyDefined = true;
3482   fontDescriptionRun02.weightDefined = false;
3483   fontDescriptionRun02.widthDefined  = false;
3484   fontDescriptionRun02.slantDefined  = false;
3485   fontDescriptionRun02.sizeDefined   = false;
3486
3487   FontDescriptionRun fontDescriptionRun03;
3488   fontDescriptionRun03.characterRun.characterIndex     = 24u;
3489   fontDescriptionRun03.characterRun.numberOfCharacters = 10u;
3490   fontDescriptionRun03.familyLength                    = fontHebrew.size();
3491   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
3492   memcpy(fontDescriptionRun03.familyName, fontHebrew.c_str(), fontDescriptionRun03.familyLength);
3493   fontDescriptionRun03.familyDefined = true;
3494   fontDescriptionRun03.weightDefined = false;
3495   fontDescriptionRun03.widthDefined  = false;
3496   fontDescriptionRun03.slantDefined  = false;
3497   fontDescriptionRun03.sizeDefined   = false;
3498
3499   FontDescriptionRun fontDescriptionRun04;
3500   fontDescriptionRun04.characterRun.characterIndex     = 34u;
3501   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
3502   fontDescriptionRun04.familyLength                    = fontArabic.size();
3503   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
3504   memcpy(fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength);
3505   fontDescriptionRun04.familyDefined = true;
3506   fontDescriptionRun04.weightDefined = false;
3507   fontDescriptionRun04.widthDefined  = false;
3508   fontDescriptionRun04.slantDefined  = false;
3509   fontDescriptionRun04.sizeDefined   = false;
3510
3511   FontDescriptionRun fontDescriptionRun05;
3512   fontDescriptionRun05.characterRun.characterIndex     = 48u;
3513   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
3514   fontDescriptionRun05.familyLength                    = fontHebrew.size();
3515   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
3516   memcpy(fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength);
3517   fontDescriptionRun05.familyDefined = true;
3518   fontDescriptionRun05.weightDefined = false;
3519   fontDescriptionRun05.widthDefined  = false;
3520   fontDescriptionRun05.slantDefined  = false;
3521   fontDescriptionRun05.sizeDefined   = false;
3522
3523   FontDescriptionRun fontDescriptionRun06;
3524   fontDescriptionRun06.characterRun.characterIndex     = 58u;
3525   fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
3526   fontDescriptionRun06.familyLength                    = fontArabic.size();
3527   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
3528   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
3529   fontDescriptionRun06.familyDefined = true;
3530   fontDescriptionRun06.weightDefined = false;
3531   fontDescriptionRun06.widthDefined  = false;
3532   fontDescriptionRun06.slantDefined  = false;
3533   fontDescriptionRun06.sizeDefined   = false;
3534
3535   Vector<FontDescriptionRun> fontDescriptionRuns;
3536   fontDescriptionRuns.PushBack(fontDescriptionRun01);
3537   fontDescriptionRuns.PushBack(fontDescriptionRun02);
3538   fontDescriptionRuns.PushBack(fontDescriptionRun03);
3539   fontDescriptionRuns.PushBack(fontDescriptionRun04);
3540   fontDescriptionRuns.PushBack(fontDescriptionRun05);
3541   fontDescriptionRuns.PushBack(fontDescriptionRun06);
3542
3543   struct LineRun line01 =
3544     {
3545       {0u, 10u},
3546       {0u, 10u},
3547       70.f,
3548       15.f,
3549       -5.f,
3550       4.f,
3551       0.f,
3552       0.f,
3553       true,
3554       false};
3555   struct LineRun line02 =
3556     {
3557       {10u, 19u},
3558       {10u, 19u},
3559       98.f,
3560       15.f,
3561       -5.f,
3562       4.f,
3563       0.f,
3564       0.f,
3565       true,
3566       true};
3567   Vector<LineRun> lines;
3568   lines.PushBack(line01);
3569   lines.PushBack(line02);
3570
3571   float positions[] =
3572     {
3573       63.f, -10.f, 54.f, -13.f, 50.f, -10.f, 40.f, -10.f, 36.f, -0.f, 27.f, -10.f, 23.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, 95.f, -8.f, 90.f, -6.f, 82.f, -8.f, 78.f, -7.f, 77.f, -11.f, 72.f, -0.f, 67.f, -7.f, 66.f, -11.f, 60.f, -11.f, 54.f, -8.f, 53.f, -11.f, 47.f, -11.f, 42.f, -8.f, 38.f, -0.f, 27.f, -10.f, 18.f, -13.f, 14.f, -10.f, 4.f, -10.f, 0.f, -0.f, 91.f, -10.f, 87.f, -10.f, 78.f, -13.f, 68.f, -10.f, 64.f, -0.f
3574     };
3575
3576   Size textArea(100.f, 50.f);
3577   Size layoutSize(100.f, 40.f);
3578
3579   LayoutTextData data =
3580     {
3581       "Layout multi-line RTL text with ellipsis.",
3582       "שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم.",
3583       textArea,
3584       6u,
3585       fontDescriptionRuns.Begin(),
3586       layoutSize,
3587       34u,
3588       positions,
3589       2u,
3590       lines.Begin(),
3591       Layout::Engine::MULTI_LINE_BOX,
3592       0u,
3593       72u,
3594       true,
3595       DevelText::EllipsisPosition::END,
3596       true};
3597
3598   if(!LayoutTextTest(data))
3599   {
3600     tet_result(TET_FAIL);
3601   }
3602
3603   tet_result(TET_PASS);
3604   END_TEST;
3605 }
3606
3607 int UtcDaliTextLayoutEllipsis05(void)
3608 {
3609   ToolkitTestApplication application;
3610   tet_infoline(" UtcDaliTextLayoutEllipsis05");
3611
3612   const std::string fontLatin("TizenSans");
3613
3614   // Set a known font description
3615   FontDescriptionRun fontDescriptionRun01;
3616   fontDescriptionRun01.characterRun.characterIndex     = 0u;
3617   fontDescriptionRun01.characterRun.numberOfCharacters = 51u;
3618   fontDescriptionRun01.familyLength                    = fontLatin.size();
3619   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
3620   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
3621   fontDescriptionRun01.familyDefined = true;
3622   fontDescriptionRun01.weightDefined = false;
3623   fontDescriptionRun01.widthDefined  = false;
3624   fontDescriptionRun01.slantDefined  = false;
3625   fontDescriptionRun01.sizeDefined   = false;
3626
3627   Vector<FontDescriptionRun> fontDescriptionRuns;
3628   fontDescriptionRuns.PushBack(fontDescriptionRun01);
3629
3630   struct LineRun line01 =
3631     {
3632       {0u, 11u},
3633       {0u, 11u},
3634       79.f,
3635       15.f,
3636       -5.f,
3637       0.f,
3638       0.f,
3639       0.f,
3640       false,
3641       true};
3642   Vector<LineRun> lines;
3643   lines.PushBack(line01);
3644
3645   float positions[] =
3646     {
3647       0.f, -12.f};
3648
3649   Size textArea(100.f, 19.f);
3650   Size layoutSize(100.f, 20.f);
3651
3652   LayoutTextData data =
3653     {
3654       "Not enough height.",
3655       "Hello world",
3656       textArea,
3657       1u,
3658       fontDescriptionRuns.Begin(),
3659       layoutSize,
3660       1u,
3661       positions,
3662       1u,
3663       lines.Begin(),
3664       Layout::Engine::MULTI_LINE_BOX,
3665       0u,
3666       11u,
3667       true,
3668       DevelText::EllipsisPosition::END,
3669       true};
3670
3671   if(!LayoutTextTest(data))
3672   {
3673     tet_result(TET_FAIL);
3674   }
3675
3676   tet_result(TET_PASS);
3677   END_TEST;
3678 }
3679
3680 int UtcDaliTextAlign01(void)
3681 {
3682   ToolkitTestApplication application;
3683   tet_infoline(" UtcDaliTextAlign01");
3684
3685   // Calculate text alignment.
3686
3687   const std::string fontLatin("TizenSans");
3688   const std::string fontHebrew("TizenSansHebrew");
3689   const std::string fontArabic("TizenSansArabic");
3690
3691   // Set a known font description
3692   FontDescriptionRun fontDescriptionRun01;
3693   fontDescriptionRun01.characterRun.characterIndex     = 0u;
3694   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
3695   fontDescriptionRun01.familyLength                    = fontLatin.size();
3696   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
3697   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
3698   fontDescriptionRun01.familyDefined = true;
3699   fontDescriptionRun01.weightDefined = false;
3700   fontDescriptionRun01.widthDefined  = false;
3701   fontDescriptionRun01.slantDefined  = false;
3702   fontDescriptionRun01.sizeDefined   = false;
3703
3704   FontDescriptionRun fontDescriptionRun02;
3705   fontDescriptionRun02.characterRun.characterIndex     = 12u;
3706   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
3707   fontDescriptionRun02.familyLength                    = fontHebrew.size();
3708   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
3709   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
3710   fontDescriptionRun02.familyDefined = true;
3711   fontDescriptionRun02.weightDefined = false;
3712   fontDescriptionRun02.widthDefined  = false;
3713   fontDescriptionRun02.slantDefined  = false;
3714   fontDescriptionRun02.sizeDefined   = false;
3715
3716   FontDescriptionRun fontDescriptionRun03;
3717   fontDescriptionRun03.characterRun.characterIndex     = 22u;
3718   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
3719   fontDescriptionRun03.familyLength                    = fontArabic.size();
3720   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
3721   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
3722   fontDescriptionRun03.familyDefined = true;
3723   fontDescriptionRun03.weightDefined = false;
3724   fontDescriptionRun03.widthDefined  = false;
3725   fontDescriptionRun03.slantDefined  = false;
3726   fontDescriptionRun03.sizeDefined   = false;
3727
3728   FontDescriptionRun fontDescriptionRun04;
3729   fontDescriptionRun04.characterRun.characterIndex     = 36u;
3730   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
3731   fontDescriptionRun04.familyLength                    = fontLatin.size();
3732   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
3733   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
3734   fontDescriptionRun04.familyDefined = true;
3735   fontDescriptionRun04.weightDefined = false;
3736   fontDescriptionRun04.widthDefined  = false;
3737   fontDescriptionRun04.slantDefined  = false;
3738   fontDescriptionRun04.sizeDefined   = false;
3739
3740   FontDescriptionRun fontDescriptionRun05;
3741   fontDescriptionRun05.characterRun.characterIndex     = 48u;
3742   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
3743   fontDescriptionRun05.familyLength                    = fontLatin.size();
3744   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
3745   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
3746   fontDescriptionRun05.familyDefined = true;
3747   fontDescriptionRun05.weightDefined = false;
3748   fontDescriptionRun05.widthDefined  = false;
3749   fontDescriptionRun05.slantDefined  = false;
3750   fontDescriptionRun05.sizeDefined   = false;
3751
3752   FontDescriptionRun fontDescriptionRun06;
3753   fontDescriptionRun06.characterRun.characterIndex     = 60u;
3754   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
3755   fontDescriptionRun06.familyLength                    = fontArabic.size();
3756   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
3757   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
3758   fontDescriptionRun06.familyDefined = true;
3759   fontDescriptionRun06.weightDefined = false;
3760   fontDescriptionRun06.widthDefined  = false;
3761   fontDescriptionRun06.slantDefined  = false;
3762   fontDescriptionRun06.sizeDefined   = false;
3763
3764   Vector<FontDescriptionRun> fontDescriptionRuns;
3765   fontDescriptionRuns.PushBack(fontDescriptionRun01);
3766   fontDescriptionRuns.PushBack(fontDescriptionRun02);
3767   fontDescriptionRuns.PushBack(fontDescriptionRun03);
3768   fontDescriptionRuns.PushBack(fontDescriptionRun04);
3769   fontDescriptionRuns.PushBack(fontDescriptionRun05);
3770   fontDescriptionRuns.PushBack(fontDescriptionRun06);
3771
3772   float positions[] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
3773
3774   Size      textArea(100.f, 300.f);
3775   AlignData data =
3776     {
3777       "Begin alignment for the first paragraph.",
3778       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
3779       textArea,
3780       6u,
3781       fontDescriptionRuns.Begin(),
3782       Text::HorizontalAlignment::BEGIN,
3783       Text::VerticalAlignment::TOP,
3784       0u,
3785       22u,
3786       6u,
3787       positions,
3788       Dali::LayoutDirection::LEFT_TO_RIGHT,
3789       false};
3790
3791   if(!AlignTest(data))
3792   {
3793     tet_result(TET_FAIL);
3794   }
3795
3796   tet_result(TET_PASS);
3797   END_TEST;
3798 }
3799
3800 int UtcDaliTextAlign02(void)
3801 {
3802   ToolkitTestApplication application;
3803   tet_infoline(" UtcDaliTextAlign02");
3804
3805   // Calculate text alignment.
3806
3807   const std::string fontLatin("TizenSans");
3808   const std::string fontHebrew("TizenSansHebrew");
3809   const std::string fontArabic("TizenSansArabic");
3810
3811   // Set a known font description
3812   FontDescriptionRun fontDescriptionRun01;
3813   fontDescriptionRun01.characterRun.characterIndex     = 0u;
3814   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
3815   fontDescriptionRun01.familyLength                    = fontLatin.size();
3816   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
3817   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
3818   fontDescriptionRun01.familyDefined = true;
3819   fontDescriptionRun01.weightDefined = false;
3820   fontDescriptionRun01.widthDefined  = false;
3821   fontDescriptionRun01.slantDefined  = false;
3822   fontDescriptionRun01.sizeDefined   = false;
3823
3824   FontDescriptionRun fontDescriptionRun02;
3825   fontDescriptionRun02.characterRun.characterIndex     = 12u;
3826   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
3827   fontDescriptionRun02.familyLength                    = fontHebrew.size();
3828   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
3829   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
3830   fontDescriptionRun02.familyDefined = true;
3831   fontDescriptionRun02.weightDefined = false;
3832   fontDescriptionRun02.widthDefined  = false;
3833   fontDescriptionRun02.slantDefined  = false;
3834   fontDescriptionRun02.sizeDefined   = false;
3835
3836   FontDescriptionRun fontDescriptionRun03;
3837   fontDescriptionRun03.characterRun.characterIndex     = 22u;
3838   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
3839   fontDescriptionRun03.familyLength                    = fontArabic.size();
3840   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
3841   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
3842   fontDescriptionRun03.familyDefined = true;
3843   fontDescriptionRun03.weightDefined = false;
3844   fontDescriptionRun03.widthDefined  = false;
3845   fontDescriptionRun03.slantDefined  = false;
3846   fontDescriptionRun03.sizeDefined   = false;
3847
3848   FontDescriptionRun fontDescriptionRun04;
3849   fontDescriptionRun04.characterRun.characterIndex     = 36u;
3850   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
3851   fontDescriptionRun04.familyLength                    = fontLatin.size();
3852   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
3853   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
3854   fontDescriptionRun04.familyDefined = true;
3855   fontDescriptionRun04.weightDefined = false;
3856   fontDescriptionRun04.widthDefined  = false;
3857   fontDescriptionRun04.slantDefined  = false;
3858   fontDescriptionRun04.sizeDefined   = false;
3859
3860   FontDescriptionRun fontDescriptionRun05;
3861   fontDescriptionRun05.characterRun.characterIndex     = 48u;
3862   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
3863   fontDescriptionRun05.familyLength                    = fontLatin.size();
3864   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
3865   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
3866   fontDescriptionRun05.familyDefined = true;
3867   fontDescriptionRun05.weightDefined = false;
3868   fontDescriptionRun05.widthDefined  = false;
3869   fontDescriptionRun05.slantDefined  = false;
3870   fontDescriptionRun05.sizeDefined   = false;
3871
3872   FontDescriptionRun fontDescriptionRun06;
3873   fontDescriptionRun06.characterRun.characterIndex     = 60u;
3874   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
3875   fontDescriptionRun06.familyLength                    = fontArabic.size();
3876   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
3877   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
3878   fontDescriptionRun06.familyDefined = true;
3879   fontDescriptionRun06.weightDefined = false;
3880   fontDescriptionRun06.widthDefined  = false;
3881   fontDescriptionRun06.slantDefined  = false;
3882   fontDescriptionRun06.sizeDefined   = false;
3883
3884   Vector<FontDescriptionRun> fontDescriptionRuns;
3885   fontDescriptionRuns.PushBack(fontDescriptionRun01);
3886   fontDescriptionRuns.PushBack(fontDescriptionRun02);
3887   fontDescriptionRuns.PushBack(fontDescriptionRun03);
3888   fontDescriptionRuns.PushBack(fontDescriptionRun04);
3889   fontDescriptionRuns.PushBack(fontDescriptionRun05);
3890   fontDescriptionRuns.PushBack(fontDescriptionRun06);
3891
3892   float positions[] = {0.f, 0.f, 34.f, 21.f, 0.f, 0.f};
3893
3894   Size      textArea(100.f, 300.f);
3895   AlignData data =
3896     {
3897       "Begin alignment for the mid paragraph.",
3898       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
3899       textArea,
3900       6u,
3901       fontDescriptionRuns.Begin(),
3902       Text::HorizontalAlignment::BEGIN,
3903       Text::VerticalAlignment::TOP,
3904       22u,
3905       26u,
3906       6u,
3907       positions,
3908       Dali::LayoutDirection::LEFT_TO_RIGHT,
3909       false};
3910
3911   if(!AlignTest(data))
3912   {
3913     tet_result(TET_FAIL);
3914   }
3915
3916   tet_result(TET_PASS);
3917   END_TEST;
3918 }
3919
3920 int UtcDaliTextAlign03(void)
3921 {
3922   ToolkitTestApplication application;
3923   tet_infoline(" UtcDaliTextAlign03");
3924
3925   // Calculate text alignment.
3926
3927   const std::string fontLatin("TizenSans");
3928   const std::string fontHebrew("TizenSansHebrew");
3929   const std::string fontArabic("TizenSansArabic");
3930
3931   // Set a known font description
3932   FontDescriptionRun fontDescriptionRun01;
3933   fontDescriptionRun01.characterRun.characterIndex     = 0u;
3934   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
3935   fontDescriptionRun01.familyLength                    = fontLatin.size();
3936   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
3937   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
3938   fontDescriptionRun01.familyDefined = true;
3939   fontDescriptionRun01.weightDefined = false;
3940   fontDescriptionRun01.widthDefined  = false;
3941   fontDescriptionRun01.slantDefined  = false;
3942   fontDescriptionRun01.sizeDefined   = false;
3943
3944   FontDescriptionRun fontDescriptionRun02;
3945   fontDescriptionRun02.characterRun.characterIndex     = 12u;
3946   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
3947   fontDescriptionRun02.familyLength                    = fontHebrew.size();
3948   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
3949   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
3950   fontDescriptionRun02.familyDefined = true;
3951   fontDescriptionRun02.weightDefined = false;
3952   fontDescriptionRun02.widthDefined  = false;
3953   fontDescriptionRun02.slantDefined  = false;
3954   fontDescriptionRun02.sizeDefined   = false;
3955
3956   FontDescriptionRun fontDescriptionRun03;
3957   fontDescriptionRun03.characterRun.characterIndex     = 22u;
3958   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
3959   fontDescriptionRun03.familyLength                    = fontArabic.size();
3960   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
3961   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
3962   fontDescriptionRun03.familyDefined = true;
3963   fontDescriptionRun03.weightDefined = false;
3964   fontDescriptionRun03.widthDefined  = false;
3965   fontDescriptionRun03.slantDefined  = false;
3966   fontDescriptionRun03.sizeDefined   = false;
3967
3968   FontDescriptionRun fontDescriptionRun04;
3969   fontDescriptionRun04.characterRun.characterIndex     = 36u;
3970   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
3971   fontDescriptionRun04.familyLength                    = fontLatin.size();
3972   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
3973   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
3974   fontDescriptionRun04.familyDefined = true;
3975   fontDescriptionRun04.weightDefined = false;
3976   fontDescriptionRun04.widthDefined  = false;
3977   fontDescriptionRun04.slantDefined  = false;
3978   fontDescriptionRun04.sizeDefined   = false;
3979
3980   FontDescriptionRun fontDescriptionRun05;
3981   fontDescriptionRun05.characterRun.characterIndex     = 48u;
3982   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
3983   fontDescriptionRun05.familyLength                    = fontLatin.size();
3984   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
3985   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
3986   fontDescriptionRun05.familyDefined = true;
3987   fontDescriptionRun05.weightDefined = false;
3988   fontDescriptionRun05.widthDefined  = false;
3989   fontDescriptionRun05.slantDefined  = false;
3990   fontDescriptionRun05.sizeDefined   = false;
3991
3992   FontDescriptionRun fontDescriptionRun06;
3993   fontDescriptionRun06.characterRun.characterIndex     = 60u;
3994   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
3995   fontDescriptionRun06.familyLength                    = fontArabic.size();
3996   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
3997   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
3998   fontDescriptionRun06.familyDefined = true;
3999   fontDescriptionRun06.weightDefined = false;
4000   fontDescriptionRun06.widthDefined  = false;
4001   fontDescriptionRun06.slantDefined  = false;
4002   fontDescriptionRun06.sizeDefined   = false;
4003
4004   Vector<FontDescriptionRun> fontDescriptionRuns;
4005   fontDescriptionRuns.PushBack(fontDescriptionRun01);
4006   fontDescriptionRuns.PushBack(fontDescriptionRun02);
4007   fontDescriptionRuns.PushBack(fontDescriptionRun03);
4008   fontDescriptionRuns.PushBack(fontDescriptionRun04);
4009   fontDescriptionRuns.PushBack(fontDescriptionRun05);
4010   fontDescriptionRuns.PushBack(fontDescriptionRun06);
4011
4012   float positions[] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
4013
4014   Size      textArea(100.f, 300.f);
4015   AlignData data =
4016     {
4017       "Begin alignment for the last paragraph.",
4018       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4019       textArea,
4020       6u,
4021       fontDescriptionRuns.Begin(),
4022       Text::HorizontalAlignment::BEGIN,
4023       Text::VerticalAlignment::TOP,
4024       48u,
4025       26u,
4026       6u,
4027       positions,
4028       Dali::LayoutDirection::LEFT_TO_RIGHT,
4029       false};
4030
4031   if(!AlignTest(data))
4032   {
4033     tet_result(TET_FAIL);
4034   }
4035
4036   tet_result(TET_PASS);
4037   END_TEST;
4038 }
4039
4040 int UtcDaliTextAlign04(void)
4041 {
4042   ToolkitTestApplication application;
4043   tet_infoline(" UtcDaliTextAlign04");
4044
4045   // Calculate text alignment.
4046
4047   const std::string fontLatin("TizenSans");
4048   const std::string fontHebrew("TizenSansHebrew");
4049   const std::string fontArabic("TizenSansArabic");
4050
4051   // Set a known font description
4052   FontDescriptionRun fontDescriptionRun01;
4053   fontDescriptionRun01.characterRun.characterIndex     = 0u;
4054   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4055   fontDescriptionRun01.familyLength                    = fontLatin.size();
4056   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
4057   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
4058   fontDescriptionRun01.familyDefined = true;
4059   fontDescriptionRun01.weightDefined = false;
4060   fontDescriptionRun01.widthDefined  = false;
4061   fontDescriptionRun01.slantDefined  = false;
4062   fontDescriptionRun01.sizeDefined   = false;
4063
4064   FontDescriptionRun fontDescriptionRun02;
4065   fontDescriptionRun02.characterRun.characterIndex     = 12u;
4066   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4067   fontDescriptionRun02.familyLength                    = fontHebrew.size();
4068   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
4069   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
4070   fontDescriptionRun02.familyDefined = true;
4071   fontDescriptionRun02.weightDefined = false;
4072   fontDescriptionRun02.widthDefined  = false;
4073   fontDescriptionRun02.slantDefined  = false;
4074   fontDescriptionRun02.sizeDefined   = false;
4075
4076   FontDescriptionRun fontDescriptionRun03;
4077   fontDescriptionRun03.characterRun.characterIndex     = 22u;
4078   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4079   fontDescriptionRun03.familyLength                    = fontArabic.size();
4080   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
4081   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
4082   fontDescriptionRun03.familyDefined = true;
4083   fontDescriptionRun03.weightDefined = false;
4084   fontDescriptionRun03.widthDefined  = false;
4085   fontDescriptionRun03.slantDefined  = false;
4086   fontDescriptionRun03.sizeDefined   = false;
4087
4088   FontDescriptionRun fontDescriptionRun04;
4089   fontDescriptionRun04.characterRun.characterIndex     = 36u;
4090   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4091   fontDescriptionRun04.familyLength                    = fontLatin.size();
4092   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
4093   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
4094   fontDescriptionRun04.familyDefined = true;
4095   fontDescriptionRun04.weightDefined = false;
4096   fontDescriptionRun04.widthDefined  = false;
4097   fontDescriptionRun04.slantDefined  = false;
4098   fontDescriptionRun04.sizeDefined   = false;
4099
4100   FontDescriptionRun fontDescriptionRun05;
4101   fontDescriptionRun05.characterRun.characterIndex     = 48u;
4102   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4103   fontDescriptionRun05.familyLength                    = fontLatin.size();
4104   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
4105   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
4106   fontDescriptionRun05.familyDefined = true;
4107   fontDescriptionRun05.weightDefined = false;
4108   fontDescriptionRun05.widthDefined  = false;
4109   fontDescriptionRun05.slantDefined  = false;
4110   fontDescriptionRun05.sizeDefined   = false;
4111
4112   FontDescriptionRun fontDescriptionRun06;
4113   fontDescriptionRun06.characterRun.characterIndex     = 60u;
4114   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4115   fontDescriptionRun06.familyLength                    = fontArabic.size();
4116   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
4117   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
4118   fontDescriptionRun06.familyDefined = true;
4119   fontDescriptionRun06.weightDefined = false;
4120   fontDescriptionRun06.widthDefined  = false;
4121   fontDescriptionRun06.slantDefined  = false;
4122   fontDescriptionRun06.sizeDefined   = false;
4123
4124   Vector<FontDescriptionRun> fontDescriptionRuns;
4125   fontDescriptionRuns.PushBack(fontDescriptionRun01);
4126   fontDescriptionRuns.PushBack(fontDescriptionRun02);
4127   fontDescriptionRuns.PushBack(fontDescriptionRun03);
4128   fontDescriptionRuns.PushBack(fontDescriptionRun04);
4129   fontDescriptionRuns.PushBack(fontDescriptionRun05);
4130   fontDescriptionRuns.PushBack(fontDescriptionRun06);
4131
4132   float positions[] = {10.f, 15.f, 0.f, 0.f, 0.f, 0.f};
4133
4134   Size      textArea(100.f, 300.f);
4135   AlignData data =
4136     {
4137       "Center alignment for the first paragraph.",
4138       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4139       textArea,
4140       6u,
4141       fontDescriptionRuns.Begin(),
4142       Text::HorizontalAlignment::CENTER,
4143       Text::VerticalAlignment::TOP,
4144       0u,
4145       22u,
4146       6u,
4147       positions,
4148       Dali::LayoutDirection::LEFT_TO_RIGHT,
4149       false};
4150
4151   if(!AlignTest(data))
4152   {
4153     tet_result(TET_FAIL);
4154   }
4155
4156   tet_result(TET_PASS);
4157   END_TEST;
4158 }
4159
4160 int UtcDaliTextAlign05(void)
4161 {
4162   ToolkitTestApplication application;
4163   tet_infoline(" UtcDaliTextAlign05");
4164
4165   // Calculate text alignment.
4166
4167   const std::string fontLatin("TizenSans");
4168   const std::string fontHebrew("TizenSansHebrew");
4169   const std::string fontArabic("TizenSansArabic");
4170
4171   // Set a known font description
4172   FontDescriptionRun fontDescriptionRun01;
4173   fontDescriptionRun01.characterRun.characterIndex     = 0u;
4174   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4175   fontDescriptionRun01.familyLength                    = fontLatin.size();
4176   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
4177   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
4178   fontDescriptionRun01.familyDefined = true;
4179   fontDescriptionRun01.weightDefined = false;
4180   fontDescriptionRun01.widthDefined  = false;
4181   fontDescriptionRun01.slantDefined  = false;
4182   fontDescriptionRun01.sizeDefined   = false;
4183
4184   FontDescriptionRun fontDescriptionRun02;
4185   fontDescriptionRun02.characterRun.characterIndex     = 12u;
4186   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4187   fontDescriptionRun02.familyLength                    = fontHebrew.size();
4188   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
4189   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
4190   fontDescriptionRun02.familyDefined = true;
4191   fontDescriptionRun02.weightDefined = false;
4192   fontDescriptionRun02.widthDefined  = false;
4193   fontDescriptionRun02.slantDefined  = false;
4194   fontDescriptionRun02.sizeDefined   = false;
4195
4196   FontDescriptionRun fontDescriptionRun03;
4197   fontDescriptionRun03.characterRun.characterIndex     = 22u;
4198   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4199   fontDescriptionRun03.familyLength                    = fontArabic.size();
4200   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
4201   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
4202   fontDescriptionRun03.familyDefined = true;
4203   fontDescriptionRun03.weightDefined = false;
4204   fontDescriptionRun03.widthDefined  = false;
4205   fontDescriptionRun03.slantDefined  = false;
4206   fontDescriptionRun03.sizeDefined   = false;
4207
4208   FontDescriptionRun fontDescriptionRun04;
4209   fontDescriptionRun04.characterRun.characterIndex     = 36u;
4210   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4211   fontDescriptionRun04.familyLength                    = fontLatin.size();
4212   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
4213   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
4214   fontDescriptionRun04.familyDefined = true;
4215   fontDescriptionRun04.weightDefined = false;
4216   fontDescriptionRun04.widthDefined  = false;
4217   fontDescriptionRun04.slantDefined  = false;
4218   fontDescriptionRun04.sizeDefined   = false;
4219
4220   FontDescriptionRun fontDescriptionRun05;
4221   fontDescriptionRun05.characterRun.characterIndex     = 48u;
4222   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4223   fontDescriptionRun05.familyLength                    = fontLatin.size();
4224   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
4225   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
4226   fontDescriptionRun05.familyDefined = true;
4227   fontDescriptionRun05.weightDefined = false;
4228   fontDescriptionRun05.widthDefined  = false;
4229   fontDescriptionRun05.slantDefined  = false;
4230   fontDescriptionRun05.sizeDefined   = false;
4231
4232   FontDescriptionRun fontDescriptionRun06;
4233   fontDescriptionRun06.characterRun.characterIndex     = 60u;
4234   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4235   fontDescriptionRun06.familyLength                    = fontArabic.size();
4236   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
4237   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
4238   fontDescriptionRun06.familyDefined = true;
4239   fontDescriptionRun06.weightDefined = false;
4240   fontDescriptionRun06.widthDefined  = false;
4241   fontDescriptionRun06.slantDefined  = false;
4242   fontDescriptionRun06.sizeDefined   = false;
4243
4244   Vector<FontDescriptionRun> fontDescriptionRuns;
4245   fontDescriptionRuns.PushBack(fontDescriptionRun01);
4246   fontDescriptionRuns.PushBack(fontDescriptionRun02);
4247   fontDescriptionRuns.PushBack(fontDescriptionRun03);
4248   fontDescriptionRuns.PushBack(fontDescriptionRun04);
4249   fontDescriptionRuns.PushBack(fontDescriptionRun05);
4250   fontDescriptionRuns.PushBack(fontDescriptionRun06);
4251
4252   float positions[] = {0.f, 0.f, 15.f, 10.f, 0.f, 0.f};
4253
4254   Size      textArea(100.f, 300.f);
4255   AlignData data =
4256     {
4257       "Center alignment for the mid paragraph.",
4258       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4259       textArea,
4260       6u,
4261       fontDescriptionRuns.Begin(),
4262       Text::HorizontalAlignment::CENTER,
4263       Text::VerticalAlignment::TOP,
4264       22u,
4265       26u,
4266       6u,
4267       positions,
4268       Dali::LayoutDirection::LEFT_TO_RIGHT,
4269       false};
4270
4271   if(!AlignTest(data))
4272   {
4273     tet_result(TET_FAIL);
4274   }
4275
4276   tet_result(TET_PASS);
4277   END_TEST;
4278 }
4279
4280 int UtcDaliTextAlign06(void)
4281 {
4282   ToolkitTestApplication application;
4283   tet_infoline(" UtcDaliTextAlign06");
4284
4285   // Calculate text alignment.
4286
4287   const std::string fontLatin("TizenSans");
4288   const std::string fontHebrew("TizenSansHebrew");
4289   const std::string fontArabic("TizenSansArabic");
4290
4291   // Set a known font description
4292   FontDescriptionRun fontDescriptionRun01;
4293   fontDescriptionRun01.characterRun.characterIndex     = 0u;
4294   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4295   fontDescriptionRun01.familyLength                    = fontLatin.size();
4296   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
4297   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
4298   fontDescriptionRun01.familyDefined = true;
4299   fontDescriptionRun01.weightDefined = false;
4300   fontDescriptionRun01.widthDefined  = false;
4301   fontDescriptionRun01.slantDefined  = false;
4302   fontDescriptionRun01.sizeDefined   = false;
4303
4304   FontDescriptionRun fontDescriptionRun02;
4305   fontDescriptionRun02.characterRun.characterIndex     = 12u;
4306   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4307   fontDescriptionRun02.familyLength                    = fontHebrew.size();
4308   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
4309   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
4310   fontDescriptionRun02.familyDefined = true;
4311   fontDescriptionRun02.weightDefined = false;
4312   fontDescriptionRun02.widthDefined  = false;
4313   fontDescriptionRun02.slantDefined  = false;
4314   fontDescriptionRun02.sizeDefined   = false;
4315
4316   FontDescriptionRun fontDescriptionRun03;
4317   fontDescriptionRun03.characterRun.characterIndex     = 22u;
4318   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4319   fontDescriptionRun03.familyLength                    = fontArabic.size();
4320   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
4321   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
4322   fontDescriptionRun03.familyDefined = true;
4323   fontDescriptionRun03.weightDefined = false;
4324   fontDescriptionRun03.widthDefined  = false;
4325   fontDescriptionRun03.slantDefined  = false;
4326   fontDescriptionRun03.sizeDefined   = false;
4327
4328   FontDescriptionRun fontDescriptionRun04;
4329   fontDescriptionRun04.characterRun.characterIndex     = 36u;
4330   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4331   fontDescriptionRun04.familyLength                    = fontLatin.size();
4332   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
4333   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
4334   fontDescriptionRun04.familyDefined = true;
4335   fontDescriptionRun04.weightDefined = false;
4336   fontDescriptionRun04.widthDefined  = false;
4337   fontDescriptionRun04.slantDefined  = false;
4338   fontDescriptionRun04.sizeDefined   = false;
4339
4340   FontDescriptionRun fontDescriptionRun05;
4341   fontDescriptionRun05.characterRun.characterIndex     = 48u;
4342   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4343   fontDescriptionRun05.familyLength                    = fontLatin.size();
4344   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
4345   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
4346   fontDescriptionRun05.familyDefined = true;
4347   fontDescriptionRun05.weightDefined = false;
4348   fontDescriptionRun05.widthDefined  = false;
4349   fontDescriptionRun05.slantDefined  = false;
4350   fontDescriptionRun05.sizeDefined   = false;
4351
4352   FontDescriptionRun fontDescriptionRun06;
4353   fontDescriptionRun06.characterRun.characterIndex     = 60u;
4354   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4355   fontDescriptionRun06.familyLength                    = fontArabic.size();
4356   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
4357   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
4358   fontDescriptionRun06.familyDefined = true;
4359   fontDescriptionRun06.weightDefined = false;
4360   fontDescriptionRun06.widthDefined  = false;
4361   fontDescriptionRun06.slantDefined  = false;
4362   fontDescriptionRun06.sizeDefined   = false;
4363
4364   Vector<FontDescriptionRun> fontDescriptionRuns;
4365   fontDescriptionRuns.PushBack(fontDescriptionRun01);
4366   fontDescriptionRuns.PushBack(fontDescriptionRun02);
4367   fontDescriptionRuns.PushBack(fontDescriptionRun03);
4368   fontDescriptionRuns.PushBack(fontDescriptionRun04);
4369   fontDescriptionRuns.PushBack(fontDescriptionRun05);
4370   fontDescriptionRuns.PushBack(fontDescriptionRun06);
4371
4372   float positions[] = {0.f, 0.f, 0.f, 0.f, 10.f, 17.f};
4373
4374   Size      textArea(100.f, 300.f);
4375   AlignData data =
4376     {
4377       "Center alignment for the last paragraph.",
4378       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4379       textArea,
4380       6u,
4381       fontDescriptionRuns.Begin(),
4382       Text::HorizontalAlignment::CENTER,
4383       Text::VerticalAlignment::TOP,
4384       48u,
4385       26u,
4386       6u,
4387       positions,
4388       Dali::LayoutDirection::LEFT_TO_RIGHT,
4389       false};
4390
4391   if(!AlignTest(data))
4392   {
4393     tet_result(TET_FAIL);
4394   }
4395
4396   tet_result(TET_PASS);
4397   END_TEST;
4398 }
4399
4400 int UtcDaliTextAlign07(void)
4401 {
4402   ToolkitTestApplication application;
4403   tet_infoline(" UtcDaliTextAlign07");
4404
4405   // Calculate text alignment.
4406
4407   const std::string fontLatin("TizenSans");
4408   const std::string fontHebrew("TizenSansHebrew");
4409   const std::string fontArabic("TizenSansArabic");
4410
4411   // Set a known font description
4412   FontDescriptionRun fontDescriptionRun01;
4413   fontDescriptionRun01.characterRun.characterIndex     = 0u;
4414   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4415   fontDescriptionRun01.familyLength                    = fontLatin.size();
4416   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
4417   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
4418   fontDescriptionRun01.familyDefined = true;
4419   fontDescriptionRun01.weightDefined = false;
4420   fontDescriptionRun01.widthDefined  = false;
4421   fontDescriptionRun01.slantDefined  = false;
4422   fontDescriptionRun01.sizeDefined   = false;
4423
4424   FontDescriptionRun fontDescriptionRun02;
4425   fontDescriptionRun02.characterRun.characterIndex     = 12u;
4426   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4427   fontDescriptionRun02.familyLength                    = fontHebrew.size();
4428   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
4429   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
4430   fontDescriptionRun02.familyDefined = true;
4431   fontDescriptionRun02.weightDefined = false;
4432   fontDescriptionRun02.widthDefined  = false;
4433   fontDescriptionRun02.slantDefined  = false;
4434   fontDescriptionRun02.sizeDefined   = false;
4435
4436   FontDescriptionRun fontDescriptionRun03;
4437   fontDescriptionRun03.characterRun.characterIndex     = 22u;
4438   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4439   fontDescriptionRun03.familyLength                    = fontArabic.size();
4440   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
4441   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
4442   fontDescriptionRun03.familyDefined = true;
4443   fontDescriptionRun03.weightDefined = false;
4444   fontDescriptionRun03.widthDefined  = false;
4445   fontDescriptionRun03.slantDefined  = false;
4446   fontDescriptionRun03.sizeDefined   = false;
4447
4448   FontDescriptionRun fontDescriptionRun04;
4449   fontDescriptionRun04.characterRun.characterIndex     = 36u;
4450   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4451   fontDescriptionRun04.familyLength                    = fontLatin.size();
4452   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
4453   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
4454   fontDescriptionRun04.familyDefined = true;
4455   fontDescriptionRun04.weightDefined = false;
4456   fontDescriptionRun04.widthDefined  = false;
4457   fontDescriptionRun04.slantDefined  = false;
4458   fontDescriptionRun04.sizeDefined   = false;
4459
4460   FontDescriptionRun fontDescriptionRun05;
4461   fontDescriptionRun05.characterRun.characterIndex     = 48u;
4462   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4463   fontDescriptionRun05.familyLength                    = fontLatin.size();
4464   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
4465   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
4466   fontDescriptionRun05.familyDefined = true;
4467   fontDescriptionRun05.weightDefined = false;
4468   fontDescriptionRun05.widthDefined  = false;
4469   fontDescriptionRun05.slantDefined  = false;
4470   fontDescriptionRun05.sizeDefined   = false;
4471
4472   FontDescriptionRun fontDescriptionRun06;
4473   fontDescriptionRun06.characterRun.characterIndex     = 60u;
4474   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4475   fontDescriptionRun06.familyLength                    = fontArabic.size();
4476   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
4477   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
4478   fontDescriptionRun06.familyDefined = true;
4479   fontDescriptionRun06.weightDefined = false;
4480   fontDescriptionRun06.widthDefined  = false;
4481   fontDescriptionRun06.slantDefined  = false;
4482   fontDescriptionRun06.sizeDefined   = false;
4483
4484   Vector<FontDescriptionRun> fontDescriptionRuns;
4485   fontDescriptionRuns.PushBack(fontDescriptionRun01);
4486   fontDescriptionRuns.PushBack(fontDescriptionRun02);
4487   fontDescriptionRuns.PushBack(fontDescriptionRun03);
4488   fontDescriptionRuns.PushBack(fontDescriptionRun04);
4489   fontDescriptionRuns.PushBack(fontDescriptionRun05);
4490   fontDescriptionRuns.PushBack(fontDescriptionRun06);
4491
4492   float positions[] = {21.f, 30.f, 0.f, 0.f, 0.f, 0.f};
4493
4494   Size      textArea(100.f, 300.f);
4495   AlignData data =
4496     {
4497       "End alignment for the first paragraph.",
4498       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4499       textArea,
4500       6u,
4501       fontDescriptionRuns.Begin(),
4502       Text::HorizontalAlignment::END,
4503       Text::VerticalAlignment::TOP,
4504       0u,
4505       22u,
4506       6u,
4507       positions,
4508       Dali::LayoutDirection::LEFT_TO_RIGHT,
4509       false};
4510
4511   if(!AlignTest(data))
4512   {
4513     tet_result(TET_FAIL);
4514   }
4515
4516   tet_result(TET_PASS);
4517   END_TEST;
4518 }
4519
4520 int UtcDaliTextAlign08(void)
4521 {
4522   ToolkitTestApplication application;
4523   tet_infoline(" UtcDaliTextAlign08");
4524
4525   // Calculate text alignment.
4526
4527   const std::string fontLatin("TizenSans");
4528   const std::string fontHebrew("TizenSansHebrew");
4529   const std::string fontArabic("TizenSansArabic");
4530
4531   // Set a known font description
4532   FontDescriptionRun fontDescriptionRun01;
4533   fontDescriptionRun01.characterRun.characterIndex     = 0u;
4534   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4535   fontDescriptionRun01.familyLength                    = fontLatin.size();
4536   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
4537   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
4538   fontDescriptionRun01.familyDefined = true;
4539   fontDescriptionRun01.weightDefined = false;
4540   fontDescriptionRun01.widthDefined  = false;
4541   fontDescriptionRun01.slantDefined  = false;
4542   fontDescriptionRun01.sizeDefined   = false;
4543
4544   FontDescriptionRun fontDescriptionRun02;
4545   fontDescriptionRun02.characterRun.characterIndex     = 12u;
4546   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4547   fontDescriptionRun02.familyLength                    = fontHebrew.size();
4548   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
4549   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
4550   fontDescriptionRun02.familyDefined = true;
4551   fontDescriptionRun02.weightDefined = false;
4552   fontDescriptionRun02.widthDefined  = false;
4553   fontDescriptionRun02.slantDefined  = false;
4554   fontDescriptionRun02.sizeDefined   = false;
4555
4556   FontDescriptionRun fontDescriptionRun03;
4557   fontDescriptionRun03.characterRun.characterIndex     = 22u;
4558   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4559   fontDescriptionRun03.familyLength                    = fontArabic.size();
4560   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
4561   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
4562   fontDescriptionRun03.familyDefined = true;
4563   fontDescriptionRun03.weightDefined = false;
4564   fontDescriptionRun03.widthDefined  = false;
4565   fontDescriptionRun03.slantDefined  = false;
4566   fontDescriptionRun03.sizeDefined   = false;
4567
4568   FontDescriptionRun fontDescriptionRun04;
4569   fontDescriptionRun04.characterRun.characterIndex     = 36u;
4570   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4571   fontDescriptionRun04.familyLength                    = fontLatin.size();
4572   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
4573   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
4574   fontDescriptionRun04.familyDefined = true;
4575   fontDescriptionRun04.weightDefined = false;
4576   fontDescriptionRun04.widthDefined  = false;
4577   fontDescriptionRun04.slantDefined  = false;
4578   fontDescriptionRun04.sizeDefined   = false;
4579
4580   FontDescriptionRun fontDescriptionRun05;
4581   fontDescriptionRun05.characterRun.characterIndex     = 48u;
4582   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4583   fontDescriptionRun05.familyLength                    = fontLatin.size();
4584   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
4585   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
4586   fontDescriptionRun05.familyDefined = true;
4587   fontDescriptionRun05.weightDefined = false;
4588   fontDescriptionRun05.widthDefined  = false;
4589   fontDescriptionRun05.slantDefined  = false;
4590   fontDescriptionRun05.sizeDefined   = false;
4591
4592   FontDescriptionRun fontDescriptionRun06;
4593   fontDescriptionRun06.characterRun.characterIndex     = 60u;
4594   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4595   fontDescriptionRun06.familyLength                    = fontArabic.size();
4596   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
4597   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
4598   fontDescriptionRun06.familyDefined = true;
4599   fontDescriptionRun06.weightDefined = false;
4600   fontDescriptionRun06.widthDefined  = false;
4601   fontDescriptionRun06.slantDefined  = false;
4602   fontDescriptionRun06.sizeDefined   = false;
4603
4604   Vector<FontDescriptionRun> fontDescriptionRuns;
4605   fontDescriptionRuns.PushBack(fontDescriptionRun01);
4606   fontDescriptionRuns.PushBack(fontDescriptionRun02);
4607   fontDescriptionRuns.PushBack(fontDescriptionRun03);
4608   fontDescriptionRuns.PushBack(fontDescriptionRun04);
4609   fontDescriptionRuns.PushBack(fontDescriptionRun05);
4610   fontDescriptionRuns.PushBack(fontDescriptionRun06);
4611
4612   float positions[] = {0.f, 0.f, -4.f, 0.f, 0.f, 0.f};
4613
4614   Size      textArea(100.f, 300.f);
4615   AlignData data =
4616     {
4617       "End alignment for the mid paragraph.",
4618       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4619       textArea,
4620       6u,
4621       fontDescriptionRuns.Begin(),
4622       Text::HorizontalAlignment::END,
4623       Text::VerticalAlignment::TOP,
4624       22u,
4625       26u,
4626       6u,
4627       positions,
4628       Dali::LayoutDirection::LEFT_TO_RIGHT,
4629       false};
4630
4631   if(!AlignTest(data))
4632   {
4633     tet_result(TET_FAIL);
4634   }
4635
4636   tet_result(TET_PASS);
4637   END_TEST;
4638 }
4639
4640 int UtcDaliTextAlign09(void)
4641 {
4642   ToolkitTestApplication application;
4643   tet_infoline(" UtcDaliTextAlign09");
4644
4645   // Calculate text alignment.
4646
4647   const std::string fontLatin("TizenSans");
4648   const std::string fontHebrew("TizenSansHebrew");
4649   const std::string fontArabic("TizenSansArabic");
4650
4651   // Set a known font description
4652   FontDescriptionRun fontDescriptionRun01;
4653   fontDescriptionRun01.characterRun.characterIndex     = 0u;
4654   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4655   fontDescriptionRun01.familyLength                    = fontLatin.size();
4656   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
4657   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
4658   fontDescriptionRun01.familyDefined = true;
4659   fontDescriptionRun01.weightDefined = false;
4660   fontDescriptionRun01.widthDefined  = false;
4661   fontDescriptionRun01.slantDefined  = false;
4662   fontDescriptionRun01.sizeDefined   = false;
4663
4664   FontDescriptionRun fontDescriptionRun02;
4665   fontDescriptionRun02.characterRun.characterIndex     = 12u;
4666   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4667   fontDescriptionRun02.familyLength                    = fontHebrew.size();
4668   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
4669   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
4670   fontDescriptionRun02.familyDefined = true;
4671   fontDescriptionRun02.weightDefined = false;
4672   fontDescriptionRun02.widthDefined  = false;
4673   fontDescriptionRun02.slantDefined  = false;
4674   fontDescriptionRun02.sizeDefined   = false;
4675
4676   FontDescriptionRun fontDescriptionRun03;
4677   fontDescriptionRun03.characterRun.characterIndex     = 22u;
4678   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4679   fontDescriptionRun03.familyLength                    = fontArabic.size();
4680   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
4681   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
4682   fontDescriptionRun03.familyDefined = true;
4683   fontDescriptionRun03.weightDefined = false;
4684   fontDescriptionRun03.widthDefined  = false;
4685   fontDescriptionRun03.slantDefined  = false;
4686   fontDescriptionRun03.sizeDefined   = false;
4687
4688   FontDescriptionRun fontDescriptionRun04;
4689   fontDescriptionRun04.characterRun.characterIndex     = 36u;
4690   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4691   fontDescriptionRun04.familyLength                    = fontLatin.size();
4692   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
4693   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
4694   fontDescriptionRun04.familyDefined = true;
4695   fontDescriptionRun04.weightDefined = false;
4696   fontDescriptionRun04.widthDefined  = false;
4697   fontDescriptionRun04.slantDefined  = false;
4698   fontDescriptionRun04.sizeDefined   = false;
4699
4700   FontDescriptionRun fontDescriptionRun05;
4701   fontDescriptionRun05.characterRun.characterIndex     = 48u;
4702   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4703   fontDescriptionRun05.familyLength                    = fontLatin.size();
4704   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
4705   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
4706   fontDescriptionRun05.familyDefined = true;
4707   fontDescriptionRun05.weightDefined = false;
4708   fontDescriptionRun05.widthDefined  = false;
4709   fontDescriptionRun05.slantDefined  = false;
4710   fontDescriptionRun05.sizeDefined   = false;
4711
4712   FontDescriptionRun fontDescriptionRun06;
4713   fontDescriptionRun06.characterRun.characterIndex     = 60u;
4714   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4715   fontDescriptionRun06.familyLength                    = fontArabic.size();
4716   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
4717   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
4718   fontDescriptionRun06.familyDefined = true;
4719   fontDescriptionRun06.weightDefined = false;
4720   fontDescriptionRun06.widthDefined  = false;
4721   fontDescriptionRun06.slantDefined  = false;
4722   fontDescriptionRun06.sizeDefined   = false;
4723
4724   Vector<FontDescriptionRun> fontDescriptionRuns;
4725   fontDescriptionRuns.PushBack(fontDescriptionRun01);
4726   fontDescriptionRuns.PushBack(fontDescriptionRun02);
4727   fontDescriptionRuns.PushBack(fontDescriptionRun03);
4728   fontDescriptionRuns.PushBack(fontDescriptionRun04);
4729   fontDescriptionRuns.PushBack(fontDescriptionRun05);
4730   fontDescriptionRuns.PushBack(fontDescriptionRun06);
4731
4732   float positions[] = {0.f, 0.f, 0.f, 0.f, 21.f, 35.f};
4733
4734   Size      textArea(100.f, 300.f);
4735   AlignData data =
4736     {
4737       "End alignment for the last paragraph.",
4738       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4739       textArea,
4740       6u,
4741       fontDescriptionRuns.Begin(),
4742       Text::HorizontalAlignment::END,
4743       Text::VerticalAlignment::TOP,
4744       48u,
4745       26u,
4746       6u,
4747       positions,
4748       Dali::LayoutDirection::LEFT_TO_RIGHT,
4749       false};
4750
4751   if(!AlignTest(data))
4752   {
4753     tet_result(TET_FAIL);
4754   }
4755
4756   tet_result(TET_PASS);
4757   END_TEST;
4758 }
4759
4760 int UtcDaliTextAlign10(void)
4761 {
4762   ToolkitTestApplication application;
4763   tet_infoline(" UtcDaliTextAlign10");
4764
4765   // Calculate text alignment.
4766
4767   const std::string fontLatin("TizenSans");
4768   const std::string fontHebrew("TizenSansHebrew");
4769   const std::string fontArabic("TizenSansArabic");
4770
4771   // Set a known font description
4772   FontDescriptionRun fontDescriptionRun01;
4773   fontDescriptionRun01.characterRun.characterIndex     = 0u;
4774   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4775   fontDescriptionRun01.familyLength                    = fontLatin.size();
4776   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
4777   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
4778   fontDescriptionRun01.familyDefined = true;
4779   fontDescriptionRun01.weightDefined = false;
4780   fontDescriptionRun01.widthDefined  = false;
4781   fontDescriptionRun01.slantDefined  = false;
4782   fontDescriptionRun01.sizeDefined   = false;
4783
4784   FontDescriptionRun fontDescriptionRun02;
4785   fontDescriptionRun02.characterRun.characterIndex     = 12u;
4786   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4787   fontDescriptionRun02.familyLength                    = fontHebrew.size();
4788   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
4789   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
4790   fontDescriptionRun02.familyDefined = true;
4791   fontDescriptionRun02.weightDefined = false;
4792   fontDescriptionRun02.widthDefined  = false;
4793   fontDescriptionRun02.slantDefined  = false;
4794   fontDescriptionRun02.sizeDefined   = false;
4795
4796   FontDescriptionRun fontDescriptionRun03;
4797   fontDescriptionRun03.characterRun.characterIndex     = 22u;
4798   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4799   fontDescriptionRun03.familyLength                    = fontArabic.size();
4800   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
4801   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
4802   fontDescriptionRun03.familyDefined = true;
4803   fontDescriptionRun03.weightDefined = false;
4804   fontDescriptionRun03.widthDefined  = false;
4805   fontDescriptionRun03.slantDefined  = false;
4806   fontDescriptionRun03.sizeDefined   = false;
4807
4808   FontDescriptionRun fontDescriptionRun04;
4809   fontDescriptionRun04.characterRun.characterIndex     = 36u;
4810   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4811   fontDescriptionRun04.familyLength                    = fontLatin.size();
4812   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
4813   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
4814   fontDescriptionRun04.familyDefined = true;
4815   fontDescriptionRun04.weightDefined = false;
4816   fontDescriptionRun04.widthDefined  = false;
4817   fontDescriptionRun04.slantDefined  = false;
4818   fontDescriptionRun04.sizeDefined   = false;
4819
4820   FontDescriptionRun fontDescriptionRun05;
4821   fontDescriptionRun05.characterRun.characterIndex     = 48u;
4822   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4823   fontDescriptionRun05.familyLength                    = fontLatin.size();
4824   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
4825   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
4826   fontDescriptionRun05.familyDefined = true;
4827   fontDescriptionRun05.weightDefined = false;
4828   fontDescriptionRun05.widthDefined  = false;
4829   fontDescriptionRun05.slantDefined  = false;
4830   fontDescriptionRun05.sizeDefined   = false;
4831
4832   FontDescriptionRun fontDescriptionRun06;
4833   fontDescriptionRun06.characterRun.characterIndex     = 60u;
4834   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4835   fontDescriptionRun06.familyLength                    = fontArabic.size();
4836   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
4837   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
4838   fontDescriptionRun06.familyDefined = true;
4839   fontDescriptionRun06.weightDefined = false;
4840   fontDescriptionRun06.widthDefined  = false;
4841   fontDescriptionRun06.slantDefined  = false;
4842   fontDescriptionRun06.sizeDefined   = false;
4843
4844   Vector<FontDescriptionRun> fontDescriptionRuns;
4845   fontDescriptionRuns.PushBack(fontDescriptionRun01);
4846   fontDescriptionRuns.PushBack(fontDescriptionRun02);
4847   fontDescriptionRuns.PushBack(fontDescriptionRun03);
4848   fontDescriptionRuns.PushBack(fontDescriptionRun04);
4849   fontDescriptionRuns.PushBack(fontDescriptionRun05);
4850   fontDescriptionRuns.PushBack(fontDescriptionRun06);
4851
4852   float positions[] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
4853
4854   Size      textArea(100.f, 300.f);
4855   AlignData data =
4856     {
4857       "Begin alignment for the first paragraph.",
4858       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4859       textArea,
4860       6u,
4861       fontDescriptionRuns.Begin(),
4862       Text::HorizontalAlignment::END,
4863       Text::VerticalAlignment::TOP,
4864       0u,
4865       22u,
4866       6u,
4867       positions,
4868       Dali::LayoutDirection::RIGHT_TO_LEFT,
4869       true};
4870
4871   if(!AlignTest(data))
4872   {
4873     tet_result(TET_FAIL);
4874   }
4875
4876   tet_result(TET_PASS);
4877   END_TEST;
4878 }
4879
4880 int UtcDaliTextAlign11(void)
4881 {
4882   ToolkitTestApplication application;
4883   tet_infoline(" UtcDaliTextAlign11");
4884
4885   // Calculate text alignment.
4886
4887   const std::string fontLatin("TizenSans");
4888   const std::string fontHebrew("TizenSansHebrew");
4889   const std::string fontArabic("TizenSansArabic");
4890
4891   // Set a known font description
4892   FontDescriptionRun fontDescriptionRun01;
4893   fontDescriptionRun01.characterRun.characterIndex     = 0u;
4894   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4895   fontDescriptionRun01.familyLength                    = fontLatin.size();
4896   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
4897   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
4898   fontDescriptionRun01.familyDefined = true;
4899   fontDescriptionRun01.weightDefined = false;
4900   fontDescriptionRun01.widthDefined  = false;
4901   fontDescriptionRun01.slantDefined  = false;
4902   fontDescriptionRun01.sizeDefined   = false;
4903
4904   FontDescriptionRun fontDescriptionRun02;
4905   fontDescriptionRun02.characterRun.characterIndex     = 12u;
4906   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4907   fontDescriptionRun02.familyLength                    = fontHebrew.size();
4908   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
4909   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
4910   fontDescriptionRun02.familyDefined = true;
4911   fontDescriptionRun02.weightDefined = false;
4912   fontDescriptionRun02.widthDefined  = false;
4913   fontDescriptionRun02.slantDefined  = false;
4914   fontDescriptionRun02.sizeDefined   = false;
4915
4916   FontDescriptionRun fontDescriptionRun03;
4917   fontDescriptionRun03.characterRun.characterIndex     = 22u;
4918   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4919   fontDescriptionRun03.familyLength                    = fontArabic.size();
4920   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
4921   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
4922   fontDescriptionRun03.familyDefined = true;
4923   fontDescriptionRun03.weightDefined = false;
4924   fontDescriptionRun03.widthDefined  = false;
4925   fontDescriptionRun03.slantDefined  = false;
4926   fontDescriptionRun03.sizeDefined   = false;
4927
4928   FontDescriptionRun fontDescriptionRun04;
4929   fontDescriptionRun04.characterRun.characterIndex     = 36u;
4930   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4931   fontDescriptionRun04.familyLength                    = fontLatin.size();
4932   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
4933   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
4934   fontDescriptionRun04.familyDefined = true;
4935   fontDescriptionRun04.weightDefined = false;
4936   fontDescriptionRun04.widthDefined  = false;
4937   fontDescriptionRun04.slantDefined  = false;
4938   fontDescriptionRun04.sizeDefined   = false;
4939
4940   FontDescriptionRun fontDescriptionRun05;
4941   fontDescriptionRun05.characterRun.characterIndex     = 48u;
4942   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4943   fontDescriptionRun05.familyLength                    = fontLatin.size();
4944   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
4945   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
4946   fontDescriptionRun05.familyDefined = true;
4947   fontDescriptionRun05.weightDefined = false;
4948   fontDescriptionRun05.widthDefined  = false;
4949   fontDescriptionRun05.slantDefined  = false;
4950   fontDescriptionRun05.sizeDefined   = false;
4951
4952   FontDescriptionRun fontDescriptionRun06;
4953   fontDescriptionRun06.characterRun.characterIndex     = 60u;
4954   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4955   fontDescriptionRun06.familyLength                    = fontArabic.size();
4956   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
4957   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
4958   fontDescriptionRun06.familyDefined = true;
4959   fontDescriptionRun06.weightDefined = false;
4960   fontDescriptionRun06.widthDefined  = false;
4961   fontDescriptionRun06.slantDefined  = false;
4962   fontDescriptionRun06.sizeDefined   = false;
4963
4964   Vector<FontDescriptionRun> fontDescriptionRuns;
4965   fontDescriptionRuns.PushBack(fontDescriptionRun01);
4966   fontDescriptionRuns.PushBack(fontDescriptionRun02);
4967   fontDescriptionRuns.PushBack(fontDescriptionRun03);
4968   fontDescriptionRuns.PushBack(fontDescriptionRun04);
4969   fontDescriptionRuns.PushBack(fontDescriptionRun05);
4970   fontDescriptionRuns.PushBack(fontDescriptionRun06);
4971
4972   float positions[] = {21.f, 30.f, 34.f, 0.f, 0.f, 0.f};
4973
4974   Size      textArea(100.f, 300.f);
4975   AlignData data =
4976     {
4977       "End alignment for the last paragraph.",
4978       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4979       textArea,
4980       6u,
4981       fontDescriptionRuns.Begin(),
4982       Text::HorizontalAlignment::END,
4983       Text::VerticalAlignment::TOP,
4984       0u,
4985       26u,
4986       6u,
4987       positions,
4988       Dali::LayoutDirection::LEFT_TO_RIGHT,
4989       true};
4990
4991   if(!AlignTest(data))
4992   {
4993     tet_result(TET_FAIL);
4994   }
4995
4996   tet_result(TET_PASS);
4997   END_TEST;
4998 }
4999
5000 int UtcDaliTextAlign12(void)
5001 {
5002   ToolkitTestApplication application;
5003   tet_infoline(" UtcDaliTextAlign12");
5004
5005   // Calculate text alignment.
5006
5007   const std::string fontLatin("TizenSans");
5008   const std::string fontHebrew("TizenSansHebrew");
5009   const std::string fontArabic("TizenSansArabic");
5010
5011   // Set a known font description
5012   FontDescriptionRun fontDescriptionRun01;
5013   fontDescriptionRun01.characterRun.characterIndex     = 0u;
5014   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
5015   fontDescriptionRun01.familyLength                    = fontLatin.size();
5016   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
5017   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
5018   fontDescriptionRun01.familyDefined = true;
5019   fontDescriptionRun01.weightDefined = false;
5020   fontDescriptionRun01.widthDefined  = false;
5021   fontDescriptionRun01.slantDefined  = false;
5022   fontDescriptionRun01.sizeDefined   = false;
5023
5024   FontDescriptionRun fontDescriptionRun02;
5025   fontDescriptionRun02.characterRun.characterIndex     = 12u;
5026   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
5027   fontDescriptionRun02.familyLength                    = fontHebrew.size();
5028   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
5029   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
5030   fontDescriptionRun02.familyDefined = true;
5031   fontDescriptionRun02.weightDefined = false;
5032   fontDescriptionRun02.widthDefined  = false;
5033   fontDescriptionRun02.slantDefined  = false;
5034   fontDescriptionRun02.sizeDefined   = false;
5035
5036   FontDescriptionRun fontDescriptionRun03;
5037   fontDescriptionRun03.characterRun.characterIndex     = 22u;
5038   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
5039   fontDescriptionRun03.familyLength                    = fontArabic.size();
5040   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
5041   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
5042   fontDescriptionRun03.familyDefined = true;
5043   fontDescriptionRun03.weightDefined = false;
5044   fontDescriptionRun03.widthDefined  = false;
5045   fontDescriptionRun03.slantDefined  = false;
5046   fontDescriptionRun03.sizeDefined   = false;
5047
5048   FontDescriptionRun fontDescriptionRun04;
5049   fontDescriptionRun04.characterRun.characterIndex     = 36u;
5050   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
5051   fontDescriptionRun04.familyLength                    = fontLatin.size();
5052   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
5053   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
5054   fontDescriptionRun04.familyDefined = true;
5055   fontDescriptionRun04.weightDefined = false;
5056   fontDescriptionRun04.widthDefined  = false;
5057   fontDescriptionRun04.slantDefined  = false;
5058   fontDescriptionRun04.sizeDefined   = false;
5059
5060   FontDescriptionRun fontDescriptionRun05;
5061   fontDescriptionRun05.characterRun.characterIndex     = 48u;
5062   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
5063   fontDescriptionRun05.familyLength                    = fontLatin.size();
5064   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
5065   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
5066   fontDescriptionRun05.familyDefined = true;
5067   fontDescriptionRun05.weightDefined = false;
5068   fontDescriptionRun05.widthDefined  = false;
5069   fontDescriptionRun05.slantDefined  = false;
5070   fontDescriptionRun05.sizeDefined   = false;
5071
5072   FontDescriptionRun fontDescriptionRun06;
5073   fontDescriptionRun06.characterRun.characterIndex     = 60u;
5074   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
5075   fontDescriptionRun06.familyLength                    = fontArabic.size();
5076   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
5077   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
5078   fontDescriptionRun06.familyDefined = true;
5079   fontDescriptionRun06.weightDefined = false;
5080   fontDescriptionRun06.widthDefined  = false;
5081   fontDescriptionRun06.slantDefined  = false;
5082   fontDescriptionRun06.sizeDefined   = false;
5083
5084   Vector<FontDescriptionRun> fontDescriptionRuns;
5085   fontDescriptionRuns.PushBack(fontDescriptionRun01);
5086   fontDescriptionRuns.PushBack(fontDescriptionRun02);
5087   fontDescriptionRuns.PushBack(fontDescriptionRun03);
5088   fontDescriptionRuns.PushBack(fontDescriptionRun04);
5089   fontDescriptionRuns.PushBack(fontDescriptionRun05);
5090   fontDescriptionRuns.PushBack(fontDescriptionRun06);
5091
5092   float positions[] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
5093
5094   Size      textArea(100.f, 300.f);
5095   AlignData data =
5096     {
5097       "Begin alignment for the first paragraph.",
5098       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
5099       textArea,
5100       6u,
5101       fontDescriptionRuns.Begin(),
5102       Text::HorizontalAlignment::BEGIN,
5103       Text::VerticalAlignment::TOP,
5104       48u,
5105       26u,
5106       6u,
5107       positions,
5108       Dali::LayoutDirection::LEFT_TO_RIGHT,
5109       true};
5110
5111   if(!AlignTest(data))
5112   {
5113     tet_result(TET_FAIL);
5114   }
5115
5116   tet_result(TET_PASS);
5117   END_TEST;
5118 }
5119
5120 int UtcDaliTextLayoutSetGetDefaultLineSpacing(void)
5121 {
5122   ToolkitTestApplication application;
5123   tet_infoline(" UtcDaliTextLayoutSetGetDefaultLineSpacing");
5124
5125   Layout::Engine engine;
5126   DALI_TEST_EQUALS(0.f, engine.GetDefaultLineSpacing(), Math::MACHINE_EPSILON_1000, TEST_LOCATION);
5127
5128   engine.SetDefaultLineSpacing(10.f);
5129   DALI_TEST_EQUALS(10.f, engine.GetDefaultLineSpacing(), Math::MACHINE_EPSILON_1000, TEST_LOCATION);
5130
5131   tet_result(TET_PASS);
5132   END_TEST;
5133 }
5134
5135 int UtcDaliTextLayoutGetGlyphMetrics(void)
5136 {
5137   tet_infoline(" UtcDaliTextLayoutGetGlyphMetrics");
5138
5139   // Test retrieving metrics from group of characters
5140
5141   const std::string fontFamily("TizenSansHindi");
5142
5143   // Set a known font description
5144   FontDescriptionRun fontDescriptionRun01;
5145   fontDescriptionRun01.characterRun.characterIndex     = 0u;
5146   fontDescriptionRun01.characterRun.numberOfCharacters = 2u;
5147   fontDescriptionRun01.familyLength                    = fontFamily.size();
5148   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
5149   memcpy(fontDescriptionRun01.familyName, fontFamily.c_str(), fontDescriptionRun01.familyLength);
5150   fontDescriptionRun01.familyDefined = true;
5151   fontDescriptionRun01.weightDefined = false;
5152   fontDescriptionRun01.widthDefined  = false;
5153   fontDescriptionRun01.slantDefined  = false;
5154   fontDescriptionRun01.sizeDefined   = false;
5155
5156   // Set a known font description
5157   FontDescriptionRun fontDescriptionRun02;
5158   fontDescriptionRun02.characterRun.characterIndex     = 0u;
5159   fontDescriptionRun02.characterRun.numberOfCharacters = 2u;
5160   fontDescriptionRun02.familyLength                    = fontFamily.size();
5161   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
5162   memcpy(fontDescriptionRun02.familyName, fontFamily.c_str(), fontDescriptionRun02.familyLength);
5163   fontDescriptionRun02.familyDefined = true;
5164   fontDescriptionRun02.weightDefined = false;
5165   fontDescriptionRun02.widthDefined  = false;
5166   fontDescriptionRun02.slantDefined  = false;
5167   fontDescriptionRun02.sizeDefined   = false;
5168
5169
5170   // Set a known font description
5171   FontDescriptionRun fontDescriptionRun03;
5172   fontDescriptionRun03.characterRun.characterIndex     = 0u;
5173   fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
5174   fontDescriptionRun03.familyLength                    = fontFamily.size();
5175   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
5176   memcpy(fontDescriptionRun03.familyName, fontFamily.c_str(), fontDescriptionRun03.familyLength);
5177   fontDescriptionRun03.familyDefined = true;
5178   fontDescriptionRun03.weightDefined = false;
5179   fontDescriptionRun03.widthDefined  = false;
5180   fontDescriptionRun03.slantDefined  = false;
5181   fontDescriptionRun03.sizeDefined   = false;
5182
5183
5184   Vector<FontDescriptionRun> fontDescriptionRuns01;
5185   fontDescriptionRuns01.PushBack(fontDescriptionRun01);
5186
5187   Vector<FontDescriptionRun> fontDescriptionRuns02;
5188   fontDescriptionRuns02.PushBack(fontDescriptionRun02);
5189
5190   Vector<FontDescriptionRun> fontDescriptionRuns03;
5191   fontDescriptionRuns03.PushBack(fontDescriptionRun03);
5192
5193   // Set a text area.
5194   Size textArea(100.f, 100.f);
5195
5196   // Group: second glyph doesn't exceed the width of the first glyph
5197   float positions01[] = {0.f, -11.f};
5198
5199   struct LineRun line01 =
5200     {
5201       {0u, 1u},
5202       {0u, 1u},
5203       11.f,
5204       15.f,
5205       -5.f,
5206       0.f,
5207       0.f,
5208       0.f,
5209       false,
5210       false};
5211   Vector<LineRun> lines01;
5212   lines01.PushBack(line01);
5213
5214   Size layoutSize01 = Vector2(11.f, 20.f);
5215
5216   // Group: second glyph doesn't exceed the width of the first glyph
5217   float positions02[] = {
5218     0.f,
5219     -11.f,
5220     7.f,
5221     -15.f,
5222   };
5223
5224   struct LineRun line02 =
5225     {
5226       {0u, 2u},
5227       {0u, 2u},
5228       15.f,
5229       15.f,
5230       -5.f,
5231       0.f,
5232       0.f,
5233       0.f,
5234       false,
5235       false};
5236   Vector<LineRun> lines02;
5237   lines02.PushBack(line02);
5238
5239   Size layoutSize02 = Vector2(15.f, 20.f);
5240
5241   // Group: second glyph doesn't exceed the width of the first glyph
5242   float positions03[] = {0.f, -11.f, 2.f, -15.f};
5243
5244   struct LineRun line03 =
5245     {
5246       {0u, 2u},
5247       {0u, 2u},
5248       11.f,
5249       15.f,
5250       -5.f,
5251       0.f,
5252       0.f,
5253       0.f,
5254       false,
5255       false};
5256   Vector<LineRun> lines03;
5257   lines03.PushBack(line03);
5258
5259   Size layoutSize03 = Vector2(11.f, 20.f);
5260
5261   /////////////////////////////
5262
5263   struct LayoutTextData data[] =
5264     {
5265       {"Single glyph",
5266        "प",
5267        textArea,
5268        1u,
5269        fontDescriptionRuns01.Begin(),
5270        layoutSize01,
5271        1u,
5272        positions01,
5273        1u,
5274        lines01.Begin(),
5275        Layout::Engine::SINGLE_LINE_BOX,
5276        0u,
5277        1u,
5278        false,
5279        DevelText::EllipsisPosition::END,
5280        true},
5281       {"Group: second glyph exceeds the width of the first glyph",
5282        "पो",
5283        textArea,
5284        1u,
5285        fontDescriptionRuns02.Begin(),
5286        layoutSize02,
5287        2u,
5288        positions02,
5289        1u,
5290        lines02.Begin(),
5291        Layout::Engine::SINGLE_LINE_BOX,
5292        0u,
5293        2u,
5294        false,
5295        DevelText::EllipsisPosition::END,
5296        true},
5297       {"Group: second glyph doesn't exceed the width of the first glyph",
5298        "पे",
5299        textArea,
5300        1u,
5301        fontDescriptionRuns03.Begin(),
5302        layoutSize03,
5303        2u,
5304        positions03,
5305        1u,
5306        lines03.Begin(),
5307        Layout::Engine::SINGLE_LINE_BOX,
5308        0u,
5309        2u,
5310        false,
5311        DevelText::EllipsisPosition::END,
5312        true}};
5313   const unsigned int numberOfTests = sizeof(data) / sizeof(LayoutTextData);
5314
5315   for(unsigned int index = 0u; index < numberOfTests; ++index)
5316   {
5317     ToolkitTestApplication application;
5318     if(!LayoutTextTest(data[index]))
5319     {
5320       tet_result(TET_FAIL);
5321     }
5322   }
5323
5324   tet_result(TET_PASS);
5325   END_TEST;
5326 }