Merge "Fix shader issue during Animation & UPDATE_PROPERTY action" into devel/master
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-TextField-internal.cpp
1 /*
2  * Copyright (c) 2022 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 <stdlib.h>
19 #include <iostream>
20
21 #include <dali-toolkit-test-suite-utils.h>
22 #include <dali-toolkit/dali-toolkit.h>
23
24 #include <dali-toolkit/internal/controls/text-controls/text-field-impl.h>
25 #include <dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager.h>
26 #include <dali-toolkit/internal/text/text-controller-impl.h>
27 #include <dali-toolkit/internal/text/text-controller.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 four children: the renderable, the clipped cursor, the highlight, and the background.
105   DALI_TEST_CHECK(stencil.GetChildCount() == 4u);
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 expectedNumberOfUnderlineRuns = 2u;
173
174   Toolkit::Internal::TextField& textFieldImpl         = GetImpl(textField);
175   const Text::Length            numberOfUnderlineRuns = textFieldImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns();
176
177   DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION);
178
179   Vector<UnderlinedGlyphRun> 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].glyphRun.glyphIndex, 0u, TEST_LOCATION);
185   DALI_TEST_EQUALS(underlineRuns[0u].glyphRun.numberOfGlyphs, 3u, TEST_LOCATION);
186
187   //GH are underlined
188   DALI_TEST_EQUALS(underlineRuns[1u].glyphRun.glyphIndex, 5u, TEST_LOCATION);
189   DALI_TEST_EQUALS(underlineRuns[1u].glyphRun.numberOfGlyphs, 2u, TEST_LOCATION);
190
191   END_TEST;
192 }
193
194 int UtcDaliTextFieldMarkupUnderlineAttributes(void)
195 {
196   ToolkitTestApplication application;
197   tet_infoline(" UtcDaliTextFieldMarkupUnderlineAttributes ");
198
199   TextField textField = TextField::New();
200
201   application.GetScene().Add(textField);
202
203   std::string testText =
204     "start<u>ABC1</u>then"
205     "<u type='solid'>ABC2</u>then"
206     "<u type='dashed'>ABC3</u>then"
207     "<u type='double'>ABC4</u>then"
208     "<u color='green'>ABC5</u>then"
209     "<u height='5.0f'>ABC6</u>then"
210     "<u type='dashed' dash-gap='3.0f'>ABC7</u>then"
211     "<u type='dashed' dash-width='4.0f'>ABC8</u>then"
212     "<u color='blue' type='dashed' height='4.0f' dash-gap='2.0f' dash-width='3.0f'>ABC9</u>end"
213
214     ;
215
216   textField.SetProperty(TextField::Property::TEXT, testText);
217   textField.SetProperty(TextField ::Property::ENABLE_MARKUP, true);
218
219   application.SendNotification();
220   application.Render();
221
222   const uint32_t expectedNumberOfUnderlineRuns = 9u;
223
224   Toolkit::Internal::TextField& textFieldImpl         = GetImpl(textField);
225   const Text::Length            numberOfUnderlineRuns = textFieldImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns();
226
227   DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION);
228
229   Vector<UnderlinedGlyphRun> underlineRuns;
230   underlineRuns.Resize(numberOfUnderlineRuns);
231   textFieldImpl.GetTextController()->GetTextModel()->GetUnderlineRuns(underlineRuns.Begin(), 0u, numberOfUnderlineRuns);
232
233   struct DataOfCase
234   {
235     std::string              title;
236     GlyphIndex               glyphIndex;
237     Length                   numberOfGlyphs;
238     UnderlineStyleProperties properties;
239   };
240   DataOfCase data[] =
241     {
242       //<u>ABC1</u>
243       {"<u>ABC1</u>",
244        5u,
245        4u,
246        {
247          Text::Underline::SOLID,
248          Color::BLACK,
249          0u,
250          1u,
251          2u,
252          false,
253          false,
254          false,
255          false,
256          false,
257        }},
258
259       //<u type='solid'>ABC2</u>
260       {"<u type='solid'>ABC2</u>",
261        13u,
262        4u,
263        {
264          Text::Underline::SOLID,
265          Color::BLACK,
266          0u,
267          1u,
268          2u,
269          true,
270          false,
271          false,
272          false,
273          false,
274        }},
275
276       //<u type='dashed'>ABC3</u>
277       {"<u type='dashed'>ABC3</u>",
278        21u,
279        4u,
280        {
281          Text::Underline::DASHED,
282          Color::BLACK,
283          0u,
284          1u,
285          2u,
286          true,
287          false,
288          false,
289          false,
290          false,
291        }},
292
293       //<u type='double'>ABC4</u>
294       {"<u type='double'>ABC4</u>",
295        29u,
296        4u,
297        {
298          Text::Underline::DOUBLE,
299          Color::BLACK,
300          0u,
301          1u,
302          2u,
303          true,
304          false,
305          false,
306          false,
307          false,
308        }},
309
310       //<u color='green'>ABC5</u>
311       {"<u color='green'>ABC5</u>",
312        37u,
313        4u,
314        {
315          Text::Underline::SOLID,
316          Color::GREEN,
317          0u,
318          1u,
319          2u,
320          false,
321          true,
322          false,
323          false,
324          false,
325        }},
326
327       //<u height='5.0f'>ABC6</u>
328       {"<u height='5.0f'>ABC6</u>",
329        45u,
330        4u,
331        {
332          Text::Underline::SOLID,
333          Color::BLACK,
334          5u,
335          1u,
336          2u,
337          false,
338          false,
339          true,
340          false,
341          false,
342        }},
343
344       //<u type='dashed' dash-gap='3.0f'>ABC7</u>
345       {"<u type='dashed' dash-gap='3.0f'>ABC7</u>",
346        53u,
347        4u,
348        {
349          Text::Underline::DASHED,
350          Color::BLACK,
351          0u,
352          3u,
353          2u,
354          true,
355          false,
356          false,
357          true,
358          false,
359        }},
360
361       //<u type='dashed' dash-width='4.0f'>ABC8</u>
362       {"<u type='dashed' dash-width='4.0f'>ABC8</u>",
363        61u,
364        4u,
365        {
366          Text::Underline::DASHED,
367          Color::BLACK,
368          0u,
369          1u,
370          4u,
371          true,
372          false,
373          false,
374          false,
375          true,
376        }},
377
378       //<u color='blue' type='dashed' height='4.0f' dash-gap='2.0f' dash-width='3.0f'>
379       {"<u color='blue' type='dashed' height='4.0f' dash-gap='2.0f' dash-width='3.0f'>",
380        69u,
381        4u,
382        {
383          Text::Underline::DASHED,
384          Color::BLUE,
385          4u,
386          2u,
387          3u,
388          true,
389          true,
390          true,
391          true,
392          true,
393        }},
394
395     };
396
397   for(uint32_t i = 0; i < expectedNumberOfUnderlineRuns; i++)
398   {
399     tet_infoline(data[i].title.c_str());
400     DALI_TEST_EQUALS(underlineRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION);
401     DALI_TEST_EQUALS(underlineRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION);
402     DALI_TEST_CHECK(data[i].properties == underlineRuns[i].properties);
403   }
404
405   END_TEST;
406 }
407
408 int UtcDaliTextFieldMarkupSpanUnderline(void)
409 {
410   ToolkitTestApplication application;
411   tet_infoline(" UtcDaliTextFieldMarkupSpanUnderline ");
412
413   TextField textField = TextField::New();
414
415   application.GetScene().Add(textField);
416
417   std::string testText =
418     "start<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red'>ABC1</span>then"
419     "<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-type='solid'>ABC2</span>then"
420     "<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-type='dashed'>ABC3</span>then"
421     "<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-type='double'>ABC4</span>then"
422     "<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-color='green'>ABC5</span>then"
423     "<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-height='5.0f'>ABC6</span>then"
424     "<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-type='dashed' u-dash-gap='3.0f'>ABC7</span>then"
425     "<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-type='dashed' u-dash-width='4.0f'>ABC8</span>then"
426     "<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-color='blue' u-type='dashed' u-height='4.0f' u-dash-gap='2.0f' u-dash-width='3.0f'>ABC9</span>end";
427
428   textField.SetProperty(TextField::Property::TEXT, testText);
429   textField.SetProperty(TextField ::Property::ENABLE_MARKUP, true);
430
431   application.SendNotification();
432   application.Render();
433
434   const uint32_t expectedNumberOfUnderlineRuns = 8u;
435
436   Toolkit::Internal::TextField& textFieldImpl         = GetImpl(textField);
437   const Text::Length            numberOfUnderlineRuns = textFieldImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns();
438
439   DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION);
440
441   Vector<UnderlinedGlyphRun> underlineRuns;
442   underlineRuns.Resize(numberOfUnderlineRuns);
443   textFieldImpl.GetTextController()->GetTextModel()->GetUnderlineRuns(underlineRuns.Begin(), 0u, numberOfUnderlineRuns);
444
445   struct DataOfCase
446   {
447     std::string              title;
448     GlyphIndex               glyphIndex;
449     Length                   numberOfGlyphs;
450     UnderlineStyleProperties properties;
451   };
452   DataOfCase data[] =
453     {
454       //<u type='solid'>ABC2</u>
455       {"<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-type='solid'>ABC2</span>",
456        13u,
457        4u,
458        {
459          Text::Underline::SOLID,
460          Color::BLACK,
461          0u,
462          1u,
463          2u,
464          true,
465          false,
466          false,
467          false,
468          false,
469        }},
470
471       //<u type='dashed'>ABC3</u>
472       {"<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-type='dashed'>ABC3</span>",
473        21u,
474        4u,
475        {
476          Text::Underline::DASHED,
477          Color::BLACK,
478          0u,
479          1u,
480          2u,
481          true,
482          false,
483          false,
484          false,
485          false,
486        }},
487
488       //<u type='double'>ABC4</u>
489       {"<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-type='double'>ABC4</span>",
490        29u,
491        4u,
492        {
493          Text::Underline::DOUBLE,
494          Color::BLACK,
495          0u,
496          1u,
497          2u,
498          true,
499          false,
500          false,
501          false,
502          false,
503        }},
504
505       //<u color='green'>ABC5</u>
506       {"<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-color='green'>ABC5</span>",
507        37u,
508        4u,
509        {
510          Text::Underline::SOLID,
511          Color::GREEN,
512          0u,
513          1u,
514          2u,
515          false,
516          true,
517          false,
518          false,
519          false,
520        }},
521
522       //<u height='5.0f'>ABC6</u>
523       {"<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-height='5.0f'>ABC6</span>",
524        45u,
525        4u,
526        {
527          Text::Underline::SOLID,
528          Color::BLACK,
529          5u,
530          1u,
531          2u,
532          false,
533          false,
534          true,
535          false,
536          false,
537        }},
538
539       //<u type='dashed' dash-gap='3.0f'>ABC7</u>
540       {"<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-type='dashed' u-dash-gap='3.0f'>ABC7</span>",
541        53u,
542        4u,
543        {
544          Text::Underline::DASHED,
545          Color::BLACK,
546          0u,
547          3u,
548          2u,
549          true,
550          false,
551          false,
552          true,
553          false,
554        }},
555
556       //<u type='dashed' dash-width='4.0f'>ABC8</u>
557       {"<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-type='dashed' u-dash-width='4.0f'>ABC8</span>",
558        61u,
559        4u,
560        {
561          Text::Underline::DASHED,
562          Color::BLACK,
563          0u,
564          1u,
565          4u,
566          true,
567          false,
568          false,
569          false,
570          true,
571        }},
572
573       //<u color='blue' type='dashed' height='4.0f' dash-gap='2.0f' dash-width='3.0f'>
574       {"<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-color='blue' u-type='dashed' u-height='4.0f' u-dash-gap='2.0f' u-dash-width='3.0f'>ABC9</span>",
575        69u,
576        4u,
577        {
578          Text::Underline::DASHED,
579          Color::BLUE,
580          4u,
581          2u,
582          3u,
583          true,
584          true,
585          true,
586          true,
587          true,
588        }},
589
590     };
591
592   for(uint32_t i = 0; i < expectedNumberOfUnderlineRuns; i++)
593   {
594     tet_infoline(data[i].title.c_str());
595     DALI_TEST_EQUALS(underlineRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION);
596     DALI_TEST_EQUALS(underlineRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION);
597     DALI_TEST_CHECK(data[i].properties == underlineRuns[i].properties);
598   }
599
600   END_TEST;
601 }
602
603 int UtcDaliTextFieldMarkupNestedUnderlineTags(void)
604 {
605   ToolkitTestApplication application;
606   tet_infoline(" UtcDaliTextFieldMarkupNestedUnderlineTags ");
607
608   TextField textField = TextField::New();
609
610   application.GetScene().Add(textField);
611
612   std::string testText = "start<u height='5.0f' color='green' >AB<u color='blue' >XYZ</u>CDE</u>end";
613
614   textField.SetProperty(TextField::Property::TEXT, testText);
615   textField.SetProperty(TextField ::Property::ENABLE_MARKUP, true);
616
617   application.SendNotification();
618   application.Render();
619
620   const uint32_t expectedNumberOfUnderlineRuns = 2u;
621
622   Toolkit::Internal::TextField& textFieldImpl         = GetImpl(textField);
623   const Text::Length            numberOfUnderlineRuns = textFieldImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns();
624
625   DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION);
626
627   Vector<UnderlinedGlyphRun> underlineRuns;
628   underlineRuns.Resize(numberOfUnderlineRuns);
629   textFieldImpl.GetTextController()->GetTextModel()->GetUnderlineRuns(underlineRuns.Begin(), 0u, numberOfUnderlineRuns);
630
631   struct DataOfCase
632   {
633     std::string              title;
634     GlyphIndex               glyphIndex;
635     Length                   numberOfGlyphs;
636     UnderlineStyleProperties properties;
637   };
638   DataOfCase data[] =
639     {
640       //Outter
641       {"<u height='5.0f' color='green' >AB<u color='blue' >XYZ</u>CDE</u>",
642        5u,
643        8u,
644        {
645          Text::Underline::SOLID,
646          Color::GREEN,
647          5u,
648          1u,
649          2u,
650          false,
651          true,
652          true,
653          false,
654          false,
655        }},
656
657       //Inner
658       {"<u color='blue' >XYZ</u>",
659        7u,
660        3u,
661        {
662          Text::Underline::SOLID,
663          Color::BLUE,
664          5u,
665          1u,
666          2u,
667          false,
668          true,
669          true,
670          false,
671          false,
672        }},
673
674     };
675
676   for(uint32_t i = 0; i < expectedNumberOfUnderlineRuns; i++)
677   {
678     tet_infoline(data[i].title.c_str());
679     DALI_TEST_EQUALS(underlineRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION);
680     DALI_TEST_EQUALS(underlineRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION);
681     DALI_TEST_CHECK(data[i].properties == underlineRuns[i].properties);
682   }
683
684   END_TEST;
685 }
686
687 int UtcDaliTextFieldFontPointSizeLargerThanAtlas(void)
688 {
689   ToolkitTestApplication application;
690   tet_infoline(" UtcDaliTextFieldFontPointSizeLargerThanAtlas ");
691
692   // Create a Text field
693   TextField textField = TextField::New();
694   //Set size to avoid automatic eliding
695   textField.SetProperty(Actor::Property::SIZE, Vector2(1025, 1025));
696   //Set very large font-size using point-size
697   textField.SetProperty(TextField::Property::POINT_SIZE, 1000);
698   //Specify font-family
699   textField.SetProperty(TextField::Property::FONT_FAMILY, "DejaVu Sans");
700   //Set text to check if appear or not
701   textField.SetProperty(TextField::Property::TEXT, "A");
702
703   application.GetScene().Add(textField);
704
705   application.SendNotification();
706   application.Render();
707
708   //Check if Glyph is added to AtlasGlyphManger or not
709   int countAtlas = AtlasGlyphManager::Get().GetMetrics().mAtlasMetrics.mAtlasCount;
710   DALI_TEST_EQUALS(countAtlas, 1, TEST_LOCATION);
711
712   END_TEST;
713 }
714
715 int UtcDaliTextFieldFontPointSizeLargerThanAtlasPlaceholderCase(void)
716 {
717   ToolkitTestApplication application;
718   tet_infoline(" UtcDaliTextFieldFontPointSizeLargerThanAtlasPlaceholderCase ");
719
720   //Set Map of placeholder: text, font-family and point-size
721   Property::Map placeholderMapSet;
722   placeholderMapSet["text"]       = "A";
723   placeholderMapSet["fontFamily"] = "DejaVu Sans";
724   placeholderMapSet["pixelSize"]  = 1000.0f;
725
726   // Create a text editor
727   TextField textField = TextField::New();
728   //Set size to avoid automatic eliding
729   textField.SetProperty(Actor::Property::SIZE, Vector2(1025, 1025));
730   //Set placeholder
731   textField.SetProperty(TextField::Property::PLACEHOLDER, placeholderMapSet);
732
733   application.GetScene().Add(textField);
734
735   application.SendNotification();
736   application.Render();
737
738   //Check if Glyph is added to AtlasGlyphManger or not
739   int countAtlas = AtlasGlyphManager::Get().GetMetrics().mAtlasMetrics.mAtlasCount;
740   DALI_TEST_EQUALS(countAtlas, 1, TEST_LOCATION);
741
742   END_TEST;
743 }
744
745 int UtcDaliTextFieldBackgroundTag(void)
746 {
747   ToolkitTestApplication application;
748   tet_infoline("UtcDaliTextFieldBackgroundTag\n");
749
750   TextField field = TextField::New();
751   DALI_TEST_CHECK(field);
752
753   field.SetProperty(TextField ::Property::ENABLE_MARKUP, true);
754   field.SetProperty(TextField::Property::TEXT, "H<background color='red'>e</background> Worl<background color='yellow'>d</background>");
755   application.GetScene().Add(field);
756   application.SendNotification();
757   application.Render();
758
759   Toolkit::Internal::TextField& fieldImpl                    = GetImpl(field);
760   const ColorIndex* const       backgroundColorIndicesBuffer = fieldImpl.GetTextController()->GetTextModel()->GetBackgroundColorIndices();
761
762   DALI_TEST_CHECK(backgroundColorIndicesBuffer);
763
764   //default color
765   DALI_TEST_EQUALS(backgroundColorIndicesBuffer[0], 0u, TEST_LOCATION);
766
767   //red color
768   DALI_TEST_EQUALS(backgroundColorIndicesBuffer[1], 1u, TEST_LOCATION);
769
770   //yellow color
771   DALI_TEST_EQUALS(backgroundColorIndicesBuffer[7], 2u, TEST_LOCATION);
772
773   END_TEST;
774 }
775
776 int UtcDaliToolkitTextFieldEllipsisInternalAPIs(void)
777 {
778   ToolkitTestApplication application;
779   tet_infoline(" UtcDaliToolkitTextFieldEllipsisInternalAPIs ");
780   TextField textField = TextField::New();
781
782   Toolkit::Internal::TextField& textFieldImpl = GetImpl(textField);
783   Text::ViewInterface&          view          = textFieldImpl.GetTextController()->GetView();
784
785   tet_infoline(" UtcDaliToolkitTextFieldEllipsisInternalAPIs - ELLIPSIS Disabled");
786   textField.SetProperty(DevelTextField::Property::ELLIPSIS, false);
787   DALI_TEST_EQUALS(textField.GetProperty<bool>(DevelTextField::Property::ELLIPSIS), false, TEST_LOCATION);
788   DALI_TEST_CHECK(!(view.IsTextElideEnabled()));
789
790   tet_infoline(" UtcDaliToolkitTextFieldEllipsisInternalAPIs - ELLIPSIS Enabled");
791   textField.SetProperty(DevelTextField::Property::ELLIPSIS, true);
792   DALI_TEST_EQUALS(textField.GetProperty<bool>(DevelTextField::Property::ELLIPSIS), true, TEST_LOCATION);
793   DALI_TEST_CHECK(view.IsTextElideEnabled());
794
795   tet_infoline(" UtcDaliToolkitTextFieldEllipsisInternalAPIs - GetStartIndexOfElidedGlyphs Default");
796   DALI_TEST_EQUALS(view.GetStartIndexOfElidedGlyphs(), 0u, TEST_LOCATION);
797
798   tet_infoline(" UtcDaliToolkitTextFieldEllipsisInternalAPIs - GetEndIndexOfElidedGlyphs Default");
799   DALI_TEST_EQUALS(view.GetEndIndexOfElidedGlyphs(), 0u, TEST_LOCATION);
800
801   tet_infoline(" UtcDaliToolkitTextFieldEllipsisInternalAPIs - GetFirstMiddleIndexOfElidedGlyphs Default");
802   DALI_TEST_EQUALS(view.GetFirstMiddleIndexOfElidedGlyphs(), 0u, TEST_LOCATION);
803
804   tet_infoline(" UtcDaliToolkitTextFieldEllipsisInternalAPIs - GetSecondMiddleIndexOfElidedGlyphs Default");
805   DALI_TEST_EQUALS(view.GetSecondMiddleIndexOfElidedGlyphs(), 0u, TEST_LOCATION);
806
807   END_TEST;
808 }
809 int UtcDaliTextFieldTextWithSpan(void)
810 {
811   ToolkitTestApplication application;
812   tet_infoline("UtcDaliTextFieldTextWithSpan\n");
813
814   TextField field = TextField::New();
815   DALI_TEST_CHECK(field);
816
817   field.SetProperty(TextField ::Property::ENABLE_MARKUP, true);
818   field.SetProperty(TextField::Property::TEXT, "Hello Span");
819   application.GetScene().Add(field);
820
821   application.SendNotification();
822   application.Render();
823
824   Vector3 originalSize = field.GetNaturalSize();
825   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");
826
827   application.SendNotification();
828   application.Render();
829
830   Vector3 spanSize = field.GetNaturalSize();
831
832   DALI_TEST_GREATER(spanSize.width, originalSize.width, TEST_LOCATION);
833
834   Toolkit::Internal::TextField& fieldImpl           = GetImpl(field);
835   const ColorIndex* const       colorIndicesBuffer1 = fieldImpl.GetTextController()->GetTextModel()->GetColorIndices();
836
837   DALI_TEST_CHECK(colorIndicesBuffer1);
838
839   //default color
840   DALI_TEST_EQUALS(colorIndicesBuffer1[0], 0u, TEST_LOCATION);
841
842   //span color
843   DALI_TEST_EQUALS(colorIndicesBuffer1[1], 1u, TEST_LOCATION);
844
845   //default color
846   DALI_TEST_EQUALS(colorIndicesBuffer1[6], 0u, TEST_LOCATION);
847
848   field.SetProperty(TextField::Property::TEXT, "<span font-size='45'>H</span>ello <span text-color='red'>S</span>pan");
849
850   application.SendNotification();
851   application.Render();
852
853   const ColorIndex* const colorIndicesBuffer2 = fieldImpl.GetTextController()->GetTextModel()->GetColorIndices();
854
855   DALI_TEST_CHECK(colorIndicesBuffer2);
856
857   //default color
858   DALI_TEST_EQUALS(colorIndicesBuffer2[0], 0u, TEST_LOCATION);
859
860   //default color
861   DALI_TEST_EQUALS(colorIndicesBuffer2[1], 0u, TEST_LOCATION);
862
863   //span color
864   DALI_TEST_EQUALS(colorIndicesBuffer2[6], 1u, TEST_LOCATION);
865
866   //default color
867   DALI_TEST_EQUALS(colorIndicesBuffer2[7], 0u, TEST_LOCATION);
868
869   END_TEST;
870 }
871
872 int UtcDaliTextFieldControlBackgroundColor(void)
873 {
874   ToolkitTestApplication application;
875   tet_infoline(" UtcDaliTextFieldControlBackgroundColor\n");
876
877   TextField field = TextField::New();
878   DALI_TEST_CHECK(field);
879
880   Vector4 backgroundColor;
881
882   field.SetProperty(TextField::Property::TEXT, "Background Color");
883   application.GetScene().Add(field);
884   application.SendNotification();
885   application.Render();
886
887   Toolkit::Internal::TextField& fieldImpl      = GetImpl(field);
888   ControllerPtr                 controller     = fieldImpl.GetTextController();
889   Controller::Impl&             controllerImpl = Controller::Impl::GetImplementation(*controller.Get());
890
891   // Default color is transparent
892   controllerImpl.mEditableControlInterface->GetControlBackgroundColor(backgroundColor);
893   DALI_TEST_EQUALS(backgroundColor, Color::TRANSPARENT, TEST_LOCATION);
894
895   // Set background color to red
896   field.SetBackgroundColor(Color::RED);
897   application.SendNotification();
898   application.Render();
899
900   // Should be red
901   controllerImpl.mEditableControlInterface->GetControlBackgroundColor(backgroundColor);
902   DALI_TEST_EQUALS(backgroundColor, Color::RED, TEST_LOCATION);
903
904   END_TEST;
905 }
906
907 int UtcDaliTextFieldMarkupStrikethrough(void)
908 {
909   ToolkitTestApplication application;
910   tet_infoline(" UtcDaliTextFieldMarkupStrikethrough ");
911
912   TextField textField = TextField::New();
913
914   application.GetScene().Add(textField);
915
916   textField.SetProperty(TextField::Property::TEXT, "<s>ABC</s>EF<s color='red'>GH</s>");
917   textField.SetProperty(TextField ::Property::ENABLE_MARKUP, true);
918
919   application.SendNotification();
920   application.Render();
921
922   uint32_t expectedNumberOfStrikethroughGlyphs = 2u;
923
924   Toolkit::Internal::TextField& textFieldImpl             = GetImpl(textField);
925   const Text::Length            numberOfStrikethroughRuns = textFieldImpl.GetTextController()->GetTextModel()->GetNumberOfStrikethroughRuns();
926
927   DALI_TEST_EQUALS(numberOfStrikethroughRuns, expectedNumberOfStrikethroughGlyphs, TEST_LOCATION);
928
929   Vector<StrikethroughGlyphRun> strikethroughRuns;
930   strikethroughRuns.Resize(numberOfStrikethroughRuns);
931   textFieldImpl.GetTextController()->GetTextModel()->GetStrikethroughRuns(strikethroughRuns.Begin(), 0u, numberOfStrikethroughRuns);
932
933   //ABC have strikethrough
934   DALI_TEST_EQUALS(strikethroughRuns[0u].glyphRun.glyphIndex, 0u, TEST_LOCATION);
935   DALI_TEST_EQUALS(strikethroughRuns[0u].glyphRun.numberOfGlyphs, 3u, TEST_LOCATION);
936   DALI_TEST_CHECK(!strikethroughRuns[0u].isColorSet);
937
938   //GH have strikethrough
939   DALI_TEST_EQUALS(strikethroughRuns[1u].glyphRun.glyphIndex, 5u, TEST_LOCATION);
940   DALI_TEST_EQUALS(strikethroughRuns[1u].glyphRun.numberOfGlyphs, 2u, TEST_LOCATION);
941   DALI_TEST_CHECK(strikethroughRuns[1u].isColorSet);
942
943   END_TEST;
944 }
945
946 int UtcDaliTextFieldMarkupStrikethroughNoEndTag(void)
947 {
948   ToolkitTestApplication application;
949   tet_infoline(" UtcDaliTextFieldMarkupStrikethroughNoEndTag ");
950
951   TextField textField = TextField::New();
952
953   application.GetScene().Add(textField);
954
955   textField.SetProperty(TextField::Property::TEXT, "<s>ABC");
956   textField.SetProperty(TextField ::Property::ENABLE_MARKUP, true);
957
958   application.SendNotification();
959   application.Render();
960
961   uint32_t expectedNumberOfStrikethroughGlyphs = 0u;
962
963   Toolkit::Internal::TextField& textFieldImpl             = GetImpl(textField);
964   Text::Length                  numberOfStrikethroughRuns = textFieldImpl.GetTextController()->GetTextModel()->GetNumberOfStrikethroughRuns();
965
966   DALI_TEST_EQUALS(numberOfStrikethroughRuns, expectedNumberOfStrikethroughGlyphs, TEST_LOCATION);
967
968   END_TEST;
969 }