Merge "Added code for stylable transitions" into devel/master
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-Text-Controller.cpp
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 #include <iostream>
19
20 #include <stdlib.h>
21 #include <limits>
22 #include <unistd.h>
23
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>
30
31 using namespace Dali;
32 using namespace Toolkit;
33 using namespace Text;
34
35 namespace
36 {
37
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.
44
45 const Size CONTROL_SIZE( 300.f, 60.f );
46
47 const std::string DEFAULT_FONT_DIR( "/resources/fonts" );
48
49 class ControlImpl : public ControlInterface, public Text::EditableControlInterface
50 {
51 public:
52   ControlImpl()
53   : ControlInterface()
54   {}
55
56   virtual ~ControlImpl()
57   {}
58
59   virtual void AddDecoration( Actor& actor, bool needsClipping )
60   {}
61
62   virtual void RequestTextRelayout()
63   {}
64
65   virtual void TextChanged()
66   {}
67
68   virtual void MaxLengthReached()
69   {}
70
71   virtual void InputStyleChanged( InputStyle::Mask inputStyleMask )
72   {}
73 };
74
75 std::string gClipboardText;
76 void ContentSelectedCallback( ClipboardEventNotifier& notifier )
77 {
78   gClipboardText = notifier.GetContent();
79 }
80
81 } // namespace
82
83 int UtcDaliTextController(void)
84 {
85   tet_infoline(" UtcDaliTextController");
86   ToolkitTestApplication application;
87
88   // Creates a text controller.
89   ControllerPtr controller = Controller::New();
90
91   DALI_TEST_CHECK( controller );
92
93   tet_result(TET_PASS);
94   END_TEST;
95 }
96
97 int UtcDaliTextControllerEnableCursorBlinking(void)
98 {
99   tet_infoline(" UtcDaliTextControllerEnableCursorBlinking");
100   ToolkitTestApplication application;
101
102   // Creates a text controller.
103   ControllerPtr controller = Controller::New();
104
105   DALI_TEST_CHECK( controller );
106
107   // There is no text input enabled.
108   DALI_TEST_CHECK( !controller->GetEnableCursorBlink() );
109
110   // Enable the text input.
111   // Creates a decorator.
112   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
113                                                        *controller );
114
115   // Enables the text input.
116   controller->EnableTextInput( decorator );
117
118   // Enables the cursor blink.
119   controller->SetEnableCursorBlink( true );
120
121   DALI_TEST_CHECK( controller->GetEnableCursorBlink() );
122
123   // Disables the cursor blink.
124   controller->SetEnableCursorBlink( false );
125
126   DALI_TEST_CHECK( !controller->GetEnableCursorBlink() );
127
128   tet_result(TET_PASS);
129   END_TEST;
130 }
131
132 int UtcDaliTextControllerImfEvent(void)
133 {
134   tet_infoline(" UtcDaliTextController");
135   ToolkitTestApplication application;
136
137   // Creates a text controller.
138   ControllerPtr controller = Controller::New();
139
140   std::string text;
141   ImfManager::ImfEventData imfEvent;
142
143   DALI_TEST_CHECK( controller );
144
145   // Enable the text input.
146   // Creates a decorator.
147   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
148                                                        *controller );
149
150   // Enables the text input.
151   controller->EnableTextInput( decorator );
152
153   // Creates an ImfManager.
154   ImfManager imfManager = ImfManager::Get();
155
156   // Send VOID event.
157   imfEvent = ImfManager::ImfEventData( ImfManager::VOID, "", 0, 0 );
158   controller->OnImfEvent( imfManager, imfEvent );
159
160   controller->GetText( text );
161   DALI_TEST_CHECK( text.empty() );
162
163   // Send COMMIT event.
164   imfEvent = ImfManager::ImfEventData( ImfManager::COMMIT, "Hello ", 0, 6 );
165   controller->OnImfEvent( imfManager, imfEvent );
166
167   // Force to update the model.
168   controller->GetNaturalSize();
169
170   controller->GetText( text );
171   DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
172
173   // Send PREEDIT event
174   imfEvent = ImfManager::ImfEventData( ImfManager::PREEDIT, "w", 6, 1 );
175   controller->OnImfEvent( imfManager, imfEvent );
176
177   // Force to update the model.
178   controller->GetNaturalSize();
179
180   controller->GetText( text );
181   DALI_TEST_EQUALS( "Hello w", text, TEST_LOCATION );
182
183   // Send DELETESURROUNDING event
184   imfEvent = ImfManager::ImfEventData( ImfManager::DELETESURROUNDING, "", -1, 1 );
185   controller->OnImfEvent( imfManager, imfEvent );
186
187   // Force to update the model.
188   controller->GetNaturalSize();
189
190   controller->GetText( text );
191   DALI_TEST_EQUALS( "Hello ", text, TEST_LOCATION );
192
193   // Send PREEDIT event
194   imfEvent = ImfManager::ImfEventData( ImfManager::PREEDIT, "wo", 6, 2 );
195   controller->OnImfEvent( imfManager, imfEvent );
196
197   // Force to update the model.
198   controller->GetNaturalSize();
199
200   controller->GetText( text );
201   DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
202
203   // Send GETSURROUNDING event
204   imfEvent = ImfManager::ImfEventData( ImfManager::GETSURROUNDING, "", 0, 0 );
205   controller->OnImfEvent( imfManager, imfEvent );
206
207   controller->GetText( text );
208   DALI_TEST_EQUALS( "Hello wo", text, TEST_LOCATION );
209
210   tet_result(TET_PASS);
211   END_TEST;
212 }
213
214 int UtcDaliTextControllerTextPopupButtonTouched(void)
215 {
216   tet_infoline(" UtcDaliTextControllerTextPopupButtonTouched");
217   ToolkitTestApplication application;
218
219   // Creates a text controller.
220   ControllerPtr controller = Controller::New();
221
222   DALI_TEST_CHECK( controller );
223
224   std::string text;
225   PushButton button;
226   Property::Map attributes;
227
228   // Enable the text input.
229   // Creates a decorator.
230   Text::DecoratorPtr decorator = Text::Decorator::New( *controller,
231                                                        *controller );
232
233   // Enables the text input.
234   controller->EnableTextInput( decorator );
235
236   // Creates the text's popup.
237   TextSelectionPopupCallbackInterface& callbackInterface = *controller;
238   TextSelectionPopup textPopup = TextSelectionPopup::New( &callbackInterface );
239
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 );
246
247   textPopup.EnableButtons( buttonsToEnable );
248   Stage::GetCurrent().Add( textPopup );
249   textPopup.ShowPopup();
250
251   // Render and notify
252   application.SendNotification();
253   application.Render();
254
255   // Sets some text.
256   controller->SetText( "Hello world" );
257
258   // Select the whole text.
259   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
260   DALI_TEST_CHECK( button );
261
262   button.DoAction( "buttonClick", attributes );
263
264   // Call relayout to process the input events.
265   controller->Relayout( CONTROL_SIZE );
266
267   // Cut the text.
268   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
269   DALI_TEST_CHECK( button );
270
271   button.DoAction( "buttonClick", attributes );
272
273   // Force to update the model.
274   controller->GetNaturalSize();
275
276   controller->GetText( text );
277   DALI_TEST_CHECK( text.empty() );
278
279   // Set text again.
280   controller->SetText( "Hello world" );
281
282   // Select the whole text.
283   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_SELECT_ALL ) );
284   DALI_TEST_CHECK( button );
285
286   button.DoAction( "buttonClick", attributes );
287
288   // Call relayout to process the input events.
289   controller->Relayout( CONTROL_SIZE );
290
291   // Copy to the clipboard.
292   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_COPY ) );
293   DALI_TEST_CHECK( button );
294
295   button.DoAction( "buttonClick", attributes );
296
297   // Call relayout to process the input events.
298   controller->Relayout( CONTROL_SIZE );
299
300   // Cut the text.
301   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CUT ) );
302   DALI_TEST_CHECK( button );
303
304   button.DoAction( "buttonClick", attributes );
305
306   // Force to update the model.
307   controller->GetNaturalSize();
308
309   controller->GetText( text );
310   DALI_TEST_CHECK( text.empty() );
311
312   ClipboardEventNotifier clipboardEventNotifier = ClipboardEventNotifier::Get();
313   clipboardEventNotifier.ContentSelectedSignal().Connect( &ContentSelectedCallback );
314
315   // Paste the text.
316   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_PASTE ) );
317   DALI_TEST_CHECK( button );
318
319   button.DoAction( "buttonClick", attributes );
320
321   // Call relayout to process the input events.
322   controller->Relayout( CONTROL_SIZE );
323
324   DALI_TEST_EQUALS( "Hello world", gClipboardText, TEST_LOCATION );
325
326   // Show the clipboard.
327   button = PushButton::DownCast( textPopup.FindChildByName( OPTION_CLIPBOARD ) );
328   DALI_TEST_CHECK( button );
329
330   button.DoAction( "buttonClick", attributes );
331
332   tet_result(TET_PASS);
333   END_TEST;
334 }
335
336 int UtcDaliTextControllerGetInputShadowProperty(void)
337 {
338   tet_infoline(" UtcDaliTextControllerGetInputShadowProperty");
339   ToolkitTestApplication application;
340
341   // Creates a text controller.
342   ControllerPtr controller = Controller::New();
343
344   DALI_TEST_CHECK( controller );
345
346   const std::string& shadowProperties = controller->GetInputShadowProperties();
347
348   DALI_TEST_CHECK( shadowProperties.empty() );
349
350   tet_result(TET_PASS);
351   END_TEST;
352 }
353
354 int UtcDaliTextControllerGetInputUnderlineProperty(void)
355 {
356   tet_infoline(" UtcDaliTextControllerGetInputUnderlineProperty");
357   ToolkitTestApplication application;
358
359   // Creates a text controller.
360   ControllerPtr controller = Controller::New();
361
362   DALI_TEST_CHECK( controller );
363
364   const std::string& underlineProperties = controller->GetInputUnderlineProperties();
365
366   DALI_TEST_CHECK( underlineProperties.empty() );
367
368   tet_result(TET_PASS);
369   END_TEST;
370 }
371
372 int UtcDaliTextControllerSetGetAutoScrollEnabled(void)
373 {
374   tet_infoline(" UtcDaliTextControllerSetGetAutoScrollEnabled");
375   ToolkitTestApplication application;
376
377   // Creates a text controller.
378   ControllerPtr controller = Controller::New();
379
380   DALI_TEST_CHECK( controller );
381
382   DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
383
384   // The auto scrolling shouldn't be enabled if the multi-line is enabled.
385
386   // Enable multi-line.
387   controller->SetMultiLineEnabled( true );
388
389   // Enable text scrolling.
390   controller->SetAutoScrollEnabled( true );
391
392   DALI_TEST_CHECK( !controller->IsAutoScrollEnabled() );
393
394   // Disable multi-line.
395   controller->SetMultiLineEnabled( false );
396
397   // Enable text scrolling.
398   controller->SetAutoScrollEnabled( true );
399
400   // Should be ebabled now.
401   DALI_TEST_CHECK( controller->IsAutoScrollEnabled() );
402
403   tet_result(TET_PASS);
404   END_TEST;
405 }
406
407 int UtcDaliTextControllerSetGetAutoScrollSpeed(void)
408 {
409   tet_infoline(" UtcDaliTextControllerSetGetAutoScrollSpeed");
410   ToolkitTestApplication application;
411
412   // Creates a text controller.
413   ControllerPtr controller = Controller::New();
414
415   DALI_TEST_CHECK( controller );
416
417   // Check the default value.
418   DALI_TEST_EQUALS( 0, controller->GetAutoScrollSpeed(), TEST_LOCATION );
419
420   // Set the auto scroll speed.
421   controller->SetAutoscrollSpeed( 10 );
422
423   DALI_TEST_EQUALS( 10, controller->GetAutoScrollSpeed(), TEST_LOCATION );
424
425   tet_result(TET_PASS);
426   END_TEST;
427 }
428
429 int UtcDaliTextControllerSetGetAutoScrollLoopCount(void)
430 {
431   tet_infoline(" UtcDaliTextControllerSetGetAutoScrollLoopCount");
432   ToolkitTestApplication application;
433
434   // Creates a text controller.
435   ControllerPtr controller = Controller::New();
436
437   DALI_TEST_CHECK( controller );
438
439   // Check the default value.
440   DALI_TEST_EQUALS( 0, controller->GetAutoScrollLoopCount(), TEST_LOCATION );
441
442   // Set the auto scroll loop count.
443   controller->SetAutoScrollLoopCount( 5 );
444
445   DALI_TEST_EQUALS( 5, controller->GetAutoScrollLoopCount(), TEST_LOCATION );
446
447   tet_result(TET_PASS);
448   END_TEST;
449 }
450
451 int UtcDaliTextControllerSetGetAutoScrollWrapGap(void)
452 {
453   tet_infoline(" UtcDaliTextControllerSetGetAutoScrollWrapGap");
454   ToolkitTestApplication application;
455
456   // Creates a text controller.
457   ControllerPtr controller = Controller::New();
458
459   DALI_TEST_CHECK( controller );
460
461   // Check the default value.
462   DALI_TEST_EQUALS( 0.f, controller->GetAutoScrollWrapGap(), Math::MACHINE_EPSILON_1000, TEST_LOCATION );
463
464   // Set the auto scroll loop count.
465   controller->SetAutoScrollWrapGap( 25.f );
466
467   DALI_TEST_EQUALS( 25.f, controller->GetAutoScrollWrapGap(), Math::MACHINE_EPSILON_1000, TEST_LOCATION );
468
469   tet_result(TET_PASS);
470   END_TEST;
471 }
472
473 int UtcDaliTextControllerGetAutoScrollData(void)
474 {
475   tet_infoline(" UtcDaliTextControllerGetAutoScrollData");
476   ToolkitTestApplication application;
477
478   // Load some fonts to get the same metrics on different platforms.
479   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
480   fontClient.SetDpi( 96u, 96u );
481
482   char* pathNamePtr = get_current_dir_name();
483   const std::string pathName( pathNamePtr );
484   free( pathNamePtr );
485
486   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
487
488   // Creates a text controller.
489   ControllerPtr controller = Controller::New();
490
491   DALI_TEST_CHECK( controller );
492
493   DALI_TEST_CHECK( NULL == controller->GetAutoScrollData() );
494
495   // Set and check some values.
496   controller->SetAutoscrollSpeed( 10 );
497   controller->SetAutoScrollLoopCount( 5 );
498   controller->SetAutoScrollWrapGap( 25.f );
499
500   const ScrollerData* scrollerData = controller->GetAutoScrollData();
501   DALI_TEST_CHECK( NULL != controller->GetAutoScrollData() );
502
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 );
510
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 ) );
516
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 );
521
522   tet_result(TET_PASS);
523   END_TEST;
524 }