Merge "(Automated Tests) All tests passing on Ubuntu 16.04" into devel/master
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-Text-Controller.cpp
1 /*
2  * Copyright (c) 2019 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 #include <iostream>
19
20 #include <stdlib.h>
21 #include <limits>
22
23 #include <dali-toolkit-test-suite-utils.h>
24 #include <dali-toolkit/dali-toolkit.h>
25 #include <toolkit-text-utils.h>
26 #include <dali-toolkit/internal/text/text-controller.h>
27 #include <dali-toolkit/internal/text/text-control-interface.h>
28 #include <dali-toolkit/internal/text/text-editable-control-interface.h>
29 #include <dali-toolkit/internal/text/text-controller-impl.h>
30
31 using namespace Dali;
32 using namespace Toolkit;
33 using namespace Text;
34
35 namespace
36 {
37
38 const char* const OPTION_SELECT_ALL("option-select_all");   // "Select All" popup option.
39 const char* const OPTION_CUT("optionCut");                  // "Cut" popup option.
40 const char* const OPTION_COPY("optionCopy");                // "Copy" popup option.
41 const char* const OPTION_PASTE("optionPaste");              // "Paste" popup option.
42 const char* const OPTION_CLIPBOARD("optionClipboard");      // "Clipboard" popup option.
43
44 const Size CONTROL_SIZE( 300.f, 60.f );
45
46 std::string gClipboardText;
47 void ContentSelectedCallback( ClipboardEventNotifier& notifier )
48 {
49   gClipboardText = notifier.GetContent();
50 }
51
52 } // namespace
53
54 int UtcDaliTextController(void)
55 {
56   tet_infoline(" UtcDaliTextController");
57   ToolkitTestApplication application;
58
59   // Creates a text controller.
60   ControllerPtr controller = Controller::New();
61   DALI_TEST_CHECK( controller );
62
63   tet_result(TET_PASS);
64   END_TEST;
65 }
66
67 int UtcDaliTextControllerSetGetScrollEnabled(void)
68 {
69   tet_infoline(" UtcDaliTextControllerSetGetScrollEnabled");
70   ToolkitTestApplication application;
71
72   // Creates a text controller.
73   ControllerPtr controller = Controller::New();
74   DALI_TEST_CHECK( controller );
75
76   // Configures the text controller similarly to the text-editor.
77   ConfigureTextEditor( controller );
78
79   DALI_TEST_CHECK( !controller->IsHorizontalScrollEnabled() );
80   DALI_TEST_CHECK( controller->IsVerticalScrollEnabled() );
81
82   // Configures the text controller similarly to the text-field.
83   ConfigureTextField( controller );
84
85   DALI_TEST_CHECK( controller->IsHorizontalScrollEnabled() );
86   DALI_TEST_CHECK( !controller->IsVerticalScrollEnabled() );
87
88   // Configures the text controller similarly to the text-label.
89   ConfigureTextLabel( controller );
90
91   DALI_TEST_CHECK( !controller->IsHorizontalScrollEnabled() );
92   DALI_TEST_CHECK( !controller->IsVerticalScrollEnabled() );
93
94   tet_result(TET_PASS);
95   END_TEST;
96 }
97
98 int UtcDaliTextControllerSetIsTextElide(void)
99 {
100   tet_infoline(" UtcDaliTextControllerSetIsTextElide");
101   ToolkitTestApplication application;
102
103   // Creates a text controller.
104   ControllerPtr controller = Controller::New();
105   DALI_TEST_CHECK( controller );
106
107   // Configures the text controller similarly to the text-editor.
108   ConfigureTextEditor( controller );
109   DALI_TEST_EQUALS( false, controller->IsTextElideEnabled(), TEST_LOCATION );
110
111   controller->SetTextElideEnabled( true );
112   DALI_TEST_EQUALS( true, controller->IsTextElideEnabled(), TEST_LOCATION );
113
114   // Configures the text controller similarly to the text-field.
115   ConfigureTextField( controller );
116   DALI_TEST_EQUALS( false, controller->IsTextElideEnabled(), TEST_LOCATION );
117
118   controller->SetTextElideEnabled( true );
119   DALI_TEST_EQUALS( true, controller->IsTextElideEnabled(), TEST_LOCATION );
120
121   // Configures the text controller similarly to the text-label.
122   ConfigureTextLabel( controller );
123   DALI_TEST_EQUALS( true, controller->IsTextElideEnabled(), TEST_LOCATION );
124
125   controller->SetTextElideEnabled( false );
126   DALI_TEST_EQUALS( false, controller->IsTextElideEnabled(), TEST_LOCATION );
127
128   tet_result(TET_PASS);
129   END_TEST;
130 }
131
132 int UtcDaliTextControllerEnableCursorBlinking(void)
133 {
134   tet_infoline(" UtcDaliTextControllerEnableCursorBlinking");
135   ToolkitTestApplication application;
136
137   // Creates a text controller.
138   ControllerPtr controller = Controller::New();
139   DALI_TEST_CHECK( controller );
140
141   // There is no text input enabled.
142   DALI_TEST_CHECK( !controller->GetEnableCursorBlink() );
143
144   // Enable the text input.
145   // Creates a decorator.
146   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
147                                                        *controller );
148   InputMethodContext inputMethodContext = InputMethodContext::New();
149   // Enables the text input.
150   controller->EnableTextInput( decorator, inputMethodContext );
151
152   // Enables the cursor blink.
153   controller->SetEnableCursorBlink( true );
154
155   DALI_TEST_CHECK( controller->GetEnableCursorBlink() );
156
157   // Disables the cursor blink.
158   controller->SetEnableCursorBlink( false );
159
160   DALI_TEST_CHECK( !controller->GetEnableCursorBlink() );
161
162   tet_result(TET_PASS);
163   END_TEST;
164 }
165
166 int UtcDaliTextControllerImfEvent(void)
167 {
168   tet_infoline(" UtcDaliTextController");
169   ToolkitTestApplication application;
170
171   // Creates a text controller.
172   ControllerPtr controller = Controller::New();
173
174   std::string text;
175   InputMethodContext::EventData imfEvent;
176
177   DALI_TEST_CHECK( controller );
178
179   // Enable the text input.
180   // Creates a decorator.
181   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
182                                                        *controller );
183
184   InputMethodContext inputMethodContext = InputMethodContext::New();
185   // Enables the text input.
186   controller->EnableTextInput( decorator, inputMethodContext );
187
188   // Set the placeholder text.
189   controller->SetPlaceholderText( Controller::PLACEHOLDER_TYPE_INACTIVE, "Hello Dali" );
190
191   // For coverage.
192   imfEvent = InputMethodContext::EventData( InputMethodContext::GET_SURROUNDING, "", 0, 0 );
193   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
194
195   // Send VOID event.
196   imfEvent = InputMethodContext::EventData( InputMethodContext::VOID, "", 0, 0 );
197   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
198
199   controller->GetText( text );
200   DALI_TEST_CHECK( text.empty() );
201
202   imfEvent = InputMethodContext::EventData( InputMethodContext::COMMIT, "Hello ", 0, 6 );
203   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
204   controller->GetNaturalSize();
205
206   // Check 'Delete All' key which means the input panel send a big range
207   imfEvent = InputMethodContext::EventData( InputMethodContext::DELETE_SURROUNDING, "", -100, 100 );
208   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
209   controller->GetNaturalSize();
210
211   controller->GetText( text );
212   DALI_TEST_EQUALS( "", text, TEST_LOCATION );
213
214   // Send COMMIT event.
215   imfEvent = InputMethodContext::EventData( InputMethodContext::COMMIT, "Hello ", 0, 6 );
216   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
217
218   // Force to update the model.
219   controller->GetNaturalSize();
220
221   controller->GetText( text );
222   DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
223
224   // Send PRE_EDIT event
225   imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
226   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
227
228   // Force to update the model.
229   controller->GetNaturalSize();
230
231   controller->GetText( text );
232   DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
233
234   // Send DELETE_SURROUNDING event
235   imfEvent = InputMethodContext::EventData( InputMethodContext::DELETE_SURROUNDING, "", -1, 1 );
236   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
237
238   // Force to update the model.
239   controller->GetNaturalSize();
240
241   controller->GetText( text );
242   DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
243
244   // Send PRE_EDIT event
245   imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "wo", 6, 2 );
246   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
247
248   // Force to update the model.
249   controller->GetNaturalSize();
250
251   controller->GetText( text );
252   DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
253
254   // Send GET_SURROUNDING event
255   imfEvent = InputMethodContext::EventData( InputMethodContext::GET_SURROUNDING, "", 0, 0 );
256   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
257
258   controller->GetText( text );
259   DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
260
261   // Send PRIVATE_COMMAND event
262   imfEvent = InputMethodContext::EventData( InputMethodContext::PRIVATE_COMMAND, "", 0, 0 );
263   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
264
265   controller->GetText( text );
266   DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
267
268   tet_result(TET_PASS);
269   END_TEST;
270 }
271
272 int UtcDaliTextControllerTextPopupButtonTouched(void)
273 {
274   tet_infoline(" UtcDaliTextControllerTextPopupButtonTouched");
275   ToolkitTestApplication application;
276
277   // Creates a text controller.
278   ControllerPtr controller = Controller::New();
279
280   DALI_TEST_CHECK( controller );
281
282   std::string text;
283   PushButton button;
284   Property::Map attributes;
285
286   // Enable the text input.
287   // Creates a decorator.
288   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
289                                                        *controller );
290
291   InputMethodContext inputMethodContext = InputMethodContext::New();
292   // Enables the text input.
293   controller->EnableTextInput( decorator, inputMethodContext );
294
295   // Creates the text's popup.
296   TextSelectionPopupCallbackInterface& callbackInterface = *controller;
297   TextSelectionPopup textPopup = TextSelectionPopup::New( &callbackInterface );
298
299   Toolkit::TextSelectionPopup::Buttons buttonsToEnable = static_cast<Toolkit::TextSelectionPopup::Buttons>( TextSelectionPopup::CUT        |
300                                                                                                             TextSelectionPopup::COPY       |
301                                                                                                             TextSelectionPopup::PASTE      |
302                                                                                                             TextSelectionPopup::SELECT     |
303                                                                                                             TextSelectionPopup::SELECT_ALL |
304                                                                                                             TextSelectionPopup::CLIPBOARD );
305
306   textPopup.EnableButtons( buttonsToEnable );
307   Stage::GetCurrent().Add( textPopup );
308   textPopup.ShowPopup();
309
310   // Render and notify
311   application.SendNotification();
312   application.Render();
313
314   // Sets some text.
315   controller->SetText( "Hello world" );
316
317   // Select the whole text.
318   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
319   DALI_TEST_CHECK( button );
320
321   button.DoAction( "buttonClick", attributes );
322
323   // Call relayout to process the input events.
324   controller->Relayout( CONTROL_SIZE );
325
326   // Cut the text.
327   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
328   DALI_TEST_CHECK( button );
329
330   button.DoAction( "buttonClick", attributes );
331
332   // Force to update the model.
333   controller->GetNaturalSize();
334
335   controller->GetText( text );
336   DALI_TEST_CHECK( text.empty() );
337
338   // Set text again.
339   controller->SetText( "Hello world" );
340
341   // Select the whole text.
342   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
343   DALI_TEST_CHECK( button );
344
345   button.DoAction( "buttonClick", attributes );
346
347   // Call relayout to process the input events.
348   controller->Relayout( CONTROL_SIZE );
349
350   // Copy to the clipboard.
351   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_COPY ) );
352   DALI_TEST_CHECK( button );
353
354   button.DoAction( "buttonClick", attributes );
355
356   // Call relayout to process the input events.
357   controller->Relayout( CONTROL_SIZE );
358
359   // Cut the text.
360   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
361   DALI_TEST_CHECK( button );
362
363   button.DoAction( "buttonClick", attributes );
364
365   // Force to update the model.
366   controller->GetNaturalSize();
367
368   controller->GetText( text );
369   DALI_TEST_CHECK( text.empty() );
370
371   ClipboardEventNotifier clipboardEventNotifier = ClipboardEventNotifier::Get();
372   clipboardEventNotifier.ContentSelectedSignal().Connect( &ContentSelectedCallback );
373
374   // Paste the text.
375   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_PASTE ) );
376   DALI_TEST_CHECK( button );
377
378   button.DoAction( "buttonClick", attributes );
379
380   // Call relayout to process the input events.
381   controller->Relayout( CONTROL_SIZE );
382
383   DALI_TEST_EQUALS( "Hello world", gClipboardText, TEST_LOCATION );
384
385   // Show the clipboard.
386   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CLIPBOARD ) );
387   DALI_TEST_CHECK( button );
388
389   button.DoAction( "buttonClick", attributes );
390
391   tet_result(TET_PASS);
392   END_TEST;
393 }
394
395 int UtcDaliTextControllerGetInputShadowProperty(void)
396 {
397   tet_infoline(" UtcDaliTextControllerGetInputShadowProperty");
398   ToolkitTestApplication application;
399
400   // Creates a text controller.
401   ControllerPtr controller = Controller::New();
402
403   DALI_TEST_CHECK( controller );
404
405   const std::string& shadowProperties = controller->GetInputShadowProperties();
406
407   DALI_TEST_CHECK( shadowProperties.empty() );
408
409   tet_result(TET_PASS);
410   END_TEST;
411 }
412
413 int UtcDaliTextControllerGetInputUnderlineProperty(void)
414 {
415   tet_infoline(" UtcDaliTextControllerGetInputUnderlineProperty");
416   ToolkitTestApplication application;
417
418   // Creates a text controller.
419   ControllerPtr controller = Controller::New();
420
421   DALI_TEST_CHECK( controller );
422
423   const std::string& underlineProperties = controller->GetInputUnderlineProperties();
424
425   DALI_TEST_CHECK( underlineProperties.empty() );
426
427   tet_result(TET_PASS);
428   END_TEST;
429 }
430
431 int UtcDaliTextControllerSetGetAutoScrollEnabled(void)
432 {
433   tet_infoline(" UtcDaliTextControllerSetGetAutoScrollEnabled");
434   ToolkitTestApplication application;
435
436   // Creates a text controller.
437   ControllerPtr controller = Controller::New();
438
439   DALI_TEST_CHECK( controller );
440
441   DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
442
443   // The auto scrolling shouldn't be enabled if the multi-line is enabled.
444
445   // Enable multi-line.
446   controller->SetMultiLineEnabled( true );
447
448   // Enable text scrolling.
449   controller->SetAutoScrollEnabled( true );
450
451   DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
452
453   // Disable multi-line.
454   controller->SetMultiLineEnabled( false );
455
456   // Enable text scrolling.
457   controller->SetAutoScrollEnabled( true );
458
459   // Should be ebabled now.
460   DALI_TEST_CHECK( controller->IsAutoScrollEnabled() );
461
462   tet_result(TET_PASS);
463   END_TEST;
464 }
465
466 int UtcDaliTextControllerSetGetCheckProperty(void)
467 {
468   tet_infoline(" UtcDaliTextControllerSetGetCheckProperty");
469   ToolkitTestApplication application;
470
471   // Creates a text controller.
472   ControllerPtr controller = Controller::New();
473
474   DALI_TEST_CHECK( controller );
475
476   // Enable the text input.
477   // Creates a decorator.
478   Text::DecoratorPtr decorator = Text::Decorator::New( *controller, *controller );
479
480   InputMethodContext inputMethodContext = InputMethodContext::New();
481   // Enables the text input.
482   controller->EnableTextInput( decorator, inputMethodContext );
483
484   DALI_TEST_CHECK( !controller->IsInputModePassword() );
485
486   // Set the text input to password.
487   controller->SetInputModePassword( true );
488
489   DALI_TEST_CHECK( controller->IsInputModePassword() );
490
491   // Unset the text input to password.
492   controller->SetInputModePassword( false );
493
494   DALI_TEST_CHECK( !controller->IsInputModePassword() );
495
496   tet_result(TET_PASS);
497   END_TEST;
498 }
499
500 int UtcDaliTextControllerSetGetTapLongPressAction(void)
501 {
502   tet_infoline(" UtcDaliTextControllerSetGetTapLongPressAction");
503   ToolkitTestApplication application;
504
505   // Creates a text controller.
506   ControllerPtr controller = Controller::New();
507
508   DALI_TEST_CHECK( controller );
509
510   // Test first with no decorator.
511
512   DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
513   controller->SetNoTextDoubleTapAction( Controller::NoTextTap::HIGHLIGHT );
514   DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
515
516   DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextLongPressAction(), TEST_LOCATION );
517   controller->SetNoTextLongPressAction( Controller::NoTextTap::HIGHLIGHT );
518   DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextLongPressAction(), TEST_LOCATION );
519
520   // Add a decorator and re-test.
521
522   // Creates a decorator.
523   Text::DecoratorPtr decorator = Text::Decorator::New( *controller, *controller );
524
525   InputMethodContext inputMethodContext = InputMethodContext::New();
526   // Enables the text input.
527   controller->EnableTextInput( decorator, inputMethodContext );
528
529   DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
530   controller->SetNoTextDoubleTapAction( Controller::NoTextTap::HIGHLIGHT );
531   DALI_TEST_EQUALS( Controller::NoTextTap::HIGHLIGHT, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
532
533   DALI_TEST_EQUALS( Controller::NoTextTap::SHOW_SELECTION_POPUP, controller->GetNoTextLongPressAction(), TEST_LOCATION ); // The default is SHOW_SELECTION_POPUP
534   controller->SetNoTextLongPressAction( Controller::NoTextTap::HIGHLIGHT );
535   DALI_TEST_EQUALS( Controller::NoTextTap::HIGHLIGHT, controller->GetNoTextLongPressAction(), TEST_LOCATION );
536
537   END_TEST;
538 }
539
540 int UtcDaliTextControllerSetGetLineSpacingProperty(void)
541 {
542   tet_infoline(" UtcDaliTextControllerSetGetLineSpacingProperty");
543   ToolkitTestApplication application;
544
545   const Size size( Dali::Stage::GetCurrent().GetSize() );
546
547   // single line text
548   const std::string textSingle("A Quick Brown Fox Jumps Over The Lazy Dog");
549
550   // multi-line text
551   const std::string textMulti("A Quick Brown\nFox Jumps Over\nThe Lazy Dog");
552
553   // Creates a text controller.
554   ControllerPtr controller = Controller::New();
555
556   ConfigureTextLabel(controller);
557
558   // single line, line spacing = 0px
559   {
560     const float EXPECTED_SPACING = 0.0f;
561     const Vector2 EXPECTED_LAYOUT_SIZE( 343.0f, 19.0f);
562     const Vector3 EXPECTED_NATURAL_SIZE( 344.0f, 20.0f, 0.0f );
563
564     controller->SetText(textSingle);
565     controller->Relayout(size);
566     controller->SetMultiLineEnabled( false );
567
568     Vector3 naturalSize  = controller->GetNaturalSize();
569     Vector2 layoutSize   = controller->GetTextModel()->GetLayoutSize();
570     float lineSpacing0 = controller->GetDefaultLineSpacing();
571
572     DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
573     DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
574     DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
575   }
576
577   // single line, line spacing = 20px
578   {
579     const float EXPECTED_SPACING = 20.0f;
580     const Vector2 EXPECTED_LAYOUT_SIZE( 343.0f, 19.0f );
581     const Vector3 EXPECTED_NATURAL_SIZE( 344.0f, 40.0f, 0.0f );
582
583     controller->SetText(textSingle);
584     controller->Relayout(size);
585     controller->SetDefaultLineSpacing( 20 );
586     controller->SetMultiLineEnabled( false );
587
588     Vector3 naturalSize  = controller->GetNaturalSize();
589     Vector2 layoutSize   = controller->GetTextModel()->GetLayoutSize();
590     float lineSpacing0 = controller->GetDefaultLineSpacing();
591
592     DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
593     DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
594     DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
595   }
596
597   // multi-line, line spacing = 0px
598   {
599     const float EXPECTED_SPACING = 0.0f;
600     const Vector2 EXPECTED_LAYOUT_SIZE( 333.0f, 39.0f );
601     const Vector3 EXPECTED_NATURAL_SIZE( 120.0f, 58.0f, 0.0f );
602
603     controller->SetText(textMulti);
604     controller->Relayout(size);
605     controller->SetMultiLineEnabled( true );
606     controller->SetDefaultLineSpacing( 0 );
607
608     Vector3 naturalSize  = controller->GetNaturalSize();
609     Vector2 layoutSize   = controller->GetTextModel()->GetLayoutSize();
610     float lineSpacing0 = controller->GetDefaultLineSpacing();
611
612     DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
613     DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
614     DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
615   }
616
617   // multi-line, line spacing = 20px
618   {
619     const float EXPECTED_SPACING = 20.0f;
620     const Vector2 EXPECTED_LAYOUT_SIZE( 119.0f, 57.0f );
621     const Vector3 EXPECTED_NATURAL_SIZE( 120.0f, 118.0f, 0.0f );
622
623     controller->SetText(textMulti);
624     controller->Relayout(size);
625     controller->SetMultiLineEnabled( true );
626     controller->SetDefaultLineSpacing( 20 );
627
628     Vector3 naturalSize  = controller->GetNaturalSize();
629     Vector2 layoutSize   = controller->GetTextModel()->GetLayoutSize();
630     float lineSpacing0 = controller->GetDefaultLineSpacing();
631
632     DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
633     DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
634     DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
635   }
636
637   // multi-line, line spacing = 30px
638   {
639     const float EXPECTED_SPACING = 30.0f;
640     const Vector2 EXPECTED_LAYOUT_SIZE( 119.0f, 117.0f );
641     const Vector3 EXPECTED_NATURAL_SIZE( 120.0f, 148.0f, 0.0f );
642
643     controller->SetText(textMulti);
644     controller->Relayout(size);
645     controller->SetMultiLineEnabled( true );
646     controller->SetDefaultLineSpacing( 30 );
647
648     Vector3 naturalSize  = controller->GetNaturalSize();
649     Vector2 layoutSize   = controller->GetTextModel()->GetLayoutSize();
650     float lineSpacing0 = controller->GetDefaultLineSpacing();
651
652     DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
653     DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
654     DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
655   }
656
657
658   END_TEST;
659
660 }
661
662 int UtcDaliTextControllerCheckBufferIndices(void)
663 {
664   tet_infoline(" UtcDaliTextControllerCheckBufferIndices");
665   ToolkitTestApplication application;
666
667   // Creates a text controller.
668   ControllerPtr controller = Controller::New();
669
670   ConfigureTextLabel(controller);
671
672   // Set the text
673   const std::string text("A Quick Brown Fox Jumps Over The Lazy Dog");
674   controller->SetText(text);
675
676   // Get the implementation of the text controller
677   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
678
679   // Tweak some parameters to make the indices to access the text buffer invalid
680   mImpl.mTextUpdateInfo.mNumberOfCharactersToAdd = mImpl.mModel->mLogicalModel->mText.Count() * 10u;
681   mImpl.mTextUpdateInfo.mNumberOfCharactersToRemove = 0u;
682   mImpl.mTextUpdateInfo.mPreviousNumberOfCharacters = 0u;
683   mImpl.mOperationsPending = Controller::ALL_OPERATIONS;
684
685   // Perform a relayout
686   const Size size( Dali::Stage::GetCurrent().GetSize() );
687   controller->Relayout(size);
688
689   tet_result(TET_PASS);
690
691   END_TEST;
692 }