00426ee868a3aca9b39a870e55f83dd2b38c908e
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-Text-Controller.cpp
1 /*
2  * Copyright (c) 2022 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/devel-api/events/key-event-devel.h>
27 #include <dali-toolkit/internal/controls/text-controls/text-field-impl.h>
28 #include <dali-toolkit/internal/text/controller/text-controller.h>
29 #include <dali-toolkit/internal/text/controller/text-controller-impl.h>
30 #include <dali-toolkit/internal/text/text-control-interface.h>
31 #include <dali-toolkit/internal/text/text-editable-control-interface.h>
32
33 using namespace Dali;
34 using namespace Toolkit;
35 using namespace Text;
36
37 namespace
38 {
39
40 const char* const OPTION_SELECT_ALL("option-select_all");   // "Select All" popup option.
41 const char* const OPTION_CUT("optionCut");                  // "Cut" popup option.
42 const char* const OPTION_COPY("optionCopy");                // "Copy" popup option.
43 const char* const OPTION_PASTE("optionPaste");              // "Paste" popup option.
44 const char* const OPTION_CLIPBOARD("optionClipboard");      // "Clipboard" popup option.
45
46 const Size CONTROL_SIZE( 300.f, 60.f );
47
48 std::string gClipboardText;
49 void ContentSelectedCallback( ClipboardEventNotifier& notifier )
50 {
51   gClipboardText = notifier.GetContent();
52 }
53
54 // Generate a KeyEvent to send to Core.
55 Dali::KeyEvent GenerateKey( const std::string& keyName,
56                             const std::string& keyString,
57                             int keyCode,
58                             int keyModifier,
59                             unsigned long timeStamp,
60                             const Dali::KeyEvent::State& keyState )
61 {
62   return DevelKeyEvent::New( keyName, "", keyString, keyCode, keyModifier, timeStamp, keyState, "", "", Device::Class::NONE, Device::Subclass::NONE );
63 }
64
65 } // namespace
66
67 int UtcDaliTextController(void)
68 {
69   tet_infoline(" UtcDaliTextController");
70   ToolkitTestApplication application;
71
72   // Creates a text controller.
73   ControllerPtr controller = Controller::New();
74   DALI_TEST_CHECK( controller );
75
76   tet_result(TET_PASS);
77   END_TEST;
78 }
79
80 int UtcDaliTextControllerSetGetScrollEnabled(void)
81 {
82   tet_infoline(" UtcDaliTextControllerSetGetScrollEnabled");
83   ToolkitTestApplication application;
84
85   // Creates a text controller.
86   ControllerPtr controller = Controller::New();
87   DALI_TEST_CHECK( controller );
88
89   // Configures the text controller similarly to the text-editor.
90   ConfigureTextEditor( controller );
91
92   DALI_TEST_CHECK( !controller->IsHorizontalScrollEnabled() );
93   DALI_TEST_CHECK( controller->IsVerticalScrollEnabled() );
94
95   // Configures the text controller similarly to the text-field.
96   ConfigureTextField( controller );
97
98   DALI_TEST_CHECK( controller->IsHorizontalScrollEnabled() );
99   DALI_TEST_CHECK( !controller->IsVerticalScrollEnabled() );
100
101   // Configures the text controller similarly to the text-label.
102   ConfigureTextLabel( controller );
103
104   DALI_TEST_CHECK( !controller->IsHorizontalScrollEnabled() );
105   DALI_TEST_CHECK( !controller->IsVerticalScrollEnabled() );
106
107   tet_result(TET_PASS);
108   END_TEST;
109 }
110
111 int UtcDaliTextControllerSetIsTextElide(void)
112 {
113   tet_infoline(" UtcDaliTextControllerSetIsTextElide");
114   ToolkitTestApplication application;
115
116   // Creates a text controller.
117   ControllerPtr controller = Controller::New();
118   DALI_TEST_CHECK( controller );
119
120   // Configures the text controller similarly to the text-editor.
121   ConfigureTextEditor( controller );
122   DALI_TEST_EQUALS( false, controller->IsTextElideEnabled(), TEST_LOCATION );
123
124   controller->SetTextElideEnabled( true );
125   DALI_TEST_EQUALS( true, controller->IsTextElideEnabled(), TEST_LOCATION );
126
127   // Configures the text controller similarly to the text-field.
128   ConfigureTextField( controller );
129   DALI_TEST_EQUALS( false, controller->IsTextElideEnabled(), TEST_LOCATION );
130
131   controller->SetTextElideEnabled( true );
132   DALI_TEST_EQUALS( true, controller->IsTextElideEnabled(), TEST_LOCATION );
133
134   // Configures the text controller similarly to the text-label.
135   ConfigureTextLabel( controller );
136   DALI_TEST_EQUALS( true, controller->IsTextElideEnabled(), TEST_LOCATION );
137
138   controller->SetTextElideEnabled( false );
139   DALI_TEST_EQUALS( false, controller->IsTextElideEnabled(), TEST_LOCATION );
140
141   tet_result(TET_PASS);
142   END_TEST;
143 }
144
145 int UtcDaliTextControllerEnableCursorBlinking(void)
146 {
147   tet_infoline(" UtcDaliTextControllerEnableCursorBlinking");
148   ToolkitTestApplication application;
149
150   // Creates a text controller.
151   ControllerPtr controller = Controller::New();
152   DALI_TEST_CHECK( controller );
153
154   // There is no text input enabled.
155   DALI_TEST_CHECK( !controller->GetEnableCursorBlink() );
156
157   // Enable the text input.
158   // Creates a decorator.
159   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
160                                                        *controller );
161   InputMethodContext inputMethodContext = InputMethodContext::New();
162   // Enables the text input.
163   controller->EnableTextInput( decorator, inputMethodContext );
164
165   // Enables the cursor blink.
166   controller->SetEnableCursorBlink( true );
167
168   DALI_TEST_CHECK( controller->GetEnableCursorBlink() );
169
170   // Disables the cursor blink.
171   controller->SetEnableCursorBlink( false );
172
173   DALI_TEST_CHECK( !controller->GetEnableCursorBlink() );
174
175   tet_result(TET_PASS);
176   END_TEST;
177 }
178
179 int UtcDaliTextControllerImfEvent(void)
180 {
181   tet_infoline(" UtcDaliTextController");
182   ToolkitTestApplication application;
183
184   // Creates a text controller.
185   ControllerPtr controller = Controller::New();
186
187   std::string text;
188   InputMethodContext::EventData imfEvent;
189
190   DALI_TEST_CHECK( controller );
191
192   // Enable the text input.
193   // Creates a decorator.
194   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
195                                                        *controller );
196
197   InputMethodContext inputMethodContext = InputMethodContext::New();
198   // Enables the text input.
199   controller->EnableTextInput( decorator, inputMethodContext );
200
201   // Set the placeholder text.
202   controller->SetPlaceholderText( Controller::PLACEHOLDER_TYPE_INACTIVE, "Hello Dali" );
203
204   // For coverage.
205   imfEvent = InputMethodContext::EventData( InputMethodContext::GET_SURROUNDING, "", 0, 0 );
206   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
207
208   // Send VOID event.
209   imfEvent = InputMethodContext::EventData( InputMethodContext::VOID, "", 0, 0 );
210   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
211
212   controller->GetText( text );
213   DALI_TEST_CHECK( text.empty() );
214
215   imfEvent = InputMethodContext::EventData( InputMethodContext::COMMIT, "Hello ", 0, 6 );
216   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
217   controller->GetNaturalSize();
218
219   // Check 'Delete All' key which means the input panel send a big range
220   imfEvent = InputMethodContext::EventData( InputMethodContext::DELETE_SURROUNDING, "", -100, 100 );
221   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
222   controller->GetNaturalSize();
223
224   controller->GetText( text );
225   DALI_TEST_EQUALS( "", text, TEST_LOCATION );
226
227   // Send COMMIT event.
228   imfEvent = InputMethodContext::EventData( InputMethodContext::COMMIT, "Hello ", 0, 6 );
229   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
230
231   // Force to update the model.
232   controller->GetNaturalSize();
233
234   controller->GetText( text );
235   DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
236
237   // Send PRE_EDIT event
238   imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
239   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
240
241   // Force to update the model.
242   controller->GetNaturalSize();
243
244   controller->GetText( text );
245   DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
246
247   // Send DELETE_SURROUNDING event
248   imfEvent = InputMethodContext::EventData( InputMethodContext::DELETE_SURROUNDING, "", -1, 1 );
249   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
250
251   // Force to update the model.
252   controller->GetNaturalSize();
253
254   controller->GetText( text );
255   DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
256
257   // for coverage
258   inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::UNDERLINE );
259
260   // Send PRE_EDIT event
261   imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "wo", 6, 2 );
262   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
263
264   // Force to update the model.
265   controller->GetNaturalSize();
266
267   controller->GetText( text );
268   DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
269
270   // Send GET_SURROUNDING event
271   imfEvent = InputMethodContext::EventData( InputMethodContext::GET_SURROUNDING, "", 0, 0 );
272   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
273
274   controller->GetText( text );
275   DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
276
277   // Send PRIVATE_COMMAND event
278   imfEvent = InputMethodContext::EventData( InputMethodContext::PRIVATE_COMMAND, "", 0, 0 );
279   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
280
281   controller->GetText( text );
282   DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
283
284   tet_result(TET_PASS);
285   END_TEST;
286 }
287
288 int UtcDaliTextControllerImfPreeditStyle(void)
289 {
290   tet_infoline(" UtcDaliTextControllerImfPreeditStyle");
291   ToolkitTestApplication application;
292
293   // Creates a text controller.
294   ControllerPtr controller = Controller::New();
295
296   std::string text;
297   InputMethodContext::EventData imfEvent;
298
299   DALI_TEST_CHECK( controller );
300
301   // Configures the text controller similarly to the text-field.
302   ConfigureTextField( controller );
303
304   InputMethodContext inputMethodContext = InputMethodContext::New();
305
306   // Send COMMIT event.
307   imfEvent = InputMethodContext::EventData( InputMethodContext::COMMIT, "Hello ", 0, 6 );
308   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
309
310   // Force to update the model.
311   controller->GetNaturalSize();
312
313   controller->GetText( text );
314   DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
315
316   // Send PRE_EDIT event
317   imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
318   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
319   inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::NONE );
320   controller->GetNaturalSize();
321
322   controller->GetText( text );
323   DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
324
325   imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
326   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
327
328   // Set the preedit style as REVERSE
329   inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::REVERSE );
330   controller->GetNaturalSize();
331
332   controller->GetText( text );
333   DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
334
335   imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
336   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
337
338   // Set the preedit style as HIGHLIGHT
339   inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::HIGHLIGHT );
340   controller->GetNaturalSize();
341
342   controller->GetText( text );
343   DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
344
345   imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
346   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
347
348   // Set the preedit style as CUSTOM_PLATFORM_STYLE_1
349   inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_1 );
350   controller->GetNaturalSize();
351
352   controller->GetText( text );
353   DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
354
355   imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
356   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
357
358   // Set the preedit style as CUSTOM_PLATFORM_STYLE_2
359   inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_2 );
360   controller->GetNaturalSize();
361
362   controller->GetText( text );
363   DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
364
365   imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
366   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
367
368   // Set the preedit style as CUSTOM_PLATFORM_STYLE_3
369   inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_3 );
370   controller->GetNaturalSize();
371
372   controller->GetText( text );
373   DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
374
375   imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
376   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
377
378   // Set the preedit style as CUSTOM_PLATFORM_STYLE_4
379   inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_4 );
380   controller->GetNaturalSize();
381
382   controller->GetText( text );
383   DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
384
385   tet_result(TET_PASS);
386   END_TEST;
387 }
388
389 int UtcDaliTextControllerImfPreeditStyleReverse(void)
390 {
391   tet_infoline(" UtcDaliTextControllerImfPreeditStyleReverse");
392   ToolkitTestApplication application;
393
394   // Creates a text controller.
395   ControllerPtr controller = Controller::New();
396
397   std::string text;
398   InputMethodContext::EventData imfEvent;
399
400   DALI_TEST_CHECK(controller);
401
402   // Configures the text controller similarly to the text-field.
403   ConfigureTextField(controller);
404
405   InputMethodContext inputMethodContext = InputMethodContext::New();
406
407   // Send PRE_EDIT event
408   imfEvent = InputMethodContext::EventData(InputMethodContext::PRE_EDIT, "Reverse", 0, 7);
409   controller->OnInputMethodContextEvent(inputMethodContext, imfEvent);
410
411   // For coverage, mEditableControlInterface is required.
412   // Creates a temporary text-field to use mEditableControlInterface.
413   TextField field = TextField::New();
414   Toolkit::Internal::TextField& fieldImpl = GetImpl(field);
415   ControllerPtr fieldController = fieldImpl.GetTextController();
416   Controller::Impl& fieldControllerImpl = Controller::Impl::GetImplementation(*fieldController.Get());
417   Controller::Impl& controllerImpl = Controller::Impl::GetImplementation(*controller.Get());
418
419   // For coverage, mEditableControlInterface is required.
420   controllerImpl.mEditableControlInterface = fieldControllerImpl.mEditableControlInterface;
421
422   // Set the preedit style as REVERSE
423   inputMethodContext.SetPreeditStyle(InputMethodContext::PreeditStyle::REVERSE);
424   controller->GetNaturalSize();
425
426   controller->GetText(text);
427   DALI_TEST_EQUALS("Reverse", text, TEST_LOCATION);
428
429   tet_result(TET_PASS);
430   END_TEST;
431 }
432
433 int UtcDaliTextControllerTextPopupButtonTouched(void)
434 {
435   tet_infoline(" UtcDaliTextControllerTextPopupButtonTouched");
436   ToolkitTestApplication application;
437
438   // Creates a text controller.
439   ControllerPtr controller = Controller::New();
440
441   DALI_TEST_CHECK( controller );
442
443   std::string text;
444   PushButton button;
445   Property::Map attributes;
446
447   // Enable the text input.
448   // Creates a decorator.
449   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
450                                                        *controller );
451
452   InputMethodContext inputMethodContext = InputMethodContext::New();
453   // Enables the text input.
454   controller->EnableTextInput( decorator, inputMethodContext );
455
456   // Creates the text's popup.
457   TextSelectionPopupCallbackInterface& callbackInterface = *controller;
458   TextSelectionPopup textPopup = TextSelectionPopup::New( &callbackInterface );
459
460   Toolkit::TextSelectionPopup::Buttons buttonsToEnable = static_cast<Toolkit::TextSelectionPopup::Buttons>( TextSelectionPopup::CUT        |
461                                                                                                             TextSelectionPopup::COPY       |
462                                                                                                             TextSelectionPopup::PASTE      |
463                                                                                                             TextSelectionPopup::SELECT     |
464                                                                                                             TextSelectionPopup::SELECT_ALL |
465                                                                                                             TextSelectionPopup::CLIPBOARD );
466
467   textPopup.EnableButtons( buttonsToEnable );
468   application.GetScene().Add( textPopup );
469   textPopup.ShowPopup();
470
471   // Render and notify
472   application.SendNotification();
473   application.Render();
474
475   // Sets some text.
476   controller->SetText( "Hello world" );
477
478   // When the TextSelectionPopup is active, the controller has focus.
479   controller->KeyboardFocusGainEvent();
480
481   // Select the whole text.
482   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
483   DALI_TEST_CHECK( button );
484
485   button.DoAction( "buttonClick", attributes );
486
487   // Call relayout to process the input events.
488   controller->Relayout( CONTROL_SIZE );
489
490   // Cut the text.
491   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
492   DALI_TEST_CHECK( button );
493
494   button.DoAction( "buttonClick", attributes );
495
496   // Force to update the model.
497   controller->GetNaturalSize();
498
499   controller->GetText( text );
500   DALI_TEST_CHECK( text.empty() );
501
502   // Set text again.
503   controller->SetText( "Hello world" );
504
505   // Select the whole text.
506   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
507   DALI_TEST_CHECK( button );
508
509   button.DoAction( "buttonClick", attributes );
510
511   // Call relayout to process the input events.
512   controller->Relayout( CONTROL_SIZE );
513
514   // Copy to the clipboard.
515   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_COPY ) );
516   DALI_TEST_CHECK( button );
517
518   button.DoAction( "buttonClick", attributes );
519
520   // Call relayout to process the input events.
521   controller->Relayout( CONTROL_SIZE );
522
523   // Cut the text.
524   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
525   DALI_TEST_CHECK( button );
526
527   button.DoAction( "buttonClick", attributes );
528
529   // Force to update the model.
530   controller->GetNaturalSize();
531
532   controller->GetText( text );
533   DALI_TEST_CHECK( text.empty() );
534
535   ClipboardEventNotifier clipboardEventNotifier = ClipboardEventNotifier::Get();
536   clipboardEventNotifier.ContentSelectedSignal().Connect( &ContentSelectedCallback );
537
538   // Paste the text.
539   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_PASTE ) );
540   DALI_TEST_CHECK( button );
541
542   button.DoAction( "buttonClick", attributes );
543
544   // Call relayout to process the input events.
545   controller->Relayout( CONTROL_SIZE );
546
547   DALI_TEST_EQUALS( "Hello world", gClipboardText, TEST_LOCATION );
548
549   // Show the clipboard.
550   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CLIPBOARD ) );
551   DALI_TEST_CHECK( button );
552
553   button.DoAction( "buttonClick", attributes );
554
555   tet_result(TET_PASS);
556   END_TEST;
557 }
558
559 int UtcDaliTextControllerGetInputShadowProperty(void)
560 {
561   tet_infoline(" UtcDaliTextControllerGetInputShadowProperty");
562   ToolkitTestApplication application;
563
564   // Creates a text controller.
565   ControllerPtr controller = Controller::New();
566
567   DALI_TEST_CHECK( controller );
568
569   const std::string& shadowProperties = controller->GetInputShadowProperties();
570
571   DALI_TEST_CHECK( shadowProperties.empty() );
572
573   tet_result(TET_PASS);
574   END_TEST;
575 }
576
577 int UtcDaliTextControllerGetInputUnderlineProperty(void)
578 {
579   tet_infoline(" UtcDaliTextControllerGetInputUnderlineProperty");
580   ToolkitTestApplication application;
581
582   // Creates a text controller.
583   ControllerPtr controller = Controller::New();
584
585   DALI_TEST_CHECK( controller );
586
587   const std::string& underlineProperties = controller->GetInputUnderlineProperties();
588
589   DALI_TEST_CHECK( underlineProperties.empty() );
590
591   tet_result(TET_PASS);
592   END_TEST;
593 }
594
595 int UtcDaliTextControllerSetGetAutoScrollEnabled(void)
596 {
597   tet_infoline(" UtcDaliTextControllerSetGetAutoScrollEnabled");
598   ToolkitTestApplication application;
599
600   // Creates a text controller.
601   ControllerPtr controller = Controller::New();
602
603   DALI_TEST_CHECK( controller );
604
605   DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
606
607   // The auto scrolling shouldn't be enabled if the multi-line is enabled.
608
609   // Enable multi-line.
610   controller->SetMultiLineEnabled( true );
611
612   // Enable text scrolling.
613   controller->SetAutoScrollEnabled( true );
614
615   DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
616
617   // Disable multi-line.
618   controller->SetMultiLineEnabled( false );
619
620   // Enable text scrolling.
621   controller->SetAutoScrollEnabled( true );
622
623   // Should be ebabled now.
624   DALI_TEST_CHECK( controller->IsAutoScrollEnabled() );
625
626   tet_result(TET_PASS);
627   END_TEST;
628 }
629
630 int UtcDaliTextControllerSetGetCheckProperty(void)
631 {
632   tet_infoline(" UtcDaliTextControllerSetGetCheckProperty");
633   ToolkitTestApplication application;
634
635   // Creates a text controller.
636   ControllerPtr controller = Controller::New();
637
638   DALI_TEST_CHECK( controller );
639
640   // Enable the text input.
641   // Creates a decorator.
642   Text::DecoratorPtr decorator = Text::Decorator::New( *controller, *controller );
643
644   InputMethodContext inputMethodContext = InputMethodContext::New();
645   // Enables the text input.
646   controller->EnableTextInput( decorator, inputMethodContext );
647
648   DALI_TEST_CHECK( !controller->IsInputModePassword() );
649
650   // Set the text input to password.
651   controller->SetInputModePassword( true );
652
653   DALI_TEST_CHECK( controller->IsInputModePassword() );
654
655   // Unset the text input to password.
656   controller->SetInputModePassword( false );
657
658   DALI_TEST_CHECK( !controller->IsInputModePassword() );
659
660   tet_result(TET_PASS);
661   END_TEST;
662 }
663
664 int UtcDaliTextControllerSetGetTapLongPressAction(void)
665 {
666   tet_infoline(" UtcDaliTextControllerSetGetTapLongPressAction");
667   ToolkitTestApplication application;
668
669   // Creates a text controller.
670   ControllerPtr controller = Controller::New();
671
672   DALI_TEST_CHECK( controller );
673
674   // Test first with no decorator.
675
676   DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
677   controller->SetNoTextDoubleTapAction( Controller::NoTextTap::HIGHLIGHT );
678   DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
679
680   DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextLongPressAction(), TEST_LOCATION );
681   controller->SetNoTextLongPressAction( Controller::NoTextTap::HIGHLIGHT );
682   DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextLongPressAction(), TEST_LOCATION );
683
684   // Add a decorator and re-test.
685
686   // Creates a decorator.
687   Text::DecoratorPtr decorator = Text::Decorator::New( *controller, *controller );
688
689   InputMethodContext inputMethodContext = InputMethodContext::New();
690   // Enables the text input.
691   controller->EnableTextInput( decorator, inputMethodContext );
692
693   DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
694   controller->SetNoTextDoubleTapAction( Controller::NoTextTap::HIGHLIGHT );
695   DALI_TEST_EQUALS( Controller::NoTextTap::HIGHLIGHT, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
696
697   DALI_TEST_EQUALS( Controller::NoTextTap::SHOW_SELECTION_POPUP, controller->GetNoTextLongPressAction(), TEST_LOCATION ); // The default is SHOW_SELECTION_POPUP
698   controller->SetNoTextLongPressAction( Controller::NoTextTap::HIGHLIGHT );
699   DALI_TEST_EQUALS( Controller::NoTextTap::HIGHLIGHT, controller->GetNoTextLongPressAction(), TEST_LOCATION );
700
701   END_TEST;
702 }
703
704 int UtcDaliTextControllerSetGetLineSpacingProperty(void)
705 {
706   tet_infoline(" UtcDaliTextControllerSetGetLineSpacingProperty");
707   ToolkitTestApplication application;
708
709   const Size size( application.GetScene().GetSize() );
710
711   // single line text
712   const std::string textSingle("A Quick Brown Fox Jumps Over The Lazy Dog");
713
714   // multi-line text
715   const std::string textMulti("A Quick Brown\nFox Jumps Over\nThe Lazy Dog");
716
717   // Creates a text controller.
718   ControllerPtr controller = Controller::New();
719
720   ConfigureTextLabel(controller);
721
722   // single line, line spacing = 0px
723   {
724     const float EXPECTED_SPACING = 0.0f;
725     const Vector2 EXPECTED_LAYOUT_SIZE( 349.0f, 19.0f);
726     const Vector3 EXPECTED_NATURAL_SIZE( 350.0f, 20.0f, 0.0f );
727
728     controller->SetText(textSingle);
729     controller->Relayout(size);
730     controller->SetMultiLineEnabled( false );
731
732     Vector3 naturalSize  = controller->GetNaturalSize();
733     Vector2 layoutSize   = controller->GetTextModel()->GetLayoutSize();
734     float lineSpacing0 = controller->GetDefaultLineSpacing();
735
736     DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
737     DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
738     DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
739   }
740
741   // single line, line spacing = 20px
742   {
743     const float EXPECTED_SPACING = 20.0f;
744     const Vector2 EXPECTED_LAYOUT_SIZE( 349.0f, 19.0f );
745     const Vector3 EXPECTED_NATURAL_SIZE( 350.0f, 40.0f, 0.0f );
746
747     controller->SetText(textSingle);
748     controller->Relayout(size);
749     controller->SetDefaultLineSpacing( 20 );
750     controller->SetMultiLineEnabled( false );
751
752     Vector3 naturalSize  = controller->GetNaturalSize();
753     Vector2 layoutSize   = controller->GetTextModel()->GetLayoutSize();
754     float lineSpacing0 = controller->GetDefaultLineSpacing();
755
756     DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
757     DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
758     DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
759   }
760
761   // multi-line, line spacing = 0px
762   {
763     const float EXPECTED_SPACING = 0.0f;
764     const Vector2 EXPECTED_LAYOUT_SIZE( 339.0f, 39.0f );
765     const Vector3 EXPECTED_NATURAL_SIZE( 122.0f, 58.0f, 0.0f );
766
767     controller->SetText(textMulti);
768     controller->Relayout(size);
769     controller->SetMultiLineEnabled( true );
770     controller->SetDefaultLineSpacing( 0 );
771
772     Vector3 naturalSize  = controller->GetNaturalSize();
773     Vector2 layoutSize   = controller->GetTextModel()->GetLayoutSize();
774     float lineSpacing0 = controller->GetDefaultLineSpacing();
775
776     DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
777     DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
778     DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
779   }
780
781   // multi-line, line spacing = 20px
782   {
783     const float EXPECTED_SPACING = 20.0f;
784     const Vector2 EXPECTED_LAYOUT_SIZE( 121.0f, 57.0f );
785     const Vector3 EXPECTED_NATURAL_SIZE( 122.0f, 118.0f, 0.0f );
786
787     controller->SetText(textMulti);
788     controller->Relayout(size);
789     controller->SetMultiLineEnabled( true );
790     controller->SetDefaultLineSpacing( 20 );
791
792     Vector3 naturalSize  = controller->GetNaturalSize();
793     Vector2 layoutSize   = controller->GetTextModel()->GetLayoutSize();
794     float lineSpacing0 = controller->GetDefaultLineSpacing();
795
796     DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
797     DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
798     DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
799   }
800
801   // multi-line, line spacing = 30px
802   {
803     const float EXPECTED_SPACING = 30.0f;
804     const Vector2 EXPECTED_LAYOUT_SIZE( 121.0f, 117.0f );
805     const Vector3 EXPECTED_NATURAL_SIZE( 122.0f, 148.0f, 0.0f );
806
807     controller->SetText(textMulti);
808     controller->Relayout(size);
809     controller->SetMultiLineEnabled( true );
810     controller->SetDefaultLineSpacing( 30 );
811
812     Vector3 naturalSize  = controller->GetNaturalSize();
813     Vector2 layoutSize   = controller->GetTextModel()->GetLayoutSize();
814     float lineSpacing0 = controller->GetDefaultLineSpacing();
815
816     DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
817     DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
818     DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
819   }
820
821
822   END_TEST;
823
824 }
825
826 int UtcDaliTextControllerCheckBufferIndices(void)
827 {
828   tet_infoline(" UtcDaliTextControllerCheckBufferIndices");
829   ToolkitTestApplication application;
830
831   // Creates a text controller.
832   ControllerPtr controller = Controller::New();
833
834   ConfigureTextLabel(controller);
835
836   // Set the text
837   const std::string text("A Quick Brown Fox Jumps Over The Lazy Dog");
838   controller->SetText(text);
839
840   // Get the implementation of the text controller
841   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
842
843   // Tweak some parameters to make the indices to access the text buffer invalid
844   mImpl.mTextUpdateInfo.mNumberOfCharactersToAdd = mImpl.mModel->mLogicalModel->mText.Count() * 10u;
845   mImpl.mTextUpdateInfo.mNumberOfCharactersToRemove = 0u;
846   mImpl.mTextUpdateInfo.mPreviousNumberOfCharacters = 0u;
847   mImpl.mOperationsPending = Controller::ALL_OPERATIONS;
848
849   // Perform a relayout
850   const Size size( application.GetScene().GetSize() );
851   controller->Relayout(size);
852
853   // Set the text
854   const std::string emptyText("");
855   controller->SetText(emptyText);
856
857   // Tweak some parameters to make the indices to access the text buffer invalid
858   mImpl.mTextUpdateInfo.mNumberOfCharactersToAdd = 10u;
859   mImpl.mTextUpdateInfo.mNumberOfCharactersToRemove = 0u;
860   mImpl.mTextUpdateInfo.mPreviousNumberOfCharacters = 0u;
861   mImpl.mOperationsPending = Controller::ALL_OPERATIONS;
862
863   // Perform a relayout
864   controller->Relayout(size);
865
866   tet_result(TET_PASS);
867
868   END_TEST;
869 }
870
871 int UtcDaliTextControllerCheckInputColorChanged(void)
872 {
873   tet_infoline(" UtcDaliTextControllerCheckInputColorChanged");
874   ToolkitTestApplication application;
875
876   // Creates a text controller.
877   ControllerPtr controller = Controller::New();
878
879   ConfigureTextLabel(controller);
880
881   // Enable the text input.
882   // Creates a decorator.
883   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
884                                                        *controller );
885   InputMethodContext inputMethodContext = InputMethodContext::New();
886   // Enables the text input.
887   controller->EnableTextInput( decorator, inputMethodContext );
888
889   // Set the text
890   const std::string text("Hello World!");
891   controller->SetText(text);
892
893   const Vector4 inputColor( 0.0f, 0.0f, 0.0f, 1.0f );
894   controller->SetInputColor( inputColor );
895
896   // Get the implementation of the text controller
897   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
898
899   //  Reset operation
900   mImpl.mOperationsPending = Controller::NO_OPERATION;
901
902   // simulate a key event.
903   controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
904
905   // change the input color
906   const Vector4 newInputColor( 1.0f, 0.0f, 0.0f, 1.0f );
907   controller->SetInputColor( newInputColor );
908
909   // Check if relayout is requested or not when event state is INACTIVE.
910   DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
911   DALI_TEST_EQUALS( Controller::COLOR, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::COLOR ), TEST_LOCATION );
912
913   // Perform a relayout
914   const Size size( application.GetScene().GetSize() );
915   controller->Relayout(size);
916
917   tet_result(TET_PASS);
918
919   END_TEST;
920 }
921
922 int UtcDaliTextControllerCheckInputFontFamilyChanged(void)
923 {
924   tet_infoline(" UtcDaliTextControllerCheckInputFontFamilyChanged");
925   ToolkitTestApplication application;
926
927   // Creates a text controller.
928   ControllerPtr controller = Controller::New();
929
930   ConfigureTextLabel(controller);
931
932   // Enable the text input.
933   // Creates a decorator.
934   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
935                                                        *controller );
936   InputMethodContext inputMethodContext = InputMethodContext::New();
937   // Enables the text input.
938   controller->EnableTextInput( decorator, inputMethodContext );
939
940   // Set the text and font family
941   const std::string text("Hello World!");
942   controller->SetText(text);
943   controller->SetInputFontFamily("SamsungOneUI_200");
944
945   // Get the implementation of the text controller
946   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
947
948   //  Reset operation
949   mImpl.mOperationsPending = Controller::NO_OPERATION;
950
951   // simulate a key event.
952   controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
953
954   // change the input font family
955   controller->SetInputFontFamily("SamsungOneUI_300");
956
957   // Check if relayout is requested or not when event state is INACTIVE.
958   DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
959   DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
960                     TEST_LOCATION );
961
962   // Perform a relayout
963   const Size size( application.GetScene().GetSize() );
964   controller->Relayout(size);
965
966   tet_result(TET_PASS);
967
968   END_TEST;
969 }
970
971 int UtcDaliTextControllerCheckInputFontWeightChanged(void)
972 {
973   tet_infoline(" UtcDaliTextControllerCheckInputFontWeightChanged");
974   ToolkitTestApplication application;
975
976   // Creates a text controller.
977   ControllerPtr controller = Controller::New();
978
979   ConfigureTextLabel(controller);
980
981   // Enable the text input.
982   // Creates a decorator.
983   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
984                                                        *controller );
985   InputMethodContext inputMethodContext = InputMethodContext::New();
986   // Enables the text input.
987   controller->EnableTextInput( decorator, inputMethodContext );
988
989   // Set the text
990   const std::string text("Hello World!");
991   controller->SetText(text);
992   controller->SetInputFontWeight( TextAbstraction::FontWeight::NORMAL );
993
994   // Get the implementation of the text controller
995   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
996
997   // Reset operation
998   mImpl.mOperationsPending = Controller::NO_OPERATION;
999
1000   // simulate a key event.
1001   controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
1002
1003   // change the input font weight
1004   controller->SetInputFontWeight( TextAbstraction::FontWeight::BOLD );
1005
1006   // Check if relayout is requested or not when event state is INACTIVE.
1007   DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1008   DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
1009                     TEST_LOCATION );
1010
1011   // Perform a relayout
1012   const Size size( application.GetScene().GetSize() );
1013   controller->Relayout(size);
1014
1015   tet_result(TET_PASS);
1016
1017   END_TEST;
1018 }
1019
1020 int UtcDaliTextControllerCheckInputFontWidthChanged(void)
1021 {
1022   tet_infoline(" UtcDaliTextControllerCheckInputFontWidthChanged");
1023   ToolkitTestApplication application;
1024
1025   // Creates a text controller.
1026   ControllerPtr controller = Controller::New();
1027
1028   ConfigureTextLabel(controller);
1029
1030   // Enable the text input.
1031   // Creates a decorator.
1032   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
1033                                                        *controller );
1034   InputMethodContext inputMethodContext = InputMethodContext::New();
1035   // Enables the text input.
1036   controller->EnableTextInput( decorator, inputMethodContext );
1037
1038   // Set the text
1039   const std::string text("Hello World!");
1040   controller->SetText(text);
1041   controller->SetInputFontWidth( TextAbstraction::FontWidth::NORMAL );
1042
1043   // Get the implementation of the text controller
1044   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1045
1046   // Reset operation
1047   mImpl.mOperationsPending = Controller::NO_OPERATION;
1048
1049   // simulate a key event.
1050   controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
1051
1052   // change the input font width
1053   controller->SetInputFontWidth( TextAbstraction::FontWidth::EXPANDED );
1054
1055   // Check if relayout is requested or not when event state is INACTIVE.
1056   DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1057   DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
1058                     TEST_LOCATION );
1059
1060   // Perform a relayout
1061   const Size size( application.GetScene().GetSize() );
1062   controller->Relayout(size);
1063
1064   tet_result(TET_PASS);
1065
1066   END_TEST;
1067 }
1068
1069 int UtcDaliTextControllerCheckInputFontSlantChanged(void)
1070 {
1071   tet_infoline(" UtcDaliTextControllerCheckInputFontSlantChanged");
1072   ToolkitTestApplication application;
1073
1074   // Creates a text controller.
1075   ControllerPtr controller = Controller::New();
1076
1077   ConfigureTextLabel(controller);
1078
1079   // Enable the text input.
1080   // Creates a decorator.
1081   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
1082                                                        *controller );
1083   InputMethodContext inputMethodContext = InputMethodContext::New();
1084   // Enables the text input.
1085   controller->EnableTextInput( decorator, inputMethodContext );
1086
1087   // Set the text
1088   const std::string text("Hello World!");
1089   controller->SetText(text);
1090   controller->SetInputFontSlant( TextAbstraction::FontSlant::NORMAL );
1091
1092   // Get the implementation of the text controller
1093   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1094
1095   //  Reset operation
1096   mImpl.mOperationsPending = Controller::NO_OPERATION;
1097
1098   // simulate a key event.
1099   controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
1100
1101   // change the input font slant
1102   controller->SetInputFontSlant( TextAbstraction::FontSlant::ROMAN );
1103
1104   // Check if relayout is requested or not when event state is INACTIVE.
1105   DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1106   DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
1107                     TEST_LOCATION );
1108
1109   // Perform a relayout
1110   const Size size( application.GetScene().GetSize() );
1111   controller->Relayout(size);
1112
1113   tet_result(TET_PASS);
1114
1115   END_TEST;
1116 }
1117
1118 int UtcDaliTextControllerCheckInputFontPointSizeChanged(void)
1119 {
1120   tet_infoline(" UtcDaliTextControllerCheckInputFontPointSizeChanged");
1121   ToolkitTestApplication application;
1122
1123   // Creates a text controller.
1124   ControllerPtr controller = Controller::New();
1125
1126   ConfigureTextLabel(controller);
1127
1128   // Enable the text input.
1129   // Creates a decorator.
1130   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
1131                                                        *controller );
1132   InputMethodContext inputMethodContext = InputMethodContext::New();
1133   // Enables the text input.
1134   controller->EnableTextInput( decorator, inputMethodContext );
1135
1136   // Set the text
1137   const std::string text("Hello World!");
1138   controller->SetText(text);
1139   controller->SetInputFontPointSize( 1.0f );
1140
1141   // Get the implementation of the text controller
1142   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1143
1144   //  Reset operation
1145   mImpl.mOperationsPending = Controller::NO_OPERATION;
1146
1147   // simulate a key event.
1148   controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
1149
1150   // change the input font point size
1151   controller->SetInputFontPointSize( 1.2f );
1152
1153   // Check if relayout is requested or not when event state is INACTIVE.
1154   DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1155   DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
1156                     TEST_LOCATION );
1157
1158   // Perform a relayout
1159   const Size size( application.GetScene().GetSize() );
1160   controller->Relayout(size);
1161
1162   // For coverage
1163   controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
1164
1165   tet_result(TET_PASS);
1166
1167   END_TEST;
1168 }
1169
1170 int UtcDaliTextControllerSelectEvent(void)
1171 {
1172   tet_infoline(" UtcDaliTextControllerSelectEvent");
1173   ToolkitTestApplication application;
1174
1175   // Creates a text controller.
1176   ControllerPtr controller = Controller::New();
1177
1178   // Configures the text controller similarly to the text-field.
1179   ConfigureTextField( controller );
1180
1181   // Set the text
1182   const std::string text("Hello World!");
1183   controller->SetText( text );
1184
1185   // Select the whole text.
1186   controller->SelectEvent( 0.f, 0.f, SelectionType::INTERACTIVE );
1187
1188   // Perform a relayout
1189   const Size size( application.GetScene().GetSize() );
1190   controller->Relayout(size);
1191
1192   // Get the implementation of the text controller
1193   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1194
1195   // Check if the whole text is selected or not.
1196   std::string retrieved_text;
1197   mImpl.RetrieveSelection( retrieved_text, false );
1198   DALI_TEST_EQUALS( "Hello", retrieved_text, TEST_LOCATION );
1199
1200   // Select the whole text.
1201   controller->SelectEvent( 0.f, 0.f, SelectionType::ALL );
1202
1203   // Perform a relayout
1204   controller->Relayout( size );
1205
1206   mImpl.RetrieveSelection( retrieved_text, false );
1207   DALI_TEST_EQUALS( text, retrieved_text, TEST_LOCATION );
1208
1209   END_TEST;
1210 }
1211
1212
1213 int UtcDaliTextControllerRemoveTextChangeEventData(void)
1214 {
1215   tet_infoline(" UtcDaliTextControllerRemoveTextChangeEventData");
1216   ToolkitTestApplication application;
1217
1218   // Creates a text controller.
1219   ControllerPtr controller = Controller::New();
1220
1221   ConfigureTextField( controller );
1222
1223   // Set the text
1224   const std::string text( "Hello World!" );
1225   controller->SetText( text );
1226   controller->SetInputFontPointSize( 1.0f );
1227
1228   // Get the implementation of the text controller
1229   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1230
1231   DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1232
1233   // Send DELETE_SURROUNDING event
1234   InputMethodContext::EventData imfEvent = InputMethodContext::EventData( InputMethodContext::DELETE_SURROUNDING, "", -1, 1 );
1235   InputMethodContext inputMethodContext = InputMethodContext::New();
1236   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
1237
1238   // Force to update the model.
1239   controller->GetNaturalSize();
1240
1241   // Simulate a key event to delete text
1242   controller->KeyEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Dali::KeyEvent::DOWN ) );
1243
1244   DALI_TEST_EQUALS( EventData::EDITING, mImpl.mEventData->mState, TEST_LOCATION );
1245
1246   // Perform a relayout
1247   const Size size( application.GetScene().GetSize() );
1248   controller->Relayout( size );
1249
1250   tet_result(TET_PASS);
1251
1252   END_TEST;
1253 }
1254
1255 int UtcDaliTextControllerCheckInputFontPointSizeUpdated(void)
1256 {
1257   tet_infoline(" UtcDaliTextControllerCheckInputFontPointSizeUpdated");
1258   ToolkitTestApplication application;
1259
1260   // Creates a text controller.
1261   ControllerPtr controller = Controller::New();
1262
1263   ConfigureTextField(controller);
1264
1265   // Set the text
1266   const std::string text("Hello World!");
1267   controller->SetText( text );
1268   controller->SetInputFontPointSize( 1.0f );
1269   controller->KeyboardFocusGainEvent();
1270
1271   application.SendNotification();
1272   application.Render();
1273
1274   // Perform a relayout
1275   const Size size( application.GetScene().GetSize() );
1276   controller->Relayout(size);
1277
1278   // simulate a key event.
1279   controller->KeyEvent( GenerateKey( "a", "a", 38, 0, 0, Dali::KeyEvent::DOWN ) );
1280
1281   // change the input font point size
1282   controller->SetInputFontPointSize( 20.f );
1283
1284   application.SendNotification();
1285   application.Render();
1286
1287   // Perform a relayout
1288   controller->Relayout(size);
1289
1290   tet_result(TET_PASS);
1291
1292   END_TEST;
1293 }
1294
1295 int UtcDaliTextControllerDeleteSurroundings(void)
1296 {
1297   tet_infoline(" UtcDaliTextControllerDeleteSurroundings");
1298   ToolkitTestApplication application;
1299
1300   // Creates a text controller.
1301   ControllerPtr controller = Controller::New();
1302
1303   ConfigureTextField( controller );
1304
1305   // Get the implementation of the text controller
1306   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1307
1308   DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1309
1310   InputMethodContext inputMethodContext = InputMethodContext::New();
1311   // Add some pre-edit text, such as Korean
1312   InputMethodContext::EventData imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "ㅂㅂㅂ", 0, 3 );
1313   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
1314
1315   // Perform a relayout
1316   const Size size( application.GetScene().GetSize() );
1317
1318   application.SendNotification();
1319   application.Render();
1320
1321   controller->Relayout( size );
1322
1323   // Simulate a key event to delete one text
1324   controller->KeyEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Dali::KeyEvent::DOWN ) );
1325
1326   // Send DELETE_SURROUNDING event (Delete All text)
1327   imfEvent = InputMethodContext::EventData( InputMethodContext::DELETE_SURROUNDING, "", -2, 2 );
1328   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
1329
1330   application.SendNotification();
1331   application.Render();
1332
1333   controller->Relayout( size );
1334
1335   // simulate a key event to add text
1336   controller->KeyEvent( GenerateKey( "ㅇ", "ㅇ", 238, 0, 0, Dali::KeyEvent::DOWN ) );
1337   controller->KeyEvent( GenerateKey( "ㅇ", "ㅇ", 238, 0, 0, Dali::KeyEvent::DOWN ) );
1338
1339   DALI_TEST_EQUALS( EventData::EDITING, mImpl.mEventData->mState, TEST_LOCATION );
1340
1341   // Force to update the model.
1342   controller->GetNaturalSize();
1343
1344   application.SendNotification();
1345   application.Render();
1346
1347   controller->Relayout( size );
1348
1349   tet_result(TET_PASS);
1350
1351   END_TEST;
1352 }