5f7328fd19db59126c9e3399b281dbf42cd5f6f8
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-TextEditor-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-editor-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 UtcDaliTextEditorSelectText(void)
34 {
35   ToolkitTestApplication application;
36   tet_infoline("UtcDaliTextEditorSelectText");
37
38   // Create a text editor
39   TextEditor textEditor = TextEditor::New();
40   textEditor.SetProperty(Actor::Property::SIZE, Vector2(400.f, 60.f));
41   textEditor.SetProperty(TextEditor::Property::TEXT, "Hello World");
42
43   // Add the text editor to the stage
44   application.GetScene().Add(textEditor);
45
46   application.SendNotification();
47   application.Render();
48
49   Toolkit::Internal::TextEditor& textEditorImpl = GetImpl(textEditor);
50
51   application.SendNotification();
52   application.Render();
53
54   // Highlight the whole text
55   textEditorImpl.SelectWholeText();
56
57   application.SendNotification();
58   application.Render();
59
60   std::string selectedText = textEditorImpl.GetSelectedText();
61   DALI_TEST_CHECK(selectedText == "Hello World");
62
63   // Select None
64   textEditorImpl.SelectNone();
65
66   application.SendNotification();
67   application.Render();
68
69   selectedText = textEditorImpl.GetSelectedText();
70   DALI_TEST_CHECK(selectedText == "");
71
72   END_TEST;
73 }
74
75 int UtcDaliTextEditorMarkupUnderline(void)
76 {
77   ToolkitTestApplication application;
78   tet_infoline(" UtcDaliTextEditorMarkupUnderline ");
79
80   TextEditor textEditor = TextEditor::New();
81
82   application.GetScene().Add(textEditor);
83
84   textEditor.SetProperty(TextEditor::Property::TEXT, "<u>ABC</u>EF<u>GH</u>");
85   textEditor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
86
87   application.SendNotification();
88   application.Render();
89
90   uint32_t expectedNumberOfUnderlineRuns = 2u;
91
92   Toolkit::Internal::TextEditor& textEditorImpl        = GetImpl(textEditor);
93   const Text::Length             numberOfUnderlineRuns = textEditorImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns();
94
95   DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION);
96
97   Vector<UnderlinedGlyphRun> underlineRuns;
98   underlineRuns.Resize(numberOfUnderlineRuns);
99   textEditorImpl.GetTextController()->GetTextModel()->GetUnderlineRuns(underlineRuns.Begin(), 0u, numberOfUnderlineRuns);
100
101   //ABC are underlined
102   DALI_TEST_EQUALS(underlineRuns[0u].glyphRun.glyphIndex, 0u, TEST_LOCATION);
103   DALI_TEST_EQUALS(underlineRuns[0u].glyphRun.numberOfGlyphs, 3u, TEST_LOCATION);
104
105   //GH are underlined
106   DALI_TEST_EQUALS(underlineRuns[1u].glyphRun.glyphIndex, 5u, TEST_LOCATION);
107   DALI_TEST_EQUALS(underlineRuns[1u].glyphRun.numberOfGlyphs, 2u, TEST_LOCATION);
108
109   END_TEST;
110 }
111
112 int UtcDaliTextEditorMarkupUnderlineAttributes(void)
113 {
114   ToolkitTestApplication application;
115   tet_infoline(" UtcDaliTextEditorMarkupUnderlineAttributes ");
116
117   TextEditor textEditor = TextEditor::New();
118
119   application.GetScene().Add(textEditor);
120
121   std::string testText =
122     "start<u>ABC1</u>then"
123     "<u type='solid'>ABC2</u>then"
124     "<u type='dashed'>ABC3</u>then"
125     "<u type='double'>ABC4</u>then"
126     "<u color='green'>ABC5</u>then"
127     "<u height='5.0f'>ABC6</u>then"
128     "<u type='dashed' dash-gap='3.0f'>ABC7</u>then"
129     "<u type='dashed' dash-width='4.0f'>ABC8</u>then"
130     "<u color='blue' type='dashed' height='4.0f' dash-gap='2.0f' dash-width='3.0f'>ABC9</u>end";
131
132   textEditor.SetProperty(TextEditor::Property::TEXT, testText);
133   textEditor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
134
135   application.SendNotification();
136   application.Render();
137
138   const uint32_t expectedNumberOfUnderlineRuns = 9u;
139
140   Toolkit::Internal::TextEditor& textEditorImpl        = GetImpl(textEditor);
141   const Text::Length             numberOfUnderlineRuns = textEditorImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns();
142
143   DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION);
144
145   Vector<UnderlinedGlyphRun> underlineRuns;
146   underlineRuns.Resize(numberOfUnderlineRuns);
147   textEditorImpl.GetTextController()->GetTextModel()->GetUnderlineRuns(underlineRuns.Begin(), 0u, numberOfUnderlineRuns);
148
149   struct DataOfCase
150   {
151     std::string              title;
152     GlyphIndex               glyphIndex;
153     Length                   numberOfGlyphs;
154     UnderlineStyleProperties properties;
155   };
156   DataOfCase data[] =
157     {
158       //<u>ABC1</u>
159       {"<u>ABC1</u>",
160        5u,
161        4u,
162        {
163          Text::Underline::SOLID,
164          Color::BLACK,
165          0u,
166          1u,
167          2u,
168          false,
169          false,
170          false,
171          false,
172          false,
173        }},
174
175       //<u type='solid'>ABC2</u>
176       {"<u type='solid'>ABC2</u>",
177        13u,
178        4u,
179        {
180          Text::Underline::SOLID,
181          Color::BLACK,
182          0u,
183          1u,
184          2u,
185          true,
186          false,
187          false,
188          false,
189          false,
190        }},
191
192       //<u type='dashed'>ABC3</u>
193       {"<u type='dashed'>ABC3</u>",
194        21u,
195        4u,
196        {
197          Text::Underline::DASHED,
198          Color::BLACK,
199          0u,
200          1u,
201          2u,
202          true,
203          false,
204          false,
205          false,
206          false,
207        }},
208
209       //<u type='double'>ABC4</u>
210       {"<u type='double'>ABC4</u>",
211        29u,
212        4u,
213        {
214          Text::Underline::DOUBLE,
215          Color::BLACK,
216          0u,
217          1u,
218          2u,
219          true,
220          false,
221          false,
222          false,
223          false,
224        }},
225
226       //<u color='green'>ABC5</u>
227       {"<u color='green'>ABC5</u>",
228        37u,
229        4u,
230        {
231          Text::Underline::SOLID,
232          Color::GREEN,
233          0u,
234          1u,
235          2u,
236          false,
237          true,
238          false,
239          false,
240          false,
241        }},
242
243       //<u height='5.0f'>ABC6</u>
244       {"<u height='5.0f'>ABC6</u>",
245        45u,
246        4u,
247        {
248          Text::Underline::SOLID,
249          Color::BLACK,
250          5u,
251          1u,
252          2u,
253          false,
254          false,
255          true,
256          false,
257          false,
258        }},
259
260       //<u type='dashed' dash-gap='3.0f'>ABC7</u>
261       {"<u type='dashed' dash-gap='3.0f'>ABC7</u>",
262        53u,
263        4u,
264        {
265          Text::Underline::DASHED,
266          Color::BLACK,
267          0u,
268          3u,
269          2u,
270          true,
271          false,
272          false,
273          true,
274          false,
275        }},
276
277       //<u type='dashed' dash-width='4.0f'>ABC8</u>
278       {"<u type='dashed' dash-width='4.0f'>ABC8</u>",
279        61u,
280        4u,
281        {
282          Text::Underline::DASHED,
283          Color::BLACK,
284          0u,
285          1u,
286          4u,
287          true,
288          false,
289          false,
290          false,
291          true,
292        }},
293
294       //<u color='blue' type='dashed' height='4.0f' dash-gap='2.0f' dash-width='3.0f'>
295       {"<u color='blue' type='dashed' height='4.0f' dash-gap='2.0f' dash-width='3.0f'>",
296        69u,
297        4u,
298        {
299          Text::Underline::DASHED,
300          Color::BLUE,
301          4u,
302          2u,
303          3u,
304          true,
305          true,
306          true,
307          true,
308          true,
309        }},
310
311     };
312
313   for(uint32_t i = 0; i < expectedNumberOfUnderlineRuns; i++)
314   {
315     tet_infoline(data[i].title.c_str());
316     DALI_TEST_EQUALS(underlineRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION);
317     DALI_TEST_EQUALS(underlineRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION);
318     DALI_TEST_CHECK(data[i].properties == underlineRuns[i].properties);
319   }
320
321   END_TEST;
322 }
323
324 int UtcDaliTextEditorMarkupSpanUnderline(void)
325 {
326   ToolkitTestApplication application;
327   tet_infoline(" UtcDaliTextEditorMarkupSpanUnderline ");
328
329   TextEditor textEditor = TextEditor::New();
330
331   application.GetScene().Add(textEditor);
332
333   std::string testText =
334     "start<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red'>ABC1</span>then"
335     "<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-type='solid'>ABC2</span>then"
336     "<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-type='dashed'>ABC3</span>then"
337     "<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-type='double'>ABC4</span>then"
338     "<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-color='green'>ABC5</span>then"
339     "<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-height='5.0f'>ABC6</span>then"
340     "<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"
341     "<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"
342     "<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";
343
344   textEditor.SetProperty(TextEditor::Property::TEXT, testText);
345   textEditor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
346
347   application.SendNotification();
348   application.Render();
349
350   const uint32_t expectedNumberOfUnderlineRuns = 8u;
351
352   Toolkit::Internal::TextEditor& textEditorImpl        = GetImpl(textEditor);
353   const Text::Length             numberOfUnderlineRuns = textEditorImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns();
354
355   DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION);
356
357   Vector<UnderlinedGlyphRun> underlineRuns;
358   underlineRuns.Resize(numberOfUnderlineRuns);
359   textEditorImpl.GetTextController()->GetTextModel()->GetUnderlineRuns(underlineRuns.Begin(), 0u, numberOfUnderlineRuns);
360
361   struct DataOfCase
362   {
363     std::string              title;
364     GlyphIndex               glyphIndex;
365     Length                   numberOfGlyphs;
366     UnderlineStyleProperties properties;
367   };
368   DataOfCase data[] =
369     {
370       //<u type='solid'>ABC2</u>
371       {"<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-type='solid'>ABC2</span>",
372        13u,
373        4u,
374        {
375          Text::Underline::SOLID,
376          Color::BLACK,
377          0u,
378          1u,
379          2u,
380          true,
381          false,
382          false,
383          false,
384          false,
385        }},
386
387       //<u type='dashed'>ABC3</u>
388       {"<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-type='dashed'>ABC3</span>",
389        21u,
390        4u,
391        {
392          Text::Underline::DASHED,
393          Color::BLACK,
394          0u,
395          1u,
396          2u,
397          true,
398          false,
399          false,
400          false,
401          false,
402        }},
403
404       //<u type='double'>ABC4</u>
405       {"<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-type='double'>ABC4</span>",
406        29u,
407        4u,
408        {
409          Text::Underline::DOUBLE,
410          Color::BLACK,
411          0u,
412          1u,
413          2u,
414          true,
415          false,
416          false,
417          false,
418          false,
419        }},
420
421       //<u color='green'>ABC5</u>
422       {"<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-color='green'>ABC5</span>",
423        37u,
424        4u,
425        {
426          Text::Underline::SOLID,
427          Color::GREEN,
428          0u,
429          1u,
430          2u,
431          false,
432          true,
433          false,
434          false,
435          false,
436        }},
437
438       //<u height='5.0f'>ABC6</u>
439       {"<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' u-height='5.0f'>ABC6</span>",
440        45u,
441        4u,
442        {
443          Text::Underline::SOLID,
444          Color::BLACK,
445          5u,
446          1u,
447          2u,
448          false,
449          false,
450          true,
451          false,
452          false,
453        }},
454
455       //<u type='dashed' dash-gap='3.0f'>ABC7</u>
456       {"<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>",
457        53u,
458        4u,
459        {
460          Text::Underline::DASHED,
461          Color::BLACK,
462          0u,
463          3u,
464          2u,
465          true,
466          false,
467          false,
468          true,
469          false,
470        }},
471
472       //<u type='dashed' dash-width='4.0f'>ABC8</u>
473       {"<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>",
474        61u,
475        4u,
476        {
477          Text::Underline::DASHED,
478          Color::BLACK,
479          0u,
480          1u,
481          4u,
482          true,
483          false,
484          false,
485          false,
486          true,
487        }},
488
489       //<u color='blue' type='dashed' height='4.0f' dash-gap='2.0f' dash-width='3.0f'>
490       {"<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>",
491        69u,
492        4u,
493        {
494          Text::Underline::DASHED,
495          Color::BLUE,
496          4u,
497          2u,
498          3u,
499          true,
500          true,
501          true,
502          true,
503          true,
504        }},
505
506     };
507
508   for(uint32_t i = 0; i < expectedNumberOfUnderlineRuns; i++)
509   {
510     tet_infoline(data[i].title.c_str());
511     DALI_TEST_EQUALS(underlineRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION);
512     DALI_TEST_EQUALS(underlineRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION);
513     DALI_TEST_CHECK(data[i].properties == underlineRuns[i].properties);
514   }
515
516   END_TEST;
517 }
518
519 int UtcDaliTextEditorMarkupNestedUnderlineTags(void)
520 {
521   ToolkitTestApplication application;
522   tet_infoline(" UtcDaliTextEditorMarkupNestedUnderlineTags ");
523
524   TextEditor textEditor = TextEditor::New();
525
526   application.GetScene().Add(textEditor);
527
528   std::string testText = "start<u height='5.0f' color='green' >AB<u color='blue' >XYZ</u>CDE</u>end";
529
530   textEditor.SetProperty(TextEditor::Property::TEXT, testText);
531   textEditor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
532
533   application.SendNotification();
534   application.Render();
535
536   const uint32_t expectedNumberOfUnderlineRuns = 2u;
537
538   Toolkit::Internal::TextEditor& textEditorImpl        = GetImpl(textEditor);
539   const Text::Length             numberOfUnderlineRuns = textEditorImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns();
540
541   DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION);
542
543   Vector<UnderlinedGlyphRun> underlineRuns;
544   underlineRuns.Resize(numberOfUnderlineRuns);
545   textEditorImpl.GetTextController()->GetTextModel()->GetUnderlineRuns(underlineRuns.Begin(), 0u, numberOfUnderlineRuns);
546
547   struct DataOfCase
548   {
549     std::string              title;
550     GlyphIndex               glyphIndex;
551     Length                   numberOfGlyphs;
552     UnderlineStyleProperties properties;
553   };
554   DataOfCase data[] =
555     {
556       //Outter
557       {"<u height='5.0f' color='green' >AB<u color='blue' >XYZ</u>CDE</u>",
558        5u,
559        8u,
560        {
561          Text::Underline::SOLID,
562          Color::GREEN,
563          5u,
564          1u,
565          2u,
566          false,
567          true,
568          true,
569          false,
570          false,
571        }},
572
573       //Inner
574       {"<u color='blue' >XYZ</u>",
575        7u,
576        3u,
577        {
578          Text::Underline::SOLID,
579          Color::BLUE,
580          5u,
581          1u,
582          2u,
583          false,
584          true,
585          true,
586          false,
587          false,
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 UtcDaliTextEditorMarkupNestedStrikethroughTags(void)
604 {
605   ToolkitTestApplication application;
606   tet_infoline(" UtcDaliTextEditorMarkupNestedStrikethroughTags ");
607
608   TextEditor textEditor = TextEditor::New();
609
610   application.GetScene().Add(textEditor);
611
612   std::string testText = "start<s height='5.0f' color='green' >AB<s color='blue' >XYZ</s>CDE</s>end";
613
614   textEditor.SetProperty(TextEditor::Property::TEXT, testText);
615   textEditor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
616
617   application.SendNotification();
618   application.Render();
619
620   const uint32_t expectedNumberOfStrikethroughRuns = 2u;
621
622   Toolkit::Internal::TextEditor& textEditorImpl            = GetImpl(textEditor);
623   const Text::Length             numberOfStrikethroughRuns = textEditorImpl.GetTextController()->GetTextModel()->GetNumberOfStrikethroughRuns();
624
625   DALI_TEST_EQUALS(numberOfStrikethroughRuns, expectedNumberOfStrikethroughRuns, TEST_LOCATION);
626
627   Vector<StrikethroughGlyphRun> strikethroughRuns;
628   strikethroughRuns.Resize(numberOfStrikethroughRuns);
629   textEditorImpl.GetTextController()->GetTextModel()->GetStrikethroughRuns(strikethroughRuns.Begin(), 0u, numberOfStrikethroughRuns);
630
631   struct DataOfCase
632   {
633     std::string                  title;
634     GlyphIndex                   glyphIndex;
635     Length                       numberOfGlyphs;
636     StrikethroughStyleProperties properties;
637   };
638   DataOfCase data[] =
639     {
640       //Outter
641       {"<s height='5.0f' color='green' >AB<s color='blue' >XYZ</s>CDE</s>",
642        5u,
643        8u,
644        {
645          Color::GREEN,
646          5.0f,
647          true,
648          true,
649        }},
650
651       //Inner
652       {"<s color='blue' >XYZ</s>",
653        7u,
654        3u,
655        {
656          Color::BLUE,
657          5.0f,
658          true,
659          true,
660        }},
661
662     };
663
664   for(uint32_t i = 0; i < expectedNumberOfStrikethroughRuns; i++)
665   {
666     tet_infoline(data[i].title.c_str());
667     DALI_TEST_EQUALS(strikethroughRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION);
668     DALI_TEST_EQUALS(strikethroughRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION);
669     DALI_TEST_CHECK(data[i].properties == strikethroughRuns[i].properties);
670   }
671
672   END_TEST;
673 }
674
675 int UtcDaliTextEditorMarkupStrikethroughAttributes(void)
676 {
677   ToolkitTestApplication application;
678   tet_infoline(" UtcDaliTextEditorMarkupStrikethroughAttributes ");
679
680   TextEditor textEditor = TextEditor::New();
681
682   application.GetScene().Add(textEditor);
683
684   std::string testText =
685     "start<s>ABC1</s>then"
686     "<s color='green'>ABC2</s>then"
687     "<s height='5.0f'>ABC3</s>then"
688     "<s color='blue' height='4.0f' >ABC4</s>end";
689
690   textEditor.SetProperty(TextEditor::Property::TEXT, testText);
691   textEditor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
692
693   application.SendNotification();
694   application.Render();
695
696   const uint32_t expectedNumberOfStrikethroughRuns = 4u;
697
698   Toolkit::Internal::TextEditor& textEditorImpl            = GetImpl(textEditor);
699   const Text::Length             numberOfStrikethroughRuns = textEditorImpl.GetTextController()->GetTextModel()->GetNumberOfStrikethroughRuns();
700
701   DALI_TEST_EQUALS(numberOfStrikethroughRuns, expectedNumberOfStrikethroughRuns, TEST_LOCATION);
702
703   Vector<StrikethroughGlyphRun> strikethroughRuns;
704   strikethroughRuns.Resize(numberOfStrikethroughRuns);
705   textEditorImpl.GetTextController()->GetTextModel()->GetStrikethroughRuns(strikethroughRuns.Begin(), 0u, numberOfStrikethroughRuns);
706
707   struct DataOfCase
708   {
709     std::string                  title;
710     GlyphIndex                   glyphIndex;
711     Length                       numberOfGlyphs;
712     StrikethroughStyleProperties properties;
713   };
714   DataOfCase data[] =
715     {
716
717       {"<s>ABC1</s>",
718        5u,
719        4u,
720        {Color::BLACK,
721         0.0f,
722         false,
723         false}},
724
725       {"<s color='green'>ABC2</s>",
726        13u,
727        4u,
728        {Color::GREEN,
729         0.0f,
730         true,
731         false}},
732
733       {"<s height='5.0f'>ABC3</s>",
734        21u,
735        4u,
736        {Color::BLACK,
737         5.0f,
738         false,
739         true}},
740
741       {"<s color='blue' height='4.0f' >ABC4</s>",
742        29u,
743        4u,
744        {Color::BLUE,
745         4.0f,
746         true,
747         true}},
748
749     };
750
751   for(uint32_t i = 0; i < expectedNumberOfStrikethroughRuns; i++)
752   {
753     tet_infoline(data[i].title.c_str());
754     DALI_TEST_EQUALS(strikethroughRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION);
755     DALI_TEST_EQUALS(strikethroughRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION);
756     DALI_TEST_CHECK(data[i].properties == strikethroughRuns[i].properties);
757   }
758
759   END_TEST;
760 }
761
762 int UtcDaliTextEditorMarkupSpanStrikethrough(void)
763 {
764   ToolkitTestApplication application;
765   tet_infoline(" UtcDaliTextEditorMarkupSpanStrikethrough ");
766
767   TextEditor textEditor = TextEditor::New();
768
769   application.GetScene().Add(textEditor);
770
771   std::string testText =
772     "start<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red'>ABC1</span>then"
773     "<span s-color='blue'>ABC2</span>then"
774     "<span s-height='2.0f'>ABC3</span>then"
775     "<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' s-color='green' s-height='5.0f'>ABC4</span>end";
776
777   textEditor.SetProperty(TextEditor::Property::TEXT, testText);
778   textEditor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
779
780   application.SendNotification();
781   application.Render();
782
783   const uint32_t expectedNumberOfStrikethroughRuns = 3u;
784
785   Toolkit::Internal::TextEditor& textEditorImpl            = GetImpl(textEditor);
786   const Text::Length             numberOfStrikethroughRuns = textEditorImpl.GetTextController()->GetTextModel()->GetNumberOfStrikethroughRuns();
787
788   DALI_TEST_EQUALS(numberOfStrikethroughRuns, expectedNumberOfStrikethroughRuns, TEST_LOCATION);
789
790   Vector<StrikethroughGlyphRun> strikethroughRuns;
791   strikethroughRuns.Resize(numberOfStrikethroughRuns);
792   textEditorImpl.GetTextController()->GetTextModel()->GetStrikethroughRuns(strikethroughRuns.Begin(), 0u, numberOfStrikethroughRuns);
793
794   struct DataOfCase
795   {
796     std::string                  title;
797     GlyphIndex                   glyphIndex;
798     Length                       numberOfGlyphs;
799     StrikethroughStyleProperties properties;
800   };
801   DataOfCase data[] =
802     {
803
804       {"<span s-color='blue'>ABC2</span>then",
805        13u,
806        4u,
807        {Color::BLUE,
808         0.0f,
809         true,
810         false}},
811
812       {"<span s-height='2.0f'>ABC3</span>then",
813        21u,
814        4u,
815        {Color::BLACK,
816         2.0f,
817         false,
818         true}},
819
820       {"<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red' s-color='green' s-height='5.0f'>ABC4</span>",
821        29u,
822        4u,
823        {Color::GREEN,
824         5.0f,
825         true,
826         true}},
827
828     };
829
830   for(uint32_t i = 0; i < expectedNumberOfStrikethroughRuns; i++)
831   {
832     tet_infoline(data[i].title.c_str());
833     DALI_TEST_EQUALS(strikethroughRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION);
834     DALI_TEST_EQUALS(strikethroughRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION);
835     DALI_TEST_CHECK(data[i].properties == strikethroughRuns[i].properties);
836   }
837
838   END_TEST;
839 }
840
841 int UtcDaliTextEditorFontPointSizeLargerThanAtlas(void)
842 {
843   ToolkitTestApplication application;
844   tet_infoline(" UtcDaliTextEditorFontPointSizeLargerThanAtlas ");
845
846   // Create a text editor
847   TextEditor textEditor = TextEditor::New();
848   //Set size to avoid automatic eliding
849   textEditor.SetProperty(Actor::Property::SIZE, Vector2(1025, 1025));
850   //Set very large font-size using point-size
851   textEditor.SetProperty(TextEditor::Property::POINT_SIZE, 1000);
852   //Specify font-family
853   textEditor.SetProperty(TextEditor::Property::FONT_FAMILY, "DejaVu Sans");
854   //Set text to check if appear or not
855   textEditor.SetProperty(TextEditor::Property::TEXT, "A");
856
857   application.GetScene().Add(textEditor);
858
859   application.SendNotification();
860   application.Render();
861
862   //Check if Glyph is added to AtlasGlyphManger or not
863   int countAtlas = AtlasGlyphManager::Get().GetMetrics().mAtlasMetrics.mAtlasCount;
864   DALI_TEST_EQUALS(countAtlas, 1, TEST_LOCATION);
865
866   END_TEST;
867 }
868
869 int UtcDaliTextEditorFontPointSizeLargerThanAtlasPlaceholderCase(void)
870 {
871   ToolkitTestApplication application;
872   tet_infoline(" UtcDaliTextEditorFontPointSizeLargerThanAtlasPlaceholderCase ");
873
874   //Set Map of placeholder: text, font-family and point-size
875   Property::Map placeholderMapSet;
876   placeholderMapSet["text"]       = "A";
877   placeholderMapSet["fontFamily"] = "DejaVu Sans";
878   placeholderMapSet["pixelSize"]  = 1000.0f;
879
880   // Create a text editor
881   TextEditor textEditor = TextEditor::New();
882   //Set size to avoid automatic eliding
883   textEditor.SetProperty(Actor::Property::SIZE, Vector2(1025, 1025));
884   //Set placeholder
885   textEditor.SetProperty(TextEditor::Property::PLACEHOLDER, placeholderMapSet);
886
887   application.GetScene().Add(textEditor);
888
889   application.SendNotification();
890   application.Render();
891
892   //Check if Glyph is added to AtlasGlyphManger or not
893   int countAtlas = AtlasGlyphManager::Get().GetMetrics().mAtlasMetrics.mAtlasCount;
894   DALI_TEST_EQUALS(countAtlas, 1, TEST_LOCATION);
895
896   END_TEST;
897 }
898
899 int UtcDaliTextEditorBackgroundTag(void)
900 {
901   ToolkitTestApplication application;
902   tet_infoline("UtcDaliTextEditorBackgroundTag\n");
903
904   TextEditor editor = TextEditor::New();
905   DALI_TEST_CHECK(editor);
906
907   editor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
908   editor.SetProperty(TextEditor::Property::TEXT, "H<background color='red'>e</background> Worl<background color='yellow'>d</background>");
909   application.GetScene().Add(editor);
910   application.SendNotification();
911   application.Render();
912
913   Toolkit::Internal::TextEditor& editorImpl                   = GetImpl(editor);
914   const ColorIndex* const        backgroundColorIndicesBuffer = editorImpl.GetTextController()->GetTextModel()->GetBackgroundColorIndices();
915
916   DALI_TEST_CHECK(backgroundColorIndicesBuffer);
917
918   //default color
919   DALI_TEST_EQUALS(backgroundColorIndicesBuffer[0], 0u, TEST_LOCATION);
920
921   //red color
922   DALI_TEST_EQUALS(backgroundColorIndicesBuffer[1], 1u, TEST_LOCATION);
923
924   //yellow color
925   DALI_TEST_EQUALS(backgroundColorIndicesBuffer[7], 2u, TEST_LOCATION);
926
927   END_TEST;
928 }
929
930 int UtcDaliTextEditorSpanBackgroundTag(void)
931 {
932   ToolkitTestApplication application;
933   tet_infoline("UtcDaliTextEditorSpanBackgroundTag\n");
934
935   TextEditor editor = TextEditor::New();
936   DALI_TEST_CHECK(editor);
937
938   editor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
939   editor.SetProperty(TextEditor::Property::TEXT, "H<span background-color='red'>e</span> Worl<span background-color='yellow'>d</span>");
940   application.GetScene().Add(editor);
941   application.SendNotification();
942   application.Render();
943
944   Toolkit::Internal::TextEditor& editorImpl                   = GetImpl(editor);
945   const ColorIndex* const        backgroundColorIndicesBuffer = editorImpl.GetTextController()->GetTextModel()->GetBackgroundColorIndices();
946
947   DALI_TEST_CHECK(backgroundColorIndicesBuffer);
948
949   //default color
950   DALI_TEST_EQUALS(backgroundColorIndicesBuffer[0], 0u, TEST_LOCATION);
951
952   //red color
953   DALI_TEST_EQUALS(backgroundColorIndicesBuffer[1], 1u, TEST_LOCATION);
954
955   //yellow color
956   DALI_TEST_EQUALS(backgroundColorIndicesBuffer[7], 2u, TEST_LOCATION);
957
958   END_TEST;
959 }
960
961 int UtcDaliTextEditorTextWithSpan(void)
962 {
963   ToolkitTestApplication application;
964   tet_infoline("UtcDaliTextEditorTextWithSpan\n");
965
966   TextEditor editor = TextEditor::New();
967   DALI_TEST_CHECK(editor);
968
969   editor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
970   editor.SetProperty(TextEditor::Property::TEXT, "Hello Span");
971   application.GetScene().Add(editor);
972
973   application.SendNotification();
974   application.Render();
975
976   Vector3 originalSize = editor.GetNaturalSize();
977   editor.SetProperty(TextEditor::Property::TEXT, "H<span font-size='45' font-family='DejaVu Sans' font-width='condensed' font-slant='italic' text-color='red'>ello</span> Span");
978
979   application.SendNotification();
980   application.Render();
981
982   Vector3 spanSize = editor.GetNaturalSize();
983
984   DALI_TEST_GREATER(spanSize.width, originalSize.width, TEST_LOCATION);
985
986   Toolkit::Internal::TextEditor& editorImpl          = GetImpl(editor);
987   const ColorIndex* const        colorIndicesBuffer1 = editorImpl.GetTextController()->GetTextModel()->GetColorIndices();
988
989   DALI_TEST_CHECK(colorIndicesBuffer1);
990
991   //default color
992   DALI_TEST_EQUALS(colorIndicesBuffer1[0], 0u, TEST_LOCATION);
993
994   //span color
995   DALI_TEST_EQUALS(colorIndicesBuffer1[1], 1u, TEST_LOCATION);
996
997   //default color
998   DALI_TEST_EQUALS(colorIndicesBuffer1[6], 0u, TEST_LOCATION);
999
1000   editor.SetProperty(TextEditor::Property::TEXT, "<span font-size='45'>H</span>ello <span text-color='red'>S</span>pan");
1001
1002   application.SendNotification();
1003   application.Render();
1004
1005   const ColorIndex* const colorIndicesBuffer2 = editorImpl.GetTextController()->GetTextModel()->GetColorIndices();
1006
1007   DALI_TEST_CHECK(colorIndicesBuffer2);
1008
1009   //default color
1010   DALI_TEST_EQUALS(colorIndicesBuffer2[0], 0u, TEST_LOCATION);
1011
1012   //default color
1013   DALI_TEST_EQUALS(colorIndicesBuffer2[1], 0u, TEST_LOCATION);
1014
1015   //span color
1016   DALI_TEST_EQUALS(colorIndicesBuffer2[6], 1u, TEST_LOCATION);
1017
1018   //default color
1019   DALI_TEST_EQUALS(colorIndicesBuffer2[7], 0u, TEST_LOCATION);
1020
1021   END_TEST;
1022 }
1023
1024 int UtcDaliTextEditorControlBackgroundColor(void)
1025 {
1026   ToolkitTestApplication application;
1027   tet_infoline(" UtcDaliTextEditorControlBackgroundColor\n");
1028
1029   TextEditor editor = TextEditor::New();
1030   DALI_TEST_CHECK(editor);
1031
1032   Vector4 backgroundColor;
1033
1034   editor.SetProperty(TextEditor::Property::TEXT, "Background Color");
1035   application.GetScene().Add(editor);
1036   application.SendNotification();
1037   application.Render();
1038
1039   Toolkit::Internal::TextEditor& editorImpl     = GetImpl(editor);
1040   ControllerPtr                  controller     = editorImpl.GetTextController();
1041   Controller::Impl&              controllerImpl = Controller::Impl::GetImplementation(*controller.Get());
1042
1043   // Default color is transparent
1044   controllerImpl.mEditableControlInterface->GetControlBackgroundColor(backgroundColor);
1045   DALI_TEST_EQUALS(backgroundColor, Color::TRANSPARENT, TEST_LOCATION);
1046
1047   // Set background color to red
1048   editor.SetBackgroundColor(Color::RED);
1049   application.SendNotification();
1050   application.Render();
1051
1052   // Should be red
1053   controllerImpl.mEditableControlInterface->GetControlBackgroundColor(backgroundColor);
1054   DALI_TEST_EQUALS(backgroundColor, Color::RED, TEST_LOCATION);
1055
1056   END_TEST;
1057 }
1058
1059 int UtcDaliTextEditorTextPositionWithMinLineAndBigFont(void)
1060 {
1061   ToolkitTestApplication application;
1062   tet_infoline(" UtcDaliTextEditorTextPositionWithMinLine ");
1063
1064   TextEditor textEditor = TextEditor::New();
1065
1066   textEditor.SetProperty(TextEditor::Property::TEXT, "<span font-size='45'>H</span>\ni");
1067   textEditor.SetProperty(DevelTextEditor::Property::MIN_LINE_SIZE, 50);
1068   textEditor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
1069
1070   application.GetScene().Add(textEditor);
1071
1072   application.SendNotification();
1073   application.Render();
1074
1075   Toolkit::Internal::TextEditor& textEditorImpl = GetImpl(textEditor);
1076   Text::ViewInterface&           view           = textEditorImpl.GetTextController()->GetView();
1077
1078   Length numberOfGlyphs = view.GetNumberOfGlyphs();
1079
1080   DALI_TEST_EQUALS(numberOfGlyphs, 3u, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
1081
1082   Vector<GlyphInfo> glyphs;
1083   glyphs.Resize(numberOfGlyphs);
1084
1085   Vector<Vector2> positions;
1086   positions.Resize(numberOfGlyphs);
1087
1088   float alignmentOffset = 0u;
1089   numberOfGlyphs        = view.GetGlyphs(glyphs.Begin(),
1090                                   positions.Begin(),
1091                                   alignmentOffset,
1092                                   0u,
1093                                   numberOfGlyphs);
1094
1095   DALI_TEST_EQUALS(positions[2].y, 165.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
1096
1097   END_TEST;
1098 }
1099
1100 int UtcDaliTextEditorMarkupStrikethrough(void)
1101 {
1102   ToolkitTestApplication application;
1103   tet_infoline(" UtcDaliTextEditorMarkupStrikethrough ");
1104
1105   TextEditor textEditor = TextEditor::New();
1106
1107   application.GetScene().Add(textEditor);
1108
1109   textEditor.SetProperty(TextEditor::Property::TEXT, "<s>ABC</s>EF<s color='red'>GH</s>");
1110   textEditor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
1111
1112   application.SendNotification();
1113   application.Render();
1114
1115   uint32_t expectedNumberOfStrikethroughGlyphs = 2u;
1116
1117   Toolkit::Internal::TextEditor& textEditorImpl            = GetImpl(textEditor);
1118   const Text::Length             numberOfStrikethroughRuns = textEditorImpl.GetTextController()->GetTextModel()->GetNumberOfStrikethroughRuns();
1119
1120   DALI_TEST_EQUALS(numberOfStrikethroughRuns, expectedNumberOfStrikethroughGlyphs, TEST_LOCATION);
1121
1122   Vector<StrikethroughGlyphRun> strikethroughRuns;
1123   strikethroughRuns.Resize(numberOfStrikethroughRuns);
1124   textEditorImpl.GetTextController()->GetTextModel()->GetStrikethroughRuns(strikethroughRuns.Begin(), 0u, numberOfStrikethroughRuns);
1125
1126   //ABC have strikethrough
1127   DALI_TEST_EQUALS(strikethroughRuns[0u].glyphRun.glyphIndex, 0u, TEST_LOCATION);
1128   DALI_TEST_EQUALS(strikethroughRuns[0u].glyphRun.numberOfGlyphs, 3u, TEST_LOCATION);
1129   DALI_TEST_CHECK(!strikethroughRuns[0u].properties.colorDefined);
1130
1131   //GH have strikethrough
1132   DALI_TEST_EQUALS(strikethroughRuns[1u].glyphRun.glyphIndex, 5u, TEST_LOCATION);
1133   DALI_TEST_EQUALS(strikethroughRuns[1u].glyphRun.numberOfGlyphs, 2u, TEST_LOCATION);
1134   DALI_TEST_CHECK(strikethroughRuns[1u].properties.colorDefined);
1135
1136   END_TEST;
1137 }
1138
1139 int UtcDaliTextEditorMarkupStrikethroughNoEndTag(void)
1140 {
1141   ToolkitTestApplication application;
1142   tet_infoline(" UtcDaliTextEditorMarkupStrikethroughNoEndTag ");
1143
1144   TextEditor textEditor = TextEditor::New();
1145
1146   application.GetScene().Add(textEditor);
1147
1148   textEditor.SetProperty(TextEditor::Property::TEXT, "<s>ABC");
1149   textEditor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
1150
1151   application.SendNotification();
1152   application.Render();
1153
1154   uint32_t expectedNumberOfStrikethroughGlyphs = 0u;
1155
1156   Toolkit::Internal::TextEditor& textEditorImpl            = GetImpl(textEditor);
1157   Text::Length                   numberOfStrikethroughRuns = textEditorImpl.GetTextController()->GetTextModel()->GetNumberOfStrikethroughRuns();
1158
1159   DALI_TEST_EQUALS(numberOfStrikethroughRuns, expectedNumberOfStrikethroughGlyphs, TEST_LOCATION);
1160
1161   END_TEST;
1162 }
1163
1164 int UtcDaliTextEditorMarkupParagraphTag(void)
1165
1166 {
1167   ToolkitTestApplication application;
1168   tet_infoline(" UtcDaliTextEditorMarkupParagraphTag ");
1169
1170   TextEditor textEditor = TextEditor::New();
1171   application.GetScene().Add(textEditor);
1172
1173   textEditor.SetProperty(TextEditor::Property::TEXT, "text one <p>Paragraph two</p> text three <p>Paragraph four</p> text five");
1174   textEditor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
1175
1176   application.SendNotification();
1177   application.Render();
1178
1179   uint32_t expectedNumberOfBoundedParagraphRuns = 2u;
1180
1181   Toolkit::Internal::TextEditor& textEditorImpl               = GetImpl(textEditor);
1182   const Text::Length             numberOfBoundedParagraphRuns = textEditorImpl.GetTextController()->GetTextModel()->GetNumberOfBoundedParagraphRuns();
1183   DALI_TEST_EQUALS(numberOfBoundedParagraphRuns, expectedNumberOfBoundedParagraphRuns, TEST_LOCATION);
1184
1185   const Vector<BoundedParagraphRun>& boundedParagraphRuns = textEditorImpl.GetTextController()->GetTextModel()->GetBoundedParagraphRuns();
1186
1187   //<p>Paragraph two</p>
1188   DALI_TEST_EQUALS(boundedParagraphRuns[0u].characterRun.characterIndex, 10u, TEST_LOCATION);
1189   DALI_TEST_EQUALS(boundedParagraphRuns[0u].characterRun.numberOfCharacters, 14u, TEST_LOCATION);
1190
1191   //<p>Paragraph four</p>
1192   DALI_TEST_EQUALS(boundedParagraphRuns[1u].characterRun.characterIndex, 37u, TEST_LOCATION);
1193   DALI_TEST_EQUALS(boundedParagraphRuns[1u].characterRun.numberOfCharacters, 15u, TEST_LOCATION);
1194
1195   END_TEST;
1196 }
1197
1198 int UtcDaliTextEditorMarkupParagraphTagAlignAttribute(void)
1199 {
1200   ToolkitTestApplication application;
1201   tet_infoline(" UtcDaliTextEditorMarkupParagraphTagAlignAttribute ");
1202
1203   // Apply alignment for each type on property level on three paragraphs and in-between text.
1204   // Apply align in markup on the three paragraphs (each one a type).
1205   // Using the same text to gain similar results from both the property level and the markup.
1206   // Compare line alignment between the property level and the markup.
1207
1208   std::string textAlignOnPropertyLevel = "text outside<p>Paragraph end</p>text outside<p>Paragraph center</p>text outside<p>Paragraph begin</p><p>Paragraph property alignment</p>";
1209   std::string textAlignInMarkup        = "text outside<p align='end'>Paragraph end</p>text outside<p align='center'>Paragraph center</p>text outside<p align='begin' >Paragraph begin</p><p>Paragraph property alignment</p>";
1210
1211   //Set size to avoid automatic eliding
1212   Vector2 controllerSize = Vector2(1025, 1025);
1213
1214   TextEditor textEditorBeginAlign  = TextEditor::New();
1215   TextEditor textEditorCenterAlign = TextEditor::New();
1216   TextEditor textEditorEndAlign    = TextEditor::New();
1217   TextEditor textEditorMultiAlign  = TextEditor::New();
1218
1219   application.GetScene().Add(textEditorBeginAlign);
1220   application.GetScene().Add(textEditorCenterAlign);
1221   application.GetScene().Add(textEditorEndAlign);
1222   application.GetScene().Add(textEditorMultiAlign);
1223
1224   textEditorBeginAlign.SetProperty(TextEditor::Property::TEXT, textAlignOnPropertyLevel);
1225   textEditorBeginAlign.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
1226   textEditorBeginAlign.SetProperty(DevelTextEditor::Property::ELLIPSIS, false);
1227   textEditorBeginAlign.SetProperty(TextEditor::Property::HORIZONTAL_ALIGNMENT, Dali::Toolkit::Text::HorizontalAlignment::BEGIN);
1228   textEditorBeginAlign.SetProperty(Actor::Property::SIZE, controllerSize);
1229
1230   textEditorCenterAlign.SetProperty(TextEditor::Property::TEXT, textAlignOnPropertyLevel);
1231   textEditorCenterAlign.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
1232   textEditorCenterAlign.SetProperty(DevelTextEditor::Property::ELLIPSIS, false);
1233   textEditorCenterAlign.SetProperty(TextEditor::Property::HORIZONTAL_ALIGNMENT, Dali::Toolkit::Text::HorizontalAlignment::CENTER);
1234   textEditorCenterAlign.SetProperty(Actor::Property::SIZE, controllerSize);
1235
1236   textEditorEndAlign.SetProperty(TextEditor::Property::TEXT, textAlignOnPropertyLevel);
1237   textEditorEndAlign.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
1238   textEditorEndAlign.SetProperty(DevelTextEditor::Property::ELLIPSIS, false);
1239   textEditorEndAlign.SetProperty(TextEditor::Property::HORIZONTAL_ALIGNMENT, Dali::Toolkit::Text::HorizontalAlignment::END);
1240   textEditorEndAlign.SetProperty(Actor::Property::SIZE, controllerSize);
1241
1242   textEditorMultiAlign.SetProperty(TextEditor::Property::TEXT, textAlignInMarkup);
1243   textEditorMultiAlign.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
1244   textEditorMultiAlign.SetProperty(DevelTextEditor::Property::ELLIPSIS, false);
1245   textEditorMultiAlign.SetProperty(TextEditor::Property::HORIZONTAL_ALIGNMENT, Dali::Toolkit::Text::HorizontalAlignment::CENTER);
1246   textEditorMultiAlign.SetProperty(Actor::Property::SIZE, controllerSize);
1247
1248   application.SendNotification();
1249   application.Render();
1250
1251   uint32_t expectedNumberOfBoundedParagraphRuns = 4u;
1252   uint32_t expectedNumberOfLines                = 7u;
1253
1254   Toolkit::Internal::TextEditor& textEditorMultiAlignImpl  = GetImpl(textEditorMultiAlign);
1255   Toolkit::Internal::TextEditor& textEditorBeginAlignImpl  = GetImpl(textEditorBeginAlign);
1256   Toolkit::Internal::TextEditor& textEditorCenterAlignImpl = GetImpl(textEditorCenterAlign);
1257   Toolkit::Internal::TextEditor& textEditorEndAlignImpl    = GetImpl(textEditorEndAlign);
1258
1259   const Text::Length numberOfBoundedParagraphRuns = textEditorMultiAlignImpl.GetTextController()->GetTextModel()->GetNumberOfBoundedParagraphRuns();
1260   DALI_TEST_EQUALS(numberOfBoundedParagraphRuns, expectedNumberOfBoundedParagraphRuns, TEST_LOCATION);
1261
1262   DALI_TEST_EQUALS(textEditorMultiAlignImpl.GetTextController()->GetTextModel()->GetNumberOfLines(), expectedNumberOfLines, TEST_LOCATION);
1263   DALI_TEST_CHECK(textEditorMultiAlignImpl.GetTextController()->GetTextModel()->GetLines());
1264
1265   DALI_TEST_EQUALS(textEditorBeginAlignImpl.GetTextController()->GetTextModel()->GetNumberOfLines(), expectedNumberOfLines, TEST_LOCATION);
1266   DALI_TEST_CHECK(textEditorBeginAlignImpl.GetTextController()->GetTextModel()->GetLines());
1267
1268   DALI_TEST_EQUALS(textEditorCenterAlignImpl.GetTextController()->GetTextModel()->GetNumberOfLines(), expectedNumberOfLines, TEST_LOCATION);
1269   DALI_TEST_CHECK(textEditorCenterAlignImpl.GetTextController()->GetTextModel()->GetLines());
1270
1271   DALI_TEST_EQUALS(textEditorEndAlignImpl.GetTextController()->GetTextModel()->GetNumberOfLines(), expectedNumberOfLines, TEST_LOCATION);
1272   DALI_TEST_CHECK(textEditorEndAlignImpl.GetTextController()->GetTextModel()->GetLines());
1273
1274   const uint32_t LINE_INDEX_ALIGN_END    = 1u;
1275   const uint32_t LINE_INDEX_ALIGN_CENTER = 3u;
1276   const uint32_t LINE_INDEX_ALIGN_BEGIN  = 5u;
1277   const uint32_t LINE_INDEX_OUTSIDE_1    = 0u;
1278   const uint32_t LINE_INDEX_OUTSIDE_2    = 2u;
1279   const uint32_t LINE_INDEX_OUTSIDE_3    = 4u;
1280   const uint32_t LINE_INDEX_PARAGRAPH    = 6u;
1281
1282   //<p align='end'>Paragraph end</p>
1283   const LineRun& lineEndFromMultiAlign = *(textEditorMultiAlignImpl.GetTextController()->GetTextModel()->GetLines() + LINE_INDEX_ALIGN_END);
1284   const LineRun& lineEndFromEndAlign   = *(textEditorEndAlignImpl.GetTextController()->GetTextModel()->GetLines() + LINE_INDEX_ALIGN_END);
1285   tet_infoline(" UtcDaliTextEditorMarkupParagraphTagAlignAttribute - <p align='end'>Paragraph end</p>");
1286   DALI_TEST_EQUALS(lineEndFromMultiAlign.alignmentOffset, lineEndFromEndAlign.alignmentOffset, TEST_LOCATION);
1287   DALI_TEST_EQUALS(lineEndFromMultiAlign.width, lineEndFromEndAlign.width, TEST_LOCATION);
1288
1289   //<p align='center'>Paragraph center</p>
1290   const LineRun& lineCenterFromMultiAlign = *(textEditorMultiAlignImpl.GetTextController()->GetTextModel()->GetLines() + LINE_INDEX_ALIGN_CENTER);
1291   const LineRun& lineEndFromCenterAlign   = *(textEditorCenterAlignImpl.GetTextController()->GetTextModel()->GetLines() + LINE_INDEX_ALIGN_CENTER);
1292   tet_infoline(" UtcDaliTextEditorMarkupParagraphTagAlignAttribute - <p align='center'>Paragraph center</p>");
1293   DALI_TEST_EQUALS(lineCenterFromMultiAlign.alignmentOffset, lineEndFromCenterAlign.alignmentOffset, TEST_LOCATION);
1294   DALI_TEST_EQUALS(lineCenterFromMultiAlign.width, lineEndFromCenterAlign.width, TEST_LOCATION);
1295
1296   //<p align='begin' >Paragraph begin</p>
1297   const LineRun& lineBeginFromMultiAlign = *(textEditorMultiAlignImpl.GetTextController()->GetTextModel()->GetLines() + LINE_INDEX_ALIGN_BEGIN);
1298   const LineRun& lineEndFromBeginAlign   = *(textEditorBeginAlignImpl.GetTextController()->GetTextModel()->GetLines() + LINE_INDEX_ALIGN_BEGIN);
1299   tet_infoline(" UtcDaliTextEditorMarkupParagraphTagAlignAttribute - <p align='begin' >Paragraph begin</p>");
1300   DALI_TEST_EQUALS(lineBeginFromMultiAlign.alignmentOffset, lineEndFromBeginAlign.alignmentOffset, TEST_LOCATION);
1301   DALI_TEST_EQUALS(lineBeginFromMultiAlign.width, lineEndFromBeginAlign.width, TEST_LOCATION);
1302
1303   //text outside
1304   const LineRun& lineOutsideOneFromMultiAlign  = *(textEditorMultiAlignImpl.GetTextController()->GetTextModel()->GetLines() + LINE_INDEX_OUTSIDE_1);
1305   const LineRun& lineOutsideOneFromCenterAlign = *(textEditorCenterAlignImpl.GetTextController()->GetTextModel()->GetLines() + LINE_INDEX_OUTSIDE_1);
1306   tet_infoline(" UtcDaliTextEditorMarkupParagraphTagAlignAttribute - text outside one");
1307   DALI_TEST_EQUALS(lineOutsideOneFromMultiAlign.alignmentOffset, lineOutsideOneFromCenterAlign.alignmentOffset, TEST_LOCATION);
1308   DALI_TEST_EQUALS(lineOutsideOneFromMultiAlign.width, lineOutsideOneFromCenterAlign.width, TEST_LOCATION);
1309
1310   const LineRun& lineOutsideTwoFromMultiAlign  = *(textEditorMultiAlignImpl.GetTextController()->GetTextModel()->GetLines() + LINE_INDEX_OUTSIDE_2);
1311   const LineRun& lineOutsideTwoFromCenterAlign = *(textEditorCenterAlignImpl.GetTextController()->GetTextModel()->GetLines() + LINE_INDEX_OUTSIDE_2);
1312   tet_infoline(" UtcDaliTextEditorMarkupParagraphTagAlignAttribute - text outside two");
1313   DALI_TEST_EQUALS(lineOutsideTwoFromMultiAlign.alignmentOffset, lineOutsideTwoFromCenterAlign.alignmentOffset, TEST_LOCATION);
1314   DALI_TEST_EQUALS(lineOutsideTwoFromMultiAlign.width, lineOutsideTwoFromCenterAlign.width, TEST_LOCATION);
1315
1316   const LineRun& lineOutsideThreeFromMultiAlign  = *(textEditorMultiAlignImpl.GetTextController()->GetTextModel()->GetLines() + LINE_INDEX_OUTSIDE_3);
1317   const LineRun& lineOutsideThreeFromCenterAlign = *(textEditorCenterAlignImpl.GetTextController()->GetTextModel()->GetLines() + LINE_INDEX_OUTSIDE_3);
1318   tet_infoline(" UtcDaliTextEditorMarkupParagraphTagAlignAttribute - text outside three");
1319   DALI_TEST_EQUALS(lineOutsideThreeFromMultiAlign.alignmentOffset, lineOutsideThreeFromCenterAlign.alignmentOffset, TEST_LOCATION);
1320   DALI_TEST_EQUALS(lineOutsideThreeFromMultiAlign.width, lineOutsideThreeFromCenterAlign.width, TEST_LOCATION);
1321
1322   const LineRun& lineParagraphFromMultiAlign  = *(textEditorMultiAlignImpl.GetTextController()->GetTextModel()->GetLines() + LINE_INDEX_PARAGRAPH);
1323   const LineRun& lineParagraphFromCenterAlign = *(textEditorCenterAlignImpl.GetTextController()->GetTextModel()->GetLines() + LINE_INDEX_PARAGRAPH);
1324   tet_infoline(" UtcDaliTextEditorMarkupParagraphTagAlignAttribute - <p>Paragraph property alignment</p>");
1325   DALI_TEST_EQUALS(lineParagraphFromMultiAlign.alignmentOffset, lineParagraphFromCenterAlign.alignmentOffset, TEST_LOCATION);
1326   DALI_TEST_EQUALS(lineParagraphFromMultiAlign.width, lineParagraphFromCenterAlign.width, TEST_LOCATION);
1327
1328   END_TEST;
1329 }
1330
1331 int UtcDaliTextEditorMarkupCharacterSpacingTag(void)
1332 {
1333   ToolkitTestApplication application;
1334   tet_infoline(" UtcDaliTextEditorMarkupCharacterSpacingTag ");
1335
1336   const Length EXPECTED_NUMBER_OF_GLYPHS = 21u;
1337
1338   const float expandedCharSpacing  = 10.0f;
1339   const float condensedCharSpacing = -5.0f;
1340
1341   TextEditor textEditor = TextEditor::New();
1342
1343   textEditor.SetProperty(TextEditor::Property::TEXT, "ABC EF\n<char-spacing value='-5.0f'>ABC EF\n</char-spacing><char-spacing value='10.0f'>ABC EF\n</char-spacing>");
1344   textEditor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true);
1345
1346   application.GetScene().Add(textEditor);
1347
1348   application.SendNotification();
1349   application.Render();
1350
1351   Toolkit::Internal::TextEditor& textEditorImpl = GetImpl(textEditor);
1352   Text::ViewInterface&           view           = textEditorImpl.GetTextController()->GetView();
1353
1354   Length numberOfGlyphs = view.GetNumberOfGlyphs();
1355
1356   DALI_TEST_EQUALS(numberOfGlyphs, EXPECTED_NUMBER_OF_GLYPHS, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
1357
1358   Vector<GlyphInfo> glyphs;
1359   glyphs.Resize(numberOfGlyphs);
1360
1361   Vector<Vector2> positions;
1362   positions.Resize(numberOfGlyphs);
1363
1364   float alignmentOffset = 0u;
1365   numberOfGlyphs        = view.GetGlyphs(glyphs.Begin(),
1366                                   positions.Begin(),
1367                                   alignmentOffset,
1368                                   0u,
1369                                   numberOfGlyphs);
1370
1371   const Length numberOfGlyphsOneLine = 7u;
1372   for(Length i = 0; i < numberOfGlyphsOneLine - 1u; i++)
1373   {
1374     float diffLineNoCharSpacing = positions[i + 1].x - positions[i].x;
1375
1376     float diffLineCondensedCharSpacing = positions[numberOfGlyphsOneLine + i + 1].x - positions[numberOfGlyphsOneLine + i].x;
1377     DALI_TEST_EQUALS(diffLineCondensedCharSpacing, diffLineNoCharSpacing + condensedCharSpacing, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
1378
1379     float diffLineExpandedCharSpacing = positions[2u * numberOfGlyphsOneLine + i + 1].x - positions[2u * numberOfGlyphsOneLine + i].x;
1380     DALI_TEST_EQUALS(diffLineExpandedCharSpacing, diffLineNoCharSpacing + expandedCharSpacing, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
1381   }
1382
1383   END_TEST;
1384 }