Merge "Reduce the number of conversion between std::string <-> VisaulUrl at interal...
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-TextField-internal.cpp
1 /*
2  * Copyright (c) 2021 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 #include <stdlib.h>
20
21 #include <dali-toolkit-test-suite-utils.h>
22 #include <dali-toolkit/dali-toolkit.h>
23
24 #include <dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager.h>
25 #include <dali-toolkit/internal/controls/text-controls/text-field-impl.h>
26 #include <dali-toolkit/internal/text/text-controller.h>
27 #include <dali-toolkit/internal/text/text-controller-impl.h>
28
29 using namespace Dali;
30 using namespace Toolkit;
31 using namespace Text;
32
33 int UtcDaliTextFieldMultipleBackgroundText(void)
34 {
35   ToolkitTestApplication application;
36   tet_infoline( "UtcDaliTextFieldMultipleBackgroundText" );
37
38   // Create a text field
39   TextField textField = TextField::New();
40   textField.SetProperty( Actor::Property::SIZE, Vector2( 400.f, 60.f ) );
41   textField.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT );
42   textField.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
43
44   // Add the text field to the stage
45   application.GetScene().Add( textField );
46
47   application.SendNotification();
48   application.Render();
49
50   Toolkit::Internal::TextField& textFieldImpl = GetImpl( textField );
51   ControllerPtr controller = textFieldImpl.GetTextController();
52   Controller::Impl& controllerImpl = Controller::Impl::GetImplementation( *controller.Get() );
53
54   // Add multiple background colors for the text.
55   ColorRun backgroundColorRun1;
56   backgroundColorRun1.characterRun.characterIndex = 0u;
57   backgroundColorRun1.characterRun.numberOfCharacters = 1u;
58   backgroundColorRun1.color = Color::RED;
59   controllerImpl.mModel->mLogicalModel->mBackgroundColorRuns.PushBack( backgroundColorRun1 );
60
61   ColorRun backgroundColorRun2;
62   backgroundColorRun2.characterRun.characterIndex = 5u;
63   backgroundColorRun2.characterRun.numberOfCharacters = 8u;
64   backgroundColorRun2.color = Color::CYAN;
65   controllerImpl.mModel->mLogicalModel->mBackgroundColorRuns.PushBack( backgroundColorRun2 );
66
67   ColorRun backgroundColorRun3;
68   backgroundColorRun3.characterRun.characterIndex = 23u;
69   backgroundColorRun3.characterRun.numberOfCharacters = 6u;
70   backgroundColorRun3.color = Color::GREEN;
71   controllerImpl.mModel->mLogicalModel->mBackgroundColorRuns.PushBack( backgroundColorRun3 );
72
73   // Check the case where there is only one character in the text
74   controller->SetText( "S" );
75
76   application.SendNotification();
77   application.Render();
78
79   // The offscreen root actor should have one child: the renderable.
80   Actor stencil = textField.GetChildAt( 0u );
81   DALI_TEST_CHECK( stencil.GetChildCount() == 1u );
82
83   // The renderable actor should have two children: the text and the background.
84   Actor renderableActor = stencil.GetChildAt( 0u );
85   DALI_TEST_CHECK( renderableActor.GetChildCount() == 2u );
86
87   // Check that the background is created
88   Actor backgroundActor = renderableActor.GetChildAt( 0u );
89   DALI_TEST_CHECK( backgroundActor );
90   DALI_TEST_CHECK( backgroundActor.GetProperty< std::string >( Dali::Actor::Property::NAME ) == "TextBackgroundColorActor" );
91
92   // Change the text to contain more characters
93   controller->SetText( "Text Multiple Background Test" );
94
95   application.SendNotification();
96   application.Render();
97
98   // Highlight the whole text
99   textFieldImpl.SelectWholeText();
100
101   application.SendNotification();
102   application.Render();
103
104   // Now the offscreen root actor should have three children: the renderable, the highlight, and the background.
105   DALI_TEST_CHECK( stencil.GetChildCount() == 3u );
106   // The renderable actor should have one child only: the text
107   DALI_TEST_CHECK( renderableActor.GetChildCount() == 1u );
108
109   // The background should now be lowered below the highlight
110   backgroundActor = stencil.GetChildAt( 0u );
111   DALI_TEST_CHECK( backgroundActor );
112   DALI_TEST_CHECK( backgroundActor.GetProperty< std::string >( Dali::Actor::Property::NAME ) == "TextBackgroundColorActor" );
113
114   END_TEST;
115 }
116
117 int UtcDaliTextFieldSelectText(void)
118 {
119   ToolkitTestApplication application;
120   tet_infoline( "UtcDaliTextFieldSelectText" );
121
122   // Create a text field
123   TextField textField = TextField::New();
124   textField.SetProperty( Actor::Property::SIZE, Vector2( 400.f, 60.f ) );
125   textField.SetProperty( TextField::Property::TEXT, "Hello World" );
126
127   // Add the text field to the stage
128   application.GetScene().Add( textField );
129
130   application.SendNotification();
131   application.Render();
132
133   Toolkit::Internal::TextField& textFieldImpl = GetImpl( textField );
134
135   application.SendNotification();
136   application.Render();
137
138   // Highlight the whole text
139   textFieldImpl.SelectWholeText();
140
141   application.SendNotification();
142   application.Render();
143
144   DALI_TEST_CHECK( textFieldImpl.GetSelectedText() == "Hello World" );
145
146   // Select None
147   textFieldImpl.SelectNone();
148
149   application.SendNotification();
150   application.Render();
151
152   DALI_TEST_CHECK( textFieldImpl.GetSelectedText() == "" );
153
154   END_TEST;
155 }
156
157 int UtcDaliTextFieldMarkupUnderline(void)
158 {
159   ToolkitTestApplication application;
160   tet_infoline(" UtcDaliTextFieldMarkupUnderline ");
161
162   TextField textField = TextField::New();
163
164   application.GetScene().Add( textField );
165
166   textField.SetProperty( TextField::Property::TEXT, "<u>ABC</u>EF<u>GH</u>" );
167   textField.SetProperty( TextField ::Property::ENABLE_MARKUP,  true );
168
169   application.SendNotification();
170   application.Render();
171
172   uint32_t expectedNumberOfUnderlinedGlyphs = 5u;
173
174   Toolkit::Internal::TextField& textFieldImpl = GetImpl( textField );
175   const Text::Length numberOfUnderlineRuns = textFieldImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns();
176
177   DALI_TEST_EQUALS( numberOfUnderlineRuns, expectedNumberOfUnderlinedGlyphs, TEST_LOCATION );
178
179   Vector<GlyphRun> underlineRuns;
180   underlineRuns.Resize(numberOfUnderlineRuns);
181   textFieldImpl.GetTextController()->GetTextModel()->GetUnderlineRuns(underlineRuns.Begin(), 0u, numberOfUnderlineRuns);
182
183   //ABC are underlined
184   DALI_TEST_EQUALS( underlineRuns[0u].glyphIndex, 0u, TEST_LOCATION);
185   DALI_TEST_EQUALS( underlineRuns[1u].glyphIndex, 1u, TEST_LOCATION);
186   DALI_TEST_EQUALS( underlineRuns[2u].glyphIndex, 2u, TEST_LOCATION);
187
188   //GH are underlined
189   DALI_TEST_EQUALS( underlineRuns[3u].glyphIndex, 5u, TEST_LOCATION);
190   DALI_TEST_EQUALS( underlineRuns[4u].glyphIndex, 6u, TEST_LOCATION);
191
192   END_TEST;
193
194 }
195
196 int UtcDaliTextFieldFontPointSizeLargerThanAtlas(void)
197 {
198   ToolkitTestApplication application;
199   tet_infoline(" UtcDaliTextFieldFontPointSizeLargerThanAtlas ");
200
201   // Create a Text field
202   TextField textField = TextField::New();
203   //Set size to avoid automatic eliding
204   textField.SetProperty( Actor::Property::SIZE, Vector2(1025, 1025));
205   //Set very large font-size using point-size
206   textField.SetProperty( TextField::Property::POINT_SIZE, 1000) ;
207   //Specify font-family
208   textField.SetProperty( TextField::Property::FONT_FAMILY, "DejaVu Sans");
209   //Set text to check if appear or not
210   textField.SetProperty( TextField::Property::TEXT, "A");
211
212   application.GetScene().Add( textField );
213
214   application.SendNotification();
215   application.Render();
216
217   //Check if Glyph is added to AtlasGlyphManger or not
218   int countAtlas = AtlasGlyphManager::Get().GetMetrics().mAtlasMetrics.mAtlasCount;
219   DALI_TEST_EQUALS( countAtlas, 1, TEST_LOCATION );
220
221
222   END_TEST;
223 }
224
225 int UtcDaliTextFieldFontPointSizeLargerThanAtlasPlaceholderCase(void)
226 {
227   ToolkitTestApplication application;
228   tet_infoline(" UtcDaliTextFieldFontPointSizeLargerThanAtlasPlaceholderCase ");
229
230   //Set Map of placeholder: text, font-family and point-size
231   Property::Map placeholderMapSet;
232   placeholderMapSet["text"] = "A";
233   placeholderMapSet["fontFamily"] = "DejaVu Sans";
234   placeholderMapSet["pixelSize"] = 1000.0f;
235
236   // Create a text editor
237   TextField textField = TextField::New();
238   //Set size to avoid automatic eliding
239   textField.SetProperty( Actor::Property::SIZE, Vector2(1025, 1025));
240   //Set placeholder
241   textField.SetProperty( TextField::Property::PLACEHOLDER, placeholderMapSet) ;
242
243   application.GetScene().Add( textField );
244
245   application.SendNotification();
246   application.Render();
247
248   //Check if Glyph is added to AtlasGlyphManger or not
249   int countAtlas = AtlasGlyphManager::Get().GetMetrics().mAtlasMetrics.mAtlasCount;
250   DALI_TEST_EQUALS( countAtlas, 1, TEST_LOCATION );
251
252
253   END_TEST;
254 }
255
256 int UtcDaliTextFieldBackgroundTag(void)
257 {
258   ToolkitTestApplication application;
259   tet_infoline("UtcDaliTextFieldBackgroundTag\n");
260
261   TextField field = TextField::New();
262   DALI_TEST_CHECK( field );
263
264   field.SetProperty( TextField ::Property::ENABLE_MARKUP,  true );
265   field.SetProperty( TextField::Property::TEXT, "H<background color='red'>e</background> Worl<background color='yellow'>d</background>" );
266   application.GetScene().Add( field );
267   application.SendNotification();
268   application.Render();
269
270   Toolkit::Internal::TextField& fieldImpl = GetImpl( field );
271   const ColorIndex* const backgroundColorIndicesBuffer = fieldImpl.GetTextController()->GetTextModel()->GetBackgroundColorIndices();
272
273   DALI_TEST_CHECK( backgroundColorIndicesBuffer );
274
275   //default color
276   DALI_TEST_EQUALS( backgroundColorIndicesBuffer[0], 0u, TEST_LOCATION);
277
278   //red color
279   DALI_TEST_EQUALS( backgroundColorIndicesBuffer[1], 1u, TEST_LOCATION);
280
281   //yellow color
282   DALI_TEST_EQUALS( backgroundColorIndicesBuffer[7], 2u, TEST_LOCATION);
283
284   END_TEST;
285 }
286
287 int UtcDaliToolkitTextFieldEllipsisInternalAPIs(void)
288 {
289   ToolkitTestApplication application;
290   tet_infoline(" UtcDaliToolkitTextFieldEllipsisInternalAPIs ");
291   TextField textField = TextField::New();
292
293   Toolkit::Internal::TextField& textFieldImpl = GetImpl( textField );
294   Text::ViewInterface& view = textFieldImpl.GetTextController()->GetView();
295
296   tet_infoline(" UtcDaliToolkitTextFieldEllipsisInternalAPIs - ELLIPSIS Disabled");
297   textField.SetProperty(DevelTextField::Property::ELLIPSIS, false);
298   DALI_TEST_EQUALS( textField.GetProperty< bool >( DevelTextField::Property::ELLIPSIS ), false, TEST_LOCATION );
299   DALI_TEST_CHECK(!(view.IsTextElideEnabled()));
300
301   tet_infoline(" UtcDaliToolkitTextFieldEllipsisInternalAPIs - ELLIPSIS Enabled");
302   textField.SetProperty(DevelTextField::Property::ELLIPSIS, true);
303   DALI_TEST_EQUALS( textField.GetProperty< bool >( DevelTextField::Property::ELLIPSIS ), true, TEST_LOCATION );
304   DALI_TEST_CHECK(view.IsTextElideEnabled());
305
306   tet_infoline(" UtcDaliToolkitTextFieldEllipsisInternalAPIs - GetStartIndexOfElidedGlyphs Default");
307   DALI_TEST_EQUALS( view.GetStartIndexOfElidedGlyphs(), 0u, TEST_LOCATION );
308
309   tet_infoline(" UtcDaliToolkitTextFieldEllipsisInternalAPIs - GetEndIndexOfElidedGlyphs Default");
310   DALI_TEST_EQUALS( view.GetEndIndexOfElidedGlyphs(), 0u, TEST_LOCATION );
311
312   tet_infoline(" UtcDaliToolkitTextFieldEllipsisInternalAPIs - GetFirstMiddleIndexOfElidedGlyphs Default");
313   DALI_TEST_EQUALS( view.GetFirstMiddleIndexOfElidedGlyphs(), 0u, TEST_LOCATION );
314
315   tet_infoline(" UtcDaliToolkitTextFieldEllipsisInternalAPIs - GetSecondMiddleIndexOfElidedGlyphs Default");
316   DALI_TEST_EQUALS( view.GetSecondMiddleIndexOfElidedGlyphs(), 0u, TEST_LOCATION );
317
318
319   END_TEST;
320 }
321 int UtcDaliTextFieldTextWithSpan(void)
322 {
323   ToolkitTestApplication application;
324   tet_infoline("UtcDaliTextFieldTextWithSpan\n");
325
326   TextField field = TextField::New();
327   DALI_TEST_CHECK( field );
328
329   field.SetProperty( TextField ::Property::ENABLE_MARKUP,  true );
330   field.SetProperty( TextField::Property::TEXT, "Hello Span" );
331   application.GetScene().Add( field );
332
333   application.SendNotification();
334   application.Render();
335
336   Vector3 originalSize = field.GetNaturalSize();
337   field.SetProperty( TextField::Property::TEXT, "H<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red'>ello</span> Span" );
338
339   application.SendNotification();
340   application.Render();
341
342   Vector3 spanSize = field.GetNaturalSize();
343
344   DALI_TEST_GREATER(spanSize.width, originalSize.width, TEST_LOCATION);
345
346   Toolkit::Internal::TextField& fieldImpl = GetImpl( field );
347   const ColorIndex* const colorIndicesBuffer1 = fieldImpl.GetTextController()->GetTextModel()->GetColorIndices();
348
349   DALI_TEST_CHECK( colorIndicesBuffer1 );
350
351   //default color
352   DALI_TEST_EQUALS( colorIndicesBuffer1[0], 0u, TEST_LOCATION);
353
354   //span color
355   DALI_TEST_EQUALS( colorIndicesBuffer1[1], 1u, TEST_LOCATION);
356
357   //default color
358   DALI_TEST_EQUALS( colorIndicesBuffer1[6], 0u, TEST_LOCATION);
359
360
361   field.SetProperty( TextField::Property::TEXT, "<span font-size='45'>H</span>ello <span text-color='red'>S</span>pan" );
362
363   application.SendNotification();
364   application.Render();
365
366   const ColorIndex* const colorIndicesBuffer2 = fieldImpl.GetTextController()->GetTextModel()->GetColorIndices();
367
368   DALI_TEST_CHECK( colorIndicesBuffer2 );
369
370   //default color
371   DALI_TEST_EQUALS( colorIndicesBuffer2[0], 0u, TEST_LOCATION);
372
373   //default color
374   DALI_TEST_EQUALS( colorIndicesBuffer2[1], 0u, TEST_LOCATION);
375
376   //span color
377   DALI_TEST_EQUALS( colorIndicesBuffer2[6], 1u, TEST_LOCATION);
378
379   //default color
380   DALI_TEST_EQUALS( colorIndicesBuffer2[7], 0u, TEST_LOCATION);
381
382   END_TEST;
383 }
384
385 int UtcDaliTextFieldControlBackgroundColor(void)
386 {
387   ToolkitTestApplication application;
388   tet_infoline(" UtcDaliTextFieldControlBackgroundColor\n");
389
390   TextField field = TextField::New();
391   DALI_TEST_CHECK(field);
392
393   Vector4 backgroundColor;
394
395   field.SetProperty(TextField::Property::TEXT, "Background Color");
396   application.GetScene().Add(field);
397   application.SendNotification();
398   application.Render();
399
400   Toolkit::Internal::TextField& fieldImpl = GetImpl(field);
401   ControllerPtr controller = fieldImpl.GetTextController();
402   Controller::Impl& controllerImpl = Controller::Impl::GetImplementation(*controller.Get());
403
404   // Default color is transparent
405   controllerImpl.mEditableControlInterface->GetControlBackgroundColor(backgroundColor);
406   DALI_TEST_EQUALS(backgroundColor, Color::TRANSPARENT, TEST_LOCATION);
407
408   // Set background color to red
409   field.SetBackgroundColor(Color::RED);
410   application.SendNotification();
411   application.Render();
412
413   // Should be red
414   controllerImpl.mEditableControlInterface->GetControlBackgroundColor(backgroundColor);
415   DALI_TEST_EQUALS(backgroundColor, Color::RED, TEST_LOCATION);
416
417   END_TEST;
418 }