2 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
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>
31 using namespace Toolkit;
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.
44 const Size CONTROL_SIZE( 300.f, 60.f );
46 std::string gClipboardText;
47 void ContentSelectedCallback( ClipboardEventNotifier& notifier )
49 gClipboardText = notifier.GetContent();
54 int UtcDaliTextController(void)
56 tet_infoline(" UtcDaliTextController");
57 ToolkitTestApplication application;
59 // Creates a text controller.
60 ControllerPtr controller = Controller::New();
61 DALI_TEST_CHECK( controller );
67 int UtcDaliTextControllerSetGetScrollEnabled(void)
69 tet_infoline(" UtcDaliTextControllerSetGetScrollEnabled");
70 ToolkitTestApplication application;
72 // Creates a text controller.
73 ControllerPtr controller = Controller::New();
74 DALI_TEST_CHECK( controller );
76 // Configures the text controller similarly to the text-editor.
77 ConfigureTextEditor( controller );
79 DALI_TEST_CHECK( !controller->IsHorizontalScrollEnabled() );
80 DALI_TEST_CHECK( controller->IsVerticalScrollEnabled() );
82 // Configures the text controller similarly to the text-field.
83 ConfigureTextField( controller );
85 DALI_TEST_CHECK( controller->IsHorizontalScrollEnabled() );
86 DALI_TEST_CHECK( !controller->IsVerticalScrollEnabled() );
88 // Configures the text controller similarly to the text-label.
89 ConfigureTextLabel( controller );
91 DALI_TEST_CHECK( !controller->IsHorizontalScrollEnabled() );
92 DALI_TEST_CHECK( !controller->IsVerticalScrollEnabled() );
98 int UtcDaliTextControllerSetIsTextElide(void)
100 tet_infoline(" UtcDaliTextControllerSetIsTextElide");
101 ToolkitTestApplication application;
103 // Creates a text controller.
104 ControllerPtr controller = Controller::New();
105 DALI_TEST_CHECK( controller );
107 // Configures the text controller similarly to the text-editor.
108 ConfigureTextEditor( controller );
109 DALI_TEST_EQUALS( false, controller->IsTextElideEnabled(), TEST_LOCATION );
111 controller->SetTextElideEnabled( true );
112 DALI_TEST_EQUALS( true, controller->IsTextElideEnabled(), TEST_LOCATION );
114 // Configures the text controller similarly to the text-field.
115 ConfigureTextField( controller );
116 DALI_TEST_EQUALS( false, controller->IsTextElideEnabled(), TEST_LOCATION );
118 controller->SetTextElideEnabled( true );
119 DALI_TEST_EQUALS( true, controller->IsTextElideEnabled(), TEST_LOCATION );
121 // Configures the text controller similarly to the text-label.
122 ConfigureTextLabel( controller );
123 DALI_TEST_EQUALS( true, controller->IsTextElideEnabled(), TEST_LOCATION );
125 controller->SetTextElideEnabled( false );
126 DALI_TEST_EQUALS( false, controller->IsTextElideEnabled(), TEST_LOCATION );
128 tet_result(TET_PASS);
132 int UtcDaliTextControllerEnableCursorBlinking(void)
134 tet_infoline(" UtcDaliTextControllerEnableCursorBlinking");
135 ToolkitTestApplication application;
137 // Creates a text controller.
138 ControllerPtr controller = Controller::New();
139 DALI_TEST_CHECK( controller );
141 // There is no text input enabled.
142 DALI_TEST_CHECK( !controller->GetEnableCursorBlink() );
144 // Enable the text input.
145 // Creates a decorator.
146 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
149 // Enables the text input.
150 controller->EnableTextInput( decorator );
152 // Enables the cursor blink.
153 controller->SetEnableCursorBlink( true );
155 DALI_TEST_CHECK( controller->GetEnableCursorBlink() );
157 // Disables the cursor blink.
158 controller->SetEnableCursorBlink( false );
160 DALI_TEST_CHECK( !controller->GetEnableCursorBlink() );
162 tet_result(TET_PASS);
166 int UtcDaliTextControllerImfEvent(void)
168 tet_infoline(" UtcDaliTextController");
169 ToolkitTestApplication application;
171 // Creates a text controller.
172 ControllerPtr controller = Controller::New();
175 ImfManager::ImfEventData imfEvent;
177 DALI_TEST_CHECK( controller );
179 // Enable the text input.
180 // Creates a decorator.
181 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
184 // Enables the text input.
185 controller->EnableTextInput( decorator );
187 // Set the placeholder text.
188 controller->SetPlaceholderText( Controller::PLACEHOLDER_TYPE_INACTIVE, "Hello Dali" );
190 // Creates an ImfManager.
191 ImfManager imfManager = ImfManager::Get();
194 imfEvent = ImfManager::ImfEventData( ImfManager::GETSURROUNDING, "", 0, 0 );
195 controller->OnImfEvent( imfManager, imfEvent );
198 imfEvent = ImfManager::ImfEventData( ImfManager::VOID, "", 0, 0 );
199 controller->OnImfEvent( imfManager, imfEvent );
201 controller->GetText( text );
202 DALI_TEST_CHECK( text.empty() );
204 imfEvent = ImfManager::ImfEventData( ImfManager::COMMIT, "Hello ", 0, 6 );
205 controller->OnImfEvent( imfManager, imfEvent );
206 controller->GetNaturalSize();
208 // Check 'Delete All' key which means the input panel send a big range
209 imfEvent = ImfManager::ImfEventData( ImfManager::DELETESURROUNDING, "", -100, 100 );
210 controller->OnImfEvent( imfManager, imfEvent );
211 controller->GetNaturalSize();
213 controller->GetText( text );
214 DALI_TEST_EQUALS( "", text, TEST_LOCATION );
216 // Send COMMIT event.
217 imfEvent = ImfManager::ImfEventData( ImfManager::COMMIT, "Hello ", 0, 6 );
218 controller->OnImfEvent( imfManager, imfEvent );
220 // Force to update the model.
221 controller->GetNaturalSize();
223 controller->GetText( text );
224 DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
226 // Send PREEDIT event
227 imfEvent = ImfManager::ImfEventData( ImfManager::PREEDIT, "w", 6, 1 );
228 controller->OnImfEvent( imfManager, imfEvent );
230 // Force to update the model.
231 controller->GetNaturalSize();
233 controller->GetText( text );
234 DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
236 // Send DELETESURROUNDING event
237 imfEvent = ImfManager::ImfEventData( ImfManager::DELETESURROUNDING, "", -1, 1 );
238 controller->OnImfEvent( imfManager, imfEvent );
240 // Force to update the model.
241 controller->GetNaturalSize();
243 controller->GetText( text );
244 DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
246 // Send PREEDIT event
247 imfEvent = ImfManager::ImfEventData( ImfManager::PREEDIT, "wo", 6, 2 );
248 controller->OnImfEvent( imfManager, imfEvent );
250 // Force to update the model.
251 controller->GetNaturalSize();
253 controller->GetText( text );
254 DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
256 // Send GETSURROUNDING event
257 imfEvent = ImfManager::ImfEventData( ImfManager::GETSURROUNDING, "", 0, 0 );
258 controller->OnImfEvent( imfManager, imfEvent );
260 controller->GetText( text );
261 DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
263 // Send PRIVATECOMMAND event
264 imfEvent = ImfManager::ImfEventData( ImfManager::PRIVATECOMMAND, "", 0, 0 );
265 controller->OnImfEvent( imfManager, imfEvent );
267 controller->GetText( text );
268 DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
270 tet_result(TET_PASS);
274 int UtcDaliTextControllerTextPopupButtonTouched(void)
276 tet_infoline(" UtcDaliTextControllerTextPopupButtonTouched");
277 ToolkitTestApplication application;
279 // Creates a text controller.
280 ControllerPtr controller = Controller::New();
282 DALI_TEST_CHECK( controller );
286 Property::Map attributes;
288 // Enable the text input.
289 // Creates a decorator.
290 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
293 // Enables the text input.
294 controller->EnableTextInput( decorator );
296 // Creates the text's popup.
297 TextSelectionPopupCallbackInterface& callbackInterface = *controller;
298 TextSelectionPopup textPopup = TextSelectionPopup::New( &callbackInterface );
300 Toolkit::TextSelectionPopup::Buttons buttonsToEnable = static_cast<Toolkit::TextSelectionPopup::Buttons>( TextSelectionPopup::CUT |
301 TextSelectionPopup::COPY |
302 TextSelectionPopup::PASTE |
303 TextSelectionPopup::SELECT |
304 TextSelectionPopup::SELECT_ALL |
305 TextSelectionPopup::CLIPBOARD );
307 textPopup.EnableButtons( buttonsToEnable );
308 Stage::GetCurrent().Add( textPopup );
309 textPopup.ShowPopup();
312 application.SendNotification();
313 application.Render();
316 controller->SetText( "Hello world" );
318 // Select the whole text.
319 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
320 DALI_TEST_CHECK( button );
322 button.DoAction( "buttonClick", attributes );
324 // Call relayout to process the input events.
325 controller->Relayout( CONTROL_SIZE );
328 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
329 DALI_TEST_CHECK( button );
331 button.DoAction( "buttonClick", attributes );
333 // Force to update the model.
334 controller->GetNaturalSize();
336 controller->GetText( text );
337 DALI_TEST_CHECK( text.empty() );
340 controller->SetText( "Hello world" );
342 // Select the whole text.
343 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
344 DALI_TEST_CHECK( button );
346 button.DoAction( "buttonClick", attributes );
348 // Call relayout to process the input events.
349 controller->Relayout( CONTROL_SIZE );
351 // Copy to the clipboard.
352 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_COPY ) );
353 DALI_TEST_CHECK( button );
355 button.DoAction( "buttonClick", attributes );
357 // Call relayout to process the input events.
358 controller->Relayout( CONTROL_SIZE );
361 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
362 DALI_TEST_CHECK( button );
364 button.DoAction( "buttonClick", attributes );
366 // Force to update the model.
367 controller->GetNaturalSize();
369 controller->GetText( text );
370 DALI_TEST_CHECK( text.empty() );
372 ClipboardEventNotifier clipboardEventNotifier = ClipboardEventNotifier::Get();
373 clipboardEventNotifier.ContentSelectedSignal().Connect( &ContentSelectedCallback );
376 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_PASTE ) );
377 DALI_TEST_CHECK( button );
379 button.DoAction( "buttonClick", attributes );
381 // Call relayout to process the input events.
382 controller->Relayout( CONTROL_SIZE );
384 DALI_TEST_EQUALS( "Hello world", gClipboardText, TEST_LOCATION );
386 // Show the clipboard.
387 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CLIPBOARD ) );
388 DALI_TEST_CHECK( button );
390 button.DoAction( "buttonClick", attributes );
392 tet_result(TET_PASS);
396 int UtcDaliTextControllerGetInputShadowProperty(void)
398 tet_infoline(" UtcDaliTextControllerGetInputShadowProperty");
399 ToolkitTestApplication application;
401 // Creates a text controller.
402 ControllerPtr controller = Controller::New();
404 DALI_TEST_CHECK( controller );
406 const std::string& shadowProperties = controller->GetInputShadowProperties();
408 DALI_TEST_CHECK( shadowProperties.empty() );
410 tet_result(TET_PASS);
414 int UtcDaliTextControllerGetInputUnderlineProperty(void)
416 tet_infoline(" UtcDaliTextControllerGetInputUnderlineProperty");
417 ToolkitTestApplication application;
419 // Creates a text controller.
420 ControllerPtr controller = Controller::New();
422 DALI_TEST_CHECK( controller );
424 const std::string& underlineProperties = controller->GetInputUnderlineProperties();
426 DALI_TEST_CHECK( underlineProperties.empty() );
428 tet_result(TET_PASS);
432 int UtcDaliTextControllerSetGetAutoScrollEnabled(void)
434 tet_infoline(" UtcDaliTextControllerSetGetAutoScrollEnabled");
435 ToolkitTestApplication application;
437 // Creates a text controller.
438 ControllerPtr controller = Controller::New();
440 DALI_TEST_CHECK( controller );
442 DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
444 // The auto scrolling shouldn't be enabled if the multi-line is enabled.
446 // Enable multi-line.
447 controller->SetMultiLineEnabled( true );
449 // Enable text scrolling.
450 controller->SetAutoScrollEnabled( true );
452 DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
454 // Disable multi-line.
455 controller->SetMultiLineEnabled( false );
457 // Enable text scrolling.
458 controller->SetAutoScrollEnabled( true );
460 // Should be ebabled now.
461 DALI_TEST_CHECK( controller->IsAutoScrollEnabled() );
463 tet_result(TET_PASS);
467 int UtcDaliTextControllerSetGetCheckProperty(void)
469 tet_infoline(" UtcDaliTextControllerSetGetCheckProperty");
470 ToolkitTestApplication application;
472 // Creates a text controller.
473 ControllerPtr controller = Controller::New();
475 DALI_TEST_CHECK( controller );
477 // Enable the text input.
478 // Creates a decorator.
479 Text::DecoratorPtr decorator = Text::Decorator::New( *controller, *controller );
481 // Enables the text input.
482 controller->EnableTextInput( decorator );
484 DALI_TEST_CHECK( !controller->IsInputModePassword() );
486 // Set the text input to password.
487 controller->SetInputModePassword( true );
489 DALI_TEST_CHECK( controller->IsInputModePassword() );
491 // Unset the text input to password.
492 controller->SetInputModePassword( false );
494 DALI_TEST_CHECK( !controller->IsInputModePassword() );
496 tet_result(TET_PASS);
500 int UtcDaliTextControllerSetGetTapLongPressAction(void)
502 tet_infoline(" UtcDaliTextControllerSetGetTapLongPressAction");
503 ToolkitTestApplication application;
505 // Creates a text controller.
506 ControllerPtr controller = Controller::New();
508 DALI_TEST_CHECK( controller );
510 // Test first with no decorator.
512 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
513 controller->SetNoTextDoubleTapAction( Controller::NoTextTap::HIGHLIGHT );
514 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
516 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextLongPressAction(), TEST_LOCATION );
517 controller->SetNoTextLongPressAction( Controller::NoTextTap::HIGHLIGHT );
518 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextLongPressAction(), TEST_LOCATION );
520 // Add a decorator and re-test.
522 // Creates a decorator.
523 Text::DecoratorPtr decorator = Text::Decorator::New( *controller, *controller );
525 // Enables the text input.
526 controller->EnableTextInput( decorator );
528 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
529 controller->SetNoTextDoubleTapAction( Controller::NoTextTap::HIGHLIGHT );
530 DALI_TEST_EQUALS( Controller::NoTextTap::HIGHLIGHT, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
532 DALI_TEST_EQUALS( Controller::NoTextTap::SHOW_SELECTION_POPUP, controller->GetNoTextLongPressAction(), TEST_LOCATION ); // The default is SHOW_SELECTION_POPUP
533 controller->SetNoTextLongPressAction( Controller::NoTextTap::HIGHLIGHT );
534 DALI_TEST_EQUALS( Controller::NoTextTap::HIGHLIGHT, controller->GetNoTextLongPressAction(), TEST_LOCATION );
539 int UtcDaliTextControllerSetGetLineSpacingProperty(void)
541 tet_infoline(" UtcDaliTextControllerSetGetLineSpacingProperty");
542 ToolkitTestApplication application;
544 const Size size( Dali::Stage::GetCurrent().GetSize() );
547 const std::string textSingle("A Quick Brown Fox Jumps Over The Lazy Dog");
550 const std::string textMulti("A Quick Brown\nFox Jumps Over\nThe Lazy Dog");
552 // Creates a text controller.
553 ControllerPtr controller = Controller::New();
555 ConfigureTextLabel(controller);
557 // single line, line spacing = 0px
559 const float EXPECTED_SPACING = 0.0f;
560 const Vector2 EXPECTED_LAYOUT_SIZE( 326.0f, 19.0f);
561 const Vector3 EXPECTED_NATURAL_SIZE( 326.0f, 20.0f, 0.0f );
563 controller->SetText(textSingle);
564 controller->Relayout(size);
565 controller->SetMultiLineEnabled( false );
567 Vector3 naturalSize = controller->GetNaturalSize();
568 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
569 float lineSpacing0 = controller->GetDefaultLineSpacing();
571 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
572 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
573 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
576 // single line, line spacing = 20px
578 const float EXPECTED_SPACING = 20.0f;
579 const Vector2 EXPECTED_LAYOUT_SIZE( 326.0f, 19.0f );
580 const Vector3 EXPECTED_NATURAL_SIZE( 326.0f, 40.0f, 0.0f );
582 controller->SetText(textSingle);
583 controller->Relayout(size);
584 controller->SetDefaultLineSpacing( 20 );
585 controller->SetMultiLineEnabled( false );
587 Vector3 naturalSize = controller->GetNaturalSize();
588 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
589 float lineSpacing0 = controller->GetDefaultLineSpacing();
591 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
592 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
593 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
596 // multi-line, line spacing = 0px
598 const float EXPECTED_SPACING = 0.0f;
599 const Vector2 EXPECTED_LAYOUT_SIZE( 318.0f, 39.0f );
600 const Vector3 EXPECTED_NATURAL_SIZE( 116.0f, 58.0f, 0.0f );
602 controller->SetText(textMulti);
603 controller->Relayout(size);
604 controller->SetMultiLineEnabled( true );
605 controller->SetDefaultLineSpacing( 0 );
607 Vector3 naturalSize = controller->GetNaturalSize();
608 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
609 float lineSpacing0 = controller->GetDefaultLineSpacing();
611 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
612 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
613 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
616 // multi-line, line spacing = 20px
618 const float EXPECTED_SPACING = 20.0f;
619 const Vector2 EXPECTED_LAYOUT_SIZE( 115.0f, 57.0f );
620 const Vector3 EXPECTED_NATURAL_SIZE( 116.0f, 118.0f, 0.0f );
622 controller->SetText(textMulti);
623 controller->Relayout(size);
624 controller->SetMultiLineEnabled( true );
625 controller->SetDefaultLineSpacing( 20 );
627 Vector3 naturalSize = controller->GetNaturalSize();
628 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
629 float lineSpacing0 = controller->GetDefaultLineSpacing();
631 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
632 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
633 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
636 // multi-line, line spacing = 30px
638 const float EXPECTED_SPACING = 30.0f;
639 const Vector2 EXPECTED_LAYOUT_SIZE( 115.0f, 117.0f );
640 const Vector3 EXPECTED_NATURAL_SIZE( 116.0f, 148.0f, 0.0f );
642 controller->SetText(textMulti);
643 controller->Relayout(size);
644 controller->SetMultiLineEnabled( true );
645 controller->SetDefaultLineSpacing( 30 );
647 Vector3 naturalSize = controller->GetNaturalSize();
648 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
649 float lineSpacing0 = controller->GetDefaultLineSpacing();
651 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
652 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
653 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );