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