Controls no longer have property names.
[platform/core/uifw/dali-toolkit.git] / automated-tests / dali-test-suite / text-view / utc-Dali-TextView.cpp
1 //
2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
3 //
4 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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 #include <iostream>
18
19 #include <stdlib.h>
20 #include <tet_api.h>
21
22 #include <dali/public-api/dali-core.h>
23
24 #include <dali-toolkit-test-suite-utils.h>
25
26 #include <dali-toolkit/public-api/controls/text-view/text-view.h>
27 #include <dali-toolkit/public-api/controls/alignment/alignment.h>
28
29 using namespace Dali;
30 using namespace Toolkit;
31
32 namespace
33 {
34
35 const char* const PROPERTY_TEXT = "text";
36 const char* const PROPERTY_MULTILINE_POLICY = "multiline-policy";
37 const char* const PROPERTY_WIDTH_EXCEED_POLICY = "width-exceed-policy";
38 const char* const PROPERTY_HEIGHT_EXCEED_POLICY = "height-exceed-policy";
39 const char* const PROPERTY_LINE_JUSTIFICATION = "line-justification";
40 const char* const PROPERTY_FADE_BOUNDARY_LEFT = "fade-boundary-left";
41 const char* const PROPERTY_FADE_BOUNDARY_RIGHT = "fade-boundary-right";
42 const char* const PROPERTY_FADE_BOUNDARY_TOP = "fade-boundary-top";
43 const char* const PROPERTY_FADE_BOUNDARY_BOTTOM = "fade-boundary-bottom";
44 const char* const PROPERTY_LINE_HEIGHT_OFFSET = "line-height-offset";
45 const char* const PROPERTY_HORIZONTAL_ALIGNMENT = "horizontal-alignment";
46 const char* const PROPERTY_VERTICAL_ALIGNMENT = "vertical-alignment";
47
48 bool TestEqual( float x, float y )
49 {
50   return !( fabsf( x - y ) > Math::MACHINE_EPSILON_1000 );
51 }
52
53 static bool gObjectCreatedCallBackCalled;
54 static unsigned int gNumberObjectCreated;
55
56 static void TestCallback(BaseHandle handle)
57 {
58   gObjectCreatedCallBackCalled = true;
59   ++gNumberObjectCreated;
60 }
61
62 static bool gTextScrolled;
63 static Vector2 gScrollDelta;
64 static void TestTextScrolled( TextView textView, Vector2 scrollDelta )
65 {
66   gTextScrolled = true;
67   gScrollDelta = scrollDelta;
68 }
69
70 } // namespace
71
72 static void Startup();
73 static void Cleanup();
74
75 extern "C"
76 {
77 void (*tet_startup)() = Startup;
78 void (*tet_cleanup)() = Cleanup;
79 }
80
81 enum
82 {
83   POSITIVE_TC_IDX = 0x01,
84   NEGATIVE_TC_IDX,
85 };
86
87 #define MAX_NUMBER_OF_TESTS 10000
88 extern "C" {
89   struct tet_testlist tet_testlist[MAX_NUMBER_OF_TESTS];
90 }
91
92 // Add test functionality for all APIs in the class (Positive and Negative)
93 TEST_FUNCTION( UtcDaliTextViewNew, POSITIVE_TC_IDX );
94 TEST_FUNCTION( UtcDaliTextViewSetAndGetText, POSITIVE_TC_IDX );
95 TEST_FUNCTION( UtcDaliTextViewSetStyleToCurrentText, POSITIVE_TC_IDX );
96 TEST_FUNCTION( UtcDaliTextViewSetAndGetLineHeight, POSITIVE_TC_IDX );
97 TEST_FUNCTION( UtcDaliTextViewSetAndGetFadeBoundary, POSITIVE_TC_IDX );
98 TEST_FUNCTION( UtcDaliTextViewSetAndGetEllipsizeText, POSITIVE_TC_IDX );
99 TEST_FUNCTION( UtcDaliTextViewSetAndGetWidthExceedPolicy, POSITIVE_TC_IDX );
100 TEST_FUNCTION( UtcDaliTextViewSetAndGetHeightExceedPolicy, POSITIVE_TC_IDX );
101 TEST_FUNCTION( UtcDaliTextViewTestLayoutOptions01, POSITIVE_TC_IDX );
102 TEST_FUNCTION( UtcDaliTextViewTestLayoutOptions02, POSITIVE_TC_IDX );
103 TEST_FUNCTION( UtcDaliTextViewInsertRemoveText, POSITIVE_TC_IDX );
104 TEST_FUNCTION( UtcDaliTextViewSnapshotEnable, POSITIVE_TC_IDX );
105 TEST_FUNCTION( UtcDaliTextViewScroll, POSITIVE_TC_IDX );
106 TEST_FUNCTION( UtcDaliTextViewSetProperty, POSITIVE_TC_IDX );
107 TEST_FUNCTION( UtcDaliTextViewSetSortModifier, POSITIVE_TC_IDX );
108 TEST_FUNCTION( UtcDaliTextViewUnderlineText, POSITIVE_TC_IDX );
109
110 // Called only once before first test is run.
111
112 static void Startup()
113 {
114 }
115
116 // Called only once after last test is run
117
118 static void Cleanup()
119 {
120 }
121
122 static void UtcDaliTextViewNew()
123 {
124   tet_infoline("UtcDaliTextViewNew: ");
125   ToolkitTestApplication application;
126
127   // Test default constructor.
128   TextView view;
129
130   DALI_TEST_CHECK( !view );
131
132   // Test default initialization.
133   view = TextView::New();
134
135   DALI_TEST_CHECK( view );
136
137   // Test copy constructor and asignment operator.
138   TextView viewCopy1;
139
140   viewCopy1 = view;
141
142   DALI_TEST_CHECK( viewCopy1 );
143
144   TextView viewCopy2( view );
145
146   DALI_TEST_CHECK( viewCopy2 );
147
148   // Test down cast.
149   Actor actorView;
150
151   actorView = view;
152
153   TextView downCastView = TextView::DownCast( actorView );
154
155   DALI_TEST_CHECK( downCastView );
156
157   // Test constructor with a given text.
158
159   const std::string text( "Hello world!" );
160
161   const float DESCENDER = 8.0f;
162
163   TextView view1 = TextView::New( text );
164
165   DALI_TEST_EQUALS( view1.GetText(), text, TEST_LOCATION );
166
167   MarkupProcessor::StyledTextArray styledText;
168   MarkupProcessor::GetStyledTextArray( text, styledText );
169
170   TextView view2 = TextView::New( styledText );
171
172   DALI_TEST_EQUALS( view2.GetText(), text, TEST_LOCATION );
173
174   // Check the default Toolkit::TextView::CharacterLayoutInfo::CharacterLayoutInfo() to increase coverage.
175   TextView::CharacterLayoutInfo characterLayoutInfo;
176
177   DALI_TEST_EQUALS( characterLayoutInfo.mSize, Vector2::ZERO, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
178   DALI_TEST_EQUALS( characterLayoutInfo.mPosition, Vector3::ZERO, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
179   DALI_TEST_EQUALS( characterLayoutInfo.mIsNewLineChar, false, TEST_LOCATION );
180   DALI_TEST_EQUALS( characterLayoutInfo.mIsRightToLeftCharacter, false, TEST_LOCATION );
181   DALI_TEST_EQUALS( characterLayoutInfo.mIsVisible, true, TEST_LOCATION );
182
183   TextView::CharacterLayoutInfo characterLayoutInfo2( Size( 2.f, 2.f ),
184                                                       Vector3( 3.f, 4.f, 5.f ),
185                                                       true,
186                                                       true,
187                                                       false,
188                                                       DESCENDER );
189
190   characterLayoutInfo = characterLayoutInfo2;
191
192   DALI_TEST_EQUALS( characterLayoutInfo.mSize, Size( 2.f, 2.f ), Math::MACHINE_EPSILON_1000, TEST_LOCATION );
193   DALI_TEST_EQUALS( characterLayoutInfo.mPosition, Vector3( 3.f, 4.f, 5.f ), Math::MACHINE_EPSILON_1000, TEST_LOCATION );
194   DALI_TEST_EQUALS( characterLayoutInfo.mIsNewLineChar, true, TEST_LOCATION );
195   DALI_TEST_EQUALS( characterLayoutInfo.mIsRightToLeftCharacter, true, TEST_LOCATION );
196   DALI_TEST_EQUALS( characterLayoutInfo.mIsVisible, false, TEST_LOCATION );
197   DALI_TEST_EQUALS( characterLayoutInfo.mDescender, DESCENDER , TEST_LOCATION );
198
199
200   TextView::CharacterLayoutInfo characterLayoutInfo3( characterLayoutInfo );
201
202   DALI_TEST_EQUALS( characterLayoutInfo3.mSize, Size( 2.f, 2.f ), Math::MACHINE_EPSILON_1000, TEST_LOCATION );
203   DALI_TEST_EQUALS( characterLayoutInfo3.mPosition, Vector3( 3.f, 4.f, 5.f ), Math::MACHINE_EPSILON_1000, TEST_LOCATION );
204   DALI_TEST_EQUALS( characterLayoutInfo3.mIsNewLineChar, true, TEST_LOCATION );
205   DALI_TEST_EQUALS( characterLayoutInfo3.mIsRightToLeftCharacter, true, TEST_LOCATION );
206   DALI_TEST_EQUALS( characterLayoutInfo3.mIsVisible, false, TEST_LOCATION );
207
208   // Check the default Toolkit::TextView::TextLayoutInfo::TextLayoutInfo() to increase coverage.
209
210   TextView::TextLayoutInfo textLayoutInfo;
211   DALI_TEST_EQUALS( textLayoutInfo.mCharacterLayoutInfoTable.size(), 0u, TEST_LOCATION );
212   DALI_TEST_EQUALS( textLayoutInfo.mCharacterLogicalToVisualMap.size(), 0u, TEST_LOCATION );
213   DALI_TEST_EQUALS( textLayoutInfo.mCharacterVisualToLogicalMap.size(), 0u, TEST_LOCATION );
214   DALI_TEST_EQUALS( textLayoutInfo.mTextSize, Size::ZERO, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
215   DALI_TEST_EQUALS( textLayoutInfo.mScrollOffset, Vector2::ZERO, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
216
217   textLayoutInfo.mCharacterLayoutInfoTable.push_back( characterLayoutInfo );
218   textLayoutInfo.mCharacterLogicalToVisualMap.push_back( 1 );
219   textLayoutInfo.mCharacterVisualToLogicalMap.push_back( 1 );
220   textLayoutInfo.mTextSize = Size( 10.f, 10.f );
221   textLayoutInfo.mScrollOffset = Vector2( 5.f, 5.f );
222
223   TextView::TextLayoutInfo textLayoutInfo2( textLayoutInfo );
224
225   DALI_TEST_EQUALS( textLayoutInfo2.mCharacterLayoutInfoTable.size(), 1u, TEST_LOCATION );
226   DALI_TEST_EQUALS( textLayoutInfo2.mCharacterLogicalToVisualMap.size(), 1u, TEST_LOCATION );
227   DALI_TEST_EQUALS( textLayoutInfo2.mCharacterVisualToLogicalMap.size(), 1u, TEST_LOCATION );
228   DALI_TEST_EQUALS( textLayoutInfo2.mTextSize, Size( 10.f, 10.f ), Math::MACHINE_EPSILON_1000, TEST_LOCATION );
229   DALI_TEST_EQUALS( textLayoutInfo2.mScrollOffset, Vector2( 5.f, 5.f ), Math::MACHINE_EPSILON_1000, TEST_LOCATION );
230
231   TextView::TextLayoutInfo textLayoutInfo3;
232
233   textLayoutInfo3 = textLayoutInfo2;
234
235   DALI_TEST_EQUALS( textLayoutInfo3.mCharacterLayoutInfoTable.size(), 1u, TEST_LOCATION );
236   DALI_TEST_EQUALS( textLayoutInfo3.mCharacterLogicalToVisualMap.size(), 1u, TEST_LOCATION );
237   DALI_TEST_EQUALS( textLayoutInfo3.mCharacterVisualToLogicalMap.size(), 1u, TEST_LOCATION );
238   DALI_TEST_EQUALS( textLayoutInfo3.mTextSize, Size( 10.f, 10.f ), Math::MACHINE_EPSILON_1000, TEST_LOCATION );
239   DALI_TEST_EQUALS( textLayoutInfo3.mScrollOffset, Vector2( 5.f, 5.f ), Math::MACHINE_EPSILON_1000, TEST_LOCATION );
240
241   //Additional check to ensure object is created by checking if it's registered
242   ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
243   DALI_TEST_CHECK( registry );
244
245   gObjectCreatedCallBackCalled = false;
246   registry.ObjectCreatedSignal().Connect(&TestCallback);
247   {
248     TextView view = TextView::New();
249   }
250   DALI_TEST_CHECK( gObjectCreatedCallBackCalled );
251 }
252
253 static void UtcDaliTextViewSetAndGetText()
254 {
255   tet_infoline("UtcDaliTextViewSetAndGetText: ");
256   ToolkitTestApplication application;
257
258   TextView view = TextView::New();
259   view.SetSnapshotModeEnabled( false ); // Disables offscreen rendering.
260
261   std::string str( "Text with differing aCeNdEr and dEcEnDeR" );
262
263   view.SetText( str );
264   DALI_TEST_EQUALS( view.GetText(), str, TEST_LOCATION );
265
266   MarkupProcessor::StyledTextArray styledText;
267   MarkupProcessor::GetStyledTextArray( str, styledText );
268
269   view.SetText( styledText );
270   DALI_TEST_EQUALS( view.GetText(), str, TEST_LOCATION );
271
272   // Test the number of text actor created.
273
274   ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
275   DALI_TEST_CHECK( registry );
276
277   gNumberObjectCreated = 0;
278   registry.ObjectCreatedSignal().Connect(&TestCallback);
279
280   // Following string should create three text-actors ([Hel], [lo wo] and [rld]).
281   std::string text( "Hel<font size='10'>lo wo</font>rld!\n"
282                     "\n" );
283
284   Stage::GetCurrent().Add( view );
285   view.SetText( text );
286
287   application.SendNotification();
288   application.Render();
289
290   DALI_TEST_EQUALS( 3u, gNumberObjectCreated, TEST_LOCATION );
291 }
292
293 static void UtcDaliTextViewSetStyleToCurrentText()
294 {
295   tet_infoline("UtcDaliTextViewSetStyleToCurrentText: ");
296   ToolkitTestApplication application;
297
298   TextStyle style;
299   style.SetItalics( true );
300
301   const std::string text( "앞서 농식품부 주이석 검역검사본부\n"
302                           "동물방역부장을 단장으로 하는\n"
303                           "민관합동조사단은 지난달 30일부터\n"
304                           "12일간의 현지 조사활동을 마치고\n"
305                           "11일 새벽 귀국했습니다." );
306   TextView view = TextView::New( text );
307
308   bool fail = false;
309   try
310   {
311     view.SetStyleToCurrentText( style );
312   }
313   catch( ... )
314   {
315     tet_printf( "Tet case fails\n" );
316     fail = true;
317     tet_result(TET_FAIL);
318   }
319
320   DALI_TEST_CHECK( !fail );
321 }
322
323 static void UtcDaliTextViewSetAndGetLineHeight()
324 {
325   tet_infoline("UtcDaliTextViewSetAndGetLineHeight: ");
326
327   ToolkitTestApplication application;
328
329   const float lineHeightOffset( 9.f );
330
331   TextView textView = TextView::New();
332
333   textView.SetLineHeightOffset( PointSize( lineHeightOffset ) );
334
335   DALI_TEST_EQUALS( float(textView.GetLineHeightOffset()), lineHeightOffset, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
336 }
337
338 static void UtcDaliTextViewSetAndGetFadeBoundary()
339 {
340   tet_infoline("UtcDaliTextViewSetAndGetFadeBoundary: ");
341
342   ToolkitTestApplication application;
343
344   TextView::FadeBoundary fadeBoundary( PixelSize( 0 ), PixelSize( 20 ), PixelSize( 0 ), PixelSize( 10 ) );
345
346   TextView textView = TextView::New( "Hello world!" );
347
348   textView.SetFadeBoundary( fadeBoundary );
349
350   TextView::FadeBoundary fadeBoundary2 = textView.GetFadeBoundary();
351
352   DALI_TEST_EQUALS( fadeBoundary.mLeft, fadeBoundary2.mLeft, TEST_LOCATION );
353   DALI_TEST_EQUALS( fadeBoundary.mRight, fadeBoundary2.mRight, TEST_LOCATION );
354   DALI_TEST_EQUALS( fadeBoundary.mTop, fadeBoundary2.mTop, TEST_LOCATION );
355   DALI_TEST_EQUALS( fadeBoundary.mBottom, fadeBoundary2.mBottom, TEST_LOCATION );
356 }
357
358 static void UtcDaliTextViewSetAndGetEllipsizeText()
359 {
360   tet_infoline("UtcDaliTextViewSetAndGetEllipsizeText: ");
361
362   ToolkitTestApplication application;
363
364   TextView textView = TextView::New( "Hello world!" );
365
366   textView.SetEllipsizeText( std::string( "..." ) );
367
368   DALI_TEST_EQUALS( std::string( "..." ), textView.GetEllipsizeText(), TEST_LOCATION );
369
370   Toolkit::MarkupProcessor::StyledTextArray styledTextArray;
371
372   GetStyledTextArray( std::string( "..." ), styledTextArray );
373
374   textView.SetEllipsizeText( styledTextArray );
375
376   DALI_TEST_EQUALS( std::string( "..." ), textView.GetEllipsizeText(), TEST_LOCATION );
377
378 }
379
380 static void UtcDaliTextViewSetAndGetWidthExceedPolicy()
381 {
382   tet_infoline("UtcDaliTextViewSetAndGetWidthExceedPolicy: ");
383
384   ToolkitTestApplication application;
385
386   const TextView::ExceedPolicy EXCEED_POLICIES[] = { TextView::Original, TextView::Fade, TextView::Split, TextView::ShrinkToFit };
387   const unsigned int NUM_EXCEED_POLICIES = sizeof( EXCEED_POLICIES ) / sizeof( unsigned int );
388
389   TextView textView = TextView::New( "Hello world!" );
390
391   for( unsigned int epIndex = 0; epIndex < NUM_EXCEED_POLICIES; ++epIndex )
392   {
393     textView.SetWidthExceedPolicy( EXCEED_POLICIES[epIndex] );
394
395     DALI_TEST_EQUALS( textView.GetWidthExceedPolicy(), EXCEED_POLICIES[epIndex], TEST_LOCATION );
396   }
397 }
398
399 static void UtcDaliTextViewSetAndGetHeightExceedPolicy()
400 {
401   tet_infoline("UtcDaliTextViewSetAndGetHeightExceedPolicy: ");
402
403   ToolkitTestApplication application;
404
405   const TextView::ExceedPolicy EXCEED_POLICIES[] = { TextView::Original, TextView::Fade, TextView::ShrinkToFit };
406   const unsigned int NUM_EXCEED_POLICIES = sizeof( EXCEED_POLICIES ) / sizeof( unsigned int );
407
408   TextView textView = TextView::New( "Hello world!" );
409
410   for( unsigned int epIndex = 0; epIndex < NUM_EXCEED_POLICIES; ++epIndex )
411   {
412     textView.SetHeightExceedPolicy( EXCEED_POLICIES[epIndex] );
413
414     DALI_TEST_EQUALS( textView.GetHeightExceedPolicy(), EXCEED_POLICIES[epIndex], TEST_LOCATION );
415   }
416 }
417
418 static void UtcDaliTextViewTestLayoutOptions01()
419 {
420   tet_infoline("UtcDaliTextViewTestLayoutOptions01: ");
421
422   ToolkitTestApplication application;
423
424   const std::string text( "앞서 농식품부 주이석 검역검사본부\n"
425                           "동물방역부장을 단장으로 하는\n"
426                           "민관합동조사단은 지난달 30일부터\n"
427                           "12일간의 현지 조사활동을 마치고\n"
428                           "11일 새벽 귀국했습니다." );
429
430   const TextView::MultilinePolicy MULTILINE_POLICIES[] = { TextView::SplitByNewLineChar, TextView::SplitByWord, TextView::SplitByChar };
431   const TextView::ExceedPolicy EXCEED_WIDTH_POLICIES[] = { TextView::Original, TextView::Fade, TextView::Split, TextView::ShrinkToFit, TextView::EllipsizeEnd };
432   const TextView::ExceedPolicy EXCEED_HEIGHT_POLICIES[] = { TextView::Original, TextView::Fade, TextView::ShrinkToFit };
433   const Alignment::Type TEXT_ALIGNMENT[] = { static_cast<Alignment::Type>( Alignment::HorizontalLeft | Alignment::VerticalTop ),
434                                              static_cast<Alignment::Type>( Alignment::HorizontalLeft | Alignment::VerticalCenter ),
435                                              static_cast<Alignment::Type>( Alignment::HorizontalLeft | Alignment::VerticalBottom ),
436                                              static_cast<Alignment::Type>( Alignment::HorizontalCenter | Alignment::VerticalTop ),
437                                              static_cast<Alignment::Type>( Alignment::HorizontalCenter | Alignment::VerticalCenter ),
438                                              static_cast<Alignment::Type>( Alignment::HorizontalCenter | Alignment::VerticalBottom ),
439                                              static_cast<Alignment::Type>( Alignment::HorizontalRight | Alignment::VerticalTop ),
440                                              static_cast<Alignment::Type>( Alignment::HorizontalRight | Alignment::VerticalCenter ),
441                                              static_cast<Alignment::Type>( Alignment::HorizontalRight | Alignment::VerticalBottom ) };
442   const TextView::LineJustification LINE_JUSTIFICATION[] = { TextView::Left, TextView::Center, TextView::Right, TextView::Justified };
443
444   const unsigned int NUM_MULTILINE_POLICIES = sizeof( MULTILINE_POLICIES ) / sizeof( unsigned int );
445   const unsigned int NUM_WIDTH_EXCEED_POLICIES = sizeof( EXCEED_WIDTH_POLICIES ) / sizeof( unsigned int );
446   const unsigned int NUM_HEIGHT_EXCEED_POLICIES = sizeof( EXCEED_HEIGHT_POLICIES ) / sizeof( unsigned int );
447   const unsigned int NUM_TEXT_ALIGNMENT = sizeof( TEXT_ALIGNMENT ) / sizeof( unsigned int );
448   const unsigned int NUM_LINE_JUSTIFICATION = sizeof( LINE_JUSTIFICATION ) / sizeof( unsigned int );
449
450   TextView textView = TextView::New( text );
451   textView.SetSnapshotModeEnabled( false ); // Disables offscreen rendering.
452
453   Stage::GetCurrent().Add( textView );
454
455   TextView::TextLayoutInfo textLayoutInfo;
456
457   for( unsigned int mlpIndex = 0; mlpIndex < NUM_MULTILINE_POLICIES; ++mlpIndex )
458   {
459     textView.SetMultilinePolicy( MULTILINE_POLICIES[mlpIndex] );
460     for( unsigned int ewpIndex = 0; ewpIndex < NUM_WIDTH_EXCEED_POLICIES; ++ewpIndex )
461     {
462       textView.SetWidthExceedPolicy( EXCEED_WIDTH_POLICIES[ewpIndex] );
463       for( unsigned int ehpIndex = 0; ehpIndex < NUM_HEIGHT_EXCEED_POLICIES; ++ehpIndex )
464       {
465         textView.SetHeightExceedPolicy( EXCEED_HEIGHT_POLICIES[ehpIndex] );
466         for( unsigned int taIndex = 0; taIndex < NUM_TEXT_ALIGNMENT; ++taIndex )
467         {
468           textView.SetTextAlignment( TEXT_ALIGNMENT[taIndex] );
469           for( unsigned int ljIndex = 0; ljIndex < NUM_LINE_JUSTIFICATION; ++ljIndex )
470           {
471             textView.SetLineJustification( LINE_JUSTIFICATION[ljIndex] );
472
473             try
474             {
475               textView.GetTextLayoutInfo( textLayoutInfo );
476
477               application.SendNotification();
478               application.Render();
479             }
480             catch( Dali::DaliException& e )
481             {
482               DALI_TEST_EQUALS( e.mCondition, "!\"TextView::CombineExceedPolicies() Invalid width and height exceed policies combination\"", TEST_LOCATION );
483             }
484             catch( ... )
485             {
486               tet_printf( "Tet case fails\n" );
487               tet_printf( "      MultilinePolicy : %d\n", MULTILINE_POLICIES[mlpIndex] );
488               tet_printf( "   Width ExceedPolicy : %d\n", EXCEED_WIDTH_POLICIES[ewpIndex] );
489               tet_printf( "  Height ExceedPolicy : %d\n", EXCEED_HEIGHT_POLICIES[ehpIndex] );
490               tet_printf( "        TextAlignment : %d\n", TEXT_ALIGNMENT[taIndex] );
491               tet_printf( "    LineJustification : %d\n", LINE_JUSTIFICATION[ljIndex] );
492               tet_result(TET_FAIL);
493             }
494
495             DALI_TEST_CHECK( LINE_JUSTIFICATION[ljIndex] == textView.GetLineJustification() );
496           }
497           DALI_TEST_CHECK( TEXT_ALIGNMENT[taIndex] == textView.GetTextAlignment() );
498         }
499         DALI_TEST_CHECK( EXCEED_HEIGHT_POLICIES[ehpIndex] == textView.GetHeightExceedPolicy() );
500       }
501       DALI_TEST_CHECK( EXCEED_WIDTH_POLICIES[ewpIndex] == textView.GetWidthExceedPolicy() );
502     }
503     DALI_TEST_CHECK( MULTILINE_POLICIES[mlpIndex] == textView.GetMultilinePolicy() );
504   }
505 }
506
507 static void UtcDaliTextViewTestLayoutOptions02()
508 {
509   tet_infoline("UtcDaliTextViewTestLayoutOptions02: ");
510   ToolkitTestApplication application;
511
512   // Check some configurations.
513
514   TextView textView = TextView::New();
515   textView.SetSnapshotModeEnabled( false ); // Disables offscreen rendering.
516
517   Stage::GetCurrent().Add( textView );
518
519   // SplitByWord and ShrinkToFit.
520   // Centered alignment.
521   // Centered justification.
522   // Don't create a text actor per character.
523
524   textView.SetMultilinePolicy( TextView::SplitByWord );
525   textView.SetWidthExceedPolicy( TextView::ShrinkToFit );
526   textView.SetHeightExceedPolicy( TextView::ShrinkToFit );
527   textView.SetTextAlignment( static_cast<Alignment::Type>( Alignment::HorizontalCenter | Alignment::VerticalTop ) );
528   textView.SetLineJustification( TextView::Center );
529   textView.SetSize( 136.56252f, 100.f );
530
531   textView.SetText( "Hel<font color='green'>lo wo</font>rld!" );
532
533   application.SendNotification();
534   application.Render();
535
536   std::vector<Size> sizes;
537   sizes.push_back( Size( 34.14063f, 11.380210f ) );              //
538   sizes.push_back( Size( 56.90105f, 11.380210f ) );              //
539   sizes.push_back( Size( 45.52084f, 11.380210f ) );              // By default characters have width and height values of 11.380210.
540                                                                  // The result should be a line with the text 'Hello world' as shown below.
541   std::vector<Vector3> positions;                                //  ____________
542   positions.push_back( Vector3( 0.000008f, 11.380209f, 0.f ) );  // |Hello world!|
543   positions.push_back( Vector3( 34.14063f, 11.380209f, 0.f ) );  //  ------------
544   positions.push_back( Vector3( 91.04168f, 11.380209f, 0.f ) );  //
545
546   DALI_TEST_CHECK( positions.size() == textView.GetChildCount() ); // Check text has two text-actors.
547
548   for( std::size_t index = 0, num = textView.GetChildCount(); index < num; ++index )
549   {
550     const Vector3& size = textView.GetChildAt(index).GetCurrentSize();
551     const Vector3& position = textView.GetChildAt(index).GetCurrentPosition();
552
553     DALI_TEST_EQUALS( size.width, sizes[index].width, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
554     DALI_TEST_EQUALS( size.height, sizes[index].height, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
555     DALI_TEST_EQUALS( position.width, positions[index].width, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
556     DALI_TEST_EQUALS( position.height, positions[index].height, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
557   }
558
559   textView.SetSize( 50.f, 50.f );
560   textView.SetTextAlignment( static_cast<Alignment::Type>( Alignment::HorizontalCenter | Alignment::VerticalCenter ) );
561   textView.SetSizePolicy( Toolkit::Control::Fixed, Toolkit::Control::Fixed );
562   textView.SetLineJustification( Toolkit::TextView::Left );
563
564   application.SendNotification();
565   application.Render();
566
567   sizes.clear();
568   sizes.push_back( Size( 24.999999f, 8.333333f ) );              //
569   sizes.push_back( Size( 24.999999f, 8.333333f ) );              //
570   sizes.push_back( Size( 16.666666f, 8.333333f ) );              // Longest word is 'world!' (6 characters x 11.380210) which doesn't fit in the 50x50 box.
571   sizes.push_back( Size( 33.333332f, 8.333333f ) );              // The scale factor is 0.732265339, so the character size is 8.333333.
572                                                                  // Text should be split in two lines, centered in the vertical dimension and fitted in the horizontal one.
573   positions.clear();                                             // As shown below, the text is two lines and centered in the vertical dimension and
574   positions.push_back( Vector3(  0.000008f, 25.223114f, 0.f ) ); // it should start in middle height (~25).
575   positions.push_back( Vector3( 24.999999f, 25.223114f, 0.f ) ); //   ______
576   positions.push_back( Vector3(  0.000006f, 33.556446f, 0.f ) ); //  |      |
577   positions.push_back( Vector3( 16.666666f, 33.556446f, 0.f ) ); //  |Hello |
578                                                                  //  |world!|
579                                                                  //  |______|
580                                                                  //
581
582   DALI_TEST_CHECK( positions.size() == textView.GetChildCount() ); // Check text has two text-actors.
583
584   for( std::size_t index = 0, num = textView.GetChildCount(); index < num; ++index )
585   {
586     const Vector3& size = textView.GetChildAt(index).GetCurrentSize();
587     const Vector3& position = textView.GetChildAt(index).GetCurrentPosition();
588
589     DALI_TEST_EQUALS( size.width, sizes[index].width, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
590     DALI_TEST_EQUALS( size.height, sizes[index].height, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
591     DALI_TEST_EQUALS( position.width, positions[index].width, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
592     DALI_TEST_EQUALS( position.height, positions[index].height, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
593   }
594
595   // TODO: Add more tests when TextView implementation is finished.
596 }
597
598 static void UtcDaliTextViewInsertRemoveText()
599 {
600   tet_infoline("UtcDaliTextViewInsertRemoveText: ");
601   ToolkitTestApplication application;
602
603   std::string text("Hello ");
604
605   MarkupProcessor::StyledTextArray styledText;
606   MarkupProcessor::GetStyledTextArray( text, styledText );
607
608   TextView view = TextView::New( "world!" );
609
610   view.InsertTextAt( 0, styledText );
611
612   DALI_TEST_EQUALS( view.GetText(), std::string("Hello world!"), TEST_LOCATION );
613
614   view.RemoveTextFrom( 4, 5 );
615
616   DALI_TEST_EQUALS( view.GetText(), std::string("Hellld!"), TEST_LOCATION );
617
618   view.InsertTextAt( 0, "Hello " );
619
620   DALI_TEST_EQUALS( view.GetText(), std::string("Hello Hellld!"), TEST_LOCATION );
621
622
623   view.InsertTextAt( 0, "Hello " );
624   view.InsertTextAt( 0, "Hello " );
625   view.InsertTextAt( 0, "Hello " );
626   view.InsertTextAt( 0, "Hello " );
627   view.RemoveTextFrom( 4, 2 );
628   view.RemoveTextFrom( 4, 2 );
629   view.RemoveTextFrom( 4, 2 );
630   view.RemoveTextFrom( 4, 2 );
631   view.RemoveTextFrom( 4, 2 );
632   view.SetText( "Hello world!" );
633
634   DALI_TEST_EQUALS( view.GetText(), std::string("Hello world!"), TEST_LOCATION );
635
636   view.ReplaceTextFromTo( 5, 1, "" );
637
638   DALI_TEST_EQUALS( view.GetText(), std::string("Helloworld!"), TEST_LOCATION );
639
640   view.ReplaceTextFromTo( 0, 11, styledText );
641
642   DALI_TEST_EQUALS( view.GetText(), std::string("Hello "), TEST_LOCATION );
643 }
644
645 static void UtcDaliTextViewSnapshotEnable()
646 {
647   tet_infoline("UtcDaliTextViewSnapshotEnable: ");
648   ToolkitTestApplication application;
649
650   // Avoids the frame buffer texture to throw an exception.
651   application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
652
653   TextView view = TextView::New( "Hel<font color='green'>lo world!</font> This <font color='green'>is</font> a sna<font color='green'>psho</font>t test." );
654
655   Stage::GetCurrent().Add( view );
656
657   view.SetSnapshotModeEnabled( true );  // VCC. By default the snapshot mode should be enabled but it has been temporary disabled.
658                                         // This line should be removed when text-view is set to use the snapshot mode by default.
659
660   // Snapshot is enabled by default.
661   DALI_TEST_CHECK( view.IsSnapshotModeEnabled() );
662
663   application.SendNotification();
664   application.Render();
665
666   // TextView should have only two actors:
667   // the root (Actor) and the image (ImageActor).
668
669   DALI_TEST_EQUALS( view.GetChildCount(), 2u, TEST_LOCATION );
670
671   view.SetSnapshotModeEnabled( false );
672   DALI_TEST_CHECK( !view.IsSnapshotModeEnabled() );
673
674   application.SendNotification();
675   application.Render();
676
677   // TextView should have one text-actor per word.
678
679   DALI_TEST_EQUALS( view.GetChildCount(), 7u, TEST_LOCATION );
680 }
681
682 static void UtcDaliTextViewScroll()
683 {
684   tet_infoline("UtcDaliTextViewScroll: ");
685   ToolkitTestApplication application;
686
687   // Avoids the frame buffer texture to throw an exception.
688   application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
689
690   TextView view = TextView::New( "Hello world! This is a scroll test." );
691   view.SetSize( 100.f, 100.f );
692   view.SetSnapshotModeEnabled( false );
693
694   Stage::GetCurrent().Add( view );
695
696   application.SendNotification();
697   application.Render();
698
699   DALI_TEST_CHECK( !view.IsScrollEnabled() ); // Scroll should be disabled by default.
700
701   view.SetScrollEnabled( true );
702   view.ScrolledSignal().Connect( &TestTextScrolled );
703
704   DALI_TEST_CHECK( view.IsScrollEnabled() );
705   DALI_TEST_CHECK( view.IsSnapshotModeEnabled() ); // Scroll should enable snapshot mode.
706
707   gTextScrolled = false;
708   gScrollDelta = Vector2::ZERO;
709   view.SetScrollPosition( Vector2( 400.f, 400.f ) );
710
711   application.SendNotification();
712   application.Render();
713
714   const Vector2& scrollPosition = view.GetScrollPosition();
715   DALI_TEST_EQUALS( scrollPosition, Vector2( 149.153656f, 0.f ), Math::MACHINE_EPSILON_1000, TEST_LOCATION );
716
717   DALI_TEST_CHECK( gTextScrolled );
718   DALI_TEST_EQUALS( gScrollDelta, Vector2( 149.153656f, 0.f ), Math::MACHINE_EPSILON_1000, TEST_LOCATION );
719
720   DALI_TEST_CHECK( view.IsScrollPositionTrimmed() );
721 }
722
723 static void UtcDaliTextViewSetProperty()
724 {
725   tet_infoline("UtcDaliTextViewSetAndGetText: ");
726   ToolkitTestApplication application;
727
728   TextView view = TextView::New( "Hello world!" );
729   Stage::GetCurrent().Add( view );
730
731   //Test multiline policy property
732   view.SetProperty(view.GetPropertyIndex(PROPERTY_MULTILINE_POLICY), "SplitByNewLineChar");
733   DALI_TEST_CHECK( Toolkit::TextView::SplitByNewLineChar == view.GetMultilinePolicy() );
734
735   view.SetProperty(view.GetPropertyIndex(PROPERTY_MULTILINE_POLICY), "SplitByWord");
736   DALI_TEST_CHECK( Toolkit::TextView::SplitByWord == view.GetMultilinePolicy() );
737
738   view.SetProperty(view.GetPropertyIndex(PROPERTY_MULTILINE_POLICY), "SplitByChar");
739   DALI_TEST_CHECK( Toolkit::TextView::SplitByChar == view.GetMultilinePolicy() );
740
741   //Test width exceed policy property
742   view.SetProperty(view.GetPropertyIndex(PROPERTY_WIDTH_EXCEED_POLICY), "Original");
743   view.SetProperty(view.GetPropertyIndex(PROPERTY_HEIGHT_EXCEED_POLICY), "Original");
744   DALI_TEST_CHECK( Toolkit::TextView::Original == view.GetWidthExceedPolicy() );
745   DALI_TEST_CHECK( Toolkit::TextView::Original == view.GetHeightExceedPolicy() );
746
747   view.SetProperty(view.GetPropertyIndex(PROPERTY_WIDTH_EXCEED_POLICY), "Fade");
748   view.SetProperty(view.GetPropertyIndex(PROPERTY_HEIGHT_EXCEED_POLICY), "Fade");
749   DALI_TEST_CHECK( Toolkit::TextView::Fade == view.GetWidthExceedPolicy() );
750   DALI_TEST_CHECK( Toolkit::TextView::Fade == view.GetHeightExceedPolicy() );
751
752   view.SetProperty(view.GetPropertyIndex(PROPERTY_WIDTH_EXCEED_POLICY), "ShrinkToFit");
753   view.SetProperty(view.GetPropertyIndex(PROPERTY_HEIGHT_EXCEED_POLICY), "ShrinkToFit");
754   DALI_TEST_CHECK( Toolkit::TextView::ShrinkToFit == view.GetWidthExceedPolicy() );
755   DALI_TEST_CHECK( Toolkit::TextView::ShrinkToFit == view.GetHeightExceedPolicy() );
756
757   //Test line justification property
758   view.SetProperty(view.GetPropertyIndex(PROPERTY_LINE_JUSTIFICATION), "Left");
759   DALI_TEST_CHECK( Toolkit::TextView::Left == view.GetLineJustification() );
760
761   view.SetProperty(view.GetPropertyIndex(PROPERTY_LINE_JUSTIFICATION), "Center");
762   DALI_TEST_CHECK( Toolkit::TextView::Center == view.GetLineJustification() );
763
764   view.SetProperty(view.GetPropertyIndex(PROPERTY_LINE_JUSTIFICATION), "Right");
765   DALI_TEST_CHECK( Toolkit::TextView::Right == view.GetLineJustification() );
766
767   view.SetProperty(view.GetPropertyIndex(PROPERTY_LINE_JUSTIFICATION), "Justified");
768   DALI_TEST_CHECK( Toolkit::TextView::Justified == view.GetLineJustification() );
769
770   //Test fade boundary property
771   unsigned int testValue = 23;
772   PixelSize leftFadeBoundary(testValue);
773   view.SetProperty(view.GetPropertyIndex(PROPERTY_FADE_BOUNDARY_LEFT), testValue);
774   DALI_TEST_CHECK( leftFadeBoundary == view.GetFadeBoundary().mLeft );
775
776   testValue = 26;
777   PixelSize rightFadeBoundary(testValue);
778   view.SetProperty(view.GetPropertyIndex(PROPERTY_FADE_BOUNDARY_RIGHT), testValue);
779   DALI_TEST_CHECK( rightFadeBoundary == view.GetFadeBoundary().mRight );
780
781   testValue = 2;
782   PixelSize topFadeBoundary(testValue);
783   view.SetProperty(view.GetPropertyIndex(PROPERTY_FADE_BOUNDARY_TOP), testValue);
784   DALI_TEST_CHECK( topFadeBoundary == view.GetFadeBoundary().mTop );
785
786   testValue = 11;
787   PixelSize bottomFadeBoundary(testValue);
788   view.SetProperty(view.GetPropertyIndex(PROPERTY_FADE_BOUNDARY_BOTTOM), testValue);
789   DALI_TEST_CHECK( bottomFadeBoundary == view.GetFadeBoundary().mBottom );
790
791   //Test Line height offset property
792   float testOffsetValue = 14.04f;
793   view.SetProperty(view.GetPropertyIndex(PROPERTY_LINE_HEIGHT_OFFSET), testOffsetValue);
794   DALI_TEST_CHECK( PointSize(testOffsetValue) == view.GetLineHeightOffset() );
795
796   //Test alignment property
797   view.SetProperty(view.GetPropertyIndex(PROPERTY_HORIZONTAL_ALIGNMENT), "HorizontalLeft");
798   view.SetProperty(view.GetPropertyIndex(PROPERTY_VERTICAL_ALIGNMENT), "VerticalTop");
799   DALI_TEST_CHECK( (Toolkit::Alignment::HorizontalLeft | Toolkit::Alignment::VerticalTop) == view.GetTextAlignment() );
800 }
801
802 static void UtcDaliTextViewSetSortModifier()
803 {
804   tet_infoline("UtcDaliTextViewSetAndGetText: ");
805   ToolkitTestApplication application;
806
807   TextView view = TextView::New( "Hello world!" );
808   Stage::GetCurrent().Add( view );
809
810   view.SetSortModifier( 10.f );
811   view.SetSnapshotModeEnabled( false );
812
813   application.SendNotification();
814   application.Render();
815
816   DALI_TEST_EQUALS( RenderableActor::DownCast(view.GetChildAt(0)).GetSortModifier(), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
817 }
818
819 static void UtcDaliTextViewUnderlineText()
820 {
821   std::cout << "##############################" << std::endl;
822
823   tet_infoline("UtcDaliTextViewUnderlineText: ");
824   ToolkitTestApplication application;
825
826   TextView textView = TextView::New( "<u><font size='10'>gg<font size='14'>gg<font size='18'>gg<font size='22'>gg</font>gg</font>gg</font>gg</font></u>" );
827   textView.SetSnapshotModeEnabled( false );
828
829   textView.SetSize( 150.f, 100.f );
830
831   Stage::GetCurrent().Add( textView );
832
833   application.SendNotification();
834   application.Render();
835
836   std::vector<float> positions;
837   positions.push_back( 6.448784f );
838   positions.push_back( 9.862847f );
839   positions.push_back( 13.276909f );
840   positions.push_back( 16.690973f );
841   positions.push_back( 13.276909f );
842   positions.push_back( 9.862847f );
843   positions.push_back( 6.448784f );
844
845   for( std::size_t index = 0, num = textView.GetChildCount(); index < num; ++index )
846   {
847     TextStyle style = TextActor::DownCast( textView.GetChildAt(index) ).GetTextStyle();
848
849     DALI_TEST_EQUALS( 4.17274f, style.GetUnderlineThickness(), Math::MACHINE_EPSILON_1000, TEST_LOCATION );
850     DALI_TEST_EQUALS( positions[index], style.GetUnderlinePosition(), Math::MACHINE_EPSILON_1000, TEST_LOCATION );
851   }
852 }