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