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