Merge "[ATSPI][SVACE] Fixes use of v variable after it was freed by eldbus_service_in...
[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 UtcDaliTextFieldTextWithSpan(void)
288 {
289   ToolkitTestApplication application;
290   tet_infoline("UtcDaliTextFieldTextWithSpan\n");
291
292   TextField field = TextField::New();
293   DALI_TEST_CHECK( field );
294
295   field.SetProperty( TextField ::Property::ENABLE_MARKUP,  true );
296   field.SetProperty( TextField::Property::TEXT, "Hello Span" );
297   application.GetScene().Add( field );
298
299   application.SendNotification();
300   application.Render();
301
302   Vector3 originalSize = field.GetNaturalSize();
303   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" );
304
305   application.SendNotification();
306   application.Render();
307
308   Vector3 spanSize = field.GetNaturalSize();
309
310   DALI_TEST_GREATER(spanSize.width, originalSize.width, TEST_LOCATION);
311
312   Toolkit::Internal::TextField& fieldImpl = GetImpl( field );
313   const ColorIndex* const colorIndicesBuffer1 = fieldImpl.GetTextController()->GetTextModel()->GetColorIndices();
314
315   DALI_TEST_CHECK( colorIndicesBuffer1 );
316
317   //default color
318   DALI_TEST_EQUALS( colorIndicesBuffer1[0], 0u, TEST_LOCATION);
319
320   //span color
321   DALI_TEST_EQUALS( colorIndicesBuffer1[1], 1u, TEST_LOCATION);
322
323   //default color
324   DALI_TEST_EQUALS( colorIndicesBuffer1[6], 0u, TEST_LOCATION);
325
326
327   field.SetProperty( TextField::Property::TEXT, "<span font-size='45'>H</span>ello <span text-color='red'>S</span>pan" );
328
329   application.SendNotification();
330   application.Render();
331
332   const ColorIndex* const colorIndicesBuffer2 = fieldImpl.GetTextController()->GetTextModel()->GetColorIndices();
333
334   DALI_TEST_CHECK( colorIndicesBuffer2 );
335
336   //default color
337   DALI_TEST_EQUALS( colorIndicesBuffer2[0], 0u, TEST_LOCATION);
338
339   //default color
340   DALI_TEST_EQUALS( colorIndicesBuffer2[1], 0u, TEST_LOCATION);
341
342   //span color
343   DALI_TEST_EQUALS( colorIndicesBuffer2[6], 1u, TEST_LOCATION);
344
345   //default color
346   DALI_TEST_EQUALS( colorIndicesBuffer2[7], 0u, TEST_LOCATION);
347
348   END_TEST;
349 }
350
351 int UtcDaliTextFieldControlBackgroundColor(void)
352 {
353   ToolkitTestApplication application;
354   tet_infoline(" UtcDaliTextFieldControlBackgroundColor\n");
355
356   TextField field = TextField::New();
357   DALI_TEST_CHECK(field);
358
359   Vector4 backgroundColor;
360
361   field.SetProperty(TextField::Property::TEXT, "Background Color");
362   application.GetScene().Add(field);
363   application.SendNotification();
364   application.Render();
365
366   Toolkit::Internal::TextField& fieldImpl = GetImpl(field);
367   ControllerPtr controller = fieldImpl.GetTextController();
368   Controller::Impl& controllerImpl = Controller::Impl::GetImplementation(*controller.Get());
369
370   // Default color is transparent
371   controllerImpl.mEditableControlInterface->GetControlBackgroundColor(backgroundColor);
372   DALI_TEST_EQUALS(backgroundColor, Color::TRANSPARENT, TEST_LOCATION);
373
374   // Set background color to red
375   field.SetBackgroundColor(Color::RED);
376   application.SendNotification();
377   application.Render();
378
379   // Should be red
380   controllerImpl.mEditableControlInterface->GetControlBackgroundColor(backgroundColor);
381   DALI_TEST_EQUALS(backgroundColor, Color::RED, TEST_LOCATION);
382
383   END_TEST;
384 }