2 * Copyright (c) 2020 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/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>
34 using namespace Toolkit;
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.
46 const Size CONTROL_SIZE( 300.f, 60.f );
48 std::string gClipboardText;
49 void ContentSelectedCallback( ClipboardEventNotifier& notifier )
51 gClipboardText = notifier.GetContent();
54 // Generate a KeyEvent to send to Core.
55 Dali::KeyEvent GenerateKey( const std::string& keyName,
56 const std::string& keyString,
59 unsigned long timeStamp,
60 const Dali::KeyEvent::State& keyState )
62 return DevelKeyEvent::New( keyName, "", keyString, keyCode, keyModifier, timeStamp, keyState, "", "", Device::Class::NONE, Device::Subclass::NONE );
67 int UtcDaliTextController(void)
69 tet_infoline(" UtcDaliTextController");
70 ToolkitTestApplication application;
72 // Creates a text controller.
73 ControllerPtr controller = Controller::New();
74 DALI_TEST_CHECK( controller );
80 int UtcDaliTextControllerSetGetScrollEnabled(void)
82 tet_infoline(" UtcDaliTextControllerSetGetScrollEnabled");
83 ToolkitTestApplication application;
85 // Creates a text controller.
86 ControllerPtr controller = Controller::New();
87 DALI_TEST_CHECK( controller );
89 // Configures the text controller similarly to the text-editor.
90 ConfigureTextEditor( controller );
92 DALI_TEST_CHECK( !controller->IsHorizontalScrollEnabled() );
93 DALI_TEST_CHECK( controller->IsVerticalScrollEnabled() );
95 // Configures the text controller similarly to the text-field.
96 ConfigureTextField( controller );
98 DALI_TEST_CHECK( controller->IsHorizontalScrollEnabled() );
99 DALI_TEST_CHECK( !controller->IsVerticalScrollEnabled() );
101 // Configures the text controller similarly to the text-label.
102 ConfigureTextLabel( controller );
104 DALI_TEST_CHECK( !controller->IsHorizontalScrollEnabled() );
105 DALI_TEST_CHECK( !controller->IsVerticalScrollEnabled() );
107 tet_result(TET_PASS);
111 int UtcDaliTextControllerSetIsTextElide(void)
113 tet_infoline(" UtcDaliTextControllerSetIsTextElide");
114 ToolkitTestApplication application;
116 // Creates a text controller.
117 ControllerPtr controller = Controller::New();
118 DALI_TEST_CHECK( controller );
120 // Configures the text controller similarly to the text-editor.
121 ConfigureTextEditor( controller );
122 DALI_TEST_EQUALS( false, controller->IsTextElideEnabled(), TEST_LOCATION );
124 controller->SetTextElideEnabled( true );
125 DALI_TEST_EQUALS( true, controller->IsTextElideEnabled(), TEST_LOCATION );
127 // Configures the text controller similarly to the text-field.
128 ConfigureTextField( controller );
129 DALI_TEST_EQUALS( false, controller->IsTextElideEnabled(), TEST_LOCATION );
131 controller->SetTextElideEnabled( true );
132 DALI_TEST_EQUALS( true, controller->IsTextElideEnabled(), TEST_LOCATION );
134 // Configures the text controller similarly to the text-label.
135 ConfigureTextLabel( controller );
136 DALI_TEST_EQUALS( true, controller->IsTextElideEnabled(), TEST_LOCATION );
138 controller->SetTextElideEnabled( false );
139 DALI_TEST_EQUALS( false, controller->IsTextElideEnabled(), TEST_LOCATION );
141 tet_result(TET_PASS);
145 int UtcDaliTextControllerEnableCursorBlinking(void)
147 tet_infoline(" UtcDaliTextControllerEnableCursorBlinking");
148 ToolkitTestApplication application;
150 // Creates a text controller.
151 ControllerPtr controller = Controller::New();
152 DALI_TEST_CHECK( controller );
154 // There is no text input enabled.
155 DALI_TEST_CHECK( !controller->GetEnableCursorBlink() );
157 // Enable the text input.
158 // Creates a decorator.
159 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
161 InputMethodContext inputMethodContext = InputMethodContext::New();
162 // Enables the text input.
163 controller->EnableTextInput( decorator, inputMethodContext );
165 // Enables the cursor blink.
166 controller->SetEnableCursorBlink( true );
168 DALI_TEST_CHECK( controller->GetEnableCursorBlink() );
170 // Disables the cursor blink.
171 controller->SetEnableCursorBlink( false );
173 DALI_TEST_CHECK( !controller->GetEnableCursorBlink() );
175 tet_result(TET_PASS);
179 int UtcDaliTextControllerImfEvent(void)
181 tet_infoline(" UtcDaliTextController");
182 ToolkitTestApplication application;
184 // Creates a text controller.
185 ControllerPtr controller = Controller::New();
188 InputMethodContext::EventData imfEvent;
190 DALI_TEST_CHECK( controller );
192 // Enable the text input.
193 // Creates a decorator.
194 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
197 InputMethodContext inputMethodContext = InputMethodContext::New();
198 // Enables the text input.
199 controller->EnableTextInput( decorator, inputMethodContext );
201 // Set the placeholder text.
202 controller->SetPlaceholderText( Controller::PLACEHOLDER_TYPE_INACTIVE, "Hello Dali" );
205 imfEvent = InputMethodContext::EventData( InputMethodContext::GET_SURROUNDING, "", 0, 0 );
206 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
209 imfEvent = InputMethodContext::EventData( InputMethodContext::VOID, "", 0, 0 );
210 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
212 controller->GetText( text );
213 DALI_TEST_CHECK( text.empty() );
215 imfEvent = InputMethodContext::EventData( InputMethodContext::COMMIT, "Hello ", 0, 6 );
216 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
217 controller->GetNaturalSize();
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();
224 controller->GetText( text );
225 DALI_TEST_EQUALS( "", text, TEST_LOCATION );
227 // Send COMMIT event.
228 imfEvent = InputMethodContext::EventData( InputMethodContext::COMMIT, "Hello ", 0, 6 );
229 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
231 // Force to update the model.
232 controller->GetNaturalSize();
234 controller->GetText( text );
235 DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
237 // Send PRE_EDIT event
238 imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
239 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
241 // Force to update the model.
242 controller->GetNaturalSize();
244 controller->GetText( text );
245 DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
247 // Send DELETE_SURROUNDING event
248 imfEvent = InputMethodContext::EventData( InputMethodContext::DELETE_SURROUNDING, "", -1, 1 );
249 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
251 // Force to update the model.
252 controller->GetNaturalSize();
254 controller->GetText( text );
255 DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
258 inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::UNDERLINE );
260 // Send PRE_EDIT event
261 imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "wo", 6, 2 );
262 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
264 // Force to update the model.
265 controller->GetNaturalSize();
267 controller->GetText( text );
268 DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
270 // Send GET_SURROUNDING event
271 imfEvent = InputMethodContext::EventData( InputMethodContext::GET_SURROUNDING, "", 0, 0 );
272 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
274 controller->GetText( text );
275 DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
277 // Send PRIVATE_COMMAND event
278 imfEvent = InputMethodContext::EventData( InputMethodContext::PRIVATE_COMMAND, "", 0, 0 );
279 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
281 controller->GetText( text );
282 DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
284 tet_result(TET_PASS);
288 int UtcDaliTextControllerImfPreeditStyle(void)
290 tet_infoline(" UtcDaliTextControllerImfPreeditStyle");
291 ToolkitTestApplication application;
293 // Creates a text controller.
294 ControllerPtr controller = Controller::New();
297 InputMethodContext::EventData imfEvent;
299 DALI_TEST_CHECK( controller );
301 // Configures the text controller similarly to the text-field.
302 ConfigureTextField( controller );
304 InputMethodContext inputMethodContext = InputMethodContext::New();
306 // Send COMMIT event.
307 imfEvent = InputMethodContext::EventData( InputMethodContext::COMMIT, "Hello ", 0, 6 );
308 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
310 // Force to update the model.
311 controller->GetNaturalSize();
313 controller->GetText( text );
314 DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
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();
322 controller->GetText( text );
323 DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
325 imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
326 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
328 // Set the preedit style as REVERSE
329 inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::REVERSE );
330 controller->GetNaturalSize();
332 controller->GetText( text );
333 DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
335 imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
336 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
338 // Set the preedit style as HIGHLIGHT
339 inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::HIGHLIGHT );
340 controller->GetNaturalSize();
342 controller->GetText( text );
343 DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
345 imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
346 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
348 // Set the preedit style as CUSTOM_PLATFORM_STYLE_1
349 inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_1 );
350 controller->GetNaturalSize();
352 controller->GetText( text );
353 DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
355 imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
356 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
358 // Set the preedit style as CUSTOM_PLATFORM_STYLE_2
359 inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_2 );
360 controller->GetNaturalSize();
362 controller->GetText( text );
363 DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
365 imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
366 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
368 // Set the preedit style as CUSTOM_PLATFORM_STYLE_3
369 inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_3 );
370 controller->GetNaturalSize();
372 controller->GetText( text );
373 DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
375 imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
376 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
378 // Set the preedit style as CUSTOM_PLATFORM_STYLE_4
379 inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_4 );
380 controller->GetNaturalSize();
382 controller->GetText( text );
383 DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
385 tet_result(TET_PASS);
389 int UtcDaliTextControllerTextPopupButtonTouched(void)
391 tet_infoline(" UtcDaliTextControllerTextPopupButtonTouched");
392 ToolkitTestApplication application;
394 // Creates a text controller.
395 ControllerPtr controller = Controller::New();
397 DALI_TEST_CHECK( controller );
401 Property::Map attributes;
403 // Enable the text input.
404 // Creates a decorator.
405 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
408 InputMethodContext inputMethodContext = InputMethodContext::New();
409 // Enables the text input.
410 controller->EnableTextInput( decorator, inputMethodContext );
412 // Creates the text's popup.
413 TextSelectionPopupCallbackInterface& callbackInterface = *controller;
414 TextSelectionPopup textPopup = TextSelectionPopup::New( &callbackInterface );
416 Toolkit::TextSelectionPopup::Buttons buttonsToEnable = static_cast<Toolkit::TextSelectionPopup::Buttons>( TextSelectionPopup::CUT |
417 TextSelectionPopup::COPY |
418 TextSelectionPopup::PASTE |
419 TextSelectionPopup::SELECT |
420 TextSelectionPopup::SELECT_ALL |
421 TextSelectionPopup::CLIPBOARD );
423 textPopup.EnableButtons( buttonsToEnable );
424 application.GetScene().Add( textPopup );
425 textPopup.ShowPopup();
428 application.SendNotification();
429 application.Render();
432 controller->SetText( "Hello world" );
434 // Select the whole text.
435 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
436 DALI_TEST_CHECK( button );
438 button.DoAction( "buttonClick", attributes );
440 // Call relayout to process the input events.
441 controller->Relayout( CONTROL_SIZE );
444 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
445 DALI_TEST_CHECK( button );
447 button.DoAction( "buttonClick", attributes );
449 // Force to update the model.
450 controller->GetNaturalSize();
452 controller->GetText( text );
453 DALI_TEST_CHECK( text.empty() );
456 controller->SetText( "Hello world" );
458 // Select the whole text.
459 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
460 DALI_TEST_CHECK( button );
462 button.DoAction( "buttonClick", attributes );
464 // Call relayout to process the input events.
465 controller->Relayout( CONTROL_SIZE );
467 // Copy to the clipboard.
468 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_COPY ) );
469 DALI_TEST_CHECK( button );
471 button.DoAction( "buttonClick", attributes );
473 // Call relayout to process the input events.
474 controller->Relayout( CONTROL_SIZE );
477 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
478 DALI_TEST_CHECK( button );
480 button.DoAction( "buttonClick", attributes );
482 // Force to update the model.
483 controller->GetNaturalSize();
485 controller->GetText( text );
486 DALI_TEST_CHECK( text.empty() );
488 ClipboardEventNotifier clipboardEventNotifier = ClipboardEventNotifier::Get();
489 clipboardEventNotifier.ContentSelectedSignal().Connect( &ContentSelectedCallback );
492 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_PASTE ) );
493 DALI_TEST_CHECK( button );
495 button.DoAction( "buttonClick", attributes );
497 // Call relayout to process the input events.
498 controller->Relayout( CONTROL_SIZE );
500 DALI_TEST_EQUALS( "Hello world", gClipboardText, TEST_LOCATION );
502 // Show the clipboard.
503 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CLIPBOARD ) );
504 DALI_TEST_CHECK( button );
506 button.DoAction( "buttonClick", attributes );
508 tet_result(TET_PASS);
512 int UtcDaliTextControllerGetInputShadowProperty(void)
514 tet_infoline(" UtcDaliTextControllerGetInputShadowProperty");
515 ToolkitTestApplication application;
517 // Creates a text controller.
518 ControllerPtr controller = Controller::New();
520 DALI_TEST_CHECK( controller );
522 const std::string& shadowProperties = controller->GetInputShadowProperties();
524 DALI_TEST_CHECK( shadowProperties.empty() );
526 tet_result(TET_PASS);
530 int UtcDaliTextControllerGetInputUnderlineProperty(void)
532 tet_infoline(" UtcDaliTextControllerGetInputUnderlineProperty");
533 ToolkitTestApplication application;
535 // Creates a text controller.
536 ControllerPtr controller = Controller::New();
538 DALI_TEST_CHECK( controller );
540 const std::string& underlineProperties = controller->GetInputUnderlineProperties();
542 DALI_TEST_CHECK( underlineProperties.empty() );
544 tet_result(TET_PASS);
548 int UtcDaliTextControllerSetGetAutoScrollEnabled(void)
550 tet_infoline(" UtcDaliTextControllerSetGetAutoScrollEnabled");
551 ToolkitTestApplication application;
553 // Creates a text controller.
554 ControllerPtr controller = Controller::New();
556 DALI_TEST_CHECK( controller );
558 DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
560 // The auto scrolling shouldn't be enabled if the multi-line is enabled.
562 // Enable multi-line.
563 controller->SetMultiLineEnabled( true );
565 // Enable text scrolling.
566 controller->SetAutoScrollEnabled( true );
568 DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
570 // Disable multi-line.
571 controller->SetMultiLineEnabled( false );
573 // Enable text scrolling.
574 controller->SetAutoScrollEnabled( true );
576 // Should be ebabled now.
577 DALI_TEST_CHECK( controller->IsAutoScrollEnabled() );
579 tet_result(TET_PASS);
583 int UtcDaliTextControllerSetGetCheckProperty(void)
585 tet_infoline(" UtcDaliTextControllerSetGetCheckProperty");
586 ToolkitTestApplication application;
588 // Creates a text controller.
589 ControllerPtr controller = Controller::New();
591 DALI_TEST_CHECK( controller );
593 // Enable the text input.
594 // Creates a decorator.
595 Text::DecoratorPtr decorator = Text::Decorator::New( *controller, *controller );
597 InputMethodContext inputMethodContext = InputMethodContext::New();
598 // Enables the text input.
599 controller->EnableTextInput( decorator, inputMethodContext );
601 DALI_TEST_CHECK( !controller->IsInputModePassword() );
603 // Set the text input to password.
604 controller->SetInputModePassword( true );
606 DALI_TEST_CHECK( controller->IsInputModePassword() );
608 // Unset the text input to password.
609 controller->SetInputModePassword( false );
611 DALI_TEST_CHECK( !controller->IsInputModePassword() );
613 tet_result(TET_PASS);
617 int UtcDaliTextControllerSetGetTapLongPressAction(void)
619 tet_infoline(" UtcDaliTextControllerSetGetTapLongPressAction");
620 ToolkitTestApplication application;
622 // Creates a text controller.
623 ControllerPtr controller = Controller::New();
625 DALI_TEST_CHECK( controller );
627 // Test first with no decorator.
629 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
630 controller->SetNoTextDoubleTapAction( Controller::NoTextTap::HIGHLIGHT );
631 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
633 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextLongPressAction(), TEST_LOCATION );
634 controller->SetNoTextLongPressAction( Controller::NoTextTap::HIGHLIGHT );
635 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextLongPressAction(), TEST_LOCATION );
637 // Add a decorator and re-test.
639 // Creates a decorator.
640 Text::DecoratorPtr decorator = Text::Decorator::New( *controller, *controller );
642 InputMethodContext inputMethodContext = InputMethodContext::New();
643 // Enables the text input.
644 controller->EnableTextInput( decorator, inputMethodContext );
646 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
647 controller->SetNoTextDoubleTapAction( Controller::NoTextTap::HIGHLIGHT );
648 DALI_TEST_EQUALS( Controller::NoTextTap::HIGHLIGHT, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
650 DALI_TEST_EQUALS( Controller::NoTextTap::SHOW_SELECTION_POPUP, controller->GetNoTextLongPressAction(), TEST_LOCATION ); // The default is SHOW_SELECTION_POPUP
651 controller->SetNoTextLongPressAction( Controller::NoTextTap::HIGHLIGHT );
652 DALI_TEST_EQUALS( Controller::NoTextTap::HIGHLIGHT, controller->GetNoTextLongPressAction(), TEST_LOCATION );
657 int UtcDaliTextControllerSetGetLineSpacingProperty(void)
659 tet_infoline(" UtcDaliTextControllerSetGetLineSpacingProperty");
660 ToolkitTestApplication application;
662 const Size size( application.GetScene().GetSize() );
665 const std::string textSingle("A Quick Brown Fox Jumps Over The Lazy Dog");
668 const std::string textMulti("A Quick Brown\nFox Jumps Over\nThe Lazy Dog");
670 // Creates a text controller.
671 ControllerPtr controller = Controller::New();
673 ConfigureTextLabel(controller);
675 // single line, line spacing = 0px
677 const float EXPECTED_SPACING = 0.0f;
678 const Vector2 EXPECTED_LAYOUT_SIZE( 360.0f, 19.0f);
679 const Vector3 EXPECTED_NATURAL_SIZE( 360.0f, 20.0f, 0.0f );
681 controller->SetText(textSingle);
682 controller->Relayout(size);
683 controller->SetMultiLineEnabled( false );
685 Vector3 naturalSize = controller->GetNaturalSize();
686 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
687 float lineSpacing0 = controller->GetDefaultLineSpacing();
689 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
690 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
691 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
694 // single line, line spacing = 20px
696 const float EXPECTED_SPACING = 20.0f;
697 const Vector2 EXPECTED_LAYOUT_SIZE( 360.0f, 19.0f );
698 const Vector3 EXPECTED_NATURAL_SIZE( 360.0f, 40.0f, 0.0f );
700 controller->SetText(textSingle);
701 controller->Relayout(size);
702 controller->SetDefaultLineSpacing( 20 );
703 controller->SetMultiLineEnabled( false );
705 Vector3 naturalSize = controller->GetNaturalSize();
706 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
707 float lineSpacing0 = controller->GetDefaultLineSpacing();
709 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
710 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
711 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
714 // multi-line, line spacing = 0px
716 const float EXPECTED_SPACING = 0.0f;
717 const Vector2 EXPECTED_LAYOUT_SIZE( 350.0f, 39.0f );
718 const Vector3 EXPECTED_NATURAL_SIZE( 124.0f, 58.0f, 0.0f );
720 controller->SetText(textMulti);
721 controller->Relayout(size);
722 controller->SetMultiLineEnabled( true );
723 controller->SetDefaultLineSpacing( 0 );
725 Vector3 naturalSize = controller->GetNaturalSize();
726 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
727 float lineSpacing0 = controller->GetDefaultLineSpacing();
729 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
730 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
731 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
734 // multi-line, line spacing = 20px
736 const float EXPECTED_SPACING = 20.0f;
737 const Vector2 EXPECTED_LAYOUT_SIZE( 124.0f, 57.0f );
738 const Vector3 EXPECTED_NATURAL_SIZE( 124.0f, 118.0f, 0.0f );
740 controller->SetText(textMulti);
741 controller->Relayout(size);
742 controller->SetMultiLineEnabled( true );
743 controller->SetDefaultLineSpacing( 20 );
745 Vector3 naturalSize = controller->GetNaturalSize();
746 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
747 float lineSpacing0 = controller->GetDefaultLineSpacing();
749 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
750 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
751 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
754 // multi-line, line spacing = 30px
756 const float EXPECTED_SPACING = 30.0f;
757 const Vector2 EXPECTED_LAYOUT_SIZE( 124.0f, 117.0f );
758 const Vector3 EXPECTED_NATURAL_SIZE( 124.0f, 148.0f, 0.0f );
760 controller->SetText(textMulti);
761 controller->Relayout(size);
762 controller->SetMultiLineEnabled( true );
763 controller->SetDefaultLineSpacing( 30 );
765 Vector3 naturalSize = controller->GetNaturalSize();
766 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
767 float lineSpacing0 = controller->GetDefaultLineSpacing();
769 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
770 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
771 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
779 int UtcDaliTextControllerCheckBufferIndices(void)
781 tet_infoline(" UtcDaliTextControllerCheckBufferIndices");
782 ToolkitTestApplication application;
784 // Creates a text controller.
785 ControllerPtr controller = Controller::New();
787 ConfigureTextLabel(controller);
790 const std::string text("A Quick Brown Fox Jumps Over The Lazy Dog");
791 controller->SetText(text);
793 // Get the implementation of the text controller
794 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
796 // Tweak some parameters to make the indices to access the text buffer invalid
797 mImpl.mTextUpdateInfo.mNumberOfCharactersToAdd = mImpl.mModel->mLogicalModel->mText.Count() * 10u;
798 mImpl.mTextUpdateInfo.mNumberOfCharactersToRemove = 0u;
799 mImpl.mTextUpdateInfo.mPreviousNumberOfCharacters = 0u;
800 mImpl.mOperationsPending = Controller::ALL_OPERATIONS;
802 // Perform a relayout
803 const Size size( application.GetScene().GetSize() );
804 controller->Relayout(size);
806 tet_result(TET_PASS);
811 int UtcDaliTextControllerCheckInputColorChanged(void)
813 tet_infoline(" UtcDaliTextControllerCheckInputColorChanged");
814 ToolkitTestApplication application;
816 // Creates a text controller.
817 ControllerPtr controller = Controller::New();
819 ConfigureTextLabel(controller);
821 // Enable the text input.
822 // Creates a decorator.
823 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
825 InputMethodContext inputMethodContext = InputMethodContext::New();
826 // Enables the text input.
827 controller->EnableTextInput( decorator, inputMethodContext );
830 const std::string text("Hello World!");
831 controller->SetText(text);
833 const Vector4 inputColor( 0.0f, 0.0f, 0.0f, 1.0f );
834 controller->SetInputColor( inputColor );
836 // Get the implementation of the text controller
837 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
840 mImpl.mOperationsPending = Controller::NO_OPERATION;
842 // simulate a key event.
843 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
845 // change the input color
846 const Vector4 newInputColor( 1.0f, 0.0f, 0.0f, 1.0f );
847 controller->SetInputColor( newInputColor );
849 // Check if relayout is requested or not when event state is INACTIVE.
850 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
851 DALI_TEST_EQUALS( Controller::COLOR, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::COLOR ), TEST_LOCATION );
853 // Perform a relayout
854 const Size size( application.GetScene().GetSize() );
855 controller->Relayout(size);
857 tet_result(TET_PASS);
862 int UtcDaliTextControllerCheckInputFontFamilyChanged(void)
864 tet_infoline(" UtcDaliTextControllerCheckInputFontFamilyChanged");
865 ToolkitTestApplication application;
867 // Creates a text controller.
868 ControllerPtr controller = Controller::New();
870 ConfigureTextLabel(controller);
872 // Enable the text input.
873 // Creates a decorator.
874 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
876 InputMethodContext inputMethodContext = InputMethodContext::New();
877 // Enables the text input.
878 controller->EnableTextInput( decorator, inputMethodContext );
880 // Set the text and font family
881 const std::string text("Hello World!");
882 controller->SetText(text);
883 controller->SetInputFontFamily("SamsungOneUI_200");
885 // Get the implementation of the text controller
886 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
889 mImpl.mOperationsPending = Controller::NO_OPERATION;
891 // simulate a key event.
892 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
894 // change the input font family
895 controller->SetInputFontFamily("SamsungOneUI_300");
897 // Check if relayout is requested or not when event state is INACTIVE.
898 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
899 DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
902 // Perform a relayout
903 const Size size( application.GetScene().GetSize() );
904 controller->Relayout(size);
906 tet_result(TET_PASS);
911 int UtcDaliTextControllerCheckInputFontWeightChanged(void)
913 tet_infoline(" UtcDaliTextControllerCheckInputFontWeightChanged");
914 ToolkitTestApplication application;
916 // Creates a text controller.
917 ControllerPtr controller = Controller::New();
919 ConfigureTextLabel(controller);
921 // Enable the text input.
922 // Creates a decorator.
923 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
925 InputMethodContext inputMethodContext = InputMethodContext::New();
926 // Enables the text input.
927 controller->EnableTextInput( decorator, inputMethodContext );
930 const std::string text("Hello World!");
931 controller->SetText(text);
932 controller->SetInputFontWeight( TextAbstraction::FontWeight::NORMAL );
934 // Get the implementation of the text controller
935 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
938 mImpl.mOperationsPending = Controller::NO_OPERATION;
940 // simulate a key event.
941 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
943 // change the input font weight
944 controller->SetInputFontWeight( TextAbstraction::FontWeight::BOLD );
946 // Check if relayout is requested or not when event state is INACTIVE.
947 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
948 DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
951 // Perform a relayout
952 const Size size( application.GetScene().GetSize() );
953 controller->Relayout(size);
955 tet_result(TET_PASS);
960 int UtcDaliTextControllerCheckInputFontWidthChanged(void)
962 tet_infoline(" UtcDaliTextControllerCheckInputFontWidthChanged");
963 ToolkitTestApplication application;
965 // Creates a text controller.
966 ControllerPtr controller = Controller::New();
968 ConfigureTextLabel(controller);
970 // Enable the text input.
971 // Creates a decorator.
972 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
974 InputMethodContext inputMethodContext = InputMethodContext::New();
975 // Enables the text input.
976 controller->EnableTextInput( decorator, inputMethodContext );
979 const std::string text("Hello World!");
980 controller->SetText(text);
981 controller->SetInputFontWidth( TextAbstraction::FontWidth::NORMAL );
983 // Get the implementation of the text controller
984 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
987 mImpl.mOperationsPending = Controller::NO_OPERATION;
989 // simulate a key event.
990 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
992 // change the input font width
993 controller->SetInputFontWidth( TextAbstraction::FontWidth::EXPANDED );
995 // Check if relayout is requested or not when event state is INACTIVE.
996 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
997 DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
1000 // Perform a relayout
1001 const Size size( application.GetScene().GetSize() );
1002 controller->Relayout(size);
1004 tet_result(TET_PASS);
1009 int UtcDaliTextControllerCheckInputFontSlantChanged(void)
1011 tet_infoline(" UtcDaliTextControllerCheckInputFontSlantChanged");
1012 ToolkitTestApplication application;
1014 // Creates a text controller.
1015 ControllerPtr controller = Controller::New();
1017 ConfigureTextLabel(controller);
1019 // Enable the text input.
1020 // Creates a decorator.
1021 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
1023 InputMethodContext inputMethodContext = InputMethodContext::New();
1024 // Enables the text input.
1025 controller->EnableTextInput( decorator, inputMethodContext );
1028 const std::string text("Hello World!");
1029 controller->SetText(text);
1030 controller->SetInputFontSlant( TextAbstraction::FontSlant::NORMAL );
1032 // Get the implementation of the text controller
1033 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1036 mImpl.mOperationsPending = Controller::NO_OPERATION;
1038 // simulate a key event.
1039 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
1041 // change the input font slant
1042 controller->SetInputFontSlant( TextAbstraction::FontSlant::ROMAN );
1044 // Check if relayout is requested or not when event state is INACTIVE.
1045 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1046 DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
1049 // Perform a relayout
1050 const Size size( application.GetScene().GetSize() );
1051 controller->Relayout(size);
1053 tet_result(TET_PASS);
1058 int UtcDaliTextControllerCheckInputFontPointSizeChanged(void)
1060 tet_infoline(" UtcDaliTextControllerCheckInputFontPointSizeChanged");
1061 ToolkitTestApplication application;
1063 // Creates a text controller.
1064 ControllerPtr controller = Controller::New();
1066 ConfigureTextLabel(controller);
1068 // Enable the text input.
1069 // Creates a decorator.
1070 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
1072 InputMethodContext inputMethodContext = InputMethodContext::New();
1073 // Enables the text input.
1074 controller->EnableTextInput( decorator, inputMethodContext );
1077 const std::string text("Hello World!");
1078 controller->SetText(text);
1079 controller->SetInputFontPointSize( 1.0f );
1081 // Get the implementation of the text controller
1082 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1085 mImpl.mOperationsPending = Controller::NO_OPERATION;
1087 // simulate a key event.
1088 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::DOWN ) );
1090 // change the input font point size
1091 controller->SetInputFontPointSize( 1.2f );
1093 // Check if relayout is requested or not when event state is INACTIVE.
1094 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1095 DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
1098 // Perform a relayout
1099 const Size size( application.GetScene().GetSize() );
1100 controller->Relayout(size);
1102 tet_result(TET_PASS);
1107 int UtcDaliTextControllerSelectEvent(void)
1109 tet_infoline(" UtcDaliTextControllerSelectEvent");
1110 ToolkitTestApplication application;
1112 // Creates a text controller.
1113 ControllerPtr controller = Controller::New();
1115 // Configures the text controller similarly to the text-field.
1116 ConfigureTextField( controller );
1119 const std::string text("Hello World!");
1120 controller->SetText( text );
1122 // Select the whole text.
1123 controller->SelectEvent( 0.f, 0.f, SelectionType::INTERACTIVE );
1125 // Perform a relayout
1126 const Size size( application.GetScene().GetSize() );
1127 controller->Relayout(size);
1129 // Get the implementation of the text controller
1130 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1132 // Check if the whole text is selected or not.
1133 std::string retrieved_text;
1134 mImpl.RetrieveSelection( retrieved_text, false );
1135 DALI_TEST_EQUALS( "Hello", retrieved_text, TEST_LOCATION );
1137 // Select the whole text.
1138 controller->SelectEvent( 0.f, 0.f, SelectionType::ALL );
1140 // Perform a relayout
1141 controller->Relayout( size );
1143 mImpl.RetrieveSelection( retrieved_text, false );
1144 DALI_TEST_EQUALS( text, retrieved_text, TEST_LOCATION );
1150 int UtcDaliTextControllerRemoveTextChangeEventData(void)
1152 tet_infoline(" UtcDaliTextControllerRemoveTextChangeEventData");
1153 ToolkitTestApplication application;
1155 // Creates a text controller.
1156 ControllerPtr controller = Controller::New();
1158 ConfigureTextField( controller );
1161 const std::string text( "Hello World!" );
1162 controller->SetText( text );
1163 controller->SetInputFontPointSize( 1.0f );
1165 // Get the implementation of the text controller
1166 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1168 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1170 // Send DELETE_SURROUNDING event
1171 InputMethodContext::EventData imfEvent = InputMethodContext::EventData( InputMethodContext::DELETE_SURROUNDING, "", -1, 1 );
1172 InputMethodContext inputMethodContext = InputMethodContext::New();
1173 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
1175 // Force to update the model.
1176 controller->GetNaturalSize();
1178 // Simulate a key event to delete text
1179 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Dali::KeyEvent::DOWN ) );
1181 DALI_TEST_EQUALS( EventData::EDITING, mImpl.mEventData->mState, TEST_LOCATION );
1183 // Perform a relayout
1184 const Size size( application.GetScene().GetSize() );
1185 controller->Relayout( size );
1187 tet_result(TET_PASS);
1192 int UtcDaliTextControllerCheckInputFontPointSizeUpdated(void)
1194 tet_infoline(" UtcDaliTextControllerCheckInputFontPointSizeUpdated");
1195 ToolkitTestApplication application;
1197 // Creates a text controller.
1198 ControllerPtr controller = Controller::New();
1200 ConfigureTextField(controller);
1203 const std::string text("Hello World!");
1204 controller->SetText( text );
1205 controller->SetInputFontPointSize( 1.0f );
1206 controller->KeyboardFocusGainEvent();
1208 application.SendNotification();
1209 application.Render();
1211 // Perform a relayout
1212 const Size size( application.GetScene().GetSize() );
1213 controller->Relayout(size);
1215 // simulate a key event.
1216 controller->KeyEvent( GenerateKey( "a", "a", 38, 0, 0, Dali::KeyEvent::DOWN ) );
1218 // change the input font point size
1219 controller->SetInputFontPointSize( 20.f );
1221 application.SendNotification();
1222 application.Render();
1224 // Perform a relayout
1225 controller->Relayout(size);
1227 tet_result(TET_PASS);
1232 int UtcDaliTextControllerDeleteSurroundings(void)
1234 tet_infoline(" UtcDaliTextControllerDeleteSurroundings");
1235 ToolkitTestApplication application;
1237 // Creates a text controller.
1238 ControllerPtr controller = Controller::New();
1240 ConfigureTextField( controller );
1242 // Get the implementation of the text controller
1243 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1245 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1247 InputMethodContext inputMethodContext = InputMethodContext::New();
1248 // Add some pre-edit text, such as Korean
1249 InputMethodContext::EventData imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "ㅂㅂㅂ", 0, 3 );
1250 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
1252 // Perform a relayout
1253 const Size size( application.GetScene().GetSize() );
1255 application.SendNotification();
1256 application.Render();
1258 controller->Relayout( size );
1260 // Simulate a key event to delete one text
1261 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Dali::KeyEvent::DOWN ) );
1263 // Send DELETE_SURROUNDING event (Delete All text)
1264 imfEvent = InputMethodContext::EventData( InputMethodContext::DELETE_SURROUNDING, "", -2, 2 );
1265 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
1267 application.SendNotification();
1268 application.Render();
1270 controller->Relayout( size );
1272 // simulate a key event to add text
1273 controller->KeyEvent( GenerateKey( "ㅇ", "ㅇ", 238, 0, 0, Dali::KeyEvent::DOWN ) );
1274 controller->KeyEvent( GenerateKey( "ㅇ", "ㅇ", 238, 0, 0, Dali::KeyEvent::DOWN ) );
1276 DALI_TEST_EQUALS( EventData::EDITING, mImpl.mEventData->mState, TEST_LOCATION );
1278 // Force to update the model.
1279 controller->GetNaturalSize();
1281 application.SendNotification();
1282 application.Render();
1284 controller->Relayout( size );
1286 tet_result(TET_PASS);