Add defensive code to detect text memory buffer corruption
[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
150   // Enables the text input.
151   controller->EnableTextInput( decorator );
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   ImfManager::ImfEventData 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   // Enables the text input.
186   controller->EnableTextInput( decorator );
187
188   // Set the placeholder text.
189   controller->SetPlaceholderText( Controller::PLACEHOLDER_TYPE_INACTIVE, "Hello Dali" );
190
191   // Creates an ImfManager.
192   ImfManager imfManager = ImfManager::Get();
193
194   // For coverage.
195   imfEvent = ImfManager::ImfEventData( ImfManager::GETSURROUNDING, "", 0, 0 );
196   controller->OnImfEvent( imfManager, imfEvent );
197
198   // Send VOID event.
199   imfEvent = ImfManager::ImfEventData( ImfManager::VOID, "", 0, 0 );
200   controller->OnImfEvent( imfManager, imfEvent );
201
202   controller->GetText( text );
203   DALI_TEST_CHECK( text.empty() );
204
205   imfEvent = ImfManager::ImfEventData( ImfManager::COMMIT, "Hello ", 0, 6 );
206   controller->OnImfEvent( imfManager, imfEvent );
207   controller->GetNaturalSize();
208
209   // Check 'Delete All' key which means the input panel send a big range
210   imfEvent = ImfManager::ImfEventData( ImfManager::DELETESURROUNDING, "", -100, 100 );
211   controller->OnImfEvent( imfManager, imfEvent );
212   controller->GetNaturalSize();
213
214   controller->GetText( text );
215   DALI_TEST_EQUALS( "", text, TEST_LOCATION );
216
217   // Send COMMIT event.
218   imfEvent = ImfManager::ImfEventData( ImfManager::COMMIT, "Hello ", 0, 6 );
219   controller->OnImfEvent( imfManager, imfEvent );
220
221   // Force to update the model.
222   controller->GetNaturalSize();
223
224   controller->GetText( text );
225   DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
226
227   // Send PREEDIT event
228   imfEvent = ImfManager::ImfEventData( ImfManager::PREEDIT, "w", 6, 1 );
229   controller->OnImfEvent( imfManager, imfEvent );
230
231   // Force to update the model.
232   controller->GetNaturalSize();
233
234   controller->GetText( text );
235   DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
236
237   // Send DELETESURROUNDING event
238   imfEvent = ImfManager::ImfEventData( ImfManager::DELETESURROUNDING, "", -1, 1 );
239   controller->OnImfEvent( imfManager, imfEvent );
240
241   // Force to update the model.
242   controller->GetNaturalSize();
243
244   controller->GetText( text );
245   DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
246
247   // Send PREEDIT event
248   imfEvent = ImfManager::ImfEventData( ImfManager::PREEDIT, "wo", 6, 2 );
249   controller->OnImfEvent( imfManager, imfEvent );
250
251   // Force to update the model.
252   controller->GetNaturalSize();
253
254   controller->GetText( text );
255   DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
256
257   // Send GETSURROUNDING event
258   imfEvent = ImfManager::ImfEventData( ImfManager::GETSURROUNDING, "", 0, 0 );
259   controller->OnImfEvent( imfManager, imfEvent );
260
261   controller->GetText( text );
262   DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
263
264   // Send PRIVATECOMMAND event
265   imfEvent = ImfManager::ImfEventData( ImfManager::PRIVATECOMMAND, "", 0, 0 );
266   controller->OnImfEvent( imfManager, imfEvent );
267
268   controller->GetText( text );
269   DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
270
271   tet_result(TET_PASS);
272   END_TEST;
273 }
274
275 int UtcDaliTextControllerTextPopupButtonTouched(void)
276 {
277   tet_infoline(" UtcDaliTextControllerTextPopupButtonTouched");
278   ToolkitTestApplication application;
279
280   // Creates a text controller.
281   ControllerPtr controller = Controller::New();
282
283   DALI_TEST_CHECK( controller );
284
285   std::string text;
286   PushButton button;
287   Property::Map attributes;
288
289   // Enable the text input.
290   // Creates a decorator.
291   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
292                                                        *controller );
293
294   // Enables the text input.
295   controller->EnableTextInput( decorator );
296
297   // Creates the text's popup.
298   TextSelectionPopupCallbackInterface& callbackInterface = *controller;
299   TextSelectionPopup textPopup = TextSelectionPopup::New( &callbackInterface );
300
301   Toolkit::TextSelectionPopup::Buttons buttonsToEnable = static_cast<Toolkit::TextSelectionPopup::Buttons>( TextSelectionPopup::CUT        |
302                                                                                                             TextSelectionPopup::COPY       |
303                                                                                                             TextSelectionPopup::PASTE      |
304                                                                                                             TextSelectionPopup::SELECT     |
305                                                                                                             TextSelectionPopup::SELECT_ALL |
306                                                                                                             TextSelectionPopup::CLIPBOARD );
307
308   textPopup.EnableButtons( buttonsToEnable );
309   Stage::GetCurrent().Add( textPopup );
310   textPopup.ShowPopup();
311
312   // Render and notify
313   application.SendNotification();
314   application.Render();
315
316   // Sets some text.
317   controller->SetText( "Hello world" );
318
319   // Select the whole text.
320   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
321   DALI_TEST_CHECK( button );
322
323   button.DoAction( "buttonClick", attributes );
324
325   // Call relayout to process the input events.
326   controller->Relayout( CONTROL_SIZE );
327
328   // Cut the text.
329   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
330   DALI_TEST_CHECK( button );
331
332   button.DoAction( "buttonClick", attributes );
333
334   // Force to update the model.
335   controller->GetNaturalSize();
336
337   controller->GetText( text );
338   DALI_TEST_CHECK( text.empty() );
339
340   // Set text again.
341   controller->SetText( "Hello world" );
342
343   // Select the whole text.
344   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
345   DALI_TEST_CHECK( button );
346
347   button.DoAction( "buttonClick", attributes );
348
349   // Call relayout to process the input events.
350   controller->Relayout( CONTROL_SIZE );
351
352   // Copy to the clipboard.
353   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_COPY ) );
354   DALI_TEST_CHECK( button );
355
356   button.DoAction( "buttonClick", attributes );
357
358   // Call relayout to process the input events.
359   controller->Relayout( CONTROL_SIZE );
360
361   // Cut the text.
362   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
363   DALI_TEST_CHECK( button );
364
365   button.DoAction( "buttonClick", attributes );
366
367   // Force to update the model.
368   controller->GetNaturalSize();
369
370   controller->GetText( text );
371   DALI_TEST_CHECK( text.empty() );
372
373   ClipboardEventNotifier clipboardEventNotifier = ClipboardEventNotifier::Get();
374   clipboardEventNotifier.ContentSelectedSignal().Connect( &ContentSelectedCallback );
375
376   // Paste the text.
377   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_PASTE ) );
378   DALI_TEST_CHECK( button );
379
380   button.DoAction( "buttonClick", attributes );
381
382   // Call relayout to process the input events.
383   controller->Relayout( CONTROL_SIZE );
384
385   DALI_TEST_EQUALS( "Hello world", gClipboardText, TEST_LOCATION );
386
387   // Show the clipboard.
388   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CLIPBOARD ) );
389   DALI_TEST_CHECK( button );
390
391   button.DoAction( "buttonClick", attributes );
392
393   tet_result(TET_PASS);
394   END_TEST;
395 }
396
397 int UtcDaliTextControllerGetInputShadowProperty(void)
398 {
399   tet_infoline(" UtcDaliTextControllerGetInputShadowProperty");
400   ToolkitTestApplication application;
401
402   // Creates a text controller.
403   ControllerPtr controller = Controller::New();
404
405   DALI_TEST_CHECK( controller );
406
407   const std::string& shadowProperties = controller->GetInputShadowProperties();
408
409   DALI_TEST_CHECK( shadowProperties.empty() );
410
411   tet_result(TET_PASS);
412   END_TEST;
413 }
414
415 int UtcDaliTextControllerGetInputUnderlineProperty(void)
416 {
417   tet_infoline(" UtcDaliTextControllerGetInputUnderlineProperty");
418   ToolkitTestApplication application;
419
420   // Creates a text controller.
421   ControllerPtr controller = Controller::New();
422
423   DALI_TEST_CHECK( controller );
424
425   const std::string& underlineProperties = controller->GetInputUnderlineProperties();
426
427   DALI_TEST_CHECK( underlineProperties.empty() );
428
429   tet_result(TET_PASS);
430   END_TEST;
431 }
432
433 int UtcDaliTextControllerSetGetAutoScrollEnabled(void)
434 {
435   tet_infoline(" UtcDaliTextControllerSetGetAutoScrollEnabled");
436   ToolkitTestApplication application;
437
438   // Creates a text controller.
439   ControllerPtr controller = Controller::New();
440
441   DALI_TEST_CHECK( controller );
442
443   DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
444
445   // The auto scrolling shouldn't be enabled if the multi-line is enabled.
446
447   // Enable multi-line.
448   controller->SetMultiLineEnabled( true );
449
450   // Enable text scrolling.
451   controller->SetAutoScrollEnabled( true );
452
453   DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
454
455   // Disable multi-line.
456   controller->SetMultiLineEnabled( false );
457
458   // Enable text scrolling.
459   controller->SetAutoScrollEnabled( true );
460
461   // Should be ebabled now.
462   DALI_TEST_CHECK( controller->IsAutoScrollEnabled() );
463
464   tet_result(TET_PASS);
465   END_TEST;
466 }
467
468 int UtcDaliTextControllerSetGetCheckProperty(void)
469 {
470   tet_infoline(" UtcDaliTextControllerSetGetCheckProperty");
471   ToolkitTestApplication application;
472
473   // Creates a text controller.
474   ControllerPtr controller = Controller::New();
475
476   DALI_TEST_CHECK( controller );
477
478   // Enable the text input.
479   // Creates a decorator.
480   Text::DecoratorPtr decorator = Text::Decorator::New( *controller, *controller );
481
482   // Enables the text input.
483   controller->EnableTextInput( decorator );
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   // Enables the text input.
527   controller->EnableTextInput( decorator );
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( 326.0f, 19.0f);
562     const Vector3 EXPECTED_NATURAL_SIZE( 326.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( 326.0f, 19.0f );
581     const Vector3 EXPECTED_NATURAL_SIZE( 326.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( 318.0f, 39.0f );
601     const Vector3 EXPECTED_NATURAL_SIZE( 116.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( 115.0f, 57.0f );
621     const Vector3 EXPECTED_NATURAL_SIZE( 116.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( 115.0f, 117.0f );
641     const Vector3 EXPECTED_NATURAL_SIZE( 116.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 }