2 * Copyright (c) 2019 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/controls/text-controls/text-field-impl.h>
27 #include <dali-toolkit/internal/text/text-controller.h>
28 #include <dali-toolkit/internal/text/text-control-interface.h>
29 #include <dali-toolkit/internal/text/text-editable-control-interface.h>
30 #include <dali-toolkit/internal/text/text-controller-impl.h>
33 using namespace Toolkit;
39 const char* const OPTION_SELECT_ALL("option-select_all"); // "Select All" popup option.
40 const char* const OPTION_CUT("optionCut"); // "Cut" popup option.
41 const char* const OPTION_COPY("optionCopy"); // "Copy" popup option.
42 const char* const OPTION_PASTE("optionPaste"); // "Paste" popup option.
43 const char* const OPTION_CLIPBOARD("optionClipboard"); // "Clipboard" popup option.
45 const Size CONTROL_SIZE( 300.f, 60.f );
47 std::string gClipboardText;
48 void ContentSelectedCallback( ClipboardEventNotifier& notifier )
50 gClipboardText = notifier.GetContent();
53 // Generate a KeyEvent to send to Core.
54 Dali::KeyEvent GenerateKey( const std::string& keyName,
55 const std::string& keyString,
58 unsigned long timeStamp,
59 const Dali::KeyEvent::State& keyState )
61 return Dali::KeyEvent( keyName,
71 int UtcDaliTextController(void)
73 tet_infoline(" UtcDaliTextController");
74 ToolkitTestApplication application;
76 // Creates a text controller.
77 ControllerPtr controller = Controller::New();
78 DALI_TEST_CHECK( controller );
84 int UtcDaliTextControllerSetGetScrollEnabled(void)
86 tet_infoline(" UtcDaliTextControllerSetGetScrollEnabled");
87 ToolkitTestApplication application;
89 // Creates a text controller.
90 ControllerPtr controller = Controller::New();
91 DALI_TEST_CHECK( controller );
93 // Configures the text controller similarly to the text-editor.
94 ConfigureTextEditor( controller );
96 DALI_TEST_CHECK( !controller->IsHorizontalScrollEnabled() );
97 DALI_TEST_CHECK( controller->IsVerticalScrollEnabled() );
99 // Configures the text controller similarly to the text-field.
100 ConfigureTextField( controller );
102 DALI_TEST_CHECK( controller->IsHorizontalScrollEnabled() );
103 DALI_TEST_CHECK( !controller->IsVerticalScrollEnabled() );
105 // Configures the text controller similarly to the text-label.
106 ConfigureTextLabel( controller );
108 DALI_TEST_CHECK( !controller->IsHorizontalScrollEnabled() );
109 DALI_TEST_CHECK( !controller->IsVerticalScrollEnabled() );
111 tet_result(TET_PASS);
115 int UtcDaliTextControllerSetIsTextElide(void)
117 tet_infoline(" UtcDaliTextControllerSetIsTextElide");
118 ToolkitTestApplication application;
120 // Creates a text controller.
121 ControllerPtr controller = Controller::New();
122 DALI_TEST_CHECK( controller );
124 // Configures the text controller similarly to the text-editor.
125 ConfigureTextEditor( controller );
126 DALI_TEST_EQUALS( false, controller->IsTextElideEnabled(), TEST_LOCATION );
128 controller->SetTextElideEnabled( true );
129 DALI_TEST_EQUALS( true, controller->IsTextElideEnabled(), TEST_LOCATION );
131 // Configures the text controller similarly to the text-field.
132 ConfigureTextField( controller );
133 DALI_TEST_EQUALS( false, controller->IsTextElideEnabled(), TEST_LOCATION );
135 controller->SetTextElideEnabled( true );
136 DALI_TEST_EQUALS( true, controller->IsTextElideEnabled(), TEST_LOCATION );
138 // Configures the text controller similarly to the text-label.
139 ConfigureTextLabel( controller );
140 DALI_TEST_EQUALS( true, controller->IsTextElideEnabled(), TEST_LOCATION );
142 controller->SetTextElideEnabled( false );
143 DALI_TEST_EQUALS( false, controller->IsTextElideEnabled(), TEST_LOCATION );
145 tet_result(TET_PASS);
149 int UtcDaliTextControllerEnableCursorBlinking(void)
151 tet_infoline(" UtcDaliTextControllerEnableCursorBlinking");
152 ToolkitTestApplication application;
154 // Creates a text controller.
155 ControllerPtr controller = Controller::New();
156 DALI_TEST_CHECK( controller );
158 // There is no text input enabled.
159 DALI_TEST_CHECK( !controller->GetEnableCursorBlink() );
161 // Enable the text input.
162 // Creates a decorator.
163 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
165 InputMethodContext inputMethodContext = InputMethodContext::New();
166 // Enables the text input.
167 controller->EnableTextInput( decorator, inputMethodContext );
169 // Enables the cursor blink.
170 controller->SetEnableCursorBlink( true );
172 DALI_TEST_CHECK( controller->GetEnableCursorBlink() );
174 // Disables the cursor blink.
175 controller->SetEnableCursorBlink( false );
177 DALI_TEST_CHECK( !controller->GetEnableCursorBlink() );
179 tet_result(TET_PASS);
183 int UtcDaliTextControllerImfEvent(void)
185 tet_infoline(" UtcDaliTextController");
186 ToolkitTestApplication application;
188 // Creates a text controller.
189 ControllerPtr controller = Controller::New();
192 InputMethodContext::EventData imfEvent;
194 DALI_TEST_CHECK( controller );
196 // Enable the text input.
197 // Creates a decorator.
198 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
201 InputMethodContext inputMethodContext = InputMethodContext::New();
202 // Enables the text input.
203 controller->EnableTextInput( decorator, inputMethodContext );
205 // Set the placeholder text.
206 controller->SetPlaceholderText( Controller::PLACEHOLDER_TYPE_INACTIVE, "Hello Dali" );
209 imfEvent = InputMethodContext::EventData( InputMethodContext::GET_SURROUNDING, "", 0, 0 );
210 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
213 imfEvent = InputMethodContext::EventData( InputMethodContext::VOID, "", 0, 0 );
214 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
216 controller->GetText( text );
217 DALI_TEST_CHECK( text.empty() );
219 imfEvent = InputMethodContext::EventData( InputMethodContext::COMMIT, "Hello ", 0, 6 );
220 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
221 controller->GetNaturalSize();
223 // Check 'Delete All' key which means the input panel send a big range
224 imfEvent = InputMethodContext::EventData( InputMethodContext::DELETE_SURROUNDING, "", -100, 100 );
225 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
226 controller->GetNaturalSize();
228 controller->GetText( text );
229 DALI_TEST_EQUALS( "", text, TEST_LOCATION );
231 // Send COMMIT event.
232 imfEvent = InputMethodContext::EventData( InputMethodContext::COMMIT, "Hello ", 0, 6 );
233 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
235 // Force to update the model.
236 controller->GetNaturalSize();
238 controller->GetText( text );
239 DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
241 // Send PRE_EDIT event
242 imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
243 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
245 // Force to update the model.
246 controller->GetNaturalSize();
248 controller->GetText( text );
249 DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
251 // Send DELETE_SURROUNDING event
252 imfEvent = InputMethodContext::EventData( InputMethodContext::DELETE_SURROUNDING, "", -1, 1 );
253 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
255 // Force to update the model.
256 controller->GetNaturalSize();
258 controller->GetText( text );
259 DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
262 inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::UNDERLINE );
264 // Send PRE_EDIT event
265 imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "wo", 6, 2 );
266 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
268 // Force to update the model.
269 controller->GetNaturalSize();
271 controller->GetText( text );
272 DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
274 // Send GET_SURROUNDING event
275 imfEvent = InputMethodContext::EventData( InputMethodContext::GET_SURROUNDING, "", 0, 0 );
276 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
278 controller->GetText( text );
279 DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
281 // Send PRIVATE_COMMAND event
282 imfEvent = InputMethodContext::EventData( InputMethodContext::PRIVATE_COMMAND, "", 0, 0 );
283 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
285 controller->GetText( text );
286 DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
288 tet_result(TET_PASS);
292 int UtcDaliTextControllerTextPopupButtonTouched(void)
294 tet_infoline(" UtcDaliTextControllerTextPopupButtonTouched");
295 ToolkitTestApplication application;
297 // Creates a text controller.
298 ControllerPtr controller = Controller::New();
300 DALI_TEST_CHECK( controller );
304 Property::Map attributes;
306 // Enable the text input.
307 // Creates a decorator.
308 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
311 InputMethodContext inputMethodContext = InputMethodContext::New();
312 // Enables the text input.
313 controller->EnableTextInput( decorator, inputMethodContext );
315 // Creates the text's popup.
316 TextSelectionPopupCallbackInterface& callbackInterface = *controller;
317 TextSelectionPopup textPopup = TextSelectionPopup::New( &callbackInterface );
319 Toolkit::TextSelectionPopup::Buttons buttonsToEnable = static_cast<Toolkit::TextSelectionPopup::Buttons>( TextSelectionPopup::CUT |
320 TextSelectionPopup::COPY |
321 TextSelectionPopup::PASTE |
322 TextSelectionPopup::SELECT |
323 TextSelectionPopup::SELECT_ALL |
324 TextSelectionPopup::CLIPBOARD );
326 textPopup.EnableButtons( buttonsToEnable );
327 Stage::GetCurrent().Add( textPopup );
328 textPopup.ShowPopup();
331 application.SendNotification();
332 application.Render();
335 controller->SetText( "Hello world" );
337 // Select the whole text.
338 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
339 DALI_TEST_CHECK( button );
341 button.DoAction( "buttonClick", attributes );
343 // Call relayout to process the input events.
344 controller->Relayout( CONTROL_SIZE );
347 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
348 DALI_TEST_CHECK( button );
350 button.DoAction( "buttonClick", attributes );
352 // Force to update the model.
353 controller->GetNaturalSize();
355 controller->GetText( text );
356 DALI_TEST_CHECK( text.empty() );
359 controller->SetText( "Hello world" );
361 // Select the whole text.
362 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
363 DALI_TEST_CHECK( button );
365 button.DoAction( "buttonClick", attributes );
367 // Call relayout to process the input events.
368 controller->Relayout( CONTROL_SIZE );
370 // Copy to the clipboard.
371 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_COPY ) );
372 DALI_TEST_CHECK( button );
374 button.DoAction( "buttonClick", attributes );
376 // Call relayout to process the input events.
377 controller->Relayout( CONTROL_SIZE );
380 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
381 DALI_TEST_CHECK( button );
383 button.DoAction( "buttonClick", attributes );
385 // Force to update the model.
386 controller->GetNaturalSize();
388 controller->GetText( text );
389 DALI_TEST_CHECK( text.empty() );
391 ClipboardEventNotifier clipboardEventNotifier = ClipboardEventNotifier::Get();
392 clipboardEventNotifier.ContentSelectedSignal().Connect( &ContentSelectedCallback );
395 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_PASTE ) );
396 DALI_TEST_CHECK( button );
398 button.DoAction( "buttonClick", attributes );
400 // Call relayout to process the input events.
401 controller->Relayout( CONTROL_SIZE );
403 DALI_TEST_EQUALS( "Hello world", gClipboardText, TEST_LOCATION );
405 // Show the clipboard.
406 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CLIPBOARD ) );
407 DALI_TEST_CHECK( button );
409 button.DoAction( "buttonClick", attributes );
411 tet_result(TET_PASS);
415 int UtcDaliTextControllerGetInputShadowProperty(void)
417 tet_infoline(" UtcDaliTextControllerGetInputShadowProperty");
418 ToolkitTestApplication application;
420 // Creates a text controller.
421 ControllerPtr controller = Controller::New();
423 DALI_TEST_CHECK( controller );
425 const std::string& shadowProperties = controller->GetInputShadowProperties();
427 DALI_TEST_CHECK( shadowProperties.empty() );
429 tet_result(TET_PASS);
433 int UtcDaliTextControllerGetInputUnderlineProperty(void)
435 tet_infoline(" UtcDaliTextControllerGetInputUnderlineProperty");
436 ToolkitTestApplication application;
438 // Creates a text controller.
439 ControllerPtr controller = Controller::New();
441 DALI_TEST_CHECK( controller );
443 const std::string& underlineProperties = controller->GetInputUnderlineProperties();
445 DALI_TEST_CHECK( underlineProperties.empty() );
447 tet_result(TET_PASS);
451 int UtcDaliTextControllerSetGetAutoScrollEnabled(void)
453 tet_infoline(" UtcDaliTextControllerSetGetAutoScrollEnabled");
454 ToolkitTestApplication application;
456 // Creates a text controller.
457 ControllerPtr controller = Controller::New();
459 DALI_TEST_CHECK( controller );
461 DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
463 // The auto scrolling shouldn't be enabled if the multi-line is enabled.
465 // Enable multi-line.
466 controller->SetMultiLineEnabled( true );
468 // Enable text scrolling.
469 controller->SetAutoScrollEnabled( true );
471 DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
473 // Disable multi-line.
474 controller->SetMultiLineEnabled( false );
476 // Enable text scrolling.
477 controller->SetAutoScrollEnabled( true );
479 // Should be ebabled now.
480 DALI_TEST_CHECK( controller->IsAutoScrollEnabled() );
482 tet_result(TET_PASS);
486 int UtcDaliTextControllerSetGetCheckProperty(void)
488 tet_infoline(" UtcDaliTextControllerSetGetCheckProperty");
489 ToolkitTestApplication application;
491 // Creates a text controller.
492 ControllerPtr controller = Controller::New();
494 DALI_TEST_CHECK( controller );
496 // Enable the text input.
497 // Creates a decorator.
498 Text::DecoratorPtr decorator = Text::Decorator::New( *controller, *controller );
500 InputMethodContext inputMethodContext = InputMethodContext::New();
501 // Enables the text input.
502 controller->EnableTextInput( decorator, inputMethodContext );
504 DALI_TEST_CHECK( !controller->IsInputModePassword() );
506 // Set the text input to password.
507 controller->SetInputModePassword( true );
509 DALI_TEST_CHECK( controller->IsInputModePassword() );
511 // Unset the text input to password.
512 controller->SetInputModePassword( false );
514 DALI_TEST_CHECK( !controller->IsInputModePassword() );
516 tet_result(TET_PASS);
520 int UtcDaliTextControllerSetGetTapLongPressAction(void)
522 tet_infoline(" UtcDaliTextControllerSetGetTapLongPressAction");
523 ToolkitTestApplication application;
525 // Creates a text controller.
526 ControllerPtr controller = Controller::New();
528 DALI_TEST_CHECK( controller );
530 // Test first with no decorator.
532 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
533 controller->SetNoTextDoubleTapAction( Controller::NoTextTap::HIGHLIGHT );
534 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
536 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextLongPressAction(), TEST_LOCATION );
537 controller->SetNoTextLongPressAction( Controller::NoTextTap::HIGHLIGHT );
538 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextLongPressAction(), TEST_LOCATION );
540 // Add a decorator and re-test.
542 // Creates a decorator.
543 Text::DecoratorPtr decorator = Text::Decorator::New( *controller, *controller );
545 InputMethodContext inputMethodContext = InputMethodContext::New();
546 // Enables the text input.
547 controller->EnableTextInput( decorator, inputMethodContext );
549 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
550 controller->SetNoTextDoubleTapAction( Controller::NoTextTap::HIGHLIGHT );
551 DALI_TEST_EQUALS( Controller::NoTextTap::HIGHLIGHT, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
553 DALI_TEST_EQUALS( Controller::NoTextTap::SHOW_SELECTION_POPUP, controller->GetNoTextLongPressAction(), TEST_LOCATION ); // The default is SHOW_SELECTION_POPUP
554 controller->SetNoTextLongPressAction( Controller::NoTextTap::HIGHLIGHT );
555 DALI_TEST_EQUALS( Controller::NoTextTap::HIGHLIGHT, controller->GetNoTextLongPressAction(), TEST_LOCATION );
560 int UtcDaliTextControllerSetGetLineSpacingProperty(void)
562 tet_infoline(" UtcDaliTextControllerSetGetLineSpacingProperty");
563 ToolkitTestApplication application;
565 const Size size( Dali::Stage::GetCurrent().GetSize() );
568 const std::string textSingle("A Quick Brown Fox Jumps Over The Lazy Dog");
571 const std::string textMulti("A Quick Brown\nFox Jumps Over\nThe Lazy Dog");
573 // Creates a text controller.
574 ControllerPtr controller = Controller::New();
576 ConfigureTextLabel(controller);
578 // single line, line spacing = 0px
580 const float EXPECTED_SPACING = 0.0f;
581 const Vector2 EXPECTED_LAYOUT_SIZE( 342.0f, 19.0f);
582 const Vector3 EXPECTED_NATURAL_SIZE( 342.0f, 20.0f, 0.0f );
584 controller->SetText(textSingle);
585 controller->Relayout(size);
586 controller->SetMultiLineEnabled( false );
588 Vector3 naturalSize = controller->GetNaturalSize();
589 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
590 float lineSpacing0 = controller->GetDefaultLineSpacing();
592 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
593 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
594 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
597 // single line, line spacing = 20px
599 const float EXPECTED_SPACING = 20.0f;
600 const Vector2 EXPECTED_LAYOUT_SIZE( 342.0f, 19.0f );
601 const Vector3 EXPECTED_NATURAL_SIZE( 342.0f, 40.0f, 0.0f );
603 controller->SetText(textSingle);
604 controller->Relayout(size);
605 controller->SetDefaultLineSpacing( 20 );
606 controller->SetMultiLineEnabled( false );
608 Vector3 naturalSize = controller->GetNaturalSize();
609 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
610 float lineSpacing0 = controller->GetDefaultLineSpacing();
612 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
613 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
614 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
617 // multi-line, line spacing = 0px
619 const float EXPECTED_SPACING = 0.0f;
620 const Vector2 EXPECTED_LAYOUT_SIZE( 332.0f, 39.0f );
621 const Vector3 EXPECTED_NATURAL_SIZE( 118.0f, 58.0f, 0.0f );
623 controller->SetText(textMulti);
624 controller->Relayout(size);
625 controller->SetMultiLineEnabled( true );
626 controller->SetDefaultLineSpacing( 0 );
628 Vector3 naturalSize = controller->GetNaturalSize();
629 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
630 float lineSpacing0 = controller->GetDefaultLineSpacing();
632 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
633 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
634 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
637 // multi-line, line spacing = 20px
639 const float EXPECTED_SPACING = 20.0f;
640 const Vector2 EXPECTED_LAYOUT_SIZE( 118.0f, 57.0f );
641 const Vector3 EXPECTED_NATURAL_SIZE( 118.0f, 118.0f, 0.0f );
643 controller->SetText(textMulti);
644 controller->Relayout(size);
645 controller->SetMultiLineEnabled( true );
646 controller->SetDefaultLineSpacing( 20 );
648 Vector3 naturalSize = controller->GetNaturalSize();
649 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
650 float lineSpacing0 = controller->GetDefaultLineSpacing();
652 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
653 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
654 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
657 // multi-line, line spacing = 30px
659 const float EXPECTED_SPACING = 30.0f;
660 const Vector2 EXPECTED_LAYOUT_SIZE( 118.0f, 117.0f );
661 const Vector3 EXPECTED_NATURAL_SIZE( 118.0f, 148.0f, 0.0f );
663 controller->SetText(textMulti);
664 controller->Relayout(size);
665 controller->SetMultiLineEnabled( true );
666 controller->SetDefaultLineSpacing( 30 );
668 Vector3 naturalSize = controller->GetNaturalSize();
669 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
670 float lineSpacing0 = controller->GetDefaultLineSpacing();
672 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
673 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
674 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
682 int UtcDaliTextControllerCheckBufferIndices(void)
684 tet_infoline(" UtcDaliTextControllerCheckBufferIndices");
685 ToolkitTestApplication application;
687 // Creates a text controller.
688 ControllerPtr controller = Controller::New();
690 ConfigureTextLabel(controller);
693 const std::string text("A Quick Brown Fox Jumps Over The Lazy Dog");
694 controller->SetText(text);
696 // Get the implementation of the text controller
697 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
699 // Tweak some parameters to make the indices to access the text buffer invalid
700 mImpl.mTextUpdateInfo.mNumberOfCharactersToAdd = mImpl.mModel->mLogicalModel->mText.Count() * 10u;
701 mImpl.mTextUpdateInfo.mNumberOfCharactersToRemove = 0u;
702 mImpl.mTextUpdateInfo.mPreviousNumberOfCharacters = 0u;
703 mImpl.mOperationsPending = Controller::ALL_OPERATIONS;
705 // Perform a relayout
706 const Size size( Dali::Stage::GetCurrent().GetSize() );
707 controller->Relayout(size);
709 tet_result(TET_PASS);
714 int UtcDaliTextControllerCheckInputColorChanged(void)
716 tet_infoline(" UtcDaliTextControllerCheckInputColorChanged");
717 ToolkitTestApplication application;
719 // Creates a text controller.
720 ControllerPtr controller = Controller::New();
722 ConfigureTextLabel(controller);
724 // Enable the text input.
725 // Creates a decorator.
726 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
728 InputMethodContext inputMethodContext = InputMethodContext::New();
729 // Enables the text input.
730 controller->EnableTextInput( decorator, inputMethodContext );
733 const std::string text("Hello World!");
734 controller->SetText(text);
736 const Vector4 inputColor( 0.0f, 0.0f, 0.0f, 1.0f );
737 controller->SetInputColor( inputColor );
739 // Get the implementation of the text controller
740 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
743 mImpl.mOperationsPending = Controller::NO_OPERATION;
745 // simulate a key event.
746 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::Down ) );
748 // change the input color
749 const Vector4 newInputColor( 1.0f, 0.0f, 0.0f, 1.0f );
750 controller->SetInputColor( newInputColor );
752 // Check if relayout is requested or not when event state is INACTIVE.
753 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
754 DALI_TEST_EQUALS( Controller::COLOR, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::COLOR ), TEST_LOCATION );
756 // Perform a relayout
757 const Size size( Dali::Stage::GetCurrent().GetSize() );
758 controller->Relayout(size);
760 tet_result(TET_PASS);
765 int UtcDaliTextControllerCheckInputFontFamilyChanged(void)
767 tet_infoline(" UtcDaliTextControllerCheckInputFontFamilyChanged");
768 ToolkitTestApplication application;
770 // Creates a text controller.
771 ControllerPtr controller = Controller::New();
773 ConfigureTextLabel(controller);
775 // Enable the text input.
776 // Creates a decorator.
777 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
779 InputMethodContext inputMethodContext = InputMethodContext::New();
780 // Enables the text input.
781 controller->EnableTextInput( decorator, inputMethodContext );
783 // Set the text and font family
784 const std::string text("Hello World!");
785 controller->SetText(text);
786 controller->SetInputFontFamily("SamsungOneUI_200");
788 // Get the implementation of the text controller
789 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
792 mImpl.mOperationsPending = Controller::NO_OPERATION;
794 // simulate a key event.
795 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::Down ) );
797 // change the input font family
798 controller->SetInputFontFamily("SamsungOneUI_300");
800 // Check if relayout is requested or not when event state is INACTIVE.
801 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
802 DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
805 // Perform a relayout
806 const Size size( Dali::Stage::GetCurrent().GetSize() );
807 controller->Relayout(size);
809 tet_result(TET_PASS);
814 int UtcDaliTextControllerCheckInputFontWeightChanged(void)
816 tet_infoline(" UtcDaliTextControllerCheckInputFontWeightChanged");
817 ToolkitTestApplication application;
819 // Creates a text controller.
820 ControllerPtr controller = Controller::New();
822 ConfigureTextLabel(controller);
824 // Enable the text input.
825 // Creates a decorator.
826 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
828 InputMethodContext inputMethodContext = InputMethodContext::New();
829 // Enables the text input.
830 controller->EnableTextInput( decorator, inputMethodContext );
833 const std::string text("Hello World!");
834 controller->SetText(text);
835 controller->SetInputFontWeight( TextAbstraction::FontWeight::NORMAL );
837 // Get the implementation of the text controller
838 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
841 mImpl.mOperationsPending = Controller::NO_OPERATION;
843 // simulate a key event.
844 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::Down ) );
846 // change the input font weight
847 controller->SetInputFontWeight( TextAbstraction::FontWeight::BOLD );
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::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
854 // Perform a relayout
855 const Size size( Dali::Stage::GetCurrent().GetSize() );
856 controller->Relayout(size);
858 tet_result(TET_PASS);
863 int UtcDaliTextControllerCheckInputFontWidthChanged(void)
865 tet_infoline(" UtcDaliTextControllerCheckInputFontWidthChanged");
866 ToolkitTestApplication application;
868 // Creates a text controller.
869 ControllerPtr controller = Controller::New();
871 ConfigureTextLabel(controller);
873 // Enable the text input.
874 // Creates a decorator.
875 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
877 InputMethodContext inputMethodContext = InputMethodContext::New();
878 // Enables the text input.
879 controller->EnableTextInput( decorator, inputMethodContext );
882 const std::string text("Hello World!");
883 controller->SetText(text);
884 controller->SetInputFontWidth( TextAbstraction::FontWidth::NORMAL );
886 // Get the implementation of the text controller
887 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
890 mImpl.mOperationsPending = Controller::NO_OPERATION;
892 // simulate a key event.
893 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::Down ) );
895 // change the input font width
896 controller->SetInputFontWidth( TextAbstraction::FontWidth::EXPANDED );
898 // Check if relayout is requested or not when event state is INACTIVE.
899 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
900 DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
903 // Perform a relayout
904 const Size size( Dali::Stage::GetCurrent().GetSize() );
905 controller->Relayout(size);
907 tet_result(TET_PASS);
912 int UtcDaliTextControllerCheckInputFontSlantChanged(void)
914 tet_infoline(" UtcDaliTextControllerCheckInputFontSlantChanged");
915 ToolkitTestApplication application;
917 // Creates a text controller.
918 ControllerPtr controller = Controller::New();
920 ConfigureTextLabel(controller);
922 // Enable the text input.
923 // Creates a decorator.
924 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
926 InputMethodContext inputMethodContext = InputMethodContext::New();
927 // Enables the text input.
928 controller->EnableTextInput( decorator, inputMethodContext );
931 const std::string text("Hello World!");
932 controller->SetText(text);
933 controller->SetInputFontSlant( TextAbstraction::FontSlant::NORMAL );
935 // Get the implementation of the text controller
936 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
939 mImpl.mOperationsPending = Controller::NO_OPERATION;
941 // simulate a key event.
942 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::Down ) );
944 // change the input font slant
945 controller->SetInputFontSlant( TextAbstraction::FontSlant::ROMAN );
947 // Check if relayout is requested or not when event state is INACTIVE.
948 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
949 DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
952 // Perform a relayout
953 const Size size( Dali::Stage::GetCurrent().GetSize() );
954 controller->Relayout(size);
956 tet_result(TET_PASS);
961 int UtcDaliTextControllerCheckInputFontPointSizeChanged(void)
963 tet_infoline(" UtcDaliTextControllerCheckInputFontPointSizeChanged");
964 ToolkitTestApplication application;
966 // Creates a text controller.
967 ControllerPtr controller = Controller::New();
969 ConfigureTextLabel(controller);
971 // Enable the text input.
972 // Creates a decorator.
973 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
975 InputMethodContext inputMethodContext = InputMethodContext::New();
976 // Enables the text input.
977 controller->EnableTextInput( decorator, inputMethodContext );
980 const std::string text("Hello World!");
981 controller->SetText(text);
982 controller->SetInputFontPointSize( 1.0f );
984 // Get the implementation of the text controller
985 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
988 mImpl.mOperationsPending = Controller::NO_OPERATION;
990 // simulate a key event.
991 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::Down ) );
993 // change the input font point size
994 controller->SetInputFontPointSize( 1.2f );
996 // Check if relayout is requested or not when event state is INACTIVE.
997 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
998 DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
1001 // Perform a relayout
1002 const Size size( Dali::Stage::GetCurrent().GetSize() );
1003 controller->Relayout(size);
1005 tet_result(TET_PASS);
1010 int UtcDaliTextControllerSelectEvent(void)
1012 tet_infoline(" UtcDaliTextControllerSelectEvent");
1013 ToolkitTestApplication application;
1015 // Creates a text controller.
1016 ControllerPtr controller = Controller::New();
1018 // Configures the text controller similarly to the text-field.
1019 ConfigureTextField( controller );
1022 const std::string text("Hello World!");
1023 controller->SetText( text );
1025 // Select the whole text.
1026 controller->SelectEvent( 0.f, 0.f, false );
1028 // Perform a relayout
1029 const Size size( Dali::Stage::GetCurrent().GetSize() );
1030 controller->Relayout(size);
1032 // Get the implementation of the text controller
1033 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1035 // Check if the whole text is selected or not.
1036 std::string retrieved_text;
1037 mImpl.RetrieveSelection( retrieved_text, false );
1038 DALI_TEST_EQUALS( "Hello", retrieved_text, TEST_LOCATION );
1040 // Select the whole text.
1041 controller->SelectEvent( 0.f, 0.f, true );
1043 // Perform a relayout
1044 controller->Relayout( size );
1046 mImpl.RetrieveSelection( retrieved_text, false );
1047 DALI_TEST_EQUALS( text, retrieved_text, TEST_LOCATION );
1053 int UtcDaliTextControllerMaxLengthSetText(void)
1055 tet_infoline(" UtcDaliTextControllerMaxLengthSetText");
1056 ToolkitTestApplication application;
1058 // Creates a text controller.
1059 ControllerPtr controller = Controller::New();
1061 ConfigureTextLabel(controller);
1063 const Length MAX_TEXT_LENGTH = 1024u * 32u;
1065 // make over length world
1066 int maxLength = (1024u * 32u) + 10u;
1067 char world[maxLength];
1068 for( int i = 0; i < maxLength; i++ )
1074 std::string text(world);
1075 controller->SetText( text );
1077 // Perform a relayout
1078 const Size size( Dali::Stage::GetCurrent().GetSize() );
1079 controller->Relayout(size);
1081 // check text length
1082 controller->GetText( text );
1083 Length textSize = text.size();
1085 DALI_TEST_EQUALS( MAX_TEXT_LENGTH, textSize, TEST_LOCATION );
1090 int UtcDaliTextControllerRemoveTextChangeEventData(void)
1092 tet_infoline(" UtcDaliTextControllerRemoveTextChangeEventData");
1093 ToolkitTestApplication application;
1095 // Creates a text controller.
1096 ControllerPtr controller = Controller::New();
1098 ConfigureTextField( controller );
1101 const std::string text( "Hello World!" );
1102 controller->SetText( text );
1103 controller->SetInputFontPointSize( 1.0f );
1105 // Get the implementation of the text controller
1106 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1108 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1110 // Send DELETE_SURROUNDING event
1111 InputMethodContext::EventData imfEvent = InputMethodContext::EventData( InputMethodContext::DELETE_SURROUNDING, "", -1, 1 );
1112 InputMethodContext inputMethodContext = InputMethodContext::New();
1113 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
1115 // Force to update the model.
1116 controller->GetNaturalSize();
1118 // Simulate a key event to delete text
1119 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Dali::KeyEvent::Down ) );
1121 DALI_TEST_EQUALS( EventData::EDITING, mImpl.mEventData->mState, TEST_LOCATION );
1123 // Perform a relayout
1124 const Size size( Dali::Stage::GetCurrent().GetSize() );
1125 controller->Relayout( size );
1127 tet_result(TET_PASS);