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 UtcDaliTextControllerImfPreeditStyle(void)
294 tet_infoline(" UtcDaliTextControllerImfPreeditStyle");
295 ToolkitTestApplication application;
297 // Creates a text controller.
298 ControllerPtr controller = Controller::New();
301 InputMethodContext::EventData imfEvent;
303 DALI_TEST_CHECK( controller );
305 // Configures the text controller similarly to the text-field.
306 ConfigureTextField( controller );
308 InputMethodContext inputMethodContext = InputMethodContext::New();
310 // Send COMMIT event.
311 imfEvent = InputMethodContext::EventData( InputMethodContext::COMMIT, "Hello ", 0, 6 );
312 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
314 // Force to update the model.
315 controller->GetNaturalSize();
317 controller->GetText( text );
318 DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
320 // Send PRE_EDIT event
321 imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
322 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
323 inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::NONE );
324 controller->GetNaturalSize();
326 controller->GetText( text );
327 DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
329 imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
330 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
332 // Set the preedit style as REVERSE
333 inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::REVERSE );
334 controller->GetNaturalSize();
336 controller->GetText( text );
337 DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
339 imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
340 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
342 // Set the preedit style as HIGHLIGHT
343 inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::HIGHLIGHT );
344 controller->GetNaturalSize();
346 controller->GetText( text );
347 DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
349 imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
350 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
352 // Set the preedit style as CUSTOM_PLATFORM_STYLE_1
353 inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_1 );
354 controller->GetNaturalSize();
356 controller->GetText( text );
357 DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
359 imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
360 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
362 // Set the preedit style as CUSTOM_PLATFORM_STYLE_2
363 inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_2 );
364 controller->GetNaturalSize();
366 controller->GetText( text );
367 DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
369 imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
370 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
372 // Set the preedit style as CUSTOM_PLATFORM_STYLE_3
373 inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_3 );
374 controller->GetNaturalSize();
376 controller->GetText( text );
377 DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
379 imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 );
380 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
382 // Set the preedit style as CUSTOM_PLATFORM_STYLE_4
383 inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_4 );
384 controller->GetNaturalSize();
386 controller->GetText( text );
387 DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
389 tet_result(TET_PASS);
393 int UtcDaliTextControllerTextPopupButtonTouched(void)
395 tet_infoline(" UtcDaliTextControllerTextPopupButtonTouched");
396 ToolkitTestApplication application;
398 // Creates a text controller.
399 ControllerPtr controller = Controller::New();
401 DALI_TEST_CHECK( controller );
405 Property::Map attributes;
407 // Enable the text input.
408 // Creates a decorator.
409 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
412 InputMethodContext inputMethodContext = InputMethodContext::New();
413 // Enables the text input.
414 controller->EnableTextInput( decorator, inputMethodContext );
416 // Creates the text's popup.
417 TextSelectionPopupCallbackInterface& callbackInterface = *controller;
418 TextSelectionPopup textPopup = TextSelectionPopup::New( &callbackInterface );
420 Toolkit::TextSelectionPopup::Buttons buttonsToEnable = static_cast<Toolkit::TextSelectionPopup::Buttons>( TextSelectionPopup::CUT |
421 TextSelectionPopup::COPY |
422 TextSelectionPopup::PASTE |
423 TextSelectionPopup::SELECT |
424 TextSelectionPopup::SELECT_ALL |
425 TextSelectionPopup::CLIPBOARD );
427 textPopup.EnableButtons( buttonsToEnable );
428 Stage::GetCurrent().Add( textPopup );
429 textPopup.ShowPopup();
432 application.SendNotification();
433 application.Render();
436 controller->SetText( "Hello world" );
438 // Select the whole text.
439 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
440 DALI_TEST_CHECK( button );
442 button.DoAction( "buttonClick", attributes );
444 // Call relayout to process the input events.
445 controller->Relayout( CONTROL_SIZE );
448 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
449 DALI_TEST_CHECK( button );
451 button.DoAction( "buttonClick", attributes );
453 // Force to update the model.
454 controller->GetNaturalSize();
456 controller->GetText( text );
457 DALI_TEST_CHECK( text.empty() );
460 controller->SetText( "Hello world" );
462 // Select the whole text.
463 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
464 DALI_TEST_CHECK( button );
466 button.DoAction( "buttonClick", attributes );
468 // Call relayout to process the input events.
469 controller->Relayout( CONTROL_SIZE );
471 // Copy to the clipboard.
472 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_COPY ) );
473 DALI_TEST_CHECK( button );
475 button.DoAction( "buttonClick", attributes );
477 // Call relayout to process the input events.
478 controller->Relayout( CONTROL_SIZE );
481 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
482 DALI_TEST_CHECK( button );
484 button.DoAction( "buttonClick", attributes );
486 // Force to update the model.
487 controller->GetNaturalSize();
489 controller->GetText( text );
490 DALI_TEST_CHECK( text.empty() );
492 ClipboardEventNotifier clipboardEventNotifier = ClipboardEventNotifier::Get();
493 clipboardEventNotifier.ContentSelectedSignal().Connect( &ContentSelectedCallback );
496 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_PASTE ) );
497 DALI_TEST_CHECK( button );
499 button.DoAction( "buttonClick", attributes );
501 // Call relayout to process the input events.
502 controller->Relayout( CONTROL_SIZE );
504 DALI_TEST_EQUALS( "Hello world", gClipboardText, TEST_LOCATION );
506 // Show the clipboard.
507 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CLIPBOARD ) );
508 DALI_TEST_CHECK( button );
510 button.DoAction( "buttonClick", attributes );
512 tet_result(TET_PASS);
516 int UtcDaliTextControllerGetInputShadowProperty(void)
518 tet_infoline(" UtcDaliTextControllerGetInputShadowProperty");
519 ToolkitTestApplication application;
521 // Creates a text controller.
522 ControllerPtr controller = Controller::New();
524 DALI_TEST_CHECK( controller );
526 const std::string& shadowProperties = controller->GetInputShadowProperties();
528 DALI_TEST_CHECK( shadowProperties.empty() );
530 tet_result(TET_PASS);
534 int UtcDaliTextControllerGetInputUnderlineProperty(void)
536 tet_infoline(" UtcDaliTextControllerGetInputUnderlineProperty");
537 ToolkitTestApplication application;
539 // Creates a text controller.
540 ControllerPtr controller = Controller::New();
542 DALI_TEST_CHECK( controller );
544 const std::string& underlineProperties = controller->GetInputUnderlineProperties();
546 DALI_TEST_CHECK( underlineProperties.empty() );
548 tet_result(TET_PASS);
552 int UtcDaliTextControllerSetGetAutoScrollEnabled(void)
554 tet_infoline(" UtcDaliTextControllerSetGetAutoScrollEnabled");
555 ToolkitTestApplication application;
557 // Creates a text controller.
558 ControllerPtr controller = Controller::New();
560 DALI_TEST_CHECK( controller );
562 DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
564 // The auto scrolling shouldn't be enabled if the multi-line is enabled.
566 // Enable multi-line.
567 controller->SetMultiLineEnabled( true );
569 // Enable text scrolling.
570 controller->SetAutoScrollEnabled( true );
572 DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
574 // Disable multi-line.
575 controller->SetMultiLineEnabled( false );
577 // Enable text scrolling.
578 controller->SetAutoScrollEnabled( true );
580 // Should be ebabled now.
581 DALI_TEST_CHECK( controller->IsAutoScrollEnabled() );
583 tet_result(TET_PASS);
587 int UtcDaliTextControllerSetGetCheckProperty(void)
589 tet_infoline(" UtcDaliTextControllerSetGetCheckProperty");
590 ToolkitTestApplication application;
592 // Creates a text controller.
593 ControllerPtr controller = Controller::New();
595 DALI_TEST_CHECK( controller );
597 // Enable the text input.
598 // Creates a decorator.
599 Text::DecoratorPtr decorator = Text::Decorator::New( *controller, *controller );
601 InputMethodContext inputMethodContext = InputMethodContext::New();
602 // Enables the text input.
603 controller->EnableTextInput( decorator, inputMethodContext );
605 DALI_TEST_CHECK( !controller->IsInputModePassword() );
607 // Set the text input to password.
608 controller->SetInputModePassword( true );
610 DALI_TEST_CHECK( controller->IsInputModePassword() );
612 // Unset the text input to password.
613 controller->SetInputModePassword( false );
615 DALI_TEST_CHECK( !controller->IsInputModePassword() );
617 tet_result(TET_PASS);
621 int UtcDaliTextControllerSetGetTapLongPressAction(void)
623 tet_infoline(" UtcDaliTextControllerSetGetTapLongPressAction");
624 ToolkitTestApplication application;
626 // Creates a text controller.
627 ControllerPtr controller = Controller::New();
629 DALI_TEST_CHECK( controller );
631 // Test first with no decorator.
633 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
634 controller->SetNoTextDoubleTapAction( Controller::NoTextTap::HIGHLIGHT );
635 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
637 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextLongPressAction(), TEST_LOCATION );
638 controller->SetNoTextLongPressAction( Controller::NoTextTap::HIGHLIGHT );
639 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextLongPressAction(), TEST_LOCATION );
641 // Add a decorator and re-test.
643 // Creates a decorator.
644 Text::DecoratorPtr decorator = Text::Decorator::New( *controller, *controller );
646 InputMethodContext inputMethodContext = InputMethodContext::New();
647 // Enables the text input.
648 controller->EnableTextInput( decorator, inputMethodContext );
650 DALI_TEST_EQUALS( Controller::NoTextTap::NO_ACTION, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
651 controller->SetNoTextDoubleTapAction( Controller::NoTextTap::HIGHLIGHT );
652 DALI_TEST_EQUALS( Controller::NoTextTap::HIGHLIGHT, controller->GetNoTextDoubleTapAction(), TEST_LOCATION );
654 DALI_TEST_EQUALS( Controller::NoTextTap::SHOW_SELECTION_POPUP, controller->GetNoTextLongPressAction(), TEST_LOCATION ); // The default is SHOW_SELECTION_POPUP
655 controller->SetNoTextLongPressAction( Controller::NoTextTap::HIGHLIGHT );
656 DALI_TEST_EQUALS( Controller::NoTextTap::HIGHLIGHT, controller->GetNoTextLongPressAction(), TEST_LOCATION );
661 int UtcDaliTextControllerSetGetLineSpacingProperty(void)
663 tet_infoline(" UtcDaliTextControllerSetGetLineSpacingProperty");
664 ToolkitTestApplication application;
666 const Size size( Dali::Stage::GetCurrent().GetSize() );
669 const std::string textSingle("A Quick Brown Fox Jumps Over The Lazy Dog");
672 const std::string textMulti("A Quick Brown\nFox Jumps Over\nThe Lazy Dog");
674 // Creates a text controller.
675 ControllerPtr controller = Controller::New();
677 ConfigureTextLabel(controller);
679 // single line, line spacing = 0px
681 const float EXPECTED_SPACING = 0.0f;
682 const Vector2 EXPECTED_LAYOUT_SIZE( 342.0f, 19.0f);
683 const Vector3 EXPECTED_NATURAL_SIZE( 342.0f, 20.0f, 0.0f );
685 controller->SetText(textSingle);
686 controller->Relayout(size);
687 controller->SetMultiLineEnabled( false );
689 Vector3 naturalSize = controller->GetNaturalSize();
690 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
691 float lineSpacing0 = controller->GetDefaultLineSpacing();
693 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
694 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
695 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
698 // single line, line spacing = 20px
700 const float EXPECTED_SPACING = 20.0f;
701 const Vector2 EXPECTED_LAYOUT_SIZE( 342.0f, 19.0f );
702 const Vector3 EXPECTED_NATURAL_SIZE( 342.0f, 40.0f, 0.0f );
704 controller->SetText(textSingle);
705 controller->Relayout(size);
706 controller->SetDefaultLineSpacing( 20 );
707 controller->SetMultiLineEnabled( false );
709 Vector3 naturalSize = controller->GetNaturalSize();
710 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
711 float lineSpacing0 = controller->GetDefaultLineSpacing();
713 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
714 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
715 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
718 // multi-line, line spacing = 0px
720 const float EXPECTED_SPACING = 0.0f;
721 const Vector2 EXPECTED_LAYOUT_SIZE( 332.0f, 39.0f );
722 const Vector3 EXPECTED_NATURAL_SIZE( 118.0f, 58.0f, 0.0f );
724 controller->SetText(textMulti);
725 controller->Relayout(size);
726 controller->SetMultiLineEnabled( true );
727 controller->SetDefaultLineSpacing( 0 );
729 Vector3 naturalSize = controller->GetNaturalSize();
730 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
731 float lineSpacing0 = controller->GetDefaultLineSpacing();
733 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
734 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
735 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
738 // multi-line, line spacing = 20px
740 const float EXPECTED_SPACING = 20.0f;
741 const Vector2 EXPECTED_LAYOUT_SIZE( 118.0f, 57.0f );
742 const Vector3 EXPECTED_NATURAL_SIZE( 118.0f, 118.0f, 0.0f );
744 controller->SetText(textMulti);
745 controller->Relayout(size);
746 controller->SetMultiLineEnabled( true );
747 controller->SetDefaultLineSpacing( 20 );
749 Vector3 naturalSize = controller->GetNaturalSize();
750 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
751 float lineSpacing0 = controller->GetDefaultLineSpacing();
753 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
754 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
755 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
758 // multi-line, line spacing = 30px
760 const float EXPECTED_SPACING = 30.0f;
761 const Vector2 EXPECTED_LAYOUT_SIZE( 118.0f, 117.0f );
762 const Vector3 EXPECTED_NATURAL_SIZE( 118.0f, 148.0f, 0.0f );
764 controller->SetText(textMulti);
765 controller->Relayout(size);
766 controller->SetMultiLineEnabled( true );
767 controller->SetDefaultLineSpacing( 30 );
769 Vector3 naturalSize = controller->GetNaturalSize();
770 Vector2 layoutSize = controller->GetTextModel()->GetLayoutSize();
771 float lineSpacing0 = controller->GetDefaultLineSpacing();
773 DALI_TEST_EQUALS( EXPECTED_SPACING, lineSpacing0, TEST_LOCATION );
774 DALI_TEST_EQUALS( EXPECTED_LAYOUT_SIZE, layoutSize, TEST_LOCATION );
775 DALI_TEST_EQUALS( EXPECTED_NATURAL_SIZE, naturalSize, TEST_LOCATION );
783 int UtcDaliTextControllerCheckBufferIndices(void)
785 tet_infoline(" UtcDaliTextControllerCheckBufferIndices");
786 ToolkitTestApplication application;
788 // Creates a text controller.
789 ControllerPtr controller = Controller::New();
791 ConfigureTextLabel(controller);
794 const std::string text("A Quick Brown Fox Jumps Over The Lazy Dog");
795 controller->SetText(text);
797 // Get the implementation of the text controller
798 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
800 // Tweak some parameters to make the indices to access the text buffer invalid
801 mImpl.mTextUpdateInfo.mNumberOfCharactersToAdd = mImpl.mModel->mLogicalModel->mText.Count() * 10u;
802 mImpl.mTextUpdateInfo.mNumberOfCharactersToRemove = 0u;
803 mImpl.mTextUpdateInfo.mPreviousNumberOfCharacters = 0u;
804 mImpl.mOperationsPending = Controller::ALL_OPERATIONS;
806 // Perform a relayout
807 const Size size( Dali::Stage::GetCurrent().GetSize() );
808 controller->Relayout(size);
810 tet_result(TET_PASS);
815 int UtcDaliTextControllerCheckInputColorChanged(void)
817 tet_infoline(" UtcDaliTextControllerCheckInputColorChanged");
818 ToolkitTestApplication application;
820 // Creates a text controller.
821 ControllerPtr controller = Controller::New();
823 ConfigureTextLabel(controller);
825 // Enable the text input.
826 // Creates a decorator.
827 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
829 InputMethodContext inputMethodContext = InputMethodContext::New();
830 // Enables the text input.
831 controller->EnableTextInput( decorator, inputMethodContext );
834 const std::string text("Hello World!");
835 controller->SetText(text);
837 const Vector4 inputColor( 0.0f, 0.0f, 0.0f, 1.0f );
838 controller->SetInputColor( inputColor );
840 // Get the implementation of the text controller
841 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
844 mImpl.mOperationsPending = Controller::NO_OPERATION;
846 // simulate a key event.
847 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::Down ) );
849 // change the input color
850 const Vector4 newInputColor( 1.0f, 0.0f, 0.0f, 1.0f );
851 controller->SetInputColor( newInputColor );
853 // Check if relayout is requested or not when event state is INACTIVE.
854 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
855 DALI_TEST_EQUALS( Controller::COLOR, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::COLOR ), TEST_LOCATION );
857 // Perform a relayout
858 const Size size( Dali::Stage::GetCurrent().GetSize() );
859 controller->Relayout(size);
861 tet_result(TET_PASS);
866 int UtcDaliTextControllerCheckInputFontFamilyChanged(void)
868 tet_infoline(" UtcDaliTextControllerCheckInputFontFamilyChanged");
869 ToolkitTestApplication application;
871 // Creates a text controller.
872 ControllerPtr controller = Controller::New();
874 ConfigureTextLabel(controller);
876 // Enable the text input.
877 // Creates a decorator.
878 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
880 InputMethodContext inputMethodContext = InputMethodContext::New();
881 // Enables the text input.
882 controller->EnableTextInput( decorator, inputMethodContext );
884 // Set the text and font family
885 const std::string text("Hello World!");
886 controller->SetText(text);
887 controller->SetInputFontFamily("SamsungOneUI_200");
889 // Get the implementation of the text controller
890 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
893 mImpl.mOperationsPending = Controller::NO_OPERATION;
895 // simulate a key event.
896 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::Down ) );
898 // change the input font family
899 controller->SetInputFontFamily("SamsungOneUI_300");
901 // Check if relayout is requested or not when event state is INACTIVE.
902 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
903 DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
906 // Perform a relayout
907 const Size size( Dali::Stage::GetCurrent().GetSize() );
908 controller->Relayout(size);
910 tet_result(TET_PASS);
915 int UtcDaliTextControllerCheckInputFontWeightChanged(void)
917 tet_infoline(" UtcDaliTextControllerCheckInputFontWeightChanged");
918 ToolkitTestApplication application;
920 // Creates a text controller.
921 ControllerPtr controller = Controller::New();
923 ConfigureTextLabel(controller);
925 // Enable the text input.
926 // Creates a decorator.
927 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
929 InputMethodContext inputMethodContext = InputMethodContext::New();
930 // Enables the text input.
931 controller->EnableTextInput( decorator, inputMethodContext );
934 const std::string text("Hello World!");
935 controller->SetText(text);
936 controller->SetInputFontWeight( TextAbstraction::FontWeight::NORMAL );
938 // Get the implementation of the text controller
939 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
942 mImpl.mOperationsPending = Controller::NO_OPERATION;
944 // simulate a key event.
945 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::Down ) );
947 // change the input font weight
948 controller->SetInputFontWeight( TextAbstraction::FontWeight::BOLD );
950 // Check if relayout is requested or not when event state is INACTIVE.
951 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
952 DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
955 // Perform a relayout
956 const Size size( Dali::Stage::GetCurrent().GetSize() );
957 controller->Relayout(size);
959 tet_result(TET_PASS);
964 int UtcDaliTextControllerCheckInputFontWidthChanged(void)
966 tet_infoline(" UtcDaliTextControllerCheckInputFontWidthChanged");
967 ToolkitTestApplication application;
969 // Creates a text controller.
970 ControllerPtr controller = Controller::New();
972 ConfigureTextLabel(controller);
974 // Enable the text input.
975 // Creates a decorator.
976 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
978 InputMethodContext inputMethodContext = InputMethodContext::New();
979 // Enables the text input.
980 controller->EnableTextInput( decorator, inputMethodContext );
983 const std::string text("Hello World!");
984 controller->SetText(text);
985 controller->SetInputFontWidth( TextAbstraction::FontWidth::NORMAL );
987 // Get the implementation of the text controller
988 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
991 mImpl.mOperationsPending = Controller::NO_OPERATION;
993 // simulate a key event.
994 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::Down ) );
996 // change the input font width
997 controller->SetInputFontWidth( TextAbstraction::FontWidth::EXPANDED );
999 // Check if relayout is requested or not when event state is INACTIVE.
1000 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1001 DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
1004 // Perform a relayout
1005 const Size size( Dali::Stage::GetCurrent().GetSize() );
1006 controller->Relayout(size);
1008 tet_result(TET_PASS);
1013 int UtcDaliTextControllerCheckInputFontSlantChanged(void)
1015 tet_infoline(" UtcDaliTextControllerCheckInputFontSlantChanged");
1016 ToolkitTestApplication application;
1018 // Creates a text controller.
1019 ControllerPtr controller = Controller::New();
1021 ConfigureTextLabel(controller);
1023 // Enable the text input.
1024 // Creates a decorator.
1025 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
1027 InputMethodContext inputMethodContext = InputMethodContext::New();
1028 // Enables the text input.
1029 controller->EnableTextInput( decorator, inputMethodContext );
1032 const std::string text("Hello World!");
1033 controller->SetText(text);
1034 controller->SetInputFontSlant( TextAbstraction::FontSlant::NORMAL );
1036 // Get the implementation of the text controller
1037 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1040 mImpl.mOperationsPending = Controller::NO_OPERATION;
1042 // simulate a key event.
1043 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::Down ) );
1045 // change the input font slant
1046 controller->SetInputFontSlant( TextAbstraction::FontSlant::ROMAN );
1048 // Check if relayout is requested or not when event state is INACTIVE.
1049 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1050 DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
1053 // Perform a relayout
1054 const Size size( Dali::Stage::GetCurrent().GetSize() );
1055 controller->Relayout(size);
1057 tet_result(TET_PASS);
1062 int UtcDaliTextControllerCheckInputFontPointSizeChanged(void)
1064 tet_infoline(" UtcDaliTextControllerCheckInputFontPointSizeChanged");
1065 ToolkitTestApplication application;
1067 // Creates a text controller.
1068 ControllerPtr controller = Controller::New();
1070 ConfigureTextLabel(controller);
1072 // Enable the text input.
1073 // Creates a decorator.
1074 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
1076 InputMethodContext inputMethodContext = InputMethodContext::New();
1077 // Enables the text input.
1078 controller->EnableTextInput( decorator, inputMethodContext );
1081 const std::string text("Hello World!");
1082 controller->SetText(text);
1083 controller->SetInputFontPointSize( 1.0f );
1085 // Get the implementation of the text controller
1086 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1089 mImpl.mOperationsPending = Controller::NO_OPERATION;
1091 // simulate a key event.
1092 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Dali::KeyEvent::Down ) );
1094 // change the input font point size
1095 controller->SetInputFontPointSize( 1.2f );
1097 // Check if relayout is requested or not when event state is INACTIVE.
1098 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1099 DALI_TEST_EQUALS( Controller::VALIDATE_FONTS, static_cast<Controller::OperationsMask>( mImpl.mOperationsPending & Controller::VALIDATE_FONTS ),
1102 // Perform a relayout
1103 const Size size( Dali::Stage::GetCurrent().GetSize() );
1104 controller->Relayout(size);
1106 tet_result(TET_PASS);
1111 int UtcDaliTextControllerSelectEvent(void)
1113 tet_infoline(" UtcDaliTextControllerSelectEvent");
1114 ToolkitTestApplication application;
1116 // Creates a text controller.
1117 ControllerPtr controller = Controller::New();
1119 // Configures the text controller similarly to the text-field.
1120 ConfigureTextField( controller );
1123 const std::string text("Hello World!");
1124 controller->SetText( text );
1126 // Select the whole text.
1127 controller->SelectEvent( 0.f, 0.f, false );
1129 // Perform a relayout
1130 const Size size( Dali::Stage::GetCurrent().GetSize() );
1131 controller->Relayout(size);
1133 // Get the implementation of the text controller
1134 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1136 // Check if the whole text is selected or not.
1137 std::string retrieved_text;
1138 mImpl.RetrieveSelection( retrieved_text, false );
1139 DALI_TEST_EQUALS( "Hello", retrieved_text, TEST_LOCATION );
1141 // Select the whole text.
1142 controller->SelectEvent( 0.f, 0.f, true );
1144 // Perform a relayout
1145 controller->Relayout( size );
1147 mImpl.RetrieveSelection( retrieved_text, false );
1148 DALI_TEST_EQUALS( text, retrieved_text, TEST_LOCATION );
1154 int UtcDaliTextControllerMaxLengthSetText(void)
1156 tet_infoline(" UtcDaliTextControllerMaxLengthSetText");
1157 ToolkitTestApplication application;
1159 // Creates a text controller.
1160 ControllerPtr controller = Controller::New();
1162 ConfigureTextLabel( controller );
1164 const Length MAX_TEXT_LENGTH = 1024u * 32u;
1166 // make over length world
1167 int maxLength = ( 1024u * 32u ) + 10u;
1168 char world[maxLength] = { 'a' };
1171 std::string text( world, maxLength );
1172 controller->SetText( text );
1174 // check text length
1175 controller->GetText( text );
1176 Length textSize = text.size();
1178 DALI_TEST_EQUALS( MAX_TEXT_LENGTH, textSize, TEST_LOCATION );
1183 int UtcDaliTextControllerRemoveTextChangeEventData(void)
1185 tet_infoline(" UtcDaliTextControllerRemoveTextChangeEventData");
1186 ToolkitTestApplication application;
1188 // Creates a text controller.
1189 ControllerPtr controller = Controller::New();
1191 ConfigureTextField( controller );
1194 const std::string text( "Hello World!" );
1195 controller->SetText( text );
1196 controller->SetInputFontPointSize( 1.0f );
1198 // Get the implementation of the text controller
1199 Controller::Impl& mImpl = Controller::Impl::GetImplementation( *controller.Get() );
1201 DALI_TEST_EQUALS( EventData::INACTIVE, mImpl.mEventData->mState, TEST_LOCATION );
1203 // Send DELETE_SURROUNDING event
1204 InputMethodContext::EventData imfEvent = InputMethodContext::EventData( InputMethodContext::DELETE_SURROUNDING, "", -1, 1 );
1205 InputMethodContext inputMethodContext = InputMethodContext::New();
1206 controller->OnInputMethodContextEvent( inputMethodContext, imfEvent );
1208 // Force to update the model.
1209 controller->GetNaturalSize();
1211 // Simulate a key event to delete text
1212 controller->KeyEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Dali::KeyEvent::Down ) );
1214 DALI_TEST_EQUALS( EventData::EDITING, mImpl.mEventData->mState, TEST_LOCATION );
1216 // Perform a relayout
1217 const Size size( Dali::Stage::GetCurrent().GetSize() );
1218 controller->Relayout( size );
1220 tet_result(TET_PASS);