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