(Automated Tests) Passing on Ubuntu 20.04
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-Text-Controller.cpp
1 /*
2  * Copyright (c) 2021 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/text-controller.h>
29 #include <dali-toolkit/internal/text/text-control-interface.h>
30 #include <dali-toolkit/internal/text/text-editable-control-interface.h>
31 #include <dali-toolkit/internal/text/text-controller-impl.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   tet_result(TET_PASS);
854
855   END_TEST;
856 }
857
858 int UtcDaliTextControllerCheckInputColorChanged(void)
859 {
860   tet_infoline(" UtcDaliTextControllerCheckInputColorChanged");
861   ToolkitTestApplication application;
862
863   // Creates a text controller.
864   ControllerPtr controller = Controller::New();
865
866   ConfigureTextLabel(controller);
867
868   // Enable the text input.
869   // Creates a decorator.
870   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
871                                                        *controller );
872   InputMethodContext inputMethodContext = InputMethodContext::New();
873   // Enables the text input.
874   controller->EnableTextInput( decorator, inputMethodContext );
875
876   // Set the text
877   const std::string text("Hello World!");
878   controller->SetText(text);
879
880   const Vector4 inputColor( 0.0f, 0.0f, 0.0f, 1.0f );
881   controller->SetInputColor( inputColor );
882
883   // Get the implementation of the text controller
884   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
885
886   //  Reset operation
887   mImpl.mOperationsPending = Controller::NO_OPERATION;
888
889   // simulate a key event.
890   controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
891
892   // change the input color
893   const Vector4 newInputColor( 1.0f, 0.0f, 0.0f, 1.0f );
894   controller->SetInputColor( newInputColor );
895
896   // Check if relayout is requested or not when event state is INACTIVE.
897   DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
898   DALI_TEST_EQUALS( Controller::COLOR, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::COLOR ), TEST_LOCATION );
899
900   // Perform a relayout
901   const Size size( application.GetScene().GetSize() );
902   controller->Relayout(size);
903
904   tet_result(TET_PASS);
905
906   END_TEST;
907 }
908
909 int UtcDaliTextControllerCheckInputFontFamilyChanged(void)
910 {
911   tet_infoline(" UtcDaliTextControllerCheckInputFontFamilyChanged");
912   ToolkitTestApplication application;
913
914   // Creates a text controller.
915   ControllerPtr controller = Controller::New();
916
917   ConfigureTextLabel(controller);
918
919   // Enable the text input.
920   // Creates a decorator.
921   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
922                                                        *controller );
923   InputMethodContext inputMethodContext = InputMethodContext::New();
924   // Enables the text input.
925   controller->EnableTextInput( decorator, inputMethodContext );
926
927   // Set the text and font family
928   const std::string text("Hello World!");
929   controller->SetText(text);
930   controller->SetInputFontFamily("SamsungOneUI_200");
931
932   // Get the implementation of the text controller
933   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
934
935   //  Reset operation
936   mImpl.mOperationsPending = Controller::NO_OPERATION;
937
938   // simulate a key event.
939   controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
940
941   // change the input font family
942   controller->SetInputFontFamily("SamsungOneUI_300");
943
944   // Check if relayout is requested or not when event state is INACTIVE.
945   DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
946   DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
947                     TEST_LOCATION );
948
949   // Perform a relayout
950   const Size size( application.GetScene().GetSize() );
951   controller->Relayout(size);
952
953   tet_result(TET_PASS);
954
955   END_TEST;
956 }
957
958 int UtcDaliTextControllerCheckInputFontWeightChanged(void)
959 {
960   tet_infoline(" UtcDaliTextControllerCheckInputFontWeightChanged");
961   ToolkitTestApplication application;
962
963   // Creates a text controller.
964   ControllerPtr controller = Controller::New();
965
966   ConfigureTextLabel(controller);
967
968   // Enable the text input.
969   // Creates a decorator.
970   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
971                                                        *controller );
972   InputMethodContext inputMethodContext = InputMethodContext::New();
973   // Enables the text input.
974   controller->EnableTextInput( decorator, inputMethodContext );
975
976   // Set the text
977   const std::string text("Hello World!");
978   controller->SetText(text);
979   controller->SetInputFontWeight( TextAbstraction::FontWeight::NORMAL );
980
981   // Get the implementation of the text controller
982   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
983
984   // Reset operation
985   mImpl.mOperationsPending = Controller::NO_OPERATION;
986
987   // simulate a key event.
988   controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
989
990   // change the input font weight
991   controller->SetInputFontWeight( TextAbstraction::FontWeight::BOLD );
992
993   // Check if relayout is requested or not when event state is INACTIVE.
994   DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
995   DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
996                     TEST_LOCATION );
997
998   // Perform a relayout
999   const Size size( application.GetScene().GetSize() );
1000   controller->Relayout(size);
1001
1002   tet_result(TET_PASS);
1003
1004   END_TEST;
1005 }
1006
1007 int UtcDaliTextControllerCheckInputFontWidthChanged(void)
1008 {
1009   tet_infoline(" UtcDaliTextControllerCheckInputFontWidthChanged");
1010   ToolkitTestApplication application;
1011
1012   // Creates a text controller.
1013   ControllerPtr controller = Controller::New();
1014
1015   ConfigureTextLabel(controller);
1016
1017   // Enable the text input.
1018   // Creates a decorator.
1019   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
1020                                                        *controller );
1021   InputMethodContext inputMethodContext = InputMethodContext::New();
1022   // Enables the text input.
1023   controller->EnableTextInput( decorator, inputMethodContext );
1024
1025   // Set the text
1026   const std::string text("Hello World!");
1027   controller->SetText(text);
1028   controller->SetInputFontWidth( TextAbstraction::FontWidth::NORMAL );
1029
1030   // Get the implementation of the text controller
1031   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1032
1033   // Reset operation
1034   mImpl.mOperationsPending = Controller::NO_OPERATION;
1035
1036   // simulate a key event.
1037   controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
1038
1039   // change the input font width
1040   controller->SetInputFontWidth( TextAbstraction::FontWidth::EXPANDED );
1041
1042   // Check if relayout is requested or not when event state is INACTIVE.
1043   DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1044   DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
1045                     TEST_LOCATION );
1046
1047   // Perform a relayout
1048   const Size size( application.GetScene().GetSize() );
1049   controller->Relayout(size);
1050
1051   tet_result(TET_PASS);
1052
1053   END_TEST;
1054 }
1055
1056 int UtcDaliTextControllerCheckInputFontSlantChanged(void)
1057 {
1058   tet_infoline(" UtcDaliTextControllerCheckInputFontSlantChanged");
1059   ToolkitTestApplication application;
1060
1061   // Creates a text controller.
1062   ControllerPtr controller = Controller::New();
1063
1064   ConfigureTextLabel(controller);
1065
1066   // Enable the text input.
1067   // Creates a decorator.
1068   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
1069                                                        *controller );
1070   InputMethodContext inputMethodContext = InputMethodContext::New();
1071   // Enables the text input.
1072   controller->EnableTextInput( decorator, inputMethodContext );
1073
1074   // Set the text
1075   const std::string text("Hello World!");
1076   controller->SetText(text);
1077   controller->SetInputFontSlant( TextAbstraction::FontSlant::NORMAL );
1078
1079   // Get the implementation of the text controller
1080   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1081
1082   //  Reset operation
1083   mImpl.mOperationsPending = Controller::NO_OPERATION;
1084
1085   // simulate a key event.
1086   controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
1087
1088   // change the input font slant
1089   controller->SetInputFontSlant( TextAbstraction::FontSlant::ROMAN );
1090
1091   // Check if relayout is requested or not when event state is INACTIVE.
1092   DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1093   DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
1094                     TEST_LOCATION );
1095
1096   // Perform a relayout
1097   const Size size( application.GetScene().GetSize() );
1098   controller->Relayout(size);
1099
1100   tet_result(TET_PASS);
1101
1102   END_TEST;
1103 }
1104
1105 int UtcDaliTextControllerCheckInputFontPointSizeChanged(void)
1106 {
1107   tet_infoline(" UtcDaliTextControllerCheckInputFontPointSizeChanged");
1108   ToolkitTestApplication application;
1109
1110   // Creates a text controller.
1111   ControllerPtr controller = Controller::New();
1112
1113   ConfigureTextLabel(controller);
1114
1115   // Enable the text input.
1116   // Creates a decorator.
1117   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
1118                                                        *controller );
1119   InputMethodContext inputMethodContext = InputMethodContext::New();
1120   // Enables the text input.
1121   controller->EnableTextInput( decorator, inputMethodContext );
1122
1123   // Set the text
1124   const std::string text("Hello World!");
1125   controller->SetText(text);
1126   controller->SetInputFontPointSize( 1.0f );
1127
1128   // Get the implementation of the text controller
1129   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1130
1131   //  Reset operation
1132   mImpl.mOperationsPending = Controller::NO_OPERATION;
1133
1134   // simulate a key event.
1135   controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
1136
1137   // change the input font point size
1138   controller->SetInputFontPointSize( 1.2f );
1139
1140   // Check if relayout is requested or not when event state is INACTIVE.
1141   DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1142   DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
1143                     TEST_LOCATION );
1144
1145   // Perform a relayout
1146   const Size size( application.GetScene().GetSize() );
1147   controller->Relayout(size);
1148
1149   tet_result(TET_PASS);
1150
1151   END_TEST;
1152 }
1153
1154 int UtcDaliTextControllerSelectEvent(void)
1155 {
1156   tet_infoline(" UtcDaliTextControllerSelectEvent");
1157   ToolkitTestApplication application;
1158
1159   // Creates a text controller.
1160   ControllerPtr controller = Controller::New();
1161
1162   // Configures the text controller similarly to the text-field.
1163   ConfigureTextField( controller );
1164
1165   // Set the text
1166   const std::string text("Hello World!");
1167   controller->SetText( text );
1168
1169   // Select the whole text.
1170   controller->SelectEvent( 0.f, 0.f, SelectionType::INTERACTIVE );
1171
1172   // Perform a relayout
1173   const Size size( application.GetScene().GetSize() );
1174   controller->Relayout(size);
1175
1176   // Get the implementation of the text controller
1177   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1178
1179   // Check if the whole text is selected or not.
1180   std::string retrieved_text;
1181   mImpl.RetrieveSelection( retrieved_text, false );
1182   DALI_TEST_EQUALS( "Hello", retrieved_text, TEST_LOCATION );
1183
1184   // Select the whole text.
1185   controller->SelectEvent( 0.f, 0.f, SelectionType::ALL );
1186
1187   // Perform a relayout
1188   controller->Relayout( size );
1189
1190   mImpl.RetrieveSelection( retrieved_text, false );
1191   DALI_TEST_EQUALS( text, retrieved_text, TEST_LOCATION );
1192
1193   END_TEST;
1194 }
1195
1196
1197 int UtcDaliTextControllerRemoveTextChangeEventData(void)
1198 {
1199   tet_infoline(" UtcDaliTextControllerRemoveTextChangeEventData");
1200   ToolkitTestApplication application;
1201
1202   // Creates a text controller.
1203   ControllerPtr controller = Controller::New();
1204
1205   ConfigureTextField( controller );
1206
1207   // Set the text
1208   const std::string text( "Hello World!" );
1209   controller->SetText( text );
1210   controller->SetInputFontPointSize( 1.0f );
1211
1212   // Get the implementation of the text controller
1213   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1214
1215   DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1216
1217   // Send DELETE_SURROUNDING event
1218   InputMethodContext::EventData imfEvent = InputMethodContext::EventData( InputMethodContext::DELETE_SURROUNDING, "", -1, 1 );
1219   InputMethodContext inputMethodContext = InputMethodContext::New();
1220   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
1221
1222   // Force to update the model.
1223   controller->GetNaturalSize();
1224
1225   // Simulate a key event to delete text
1226   controller->KeyEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Dali::KeyEvent::DOWN ) );
1227
1228   DALI_TEST_EQUALS( EventData::EDITING, mImpl.mEventData->mState, TEST_LOCATION );
1229
1230   // Perform a relayout
1231   const Size size( application.GetScene().GetSize() );
1232   controller->Relayout( size );
1233
1234   tet_result(TET_PASS);
1235
1236   END_TEST;
1237 }
1238
1239 int UtcDaliTextControllerCheckInputFontPointSizeUpdated(void)
1240 {
1241   tet_infoline(" UtcDaliTextControllerCheckInputFontPointSizeUpdated");
1242   ToolkitTestApplication application;
1243
1244   // Creates a text controller.
1245   ControllerPtr controller = Controller::New();
1246
1247   ConfigureTextField(controller);
1248
1249   // Set the text
1250   const std::string text("Hello World!");
1251   controller->SetText( text );
1252   controller->SetInputFontPointSize( 1.0f );
1253   controller->KeyboardFocusGainEvent();
1254
1255   application.SendNotification();
1256   application.Render();
1257
1258   // Perform a relayout
1259   const Size size( application.GetScene().GetSize() );
1260   controller->Relayout(size);
1261
1262   // simulate a key event.
1263   controller->KeyEvent( GenerateKey( "a", "a", 38, 0, 0, Dali::KeyEvent::DOWN ) );
1264
1265   // change the input font point size
1266   controller->SetInputFontPointSize( 20.f );
1267
1268   application.SendNotification();
1269   application.Render();
1270
1271   // Perform a relayout
1272   controller->Relayout(size);
1273
1274   tet_result(TET_PASS);
1275
1276   END_TEST;
1277 }
1278
1279 int UtcDaliTextControllerDeleteSurroundings(void)
1280 {
1281   tet_infoline(" UtcDaliTextControllerDeleteSurroundings");
1282   ToolkitTestApplication application;
1283
1284   // Creates a text controller.
1285   ControllerPtr controller = Controller::New();
1286
1287   ConfigureTextField( controller );
1288
1289   // Get the implementation of the text controller
1290   Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1291
1292   DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1293
1294   InputMethodContext inputMethodContext = InputMethodContext::New();
1295   // Add some pre-edit text, such as Korean
1296   InputMethodContext::EventData imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "ㅂㅂㅂ", 0, 3 );
1297   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
1298
1299   // Perform a relayout
1300   const Size size( application.GetScene().GetSize() );
1301
1302   application.SendNotification();
1303   application.Render();
1304
1305   controller->Relayout( size );
1306
1307   // Simulate a key event to delete one text
1308   controller->KeyEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Dali::KeyEvent::DOWN ) );
1309
1310   // Send DELETE_SURROUNDING event (Delete All text)
1311   imfEvent = InputMethodContext::EventData( InputMethodContext::DELETE_SURROUNDING, "", -2, 2 );
1312   controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
1313
1314   application.SendNotification();
1315   application.Render();
1316
1317   controller->Relayout( size );
1318
1319   // simulate a key event to add text
1320   controller->KeyEvent( GenerateKey( "ㅇ", "ㅇ", 238, 0, 0, Dali::KeyEvent::DOWN ) );
1321   controller->KeyEvent( GenerateKey( "ㅇ", "ㅇ", 238, 0, 0, Dali::KeyEvent::DOWN ) );
1322
1323   DALI_TEST_EQUALS( EventData::EDITING, mImpl.mEventData->mState, TEST_LOCATION );
1324
1325   // Force to update the model.
1326   controller->GetNaturalSize();
1327
1328   application.SendNotification();
1329   application.Render();
1330
1331   controller->Relayout( size );
1332
1333   tet_result(TET_PASS);
1334
1335   END_TEST;
1336 }