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