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