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