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