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