2 * Copyright (c) 2016 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.
24 #include <dali-toolkit-test-suite-utils.h>
25 #include <dali-toolkit/dali-toolkit.h>
26 #include <dali-toolkit/internal/text/text-controller.h>
27 #include <dali-toolkit/internal/text/text-control-interface.h>
28 #include <dali-toolkit/internal/text/text-editable-control-interface.h>
29 #include <dali-toolkit/internal/text/text-scroller-data.h>
32 using namespace Toolkit;
38 const char* const OPTION_SELECT_WORD("option-select_word"); // "Select Word" popup option.
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 const std::string DEFAULT_FONT_DIR( "/resources/fonts" );
49 class ControlImpl : public ControlInterface, public Text::EditableControlInterface
56 virtual ~ControlImpl()
59 virtual void AddDecoration( Actor& actor, bool needsClipping )
62 virtual void RequestTextRelayout()
65 virtual void TextChanged()
68 virtual void MaxLengthReached()
71 virtual void InputStyleChanged( InputStyle::Mask inputStyleMask )
75 std::string gClipboardText;
76 void ContentSelectedCallback( ClipboardEventNotifier& notifier )
78 gClipboardText = notifier.GetContent();
83 int UtcDaliTextController(void)
85 tet_infoline(" UtcDaliTextController");
86 ToolkitTestApplication application;
88 // Creates a text controller.
89 ControllerPtr controller = Controller::New();
91 DALI_TEST_CHECK( controller );
97 int UtcDaliTextControllerEnableCursorBlinking(void)
99 tet_infoline(" UtcDaliTextControllerEnableCursorBlinking");
100 ToolkitTestApplication application;
102 // Creates a text controller.
103 ControllerPtr controller = Controller::New();
105 DALI_TEST_CHECK( controller );
107 // There is no text input enabled.
108 DALI_TEST_CHECK( !controller->GetEnableCursorBlink() );
110 // Enable the text input.
111 // Creates a decorator.
112 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
115 // Enables the text input.
116 controller->EnableTextInput( decorator );
118 // Enables the cursor blink.
119 controller->SetEnableCursorBlink( true );
121 DALI_TEST_CHECK( controller->GetEnableCursorBlink() );
123 // Disables the cursor blink.
124 controller->SetEnableCursorBlink( false );
126 DALI_TEST_CHECK( !controller->GetEnableCursorBlink() );
128 tet_result(TET_PASS);
132 int UtcDaliTextControllerImfEvent(void)
134 tet_infoline(" UtcDaliTextController");
135 ToolkitTestApplication application;
137 // Creates a text controller.
138 ControllerPtr controller = Controller::New();
141 ImfManager::ImfEventData imfEvent;
143 DALI_TEST_CHECK( controller );
145 // Enable the text input.
146 // Creates a decorator.
147 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
150 // Enables the text input.
151 controller->EnableTextInput( decorator );
153 // Creates an ImfManager.
154 ImfManager imfManager = ImfManager::Get();
157 imfEvent = ImfManager::ImfEventData( ImfManager::VOID, "", 0, 0 );
158 controller->OnImfEvent( imfManager, imfEvent );
160 controller->GetText( text );
161 DALI_TEST_CHECK( text.empty() );
163 // Send COMMIT event.
164 imfEvent = ImfManager::ImfEventData( ImfManager::COMMIT, "Hello ", 0, 6 );
165 controller->OnImfEvent( imfManager, imfEvent );
167 // Force to update the model.
168 controller->GetNaturalSize();
170 controller->GetText( text );
171 DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
173 // Send PREEDIT event
174 imfEvent = ImfManager::ImfEventData( ImfManager::PREEDIT, "w", 6, 1 );
175 controller->OnImfEvent( imfManager, imfEvent );
177 // Force to update the model.
178 controller->GetNaturalSize();
180 controller->GetText( text );
181 DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
183 // Send DELETESURROUNDING event
184 imfEvent = ImfManager::ImfEventData( ImfManager::DELETESURROUNDING, "", -1, 1 );
185 controller->OnImfEvent( imfManager, imfEvent );
187 // Force to update the model.
188 controller->GetNaturalSize();
190 controller->GetText( text );
191 DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
193 // Send PREEDIT event
194 imfEvent = ImfManager::ImfEventData( ImfManager::PREEDIT, "wo", 6, 2 );
195 controller->OnImfEvent( imfManager, imfEvent );
197 // Force to update the model.
198 controller->GetNaturalSize();
200 controller->GetText( text );
201 DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
203 // Send GETSURROUNDING event
204 imfEvent = ImfManager::ImfEventData( ImfManager::GETSURROUNDING, "", 0, 0 );
205 controller->OnImfEvent( imfManager, imfEvent );
207 controller->GetText( text );
208 DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
210 tet_result(TET_PASS);
214 int UtcDaliTextControllerTextPopupButtonTouched(void)
216 tet_infoline(" UtcDaliTextControllerTextPopupButtonTouched");
217 ToolkitTestApplication application;
219 // Creates a text controller.
220 ControllerPtr controller = Controller::New();
222 DALI_TEST_CHECK( controller );
226 Property::Map attributes;
228 // Enable the text input.
229 // Creates a decorator.
230 Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
233 // Enables the text input.
234 controller->EnableTextInput( decorator );
236 // Creates the text's popup.
237 TextSelectionPopupCallbackInterface& callbackInterface = *controller;
238 TextSelectionPopup textPopup = TextSelectionPopup::New( &callbackInterface );
240 Toolkit::TextSelectionPopup::Buttons buttonsToEnable = static_cast<Toolkit::TextSelectionPopup::Buttons>( TextSelectionPopup::CUT |
241 TextSelectionPopup::COPY |
242 TextSelectionPopup::PASTE |
243 TextSelectionPopup::SELECT |
244 TextSelectionPopup::SELECT_ALL |
245 TextSelectionPopup::CLIPBOARD );
247 textPopup.EnableButtons( buttonsToEnable );
248 Stage::GetCurrent().Add( textPopup );
249 textPopup.ShowPopup();
252 application.SendNotification();
253 application.Render();
256 controller->SetText( "Hello world" );
258 // Select the whole text.
259 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
260 DALI_TEST_CHECK( button );
262 button.DoAction( "buttonClick", attributes );
264 // Call relayout to process the input events.
265 controller->Relayout( CONTROL_SIZE );
268 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
269 DALI_TEST_CHECK( button );
271 button.DoAction( "buttonClick", attributes );
273 // Force to update the model.
274 controller->GetNaturalSize();
276 controller->GetText( text );
277 DALI_TEST_CHECK( text.empty() );
280 controller->SetText( "Hello world" );
282 // Select the whole text.
283 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
284 DALI_TEST_CHECK( button );
286 button.DoAction( "buttonClick", attributes );
288 // Call relayout to process the input events.
289 controller->Relayout( CONTROL_SIZE );
291 // Copy to the clipboard.
292 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_COPY ) );
293 DALI_TEST_CHECK( button );
295 button.DoAction( "buttonClick", attributes );
297 // Call relayout to process the input events.
298 controller->Relayout( CONTROL_SIZE );
301 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
302 DALI_TEST_CHECK( button );
304 button.DoAction( "buttonClick", attributes );
306 // Force to update the model.
307 controller->GetNaturalSize();
309 controller->GetText( text );
310 DALI_TEST_CHECK( text.empty() );
312 ClipboardEventNotifier clipboardEventNotifier = ClipboardEventNotifier::Get();
313 clipboardEventNotifier.ContentSelectedSignal().Connect( &ContentSelectedCallback );
316 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_PASTE ) );
317 DALI_TEST_CHECK( button );
319 button.DoAction( "buttonClick", attributes );
321 // Call relayout to process the input events.
322 controller->Relayout( CONTROL_SIZE );
324 DALI_TEST_EQUALS( "Hello world", gClipboardText, TEST_LOCATION );
326 // Show the clipboard.
327 button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CLIPBOARD ) );
328 DALI_TEST_CHECK( button );
330 button.DoAction( "buttonClick", attributes );
332 tet_result(TET_PASS);
336 int UtcDaliTextControllerGetInputShadowProperty(void)
338 tet_infoline(" UtcDaliTextControllerGetInputShadowProperty");
339 ToolkitTestApplication application;
341 // Creates a text controller.
342 ControllerPtr controller = Controller::New();
344 DALI_TEST_CHECK( controller );
346 const std::string& shadowProperties = controller->GetInputShadowProperties();
348 DALI_TEST_CHECK( shadowProperties.empty() );
350 tet_result(TET_PASS);
354 int UtcDaliTextControllerGetInputUnderlineProperty(void)
356 tet_infoline(" UtcDaliTextControllerGetInputUnderlineProperty");
357 ToolkitTestApplication application;
359 // Creates a text controller.
360 ControllerPtr controller = Controller::New();
362 DALI_TEST_CHECK( controller );
364 const std::string& underlineProperties = controller->GetInputUnderlineProperties();
366 DALI_TEST_CHECK( underlineProperties.empty() );
368 tet_result(TET_PASS);
372 int UtcDaliTextControllerSetGetAutoScrollEnabled(void)
374 tet_infoline(" UtcDaliTextControllerSetGetAutoScrollEnabled");
375 ToolkitTestApplication application;
377 // Creates a text controller.
378 ControllerPtr controller = Controller::New();
380 DALI_TEST_CHECK( controller );
382 DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
384 // The auto scrolling shouldn't be enabled if the multi-line is enabled.
386 // Enable multi-line.
387 controller->SetMultiLineEnabled( true );
389 // Enable text scrolling.
390 controller->SetAutoScrollEnabled( true );
392 DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
394 // Disable multi-line.
395 controller->SetMultiLineEnabled( false );
397 // Enable text scrolling.
398 controller->SetAutoScrollEnabled( true );
400 // Should be ebabled now.
401 DALI_TEST_CHECK( controller->IsAutoScrollEnabled() );
403 tet_result(TET_PASS);
407 int UtcDaliTextControllerSetGetAutoScrollSpeed(void)
409 tet_infoline(" UtcDaliTextControllerSetGetAutoScrollSpeed");
410 ToolkitTestApplication application;
412 // Creates a text controller.
413 ControllerPtr controller = Controller::New();
415 DALI_TEST_CHECK( controller );
417 // Check the default value.
418 DALI_TEST_EQUALS( 0, controller->GetAutoScrollSpeed(), TEST_LOCATION );
420 // Set the auto scroll speed.
421 controller->SetAutoscrollSpeed( 10 );
423 DALI_TEST_EQUALS( 10, controller->GetAutoScrollSpeed(), TEST_LOCATION );
425 tet_result(TET_PASS);
429 int UtcDaliTextControllerSetGetAutoScrollLoopCount(void)
431 tet_infoline(" UtcDaliTextControllerSetGetAutoScrollLoopCount");
432 ToolkitTestApplication application;
434 // Creates a text controller.
435 ControllerPtr controller = Controller::New();
437 DALI_TEST_CHECK( controller );
439 // Check the default value.
440 DALI_TEST_EQUALS( 0, controller->GetAutoScrollLoopCount(), TEST_LOCATION );
442 // Set the auto scroll loop count.
443 controller->SetAutoScrollLoopCount( 5 );
445 DALI_TEST_EQUALS( 5, controller->GetAutoScrollLoopCount(), TEST_LOCATION );
447 tet_result(TET_PASS);
451 int UtcDaliTextControllerSetGetAutoScrollWrapGap(void)
453 tet_infoline(" UtcDaliTextControllerSetGetAutoScrollWrapGap");
454 ToolkitTestApplication application;
456 // Creates a text controller.
457 ControllerPtr controller = Controller::New();
459 DALI_TEST_CHECK( controller );
461 // Check the default value.
462 DALI_TEST_EQUALS( 0.f, controller->GetAutoScrollWrapGap(), Math::MACHINE_EPSILON_1000, TEST_LOCATION );
464 // Set the auto scroll loop count.
465 controller->SetAutoScrollWrapGap( 25.f );
467 DALI_TEST_EQUALS( 25.f, controller->GetAutoScrollWrapGap(), Math::MACHINE_EPSILON_1000, TEST_LOCATION );
469 tet_result(TET_PASS);
473 int UtcDaliTextControllerGetAutoScrollData(void)
475 tet_infoline(" UtcDaliTextControllerGetAutoScrollData");
476 ToolkitTestApplication application;
478 // Load some fonts to get the same metrics on different platforms.
479 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
480 fontClient.SetDpi( 96u, 96u );
482 char* pathNamePtr = get_current_dir_name();
483 const std::string pathName( pathNamePtr );
486 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
488 // Creates a text controller.
489 ControllerPtr controller = Controller::New();
491 DALI_TEST_CHECK( controller );
493 DALI_TEST_CHECK( NULL == controller->GetAutoScrollData() );
495 // Set and check some values.
496 controller->SetAutoscrollSpeed( 10 );
497 controller->SetAutoScrollLoopCount( 5 );
498 controller->SetAutoScrollWrapGap( 25.f );
500 const ScrollerData* scrollerData = controller->GetAutoScrollData();
501 DALI_TEST_CHECK( NULL != controller->GetAutoScrollData() );
503 DALI_TEST_EQUALS( Size::ZERO, scrollerData->mControlSize, TEST_LOCATION );
504 DALI_TEST_EQUALS( Size::ZERO, scrollerData->mOffscreenSize, TEST_LOCATION );
505 DALI_TEST_EQUALS( 10, scrollerData->mScrollSpeed, TEST_LOCATION );
506 DALI_TEST_EQUALS( 5, scrollerData->mLoopCount, TEST_LOCATION );
507 DALI_TEST_EQUALS( 25.f, scrollerData->mWrapGap, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
508 DALI_TEST_EQUALS( 0.f, scrollerData->mAlignmentOffset, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
509 DALI_TEST_CHECK( !scrollerData->mAutoScrollDirectionRTL );
511 // Set some text and layout.
512 controller->SetMarkupProcessorEnabled( true );
513 controller->SetHorizontalAlignment( LayoutEngine::HORIZONTAL_ALIGN_END );
514 controller->SetText( "<font family='TizenSans' size='12'>Hello world</font>" );
515 controller->Relayout( Size( 100.f, 20.f ) );
517 scrollerData = controller->GetAutoScrollData();
518 DALI_TEST_EQUALS( Size( 100.f, 20.f ), scrollerData->mControlSize, TEST_LOCATION );
519 DALI_TEST_EQUALS( Size( 80.f, 20.f ), scrollerData->mOffscreenSize, TEST_LOCATION );
520 DALI_TEST_EQUALS( 20.f, scrollerData->mAlignmentOffset, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
522 tet_result(TET_PASS);