9b8217becfddfb753ffd7d56a6837699f2a0ad61
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-Text-Controller.cpp
1 /*
2  * Copyright (c) 2017 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 #include <iostream>
19
20 #include <stdlib.h>
21 #include <limits>
22
23 #include <dali-toolkit-test-suite-utils.h>
24 #include <dali-toolkit/dali-toolkit.h>
25 #include <toolkit-text-utils.h>
26 #include <dali-toolkit/internal/text/text-controller.h>
27 #include <dali-toolkit/internal/text/text-control-interface.h>
28 #include <dali-toolkit/internal/text/text-editable-control-interface.h>
29
30 using namespace Dali;
31 using namespace Toolkit;
32 using namespace Text;
33
34 namespace
35 {
36
37 const char* const OPTION_SELECT_WORD("option-select_word"); // "Select Word" popup option.
38 const char* const OPTION_SELECT_ALL("option-select_all");   // "Select All" popup option.
39 const char* const OPTION_CUT("optionCut");                  // "Cut" popup option.
40 const char* const OPTION_COPY("optionCopy");                // "Copy" popup option.
41 const char* const OPTION_PASTE("optionPaste");              // "Paste" popup option.
42 const char* const OPTION_CLIPBOARD("optionClipboard");      // "Clipboard" popup option.
43
44 const Size CONTROL_SIZE( 300.f, 60.f );
45
46 std::string gClipboardText;
47 void ContentSelectedCallback( ClipboardEventNotifier& notifier )
48 {
49   gClipboardText = notifier.GetContent();
50 }
51
52 } // namespace
53
54 int UtcDaliTextController(void)
55 {
56   tet_infoline(" UtcDaliTextController");
57   ToolkitTestApplication application;
58
59   // Creates a text controller.
60   ControllerPtr controller = Controller::New();
61   DALI_TEST_CHECK( controller );
62
63   tet_result(TET_PASS);
64   END_TEST;
65 }
66
67 int UtcDaliTextControllerSetGetScrollEnabled(void)
68 {
69   tet_infoline(" UtcDaliTextControllerSetGetScrollEnabled");
70   ToolkitTestApplication application;
71
72   // Creates a text controller.
73   ControllerPtr controller = Controller::New();
74   DALI_TEST_CHECK( controller );
75
76   // Configures the text controller similarly to the text-editor.
77   ConfigureTextEditor( controller );
78
79   DALI_TEST_CHECK( !controller->IsHorizontalScrollEnabled() );
80   DALI_TEST_CHECK( controller->IsVerticalScrollEnabled() );
81
82   // Configures the text controller similarly to the text-field.
83   ConfigureTextField( controller );
84
85   DALI_TEST_CHECK( controller->IsHorizontalScrollEnabled() );
86   DALI_TEST_CHECK( !controller->IsVerticalScrollEnabled() );
87
88   // Configures the text controller similarly to the text-label.
89   ConfigureTextLabel( controller );
90
91   DALI_TEST_CHECK( !controller->IsHorizontalScrollEnabled() );
92   DALI_TEST_CHECK( !controller->IsVerticalScrollEnabled() );
93
94   tet_result(TET_PASS);
95   END_TEST;
96 }
97
98 int UtcDaliTextControllerSetIsTextElide(void)
99 {
100   tet_infoline(" UtcDaliTextControllerSetIsTextElide");
101   ToolkitTestApplication application;
102
103   // Creates a text controller.
104   ControllerPtr controller = Controller::New();
105   DALI_TEST_CHECK( controller );
106
107   // Configures the text controller similarly to the text-editor.
108   ConfigureTextEditor( controller );
109   DALI_TEST_EQUALS( false, controller->IsTextElideEnabled(), TEST_LOCATION );
110
111   controller->SetTextElideEnabled( true );
112   DALI_TEST_EQUALS( true, controller->IsTextElideEnabled(), TEST_LOCATION );
113
114   // Configures the text controller similarly to the text-field.
115   ConfigureTextField( controller );
116   DALI_TEST_EQUALS( false, controller->IsTextElideEnabled(), TEST_LOCATION );
117
118   controller->SetTextElideEnabled( true );
119   DALI_TEST_EQUALS( true, controller->IsTextElideEnabled(), TEST_LOCATION );
120
121   // Configures the text controller similarly to the text-label.
122   ConfigureTextLabel( controller );
123   DALI_TEST_EQUALS( true, controller->IsTextElideEnabled(), TEST_LOCATION );
124
125   controller->SetTextElideEnabled( false );
126   DALI_TEST_EQUALS( false, controller->IsTextElideEnabled(), TEST_LOCATION );
127
128   tet_result(TET_PASS);
129   END_TEST;
130 }
131
132 int UtcDaliTextControllerEnableCursorBlinking(void)
133 {
134   tet_infoline(" UtcDaliTextControllerEnableCursorBlinking");
135   ToolkitTestApplication application;
136
137   // Creates a text controller.
138   ControllerPtr controller = Controller::New();
139   DALI_TEST_CHECK( controller );
140
141   // There is no text input enabled.
142   DALI_TEST_CHECK( !controller->GetEnableCursorBlink() );
143
144   // Enable the text input.
145   // Creates a decorator.
146   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
147                                                        *controller );
148
149   // Enables the text input.
150   controller->EnableTextInput( decorator );
151
152   // Enables the cursor blink.
153   controller->SetEnableCursorBlink( true );
154
155   DALI_TEST_CHECK( controller->GetEnableCursorBlink() );
156
157   // Disables the cursor blink.
158   controller->SetEnableCursorBlink( false );
159
160   DALI_TEST_CHECK( !controller->GetEnableCursorBlink() );
161
162   tet_result(TET_PASS);
163   END_TEST;
164 }
165
166 int UtcDaliTextControllerImfEvent(void)
167 {
168   tet_infoline(" UtcDaliTextController");
169   ToolkitTestApplication application;
170
171   // Creates a text controller.
172   ControllerPtr controller = Controller::New();
173
174   std::string text;
175   ImfManager::ImfEventData imfEvent;
176
177   DALI_TEST_CHECK( controller );
178
179   // Enable the text input.
180   // Creates a decorator.
181   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
182                                                        *controller );
183
184   // Enables the text input.
185   controller->EnableTextInput( decorator );
186
187   // Creates an ImfManager.
188   ImfManager imfManager = ImfManager::Get();
189
190   // Send VOID event.
191   imfEvent = ImfManager::ImfEventData( ImfManager::VOID, "", 0, 0 );
192   controller->OnImfEvent( imfManager, imfEvent );
193
194   controller->GetText( text );
195   DALI_TEST_CHECK( text.empty() );
196
197   // Send COMMIT event.
198   imfEvent = ImfManager::ImfEventData( ImfManager::COMMIT, "Hello ", 0, 6 );
199   controller->OnImfEvent( imfManager, imfEvent );
200
201   // Force to update the model.
202   controller->GetNaturalSize();
203
204   controller->GetText( text );
205   DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
206
207   // Send PREEDIT event
208   imfEvent = ImfManager::ImfEventData( ImfManager::PREEDIT, "w", 6, 1 );
209   controller->OnImfEvent( imfManager, imfEvent );
210
211   // Force to update the model.
212   controller->GetNaturalSize();
213
214   controller->GetText( text );
215   DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
216
217   // Send DELETESURROUNDING event
218   imfEvent = ImfManager::ImfEventData( ImfManager::DELETESURROUNDING, "", -1, 1 );
219   controller->OnImfEvent( imfManager, imfEvent );
220
221   // Force to update the model.
222   controller->GetNaturalSize();
223
224   controller->GetText( text );
225   DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
226
227   // Send PREEDIT event
228   imfEvent = ImfManager::ImfEventData( ImfManager::PREEDIT, "wo", 6, 2 );
229   controller->OnImfEvent( imfManager, imfEvent );
230
231   // Force to update the model.
232   controller->GetNaturalSize();
233
234   controller->GetText( text );
235   DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
236
237   // Send GETSURROUNDING event
238   imfEvent = ImfManager::ImfEventData( ImfManager::GETSURROUNDING, "", 0, 0 );
239   controller->OnImfEvent( imfManager, imfEvent );
240
241   controller->GetText( text );
242   DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
243
244   tet_result(TET_PASS);
245   END_TEST;
246 }
247
248 int UtcDaliTextControllerTextPopupButtonTouched(void)
249 {
250   tet_infoline(" UtcDaliTextControllerTextPopupButtonTouched");
251   ToolkitTestApplication application;
252
253   // Creates a text controller.
254   ControllerPtr controller = Controller::New();
255
256   DALI_TEST_CHECK( controller );
257
258   std::string text;
259   PushButton button;
260   Property::Map attributes;
261
262   // Enable the text input.
263   // Creates a decorator.
264   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
265                                                        *controller );
266
267   // Enables the text input.
268   controller->EnableTextInput( decorator );
269
270   // Creates the text's popup.
271   TextSelectionPopupCallbackInterface& callbackInterface = *controller;
272   TextSelectionPopup textPopup = TextSelectionPopup::New( &callbackInterface );
273
274   Toolkit::TextSelectionPopup::Buttons buttonsToEnable = static_cast<Toolkit::TextSelectionPopup::Buttons>( TextSelectionPopup::CUT        |
275                                                                                                             TextSelectionPopup::COPY       |
276                                                                                                             TextSelectionPopup::PASTE      |
277                                                                                                             TextSelectionPopup::SELECT     |
278                                                                                                             TextSelectionPopup::SELECT_ALL |
279                                                                                                             TextSelectionPopup::CLIPBOARD );
280
281   textPopup.EnableButtons( buttonsToEnable );
282   Stage::GetCurrent().Add( textPopup );
283   textPopup.ShowPopup();
284
285   // Render and notify
286   application.SendNotification();
287   application.Render();
288
289   // Sets some text.
290   controller->SetText( "Hello world" );
291
292   // Select the whole text.
293   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
294   DALI_TEST_CHECK( button );
295
296   button.DoAction( "buttonClick", attributes );
297
298   // Call relayout to process the input events.
299   controller->Relayout( CONTROL_SIZE );
300
301   // Cut the text.
302   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
303   DALI_TEST_CHECK( button );
304
305   button.DoAction( "buttonClick", attributes );
306
307   // Force to update the model.
308   controller->GetNaturalSize();
309
310   controller->GetText( text );
311   DALI_TEST_CHECK( text.empty() );
312
313   // Set text again.
314   controller->SetText( "Hello world" );
315
316   // Select the whole text.
317   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
318   DALI_TEST_CHECK( button );
319
320   button.DoAction( "buttonClick", attributes );
321
322   // Call relayout to process the input events.
323   controller->Relayout( CONTROL_SIZE );
324
325   // Copy to the clipboard.
326   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_COPY ) );
327   DALI_TEST_CHECK( button );
328
329   button.DoAction( "buttonClick", attributes );
330
331   // Call relayout to process the input events.
332   controller->Relayout( CONTROL_SIZE );
333
334   // Cut the text.
335   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
336   DALI_TEST_CHECK( button );
337
338   button.DoAction( "buttonClick", attributes );
339
340   // Force to update the model.
341   controller->GetNaturalSize();
342
343   controller->GetText( text );
344   DALI_TEST_CHECK( text.empty() );
345
346   ClipboardEventNotifier clipboardEventNotifier = ClipboardEventNotifier::Get();
347   clipboardEventNotifier.ContentSelectedSignal().Connect( &ContentSelectedCallback );
348
349   // Paste the text.
350   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_PASTE ) );
351   DALI_TEST_CHECK( button );
352
353   button.DoAction( "buttonClick", attributes );
354
355   // Call relayout to process the input events.
356   controller->Relayout( CONTROL_SIZE );
357
358   DALI_TEST_EQUALS( "Hello world", gClipboardText, TEST_LOCATION );
359
360   // Show the clipboard.
361   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CLIPBOARD ) );
362   DALI_TEST_CHECK( button );
363
364   button.DoAction( "buttonClick", attributes );
365
366   tet_result(TET_PASS);
367   END_TEST;
368 }
369
370 int UtcDaliTextControllerGetInputShadowProperty(void)
371 {
372   tet_infoline(" UtcDaliTextControllerGetInputShadowProperty");
373   ToolkitTestApplication application;
374
375   // Creates a text controller.
376   ControllerPtr controller = Controller::New();
377
378   DALI_TEST_CHECK( controller );
379
380   const std::string& shadowProperties = controller->GetInputShadowProperties();
381
382   DALI_TEST_CHECK( shadowProperties.empty() );
383
384   tet_result(TET_PASS);
385   END_TEST;
386 }
387
388 int UtcDaliTextControllerGetInputUnderlineProperty(void)
389 {
390   tet_infoline(" UtcDaliTextControllerGetInputUnderlineProperty");
391   ToolkitTestApplication application;
392
393   // Creates a text controller.
394   ControllerPtr controller = Controller::New();
395
396   DALI_TEST_CHECK( controller );
397
398   const std::string& underlineProperties = controller->GetInputUnderlineProperties();
399
400   DALI_TEST_CHECK( underlineProperties.empty() );
401
402   tet_result(TET_PASS);
403   END_TEST;
404 }
405
406 int UtcDaliTextControllerSetGetAutoScrollEnabled(void)
407 {
408   tet_infoline(" UtcDaliTextControllerSetGetAutoScrollEnabled");
409   ToolkitTestApplication application;
410
411   // Creates a text controller.
412   ControllerPtr controller = Controller::New();
413
414   DALI_TEST_CHECK( controller );
415
416   DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
417
418   // The auto scrolling shouldn't be enabled if the multi-line is enabled.
419
420   // Enable multi-line.
421   controller->SetMultiLineEnabled( true );
422
423   // Enable text scrolling.
424   controller->SetAutoScrollEnabled( true );
425
426   DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
427
428   // Disable multi-line.
429   controller->SetMultiLineEnabled( false );
430
431   // Enable text scrolling.
432   controller->SetAutoScrollEnabled( true );
433
434   // Should be ebabled now.
435   DALI_TEST_CHECK( controller->IsAutoScrollEnabled() );
436
437   tet_result(TET_PASS);
438   END_TEST;
439 }
440
441 int UtcDaliTextControllerSetGetCheckProperty(void)
442 {
443   tet_infoline(" UtcDaliTextControllerSetGetCheckProperty");
444   ToolkitTestApplication application;
445
446   // Creates a text controller.
447   ControllerPtr controller = Controller::New();
448
449   DALI_TEST_CHECK( controller );
450
451   // Enable the text input.
452   // Creates a decorator.
453   Text::DecoratorPtr decorator = Text::Decorator::New( *controller, *controller );
454
455   // Enables the text input.
456   controller->EnableTextInput( decorator );
457
458   DALI_TEST_CHECK( !controller->IsInputModePassword() );
459
460   // Set the text input to password.
461   controller->SetInputModePassword( true );
462
463   DALI_TEST_CHECK( controller->IsInputModePassword() );
464
465   // Unset the text input to password.
466   controller->SetInputModePassword( false );
467
468   DALI_TEST_CHECK( !controller->IsInputModePassword() );
469
470   tet_result(TET_PASS);
471   END_TEST;
472 }