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