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