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