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