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