cleanup auto scroll in text label
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-TextLabel.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 <unistd.h>
20 #include <iostream>
21
22 #include <dali-toolkit-test-suite-utils.h>
23 #include <dali-toolkit/dali-toolkit.h>
24 #include <dali-toolkit/devel-api/controls/text-controls/text-label-devel.h>
25 #include <dali-toolkit/devel-api/controls/text-controls/text-style-properties-devel.h>
26 #include <dali-toolkit/devel-api/text/bitmap-font.h>
27 #include <dali-toolkit/devel-api/text/rendering-backend.h>
28 #include <dali-toolkit/devel-api/text/text-enumerations-devel.h>
29 #include <dali-toolkit/devel-api/text/text-utils-devel.h>
30 #include <dali/devel-api/adaptor-framework/image-loading.h>
31 #include <dali/devel-api/text-abstraction/bitmap-font.h>
32 #include <dali/devel-api/text-abstraction/font-client.h>
33 #include "test-text-geometry-utils.h"
34
35 using namespace Dali;
36 using namespace Toolkit;
37
38 void dali_textlabel_startup(void)
39 {
40   test_return_value = TET_UNDEF;
41 }
42
43 void dali_textlabel_cleanup(void)
44 {
45   test_return_value = TET_PASS;
46 }
47
48 namespace
49 {
50 const char* const PROPERTY_NAME_RENDERING_BACKEND        = "renderingBackend";
51 const char* const PROPERTY_NAME_TEXT                     = "text";
52 const char* const PROPERTY_NAME_FONT_FAMILY              = "fontFamily";
53 const char* const PROPERTY_NAME_FONT_STYLE               = "fontStyle";
54 const char* const PROPERTY_NAME_POINT_SIZE               = "pointSize";
55 const char* const PROPERTY_NAME_MULTI_LINE               = "multiLine";
56 const char* const PROPERTY_NAME_HORIZONTAL_ALIGNMENT     = "horizontalAlignment";
57 const char* const PROPERTY_NAME_VERTICAL_ALIGNMENT       = "verticalAlignment";
58 const char* const PROPERTY_NAME_TEXT_COLOR               = "textColor";
59 const char* const PROPERTY_NAME_ENABLE_MARKUP            = "enableMarkup";
60 const char* const PROPERTY_NAME_ENABLE_AUTO_SCROLL       = "enableAutoScroll";
61 const char* const PROPERTY_NAME_ENABLE_AUTO_SCROLL_SPEED = "autoScrollSpeed";
62 const char* const PROPERTY_NAME_ENABLE_AUTO_SCROLL_LOOPS = "autoScrollLoopCount";
63 const char* const PROPERTY_NAME_ENABLE_AUTO_SCROLL_GAP   = "autoScrollGap";
64
65 const char* const PROPERTY_NAME_LINE_SPACING  = "lineSpacing";
66 const char* const PROPERTY_NAME_UNDERLINE     = "underline";
67 const char* const PROPERTY_NAME_SHADOW        = "shadow";
68 const char* const PROPERTY_NAME_EMBOSS        = "emboss";
69 const char* const PROPERTY_NAME_OUTLINE       = "outline";
70 const char* const PROPERTY_NAME_BACKGROUND    = "textBackground";
71 const char* const PROPERTY_NAME_STRIKETHROUGH = "strikethrough";
72
73 const char* const PROPERTY_NAME_PIXEL_SIZE             = "pixelSize";
74 const char* const PROPERTY_NAME_ELLIPSIS               = "ellipsis";
75 const char* const PROPERTY_NAME_AUTO_SCROLL_LOOP_DELAY = "autoScrollLoopDelay";
76 const char* const PROPERTY_NAME_FONT_SIZE_SCALE        = "fontSizeScale";
77 const char* const PROPERTY_NAME_ENABLE_FONT_SIZE_SCALE = "enableFontSizeScale";
78
79 const char* const PROPERTY_NAME_ELLIPSIS_POSITION = "ellipsisPosition";
80
81 const std::string  DEFAULT_FONT_DIR("/resources/fonts");
82 const unsigned int EMOJI_FONT_SIZE = 3840u; // 60 * 64
83
84 static bool gAnchorClickedCallBackCalled;
85 static bool gAnchorClickedCallBackNotCalled;
86
87 static bool gTextFitChangedCallBackCalled;
88
89 struct CallbackFunctor
90 {
91   CallbackFunctor(bool* callbackFlag)
92   : mCallbackFlag(callbackFlag)
93   {
94   }
95
96   void operator()()
97   {
98     *mCallbackFlag = true;
99   }
100   bool* mCallbackFlag;
101 };
102
103 static void TestAnchorClickedCallback(TextLabel control, const char* href, unsigned int hrefLength)
104 {
105   tet_infoline(" TestAnchorClickedCallback");
106
107   gAnchorClickedCallBackNotCalled = false;
108
109   if(!strcmp(href, "https://www.tizen.org") && hrefLength == strlen(href))
110   {
111     gAnchorClickedCallBackCalled = true;
112   }
113 }
114
115 static void TestTextFitChangedCallback(TextLabel control)
116 {
117   tet_infoline(" TestTextFitChangedCallback");
118   gTextFitChangedCallBackCalled = true;
119 }
120
121 bool DaliTestCheckMaps(const Property::Map& mapGet, const Property::Map& mapSet, const std::vector<std::string>& indexConversionTable = std::vector<std::string>())
122 {
123   const Property::Map::SizeType size = mapGet.Count();
124
125   if(size == mapSet.Count())
126   {
127     for(unsigned int index = 0u; index < size; ++index)
128     {
129       const KeyValuePair& valueGet = mapGet.GetKeyValue(index);
130
131       // Find the keys of the 'get' map
132       Property::Index indexKey  = valueGet.first.indexKey;
133       std::string     stringKey = valueGet.first.stringKey;
134
135       if(!indexConversionTable.empty())
136       {
137         if(stringKey.empty())
138         {
139           stringKey = indexConversionTable[indexKey];
140         }
141
142         if((indexKey == Property::INVALID_INDEX) && !stringKey.empty())
143         {
144           Property::Index index = 0u;
145           for(auto key : indexConversionTable)
146           {
147             if(key == stringKey)
148             {
149               indexKey = index;
150               break;
151             }
152             ++index;
153           }
154         }
155       }
156
157       const Property::Value* const valueSet = mapSet.Find(indexKey, stringKey);
158
159       if(nullptr != valueSet)
160       {
161         if((valueSet->GetType() == Dali::Property::STRING) && (valueGet.second.Get<std::string>() != valueSet->Get<std::string>()))
162         {
163           tet_printf("Value got : [%s], expected : [%s]", valueGet.second.Get<std::string>().c_str(), valueSet->Get<std::string>().c_str());
164           return false;
165         }
166         else if((valueSet->GetType() == Dali::Property::BOOLEAN) && (valueGet.second.Get<bool>() != valueSet->Get<bool>()))
167         {
168           tet_printf("Value got : [%d], expected : [%d]", valueGet.second.Get<bool>(), valueSet->Get<bool>());
169           return false;
170         }
171         else if((valueSet->GetType() == Dali::Property::INTEGER) && (valueGet.second.Get<int>() != valueSet->Get<int>()))
172         {
173           tet_printf("Value got : [%d], expected : [%d]", valueGet.second.Get<int>(), valueSet->Get<int>());
174           return false;
175         }
176         else if((valueSet->GetType() == Dali::Property::FLOAT) && (valueGet.second.Get<float>() != valueSet->Get<float>()))
177         {
178           tet_printf("Value got : [%f], expected : [%f]", valueGet.second.Get<float>(), valueSet->Get<float>());
179           return false;
180         }
181         else if((valueSet->GetType() == Dali::Property::VECTOR2) && (valueGet.second.Get<Vector2>() != valueSet->Get<Vector2>()))
182         {
183           Vector2 vector2Get = valueGet.second.Get<Vector2>();
184           Vector2 vector2Set = valueSet->Get<Vector2>();
185           tet_printf("Value got : [%f, %f], expected : [%f, %f]", vector2Get.x, vector2Get.y, vector2Set.x, vector2Set.y);
186           return false;
187         }
188         else if((valueSet->GetType() == Dali::Property::VECTOR4) && (valueGet.second.Get<Vector4>() != valueSet->Get<Vector4>()))
189         {
190           Vector4 vector4Get = valueGet.second.Get<Vector4>();
191           Vector4 vector4Set = valueSet->Get<Vector4>();
192           tet_printf("Value got : [%f, %f, %f, %f], expected : [%f, %f, %f, %f]", vector4Get.r, vector4Get.g, vector4Get.b, vector4Get.a, vector4Set.r, vector4Set.g, vector4Set.b, vector4Set.a);
193           return false;
194         }
195       }
196       else
197       {
198         if(valueGet.first.type == Property::Key::INDEX)
199         {
200           tet_printf("  The key %d doesn't exist.", valueGet.first.indexKey);
201         }
202         else
203         {
204           tet_printf("  The key %s doesn't exist.", valueGet.first.stringKey.c_str());
205         }
206         return false;
207       }
208     }
209   }
210
211   return true;
212 }
213
214 } // namespace
215
216 int UtcDaliToolkitTextLabelConstructorP(void)
217 {
218   ToolkitTestApplication application;
219   tet_infoline(" UtcDaliToolkitTextLabelConstructorP");
220   TextLabel textLabel;
221   DALI_TEST_CHECK(!textLabel);
222   END_TEST;
223 }
224
225 int UtcDaliToolkitTextLabelNewP(void)
226 {
227   ToolkitTestApplication application;
228   tet_infoline(" UtcDaliToolkitTextLabelNewP");
229   TextLabel textLabel = TextLabel::New("Test Text");
230   DALI_TEST_CHECK(textLabel);
231   END_TEST;
232 }
233
234 int UtcDaliToolkitTextLabelDownCastP(void)
235 {
236   ToolkitTestApplication application;
237   tet_infoline(" UtcDaliToolkitTextLabelDownCastP");
238   TextLabel  textLabel1 = TextLabel::New();
239   BaseHandle object(textLabel1);
240
241   TextLabel textLabel2 = TextLabel::DownCast(object);
242   DALI_TEST_CHECK(textLabel2);
243
244   TextLabel textLabel3 = DownCast<TextLabel>(object);
245   DALI_TEST_CHECK(textLabel3);
246   END_TEST;
247 }
248
249 int UtcDaliToolkitTextLabelDownCastN(void)
250 {
251   ToolkitTestApplication application;
252   tet_infoline(" UtcDaliToolkitTextLabelDownCastN");
253   BaseHandle uninitializedObject;
254   TextLabel  textLabel1 = TextLabel::DownCast(uninitializedObject);
255   DALI_TEST_CHECK(!textLabel1);
256
257   TextLabel textLabel2 = DownCast<TextLabel>(uninitializedObject);
258   DALI_TEST_CHECK(!textLabel2);
259   END_TEST;
260 }
261
262 int UtcDaliToolkitTextLabelCopyConstructorP(void)
263 {
264   ToolkitTestApplication application;
265   tet_infoline(" UtcDaliToolkitTextLabelCopyConstructorP");
266   TextLabel textLabel = TextLabel::New();
267   textLabel.SetProperty(TextLabel::Property::TEXT_COLOR, Color::RED);
268
269   TextLabel copy(textLabel);
270   DALI_TEST_CHECK(copy);
271   DALI_TEST_CHECK(copy.GetProperty<Vector4>(TextLabel::Property::TEXT_COLOR) == textLabel.GetProperty<Vector4>(TextLabel::Property::TEXT_COLOR));
272   END_TEST;
273 }
274
275 int UtcDaliTextLabelMoveConstructor(void)
276 {
277   ToolkitTestApplication application;
278
279   TextLabel textLabel = TextLabel::New();
280   textLabel.SetProperty(TextLabel::Property::TEXT, "Test");
281   DALI_TEST_CHECK(textLabel.GetProperty<std::string>(TextLabel::Property::TEXT) == "Test");
282
283   TextLabel moved = std::move(textLabel);
284   DALI_TEST_CHECK(moved);
285   DALI_TEST_EQUALS(1, moved.GetBaseObject().ReferenceCount(), TEST_LOCATION);
286   DALI_TEST_CHECK(moved.GetProperty<std::string>(TextLabel::Property::TEXT) == "Test");
287   DALI_TEST_CHECK(!textLabel);
288
289   END_TEST;
290 }
291
292 int UtcDaliToolkitTextLabelAssignmentOperatorP(void)
293 {
294   ToolkitTestApplication application;
295   tet_infoline(" UtcDaliToolkitTextLabelAssingmentOperatorP");
296   TextLabel textLabel = TextLabel::New();
297   textLabel.SetProperty(TextLabel::Property::TEXT_COLOR, Color::RED);
298
299   TextLabel copy = textLabel;
300   DALI_TEST_CHECK(copy);
301   DALI_TEST_CHECK(copy.GetProperty<Vector4>(TextLabel::Property::TEXT_COLOR) == textLabel.GetProperty<Vector4>(TextLabel::Property::TEXT_COLOR));
302   END_TEST;
303 }
304
305 int UtcDaliTextLabelMoveAssignment(void)
306 {
307   ToolkitTestApplication application;
308
309   TextLabel textLabel = TextLabel::New();
310   textLabel.SetProperty(TextLabel::Property::TEXT, "Test");
311   DALI_TEST_CHECK(textLabel.GetProperty<std::string>(TextLabel::Property::TEXT) == "Test");
312
313   TextLabel moved;
314   moved = std::move(textLabel);
315   DALI_TEST_CHECK(moved);
316   DALI_TEST_EQUALS(1, moved.GetBaseObject().ReferenceCount(), TEST_LOCATION);
317   DALI_TEST_CHECK(moved.GetProperty<std::string>(TextLabel::Property::TEXT) == "Test");
318   DALI_TEST_CHECK(!textLabel);
319
320   END_TEST;
321 }
322
323 // Positive test case for a method
324 int UtcDaliToolkitTextLabelGetPropertyP(void)
325 {
326   ToolkitTestApplication application;
327   tet_infoline(" UtcDaliToolkitTextLabelGetPropertyP");
328   TextLabel label = TextLabel::New("Test Text");
329   DALI_TEST_CHECK(label);
330
331   // Check Property Indices are correct
332   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_RENDERING_BACKEND) == DevelTextLabel::Property::RENDERING_BACKEND);
333   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_TEXT) == TextLabel::Property::TEXT);
334   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_FONT_FAMILY) == TextLabel::Property::FONT_FAMILY);
335   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_FONT_STYLE) == TextLabel::Property::FONT_STYLE);
336   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_POINT_SIZE) == TextLabel::Property::POINT_SIZE);
337   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_MULTI_LINE) == TextLabel::Property::MULTI_LINE);
338   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_HORIZONTAL_ALIGNMENT) == TextLabel::Property::HORIZONTAL_ALIGNMENT);
339   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_VERTICAL_ALIGNMENT) == TextLabel::Property::VERTICAL_ALIGNMENT);
340   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_TEXT_COLOR) == TextLabel::Property::TEXT_COLOR);
341   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_ENABLE_MARKUP) == TextLabel::Property::ENABLE_MARKUP);
342   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_ENABLE_AUTO_SCROLL) == TextLabel::Property::ENABLE_AUTO_SCROLL);
343   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_ENABLE_AUTO_SCROLL_SPEED) == TextLabel::Property::AUTO_SCROLL_SPEED);
344   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_ENABLE_AUTO_SCROLL_LOOPS) == TextLabel::Property::AUTO_SCROLL_LOOP_COUNT);
345   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_ENABLE_AUTO_SCROLL_GAP) == TextLabel::Property::AUTO_SCROLL_GAP);
346   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_LINE_SPACING) == TextLabel::Property::LINE_SPACING);
347   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_UNDERLINE) == TextLabel::Property::UNDERLINE);
348   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_SHADOW) == TextLabel::Property::SHADOW);
349   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_EMBOSS) == TextLabel::Property::EMBOSS);
350   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_OUTLINE) == TextLabel::Property::OUTLINE);
351   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_BACKGROUND) == DevelTextLabel::Property::BACKGROUND);
352   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_PIXEL_SIZE) == TextLabel::Property::PIXEL_SIZE);
353   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_ELLIPSIS) == TextLabel::Property::ELLIPSIS);
354   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_AUTO_SCROLL_LOOP_DELAY) == TextLabel::Property::AUTO_SCROLL_LOOP_DELAY);
355   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_FONT_SIZE_SCALE) == DevelTextLabel::Property::FONT_SIZE_SCALE);
356   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_ENABLE_FONT_SIZE_SCALE) == DevelTextLabel::Property::ENABLE_FONT_SIZE_SCALE);
357   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_ELLIPSIS_POSITION) == DevelTextLabel::Property::ELLIPSIS_POSITION);
358   DALI_TEST_CHECK(label.GetPropertyIndex(PROPERTY_NAME_STRIKETHROUGH) == DevelTextLabel::Property::STRIKETHROUGH);
359
360   END_TEST;
361 }
362
363 int UtcDaliToolkitTextLabelSetPropertyP(void)
364 {
365   ToolkitTestApplication application;
366   tet_infoline(" UtcDaliToolkitTextLabelSetPropertyP");
367   TextLabel label = TextLabel::New();
368   DALI_TEST_CHECK(label);
369
370   application.GetScene().Add(label);
371
372   // Note - we can't check the defaults since the stylesheets are platform-specific
373   label.SetProperty(DevelTextLabel::Property::RENDERING_BACKEND, DevelText::RENDERING_SHARED_ATLAS);
374   DALI_TEST_EQUALS((DevelText::RenderingType)label.GetProperty<int>(DevelTextLabel::Property::RENDERING_BACKEND), DevelText::RENDERING_SHARED_ATLAS, TEST_LOCATION);
375
376   // Check that text can be correctly reset
377   label.SetProperty(TextLabel::Property::TEXT, "Setting Text");
378   DALI_TEST_EQUALS(label.GetProperty<std::string>(TextLabel::Property::TEXT), std::string("Setting Text"), TEST_LOCATION);
379
380   // Check font properties.
381   label.SetProperty(TextLabel::Property::FONT_FAMILY, "Setting font family");
382   DALI_TEST_EQUALS(label.GetProperty<std::string>(TextLabel::Property::FONT_FAMILY), std::string("Setting font family"), TEST_LOCATION);
383
384   Property::Map fontStyleMapSet;
385   Property::Map fontStyleMapGet;
386
387   fontStyleMapSet.Insert("weight", "bold");
388   fontStyleMapSet.Insert("width", "condensed");
389   fontStyleMapSet.Insert("slant", "italic");
390   label.SetProperty(TextLabel::Property::FONT_STYLE, fontStyleMapSet);
391
392   fontStyleMapGet = label.GetProperty<Property::Map>(TextLabel::Property::FONT_STYLE);
393   DALI_TEST_EQUALS(fontStyleMapGet.Count(), fontStyleMapSet.Count(), TEST_LOCATION);
394   DALI_TEST_EQUALS(DaliTestCheckMaps(fontStyleMapGet, fontStyleMapSet), true, TEST_LOCATION);
395
396   // Check the old font style format.
397   fontStyleMapSet.Clear();
398   fontStyleMapSet.Insert("weight", "thin");
399   fontStyleMapSet.Insert("width", "expanded");
400   fontStyleMapSet.Insert("slant", "oblique");
401   const std::string strFontStyle = "{\"weight\":\"thin\",\"width\":\"expanded\",\"slant\":\"oblique\"}";
402
403   label.SetProperty(TextLabel::Property::FONT_STYLE, "{\"weight\":\"thin\",\"width\":\"expanded\",\"slant\":\"oblique\"}");
404   std::string getFontStyle = label.GetProperty<std::string>(TextLabel::Property::FONT_STYLE);
405   DALI_TEST_EQUALS(getFontStyle, strFontStyle, TEST_LOCATION);
406
407   label.SetProperty(TextLabel::Property::POINT_SIZE, 10.f);
408   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::POINT_SIZE), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
409
410   label.SetProperty(DevelTextLabel::Property::FONT_SIZE_SCALE, 2.5f);
411   DALI_TEST_EQUALS(label.GetProperty<float>(DevelTextLabel::Property::FONT_SIZE_SCALE), 2.5f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
412   label.SetProperty(DevelTextLabel::Property::FONT_SIZE_SCALE, 1.0f);
413
414   label.SetProperty(DevelTextLabel::Property::ENABLE_FONT_SIZE_SCALE, false);
415   DALI_TEST_EQUALS(label.GetProperty<bool>(DevelTextLabel::Property::ENABLE_FONT_SIZE_SCALE), false, TEST_LOCATION);
416   label.SetProperty(DevelTextLabel::Property::ENABLE_FONT_SIZE_SCALE, true);
417
418   // Reset font style.
419   fontStyleMapSet.Clear();
420   fontStyleMapSet.Insert("weight", "normal");
421   fontStyleMapSet.Insert("slant", "oblique");
422
423   label.SetProperty(TextLabel::Property::FONT_STYLE, fontStyleMapSet);
424   fontStyleMapGet = label.GetProperty<Property::Map>(TextLabel::Property::FONT_STYLE);
425   DALI_TEST_EQUALS(fontStyleMapGet.Count(), fontStyleMapSet.Count(), TEST_LOCATION);
426   DALI_TEST_EQUALS(DaliTestCheckMaps(fontStyleMapGet, fontStyleMapSet), true, TEST_LOCATION);
427
428   fontStyleMapSet.Clear();
429   fontStyleMapSet.Insert("slant", "roman");
430
431   label.SetProperty(TextLabel::Property::FONT_STYLE, fontStyleMapSet);
432   fontStyleMapGet = label.GetProperty<Property::Map>(TextLabel::Property::FONT_STYLE);
433   DALI_TEST_EQUALS(fontStyleMapGet.Count(), fontStyleMapSet.Count(), TEST_LOCATION);
434
435   // Replace 'roman' for 'normal'.
436   Property::Value* slantValue = fontStyleMapGet.Find("slant");
437   if(NULL != slantValue)
438   {
439     if("normal" == slantValue->Get<std::string>())
440     {
441       fontStyleMapGet["slant"] = "roman";
442     }
443   }
444   DALI_TEST_EQUALS(DaliTestCheckMaps(fontStyleMapGet, fontStyleMapSet), true, TEST_LOCATION);
445
446   fontStyleMapSet.Clear();
447
448   label.SetProperty(TextLabel::Property::FONT_STYLE, fontStyleMapSet);
449   fontStyleMapGet = label.GetProperty<Property::Map>(TextLabel::Property::FONT_STYLE);
450   DALI_TEST_EQUALS(fontStyleMapGet.Count(), fontStyleMapSet.Count(), TEST_LOCATION);
451   DALI_TEST_EQUALS(DaliTestCheckMaps(fontStyleMapGet, fontStyleMapSet), true, TEST_LOCATION);
452
453   // Toggle multi-line
454   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
455   DALI_TEST_EQUALS(label.GetProperty<bool>(TextLabel::Property::MULTI_LINE), true, TEST_LOCATION);
456
457   // Check that the Alignment properties can be correctly set
458   label.SetProperty(TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER");
459   DALI_TEST_EQUALS(label.GetProperty<std::string>(TextLabel::Property::HORIZONTAL_ALIGNMENT), "CENTER", TEST_LOCATION);
460   label.SetProperty(TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER");
461   DALI_TEST_EQUALS(label.GetProperty<std::string>(TextLabel::Property::VERTICAL_ALIGNMENT), "CENTER", TEST_LOCATION);
462
463   // Check that text color can be properly set
464   label.SetProperty(TextLabel::Property::TEXT_COLOR, Color::BLUE);
465   DALI_TEST_EQUALS(label.GetProperty<Vector4>(TextLabel::Property::TEXT_COLOR), Color::BLUE, TEST_LOCATION);
466
467   Property::Map strikethroughMapSet;
468   Property::Map strikethroughMapGet;
469
470   strikethroughMapSet.Insert("enable", false);
471   strikethroughMapSet.Insert("color", Color::BLUE);
472   strikethroughMapSet.Insert("height", 2.0f);
473
474   label.SetProperty(DevelTextLabel::Property::STRIKETHROUGH, strikethroughMapSet);
475
476   strikethroughMapGet = label.GetProperty<Property::Map>(DevelTextLabel::Property::STRIKETHROUGH);
477   DALI_TEST_EQUALS(strikethroughMapGet.Count(), strikethroughMapSet.Count(), TEST_LOCATION);
478   DALI_TEST_EQUALS(DaliTestCheckMaps(strikethroughMapGet, strikethroughMapSet), true, TEST_LOCATION);
479
480   Property::Map underlineMapSet;
481   Property::Map underlineMapGet;
482
483   underlineMapSet.Insert("enable", false);
484   underlineMapSet.Insert("color", Color::BLUE);
485   underlineMapSet.Insert("height", 0);
486   underlineMapSet.Insert("type", Text::Underline::SOLID);
487   underlineMapSet.Insert("dashWidth", 2);
488   underlineMapSet.Insert("dashGap", 1);
489
490   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
491
492   application.SendNotification();
493   application.Render();
494
495   underlineMapGet = label.GetProperty<Property::Map>(TextLabel::Property::UNDERLINE);
496   DALI_TEST_EQUALS(underlineMapGet.Count(), underlineMapSet.Count(), TEST_LOCATION);
497   DALI_TEST_EQUALS(DaliTestCheckMaps(underlineMapGet, underlineMapSet), true, TEST_LOCATION);
498
499   //DASHED Underline
500   underlineMapSet.Clear();
501   underlineMapGet.Clear();
502
503   underlineMapSet.Insert("enable", false);
504   underlineMapSet.Insert("color", Color::BLUE);
505   underlineMapSet.Insert("height", 0);
506   underlineMapSet.Insert("type", Text::Underline::DASHED);
507   underlineMapSet.Insert("dashWidth", 2);
508   underlineMapSet.Insert("dashGap", 1);
509
510   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
511
512   application.SendNotification();
513   application.Render();
514
515   underlineMapGet = label.GetProperty<Property::Map>(TextLabel::Property::UNDERLINE);
516   DALI_TEST_EQUALS(underlineMapGet.Count(), underlineMapSet.Count(), TEST_LOCATION);
517   DALI_TEST_EQUALS(DaliTestCheckMaps(underlineMapGet, underlineMapSet), true, TEST_LOCATION);
518
519   //DOUBLE Underline
520   underlineMapSet.Clear();
521   underlineMapGet.Clear();
522
523   underlineMapSet.Insert("enable", false);
524   underlineMapSet.Insert("color", Color::BLUE);
525   underlineMapSet.Insert("height", 0);
526   underlineMapSet.Insert("type", Text::Underline::DOUBLE);
527   underlineMapSet.Insert("dashWidth", 2);
528   underlineMapSet.Insert("dashGap", 1);
529
530   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
531
532   application.SendNotification();
533   application.Render();
534
535   underlineMapGet = label.GetProperty<Property::Map>(TextLabel::Property::UNDERLINE);
536   DALI_TEST_EQUALS(underlineMapGet.Count(), underlineMapSet.Count(), TEST_LOCATION);
537   DALI_TEST_EQUALS(DaliTestCheckMaps(underlineMapGet, underlineMapSet), true, TEST_LOCATION);
538
539   TextLabel label2 = TextLabel::New("New text");
540   DALI_TEST_CHECK(label2);
541   DALI_TEST_EQUALS(label2.GetProperty<std::string>(TextLabel::Property::TEXT), std::string("New text"), TEST_LOCATION);
542
543   // Check the enable markup property.
544   DALI_TEST_CHECK(!label.GetProperty<bool>(TextLabel::Property::ENABLE_MARKUP));
545   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
546   DALI_TEST_CHECK(label.GetProperty<bool>(TextLabel::Property::ENABLE_MARKUP));
547
548   // Check the text property when markup is enabled
549   label.SetProperty(TextLabel::Property::TEXT, "<color value='white'>Markup</color><color value='cyan'>Text</color>");
550   DALI_TEST_EQUALS(label.GetProperty<std::string>(TextLabel::Property::TEXT), std::string("MarkupText"), TEST_LOCATION);
551
552   // Check for incomplete marks.
553   label.SetProperty(TextLabel::Property::TEXT, "<color='white'><i>Markup</i><b>Text</b></color>");
554   DALI_TEST_EQUALS(label.GetProperty<std::string>(TextLabel::Property::TEXT), std::string("MarkupText"), TEST_LOCATION);
555   try
556   {
557     application.SendNotification();
558     application.Render();
559   }
560   catch(...)
561   {
562     tet_result(TET_FAIL);
563   }
564
565   // Check autoscroll properties
566   const int         SCROLL_SPEED      = 80;
567   const int         SCROLL_LOOPS      = 4;
568   const float       SCROLL_GAP        = 50.0f;
569   const float       SCROLL_LOOP_DELAY = 0.3f;
570   const std::string STOP_IMMEDIATE    = std::string("IMMEDIATE");
571   const std::string STOP_FINISH_LOOP  = std::string("FINISH_LOOP");
572
573   label.SetProperty(TextLabel::Property::MULTI_LINE, false); // Autoscroll only supported in single line
574   DALI_TEST_CHECK(!label.GetProperty<bool>(TextLabel::Property::ENABLE_AUTO_SCROLL));
575   label.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
576   DALI_TEST_CHECK(label.GetProperty<bool>(TextLabel::Property::ENABLE_AUTO_SCROLL));
577   label.SetProperty(TextLabel::Property::AUTO_SCROLL_SPEED, SCROLL_SPEED);
578   DALI_TEST_EQUALS(SCROLL_SPEED, label.GetProperty<int>(TextLabel::Property::AUTO_SCROLL_SPEED), TEST_LOCATION);
579   label.SetProperty(TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, SCROLL_LOOPS);
580   DALI_TEST_EQUALS(SCROLL_LOOPS, label.GetProperty<int>(TextLabel::Property::AUTO_SCROLL_LOOP_COUNT), TEST_LOCATION);
581   label.SetProperty(TextLabel::Property::AUTO_SCROLL_GAP, SCROLL_GAP);
582   DALI_TEST_EQUALS(SCROLL_GAP, label.GetProperty<float>(TextLabel::Property::AUTO_SCROLL_GAP), TEST_LOCATION);
583   label.SetProperty(TextLabel::Property::AUTO_SCROLL_LOOP_DELAY, SCROLL_LOOP_DELAY);
584   DALI_TEST_EQUALS(SCROLL_LOOP_DELAY, label.GetProperty<float>(TextLabel::Property::AUTO_SCROLL_LOOP_DELAY), TEST_LOCATION);
585
586   //Check autoscroll stop type property
587   label.SetProperty(TextLabel::Property::AUTO_SCROLL_STOP_MODE, TextLabel::AutoScrollStopMode::IMMEDIATE);
588   DALI_TEST_EQUALS(STOP_IMMEDIATE, label.GetProperty<std::string>(TextLabel::Property::AUTO_SCROLL_STOP_MODE), TEST_LOCATION);
589
590   label.SetProperty(TextLabel::Property::AUTO_SCROLL_STOP_MODE, TextLabel::AutoScrollStopMode::FINISH_LOOP);
591   DALI_TEST_EQUALS(STOP_FINISH_LOOP, label.GetProperty<std::string>(TextLabel::Property::AUTO_SCROLL_STOP_MODE), TEST_LOCATION);
592
593   // test natural size with multi-line and line spacing
594   {
595     TextLabel label3             = TextLabel::New("Some text here\nend there\nend here");
596     Vector3   oneLineNaturalSize = label3.GetNaturalSize();
597     label3.SetProperty(TextLabel::Property::MULTI_LINE, true);
598     label3.SetProperty(TextLabel::Property::LINE_SPACING, 0);
599     Vector3 multiLineNaturalSize = label3.GetNaturalSize();
600
601     // The width of the text when multi-line is enabled will be smaller (lines separated on '\n')
602     // The height of the text when multi-line is enabled will be larger
603     DALI_TEST_CHECK(oneLineNaturalSize.width > multiLineNaturalSize.width);
604     DALI_TEST_CHECK(oneLineNaturalSize.height < multiLineNaturalSize.height);
605
606     // Change line spacing, meaning height will increase by 3 times the amount specified as we have three lines
607     // Everything else will remain the same
608     int lineSpacing = 20;
609     label3.SetProperty(TextLabel::Property::LINE_SPACING, lineSpacing);
610     Vector3 expectedAfterLineSpacingApplied(multiLineNaturalSize);
611     expectedAfterLineSpacingApplied.height += 3 * lineSpacing;
612     DALI_TEST_EQUALS(expectedAfterLineSpacingApplied, label3.GetNaturalSize(), TEST_LOCATION);
613   }
614
615   // single line, line spacing must not affect natural size of the text, only add the spacing to the height
616   {
617     TextLabel label3 = TextLabel::New("Some text here end there end here");
618     label3.SetProperty(TextLabel::Property::MULTI_LINE, false);
619     label3.SetProperty(TextLabel::Property::LINE_SPACING, 0);
620     Vector3 textNaturalSize = label3.GetNaturalSize();
621     int     lineSpacing     = 20;
622     label3.SetProperty(TextLabel::Property::LINE_SPACING, lineSpacing);
623     Vector3 expectedNaturalSizeWithLineSpacing(textNaturalSize);
624     expectedNaturalSizeWithLineSpacing.height += lineSpacing;
625     DALI_TEST_EQUALS(expectedNaturalSizeWithLineSpacing, label3.GetNaturalSize(), TEST_LOCATION);
626   }
627   // Check the line spacing property
628   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::LINE_SPACING), 0.0f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
629   label.SetProperty(TextLabel::Property::LINE_SPACING, 10.f);
630   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::LINE_SPACING), 10.0f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
631
632   // Check the strikethrough property
633   strikethroughMapSet.Clear();
634   strikethroughMapSet.Insert("enable", true);
635   strikethroughMapSet.Insert("color", Color::RED);
636   strikethroughMapSet.Insert("height", 2.0f);
637
638   label.SetProperty(DevelTextLabel::Property::STRIKETHROUGH, strikethroughMapSet);
639
640   application.SendNotification();
641   application.Render();
642
643   strikethroughMapGet = label.GetProperty<Property::Map>(DevelTextLabel::Property::STRIKETHROUGH);
644   DALI_TEST_EQUALS(strikethroughMapGet.Count(), strikethroughMapSet.Count(), TEST_LOCATION);
645   DALI_TEST_EQUALS(DaliTestCheckMaps(strikethroughMapGet, strikethroughMapSet), true, TEST_LOCATION);
646
647   // Check the transparent strikethrough property for coverage.
648   strikethroughMapSet.Clear();
649   strikethroughMapSet.Insert("enable", true);
650   strikethroughMapSet.Insert("color", Color::TRANSPARENT);
651   strikethroughMapSet.Insert("height", 2.0f);
652
653   label.SetProperty(DevelTextLabel::Property::STRIKETHROUGH, strikethroughMapSet);
654
655   application.SendNotification();
656   application.Render();
657
658   strikethroughMapGet = label.GetProperty<Property::Map>(DevelTextLabel::Property::STRIKETHROUGH);
659   DALI_TEST_EQUALS(strikethroughMapGet.Count(), strikethroughMapSet.Count(), TEST_LOCATION);
660   DALI_TEST_EQUALS(DaliTestCheckMaps(strikethroughMapGet, strikethroughMapSet), true, TEST_LOCATION);
661
662   strikethroughMapSet.Clear();
663   strikethroughMapSet.Insert(Toolkit::DevelText::Strikethrough::Property::ENABLE, true);
664   strikethroughMapSet.Insert(Toolkit::DevelText::Strikethrough::Property::COLOR, Color::RED);
665   strikethroughMapSet.Insert(Toolkit::DevelText::Strikethrough::Property::HEIGHT, 2.0f);
666
667   label.SetProperty(DevelTextLabel::Property::STRIKETHROUGH, strikethroughMapSet);
668
669   application.SendNotification();
670   application.Render();
671
672   strikethroughMapGet = label.GetProperty<Property::Map>(DevelTextLabel::Property::STRIKETHROUGH);
673   DALI_TEST_EQUALS(strikethroughMapGet.Count(), strikethroughMapSet.Count(), TEST_LOCATION);
674   std::vector<std::string> strikethroughIndicesConversionTable = {"enable", "color", "height"};
675   DALI_TEST_EQUALS(DaliTestCheckMaps(strikethroughMapGet, strikethroughMapSet, strikethroughIndicesConversionTable), true, TEST_LOCATION);
676
677   strikethroughMapSet.Clear();
678
679   Property::Map strikethroughDisabledMapGet;
680   strikethroughDisabledMapGet.Insert("enable", false);
681   strikethroughDisabledMapGet.Insert("color", Color::RED);
682   strikethroughDisabledMapGet.Insert("height", 2.0f);
683
684   label.SetProperty(DevelTextLabel::Property::STRIKETHROUGH, strikethroughMapSet);
685
686   application.SendNotification();
687   application.Render();
688
689   strikethroughMapGet = label.GetProperty<Property::Map>(DevelTextLabel::Property::STRIKETHROUGH);
690   DALI_TEST_EQUALS(strikethroughMapGet.Count(), strikethroughDisabledMapGet.Count(), TEST_LOCATION);
691   DALI_TEST_EQUALS(DaliTestCheckMaps(strikethroughMapGet, strikethroughDisabledMapGet), true, TEST_LOCATION);
692
693   // Check the underline property
694   underlineMapSet.Clear();
695   underlineMapSet.Insert("enable", true);
696   underlineMapSet.Insert("color", Color::RED);
697   underlineMapSet.Insert("height", 1);
698   underlineMapSet.Insert("type", Text::Underline::SOLID);
699   underlineMapSet.Insert("dashWidth", 2);
700   underlineMapSet.Insert("dashGap", 1);
701
702   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
703
704   application.SendNotification();
705   application.Render();
706
707   underlineMapGet = label.GetProperty<Property::Map>(TextLabel::Property::UNDERLINE);
708   DALI_TEST_EQUALS(underlineMapGet.Count(), underlineMapSet.Count(), TEST_LOCATION);
709   DALI_TEST_EQUALS(DaliTestCheckMaps(underlineMapGet, underlineMapSet), true, TEST_LOCATION);
710
711   underlineMapSet.Clear();
712   underlineMapSet.Insert(Toolkit::DevelText::Underline::Property::ENABLE, true);
713   underlineMapSet.Insert(Toolkit::DevelText::Underline::Property::COLOR, Color::GREEN);
714   underlineMapSet.Insert(Toolkit::DevelText::Underline::Property::HEIGHT, 2);
715   underlineMapSet.Insert(Toolkit::DevelText::Underline::Property::TYPE, Text::Underline::DASHED);
716   underlineMapSet.Insert(Toolkit::DevelText::Underline::Property::DASH_WIDTH, 2);
717   underlineMapSet.Insert(Toolkit::DevelText::Underline::Property::DASH_GAP, 1);
718
719   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
720
721   application.SendNotification();
722   application.Render();
723
724   underlineMapGet = label.GetProperty<Property::Map>(TextLabel::Property::UNDERLINE);
725   DALI_TEST_EQUALS(underlineMapGet.Count(), underlineMapSet.Count(), TEST_LOCATION);
726   std::vector<std::string> underlineIndicesConversionTable = {"enable", "color", "height", "type", "dashWidth", "dashGap"};
727   DALI_TEST_EQUALS(DaliTestCheckMaps(underlineMapGet, underlineMapSet, underlineIndicesConversionTable), true, TEST_LOCATION);
728
729   underlineMapSet.Clear();
730
731   Property::Map underlineDisabledMapGet;
732   underlineDisabledMapGet.Insert("enable", false);
733   underlineDisabledMapGet.Insert("color", Color::GREEN);
734   underlineDisabledMapGet.Insert("height", 2);
735   underlineDisabledMapGet.Insert("type", Text::Underline::SOLID);
736   underlineDisabledMapGet.Insert("dashWidth", 2);
737   underlineDisabledMapGet.Insert("dashGap", 1);
738
739   label.SetProperty(TextLabel::Property::UNDERLINE, underlineDisabledMapGet);
740
741   application.SendNotification();
742   application.Render();
743
744   underlineMapGet = label.GetProperty<Property::Map>(TextLabel::Property::UNDERLINE);
745   DALI_TEST_EQUALS(underlineMapGet.Count(), underlineDisabledMapGet.Count(), TEST_LOCATION);
746   DALI_TEST_EQUALS(DaliTestCheckMaps(underlineMapGet, underlineDisabledMapGet), true, TEST_LOCATION);
747
748   // Check the dashed underline property
749   underlineMapSet.Clear();
750   underlineMapSet.Insert("enable", true);
751   underlineMapSet.Insert("color", Color::RED);
752   underlineMapSet.Insert("height", 1);
753   underlineMapSet.Insert("type", Text::Underline::DASHED);
754   underlineMapSet.Insert("dashWidth", 2);
755   underlineMapSet.Insert("dashGap", 1);
756
757   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
758
759   application.SendNotification();
760   application.Render();
761
762   underlineMapGet = label.GetProperty<Property::Map>(TextLabel::Property::UNDERLINE);
763   DALI_TEST_EQUALS(underlineMapGet.Count(), underlineMapSet.Count(), TEST_LOCATION);
764   DALI_TEST_EQUALS(DaliTestCheckMaps(underlineMapGet, underlineMapSet), true, TEST_LOCATION);
765
766   underlineMapSet.Clear();
767   underlineMapSet.Insert(Toolkit::DevelText::Underline::Property::ENABLE, true);
768   underlineMapSet.Insert(Toolkit::DevelText::Underline::Property::COLOR, Color::GREEN);
769   underlineMapSet.Insert(Toolkit::DevelText::Underline::Property::HEIGHT, 2);
770   underlineMapSet.Insert(Toolkit::DevelText::Underline::Property::TYPE, Text::Underline::DASHED);
771   underlineMapSet.Insert(Toolkit::DevelText::Underline::Property::DASH_WIDTH, 2);
772   underlineMapSet.Insert(Toolkit::DevelText::Underline::Property::DASH_GAP, 1);
773
774   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
775
776   application.SendNotification();
777   application.Render();
778
779   underlineMapGet = label.GetProperty<Property::Map>(TextLabel::Property::UNDERLINE);
780   DALI_TEST_EQUALS(underlineMapGet.Count(), underlineMapSet.Count(), TEST_LOCATION);
781   underlineIndicesConversionTable = {"enable", "color", "height", "type", "dashWidth", "dashGap"};
782   DALI_TEST_EQUALS(DaliTestCheckMaps(underlineMapGet, underlineMapSet, underlineIndicesConversionTable), true, TEST_LOCATION);
783
784   underlineMapSet.Clear();
785
786   underlineDisabledMapGet.Clear();
787   underlineDisabledMapGet.Insert("enable", false);
788   underlineDisabledMapGet.Insert("color", Color::GREEN);
789   underlineDisabledMapGet.Insert("height", 2);
790   underlineDisabledMapGet.Insert("type", Text::Underline::DASHED);
791   underlineDisabledMapGet.Insert("dashWidth", 2);
792   underlineDisabledMapGet.Insert("dashGap", 1);
793
794   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
795
796   application.SendNotification();
797   application.Render();
798
799   underlineMapGet = label.GetProperty<Property::Map>(TextLabel::Property::UNDERLINE);
800   DALI_TEST_EQUALS(underlineMapGet.Count(), underlineDisabledMapGet.Count(), TEST_LOCATION);
801   DALI_TEST_EQUALS(DaliTestCheckMaps(underlineMapGet, underlineDisabledMapGet), true, TEST_LOCATION);
802
803   // Check the double underline property
804   underlineMapSet.Clear();
805   underlineMapSet.Insert("enable", true);
806   underlineMapSet.Insert("color", Color::RED);
807   underlineMapSet.Insert("height", 1);
808   underlineMapSet.Insert("type", Text::Underline::DOUBLE);
809   underlineMapSet.Insert("dashWidth", 2);
810   underlineMapSet.Insert("dashGap", 1);
811
812   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
813
814   application.SendNotification();
815   application.Render();
816
817   underlineMapGet = label.GetProperty<Property::Map>(TextLabel::Property::UNDERLINE);
818   DALI_TEST_EQUALS(underlineMapGet.Count(), underlineMapSet.Count(), TEST_LOCATION);
819   DALI_TEST_EQUALS(DaliTestCheckMaps(underlineMapGet, underlineMapSet), true, TEST_LOCATION);
820
821   // Check the transparent double underline property for coverage.
822   underlineMapSet.Clear();
823   underlineMapSet.Insert("enable", true);
824   underlineMapSet.Insert("color", Color::TRANSPARENT);
825   underlineMapSet.Insert("height", 1);
826   underlineMapSet.Insert("type", Text::Underline::DOUBLE);
827   underlineMapSet.Insert("dashWidth", 2);
828   underlineMapSet.Insert("dashGap", 1);
829
830   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
831
832   application.SendNotification();
833   application.Render();
834
835   underlineMapGet = label.GetProperty<Property::Map>(TextLabel::Property::UNDERLINE);
836   DALI_TEST_EQUALS(underlineMapGet.Count(), underlineMapSet.Count(), TEST_LOCATION);
837   DALI_TEST_EQUALS(DaliTestCheckMaps(underlineMapGet, underlineMapSet), true, TEST_LOCATION);
838
839   underlineMapSet.Clear();
840   underlineMapSet.Insert(Toolkit::DevelText::Underline::Property::ENABLE, true);
841   underlineMapSet.Insert(Toolkit::DevelText::Underline::Property::COLOR, Color::GREEN);
842   underlineMapSet.Insert(Toolkit::DevelText::Underline::Property::HEIGHT, 2);
843   underlineMapSet.Insert(Toolkit::DevelText::Underline::Property::TYPE, Text::Underline::DOUBLE);
844   underlineMapSet.Insert(Toolkit::DevelText::Underline::Property::DASH_WIDTH, 2);
845   underlineMapSet.Insert(Toolkit::DevelText::Underline::Property::DASH_GAP, 1);
846
847   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
848
849   application.SendNotification();
850   application.Render();
851
852   underlineMapGet = label.GetProperty<Property::Map>(TextLabel::Property::UNDERLINE);
853   DALI_TEST_EQUALS(underlineMapGet.Count(), underlineMapSet.Count(), TEST_LOCATION);
854   underlineIndicesConversionTable = {"enable", "color", "height", "type", "dashWidth", "dashGap"};
855   DALI_TEST_EQUALS(DaliTestCheckMaps(underlineMapGet, underlineMapSet, underlineIndicesConversionTable), true, TEST_LOCATION);
856
857   underlineMapSet.Clear();
858
859   underlineDisabledMapGet.Clear();
860   underlineDisabledMapGet.Insert("enable", false);
861   underlineDisabledMapGet.Insert("color", Color::GREEN);
862   underlineDisabledMapGet.Insert("height", 2);
863   underlineDisabledMapGet.Insert("type", Text::Underline::DOUBLE);
864   underlineDisabledMapGet.Insert("dashWidth", 2);
865   underlineDisabledMapGet.Insert("dashGap", 1);
866
867   label.SetProperty(TextLabel::Property::UNDERLINE, underlineDisabledMapGet);
868
869   application.SendNotification();
870   application.Render();
871
872   underlineMapGet = label.GetProperty<Property::Map>(TextLabel::Property::UNDERLINE);
873   DALI_TEST_EQUALS(underlineMapGet.Count(), underlineDisabledMapGet.Count(), TEST_LOCATION);
874   DALI_TEST_EQUALS(DaliTestCheckMaps(underlineMapGet, underlineDisabledMapGet), true, TEST_LOCATION);
875
876   // Check the shadow property
877
878   Property::Map shadowMapSet;
879   Property::Map shadowMapGet;
880
881   shadowMapSet.Insert("color", Color::GREEN);
882   shadowMapSet.Insert("offset", Vector2(2.0f, 2.0f));
883   shadowMapSet.Insert("blurRadius", 5.0f);
884
885   label.SetProperty(TextLabel::Property::SHADOW, shadowMapSet);
886
887   shadowMapGet = label.GetProperty<Property::Map>(TextLabel::Property::SHADOW);
888   DALI_TEST_EQUALS(shadowMapGet.Count(), shadowMapSet.Count(), TEST_LOCATION);
889   DALI_TEST_EQUALS(DaliTestCheckMaps(shadowMapGet, shadowMapSet), true, TEST_LOCATION);
890
891   shadowMapSet.Clear();
892
893   shadowMapSet.Insert(Toolkit::DevelText::Shadow::Property::COLOR, Color::BLUE);
894   shadowMapSet.Insert(Toolkit::DevelText::Shadow::Property::OFFSET, "3.0 3.0");
895   shadowMapSet.Insert(Toolkit::DevelText::Shadow::Property::BLUR_RADIUS, 3.0f);
896
897   label.SetProperty(TextLabel::Property::SHADOW, shadowMapSet);
898
899   // Replace the offset (string) by a vector2
900   shadowMapSet.Clear();
901   shadowMapSet.Insert(Toolkit::DevelText::Shadow::Property::COLOR, Color::BLUE);
902   shadowMapSet.Insert(Toolkit::DevelText::Shadow::Property::OFFSET, Vector2(3.0, 3.0));
903   shadowMapSet.Insert(Toolkit::DevelText::Shadow::Property::BLUR_RADIUS, 3.0f);
904
905   shadowMapGet = label.GetProperty<Property::Map>(TextLabel::Property::SHADOW);
906   DALI_TEST_EQUALS(shadowMapGet.Count(), shadowMapSet.Count(), TEST_LOCATION);
907   std::vector<std::string> shadowIndicesConversionTable = {"color", "offset", "blurRadius"};
908   DALI_TEST_EQUALS(DaliTestCheckMaps(shadowMapGet, shadowMapSet, shadowIndicesConversionTable), true, TEST_LOCATION);
909
910   shadowMapSet.Clear();
911   Property::Map shadowDisabledMapGet;
912   shadowDisabledMapGet.Insert("color", Color::BLUE);
913   shadowDisabledMapGet.Insert("offset", Vector2(0.0f, 0.0f));
914   shadowDisabledMapGet.Insert("blurRadius", 3.0f);
915
916   label.SetProperty(TextLabel::Property::SHADOW, shadowMapSet);
917
918   shadowMapGet = label.GetProperty<Property::Map>(TextLabel::Property::SHADOW);
919   DALI_TEST_EQUALS(shadowMapGet.Count(), shadowDisabledMapGet.Count(), TEST_LOCATION);
920   DALI_TEST_EQUALS(DaliTestCheckMaps(shadowMapGet, shadowDisabledMapGet), true, TEST_LOCATION);
921
922   // Check the emboss property
923   label.SetProperty(TextLabel::Property::EMBOSS, "Emboss properties");
924   DALI_TEST_EQUALS(label.GetProperty<std::string>(TextLabel::Property::EMBOSS), std::string("Emboss properties"), TEST_LOCATION);
925
926   // Check the outline property
927
928   // Test string type first
929   // This is purely to maintain backward compatibility, but we don't support string as the outline property type.
930   label.SetProperty(TextLabel::Property::OUTLINE, "Outline properties");
931   DALI_TEST_EQUALS(label.GetProperty<std::string>(TextLabel::Property::OUTLINE), std::string("Outline properties"), TEST_LOCATION);
932
933   // Then test the property map type
934   Property::Map outlineMapSet;
935   Property::Map outlineMapGet;
936
937   outlineMapSet["color"] = Color::RED;
938   outlineMapSet["width"] = 2.0f;
939   label.SetProperty(TextLabel::Property::OUTLINE, outlineMapSet);
940
941   outlineMapGet = label.GetProperty<Property::Map>(TextLabel::Property::OUTLINE);
942   DALI_TEST_EQUALS(outlineMapGet.Count(), outlineMapSet.Count(), TEST_LOCATION);
943   DALI_TEST_EQUALS(DaliTestCheckMaps(outlineMapGet, outlineMapSet), true, TEST_LOCATION);
944
945   outlineMapSet.Clear();
946   outlineMapSet[Toolkit::DevelText::Outline::Property::COLOR] = Color::BLUE;
947   outlineMapSet[Toolkit::DevelText::Outline::Property::WIDTH] = 3.0f;
948   label.SetProperty(TextLabel::Property::OUTLINE, outlineMapSet);
949
950   outlineMapGet = label.GetProperty<Property::Map>(TextLabel::Property::OUTLINE);
951   DALI_TEST_EQUALS(outlineMapGet.Count(), outlineMapSet.Count(), TEST_LOCATION);
952   std::vector<std::string> outlineIndicesConversionTable = {"color", "width"};
953   DALI_TEST_EQUALS(DaliTestCheckMaps(outlineMapGet, outlineMapSet, outlineIndicesConversionTable), true, TEST_LOCATION);
954
955   // Check the background property
956   Property::Map backgroundMapSet;
957   Property::Map backgroundMapGet;
958
959   backgroundMapSet["enable"] = true;
960   backgroundMapSet["color"]  = Color::RED;
961   label.SetProperty(DevelTextLabel::Property::BACKGROUND, backgroundMapSet);
962
963   backgroundMapGet = label.GetProperty<Property::Map>(DevelTextLabel::Property::BACKGROUND);
964   DALI_TEST_EQUALS(backgroundMapGet.Count(), backgroundMapSet.Count(), TEST_LOCATION);
965   DALI_TEST_EQUALS(DaliTestCheckMaps(backgroundMapGet, backgroundMapSet), true, TEST_LOCATION);
966
967   // Check the transparent background property for coverage
968   backgroundMapSet.Clear();
969   backgroundMapSet["enable"] = true;
970   backgroundMapSet["color"]  = Color::TRANSPARENT;
971   label.SetProperty(DevelTextLabel::Property::BACKGROUND, backgroundMapSet);
972
973   application.SendNotification();
974   application.Render();
975
976   backgroundMapGet = label.GetProperty<Property::Map>(DevelTextLabel::Property::BACKGROUND);
977   DALI_TEST_EQUALS(backgroundMapGet.Count(), backgroundMapSet.Count(), TEST_LOCATION);
978   DALI_TEST_EQUALS(DaliTestCheckMaps(backgroundMapGet, backgroundMapSet), true, TEST_LOCATION);
979
980   backgroundMapSet.Clear();
981   backgroundMapSet[Toolkit::DevelText::Background::Property::ENABLE] = true;
982   backgroundMapSet[Toolkit::DevelText::Background::Property::COLOR]  = Color::GREEN;
983   label.SetProperty(DevelTextLabel::Property::BACKGROUND, backgroundMapSet);
984
985   backgroundMapGet = label.GetProperty<Property::Map>(DevelTextLabel::Property::BACKGROUND);
986   DALI_TEST_EQUALS(backgroundMapGet.Count(), backgroundMapSet.Count(), TEST_LOCATION);
987   std::vector<std::string> backgroundIndicesConversionTable = {"enable", "color"};
988   DALI_TEST_EQUALS(DaliTestCheckMaps(backgroundMapGet, backgroundMapSet, backgroundIndicesConversionTable), true, TEST_LOCATION);
989
990   // Check the pixel size of font
991   label.SetProperty(TextLabel::Property::PIXEL_SIZE, 20.f);
992   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::PIXEL_SIZE), 20.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
993
994   // Check the ellipsis property
995   DALI_TEST_CHECK(label.GetProperty<bool>(TextLabel::Property::ELLIPSIS));
996   label.SetProperty(TextLabel::Property::ELLIPSIS, false);
997   DALI_TEST_CHECK(!label.GetProperty<bool>(TextLabel::Property::ELLIPSIS));
998
999   // Check the layout direction property
1000   label.SetProperty(Actor::Property::LAYOUT_DIRECTION, LayoutDirection::RIGHT_TO_LEFT);
1001   DALI_TEST_EQUALS(label.GetProperty<int>(Actor::Property::LAYOUT_DIRECTION), static_cast<int>(LayoutDirection::RIGHT_TO_LEFT), TEST_LOCATION);
1002
1003   // Check the line size property
1004   DALI_TEST_EQUALS(label.GetProperty<float>(DevelTextLabel::Property::MIN_LINE_SIZE), 0.0f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
1005   label.SetProperty(DevelTextLabel::Property::MIN_LINE_SIZE, 50.f);
1006   DALI_TEST_EQUALS(label.GetProperty<float>(DevelTextLabel::Property::MIN_LINE_SIZE), 50.0f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
1007
1008   application.SendNotification();
1009   application.Render();
1010
1011   END_TEST;
1012 }
1013
1014 int UtcDaliToolkitTextlabelAtlasRenderP(void)
1015 {
1016   ToolkitTestApplication application;
1017   tet_infoline(" UtcDaliToolkitTextLabelAtlasRenderP");
1018   TextLabel label = TextLabel::New("Test Text");
1019   DALI_TEST_CHECK(label);
1020
1021   // Avoid a crash when core load gl resources.
1022   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
1023
1024   application.GetScene().Add(label);
1025
1026   // Turn on all the effects
1027   label.SetProperty(TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER");
1028   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
1029
1030   Property::Map underlineMap;
1031   underlineMap.Insert("enable", true);
1032   underlineMap.Insert("color", Color::RED);
1033   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMap);
1034
1035   Property::Map shadowMap;
1036   shadowMap.Insert("color", Color::BLUE);
1037   shadowMap.Insert("offset", Vector2(1.0f, 1.0f));
1038   label.SetProperty(TextLabel::Property::SHADOW, shadowMap);
1039
1040   Property::Map strikethroughMap;
1041   strikethroughMap.Insert("enable", true);
1042   strikethroughMap.Insert("color", Color::GREEN);
1043   strikethroughMap.Insert("height", 2.0f);
1044   label.SetProperty(DevelTextLabel::Property::STRIKETHROUGH, strikethroughMap);
1045
1046   try
1047   {
1048     // Render some text with the shared atlas backend
1049     label.SetProperty(DevelTextLabel::Property::RENDERING_BACKEND, DevelText::RENDERING_SHARED_ATLAS);
1050     application.SendNotification();
1051     application.Render();
1052   }
1053   catch(...)
1054   {
1055     tet_result(TET_FAIL);
1056   }
1057
1058   try
1059   {
1060     // Render some text with the shared atlas backend
1061     label.SetProperty(DevelTextLabel::Property::RENDERING_BACKEND, DevelText::RENDERING_VECTOR_BASED);
1062     application.SendNotification();
1063     application.Render();
1064   }
1065   catch(...)
1066   {
1067     tet_result(TET_FAIL);
1068   }
1069   END_TEST;
1070 }
1071
1072 int UtcDaliToolkitTextLabelLanguagesP(void)
1073 {
1074   ToolkitTestApplication application;
1075   tet_infoline(" UtcDaliToolkitTextLabelLanguagesP");
1076   TextLabel label = TextLabel::New();
1077   DALI_TEST_CHECK(label);
1078
1079   application.GetScene().Add(label);
1080
1081   const std::string scripts(
1082     " привет мир, γειά σου Κόσμε, Hello world, مرحبا بالعالم, שלום עולם, "
1083     "բարեւ աշխարհը, მსოფლიოში, 안녕하세요, 你好世界, ひらがな, カタカナ, "
1084     "ওহে বিশ্ব, မင်္ဂလာပါကမ္ဘာလောက, हैलो वर्ल्ड, હેલો વર્લ્ડ, ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ ਦੁਨਿਆ, ಹಲೋ ವರ್ಲ್ಡ್, "
1085     "ഹലോ വേൾഡ്, ଓଡ଼ିଆ, හෙලෝ වර්ල්ඩ්, ஹலோ உலகம், హలో వరల్డ్, "
1086     "ສະບາຍດີໂລກ, สวัสดีโลก, ជំរាបសួរពិភពលោក, "
1087     "\xF0\x9F\x98\x81 \xF0\x9F\x98\x82 \xF0\x9F\x98\x83 \xF0\x9F\x98\x84."); // these characters on the last line are emojis.
1088
1089   label.SetProperty(TextLabel::Property::TEXT, scripts);
1090   DALI_TEST_EQUALS(label.GetProperty<std::string>(TextLabel::Property::TEXT), scripts, TEST_LOCATION);
1091
1092   application.SendNotification();
1093   application.Render();
1094
1095   END_TEST;
1096 }
1097
1098 int UtcDaliToolkitTextLabelEmojisP(void)
1099 {
1100   ToolkitTestApplication application;
1101   tet_infoline(" UtcDaliToolkitTextLabelLanguagesP");
1102   TextLabel label = TextLabel::New();
1103   DALI_TEST_CHECK(label);
1104
1105   application.GetScene().Add(label);
1106
1107   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
1108
1109   char*             pathNamePtr = get_current_dir_name();
1110   const std::string pathName(pathNamePtr);
1111   free(pathNamePtr);
1112
1113   TextAbstraction::FontDescription fontDescription;
1114   fontDescription.path   = pathName + DEFAULT_FONT_DIR + "/tizen/BreezeColorEmoji.ttf";
1115   fontDescription.family = "BreezeColorEmoji";
1116   fontDescription.width  = TextAbstraction::FontWidth::NONE;
1117   fontDescription.weight = TextAbstraction::FontWeight::NORMAL;
1118   fontDescription.slant  = TextAbstraction::FontSlant::NONE;
1119
1120   fontClient.GetFontId(fontDescription, EMOJI_FONT_SIZE);
1121
1122   const std::string emojis = "<font family='BreezeColorEmoji' size='60'>\xF0\x9F\x98\x81 \xF0\x9F\x98\x82 \xF0\x9F\x98\x83 \xF0\x9F\x98\x84</font>";
1123   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
1124   label.SetProperty(TextLabel::Property::TEXT, emojis);
1125
1126   Property::Map shadowMap;
1127   shadowMap.Insert("color", "green");
1128   shadowMap.Insert("offset", "2 2");
1129   label.SetProperty(TextLabel::Property::SHADOW, shadowMap);
1130
1131   application.SendNotification();
1132   application.Render();
1133
1134   // EMOJI + ZWJ + EMOJI case for coverage.
1135   const std::string emojiWithZWJ = "&#x1f469;&#x200d;&#x1f52c;";
1136   label.SetProperty(TextLabel::Property::TEXT, emojiWithZWJ);
1137
1138   application.SendNotification();
1139   application.Render();
1140
1141   // EMOJI Sequences case for coverage.
1142   std::string emojiSequences =
1143     "Glyphs not included in the font &#xf01a;&#xf01b;&#xf01c;&#xf01d;&#xf01e;&#xf01f;\n"   //case for coverage when glyph is not included in the font
1144     "Text VS15 &#x262a;&#xfe0e;\n"                                                         //text presentation sequence and selector
1145     "Color VS16 &#x262a;&#xfe0f;\n"                                                        //emoji presentation sequence and selector
1146     "Default &#x262a; \n"                                                                  //default presentation
1147     "FamilyManWomanGirlBoy &#x1F468;&#x200D;&#x1F469;&#x200D;&#x1F467;&#x200D;&#x1F466;\n" // emoji multi zwj sequence
1148     "WomanScientist &#x1f469;&#x200d;&#x1f52c;\n"                                          // emoji zwj sequence
1149     "WomanScientistLightSkinTone&#x1F469;&#x1F3FB;&#x200D;&#x1F52C; \n"                    // emoji modifier sequence: skin tone & JWZ
1150     "LeftRightArrowText&#x2194;&#xfe0e;\n"                                                 // text presentation sequence and selector
1151     "LeftRightArrowEmoji&#x2194;&#xfe0f;\n"                                                // emoji presentation sequence and selector
1152     "SouthKoreaFlag&#x1f1f0;&#x1f1f7;\n"                                                   // emoji flag sequence
1153     "JordanFlag&#x1f1ef;&#x1f1f4;\n"                                                       // emoji flag sequence
1154     "EnglandFlag&#x1F3F4;&#xE0067;&#xE0062;&#xE0065;&#xE006E;&#xE0067;&#xE007F;\n"         // emoji tag sequence like England flag
1155     "Runner &#x1f3c3;&#x200d;&#x27a1;&#xfe0f; \n"
1156     "VictoryHandMediumLightSkinTone:&#x270C;&#xFE0F;&#x1F3FC;\n"                                                                // emoji modifier sequence: skin tone
1157     "RainbowFlag:&#x1F3F3;&#xFE0F;&#x200D;&#x1F308; \n"                                                                         // emoji zwj sequence: Rainbow Flag
1158     "keycap# &#x0023;&#xFE0F;&#x20E3; \n"                                                                                       // fully-qualified  emoji keycap sequence
1159     "keycap#_text &#x0023;&#x20E3; \n"                                                                                          // unqualified emoji keycap sequence
1160     "keycap3 &#x0033;&#xfe0f;&#x20e3; \n"                                                                                       // fully-qualified  emoji keycap sequence
1161     "keycap3_text &#x0033;&#x20e3; \n"                                                                                          // unqualified emoji keycap sequence
1162     "two adjacent glyphs &#x262a;&#xfe0f;&#xfe0f;&#xfe0f;&#x262a;&#xfe0f;\n"                                                    // This line should be rendered as two adjacent glyphs
1163     "Digit 8&#xfe0f; 8&#xfe0e; 8\n"                                                                                             // should be rendered according to selector
1164     "Surfing Medium Skin Female:  &#x1f3c4;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;\n"                                                 // Person Surfing + Medium Skin Tone +? Zero Width Joiner + Female Sign
1165     "SYMBOLS_NSLCL variation selector: &#x1f170;&#xfe0f;&#x1f171;&#xfe0f;&#x1f172;&#xfe0e;&#x1f173;&#xfe0e;&#x1f174;&#xfe0e;\n" // 1F170 ~ 1F174 with variation selector, text vs emoji
1166     "SYMBOLS_NSLCL with VS15: &#x1f170;&#xfe0e;&#x1f171;&#xfe0e;&#x1f172;&#xfe0e;&#x1f173;&#xfe0e;&#x1f174;&#xfe0e;\n"          // 1F170 ~ 1F174 with VS15
1167     "SYMBOLS_NSLCL with VS16: &#x1f170;&#xfe0f;&#x1f171;&#xfe0f;&#x1f172;&#xfe0f;&#x1f173;&#xfe0f;&#x1f174;&#xfe0f;\n"          // 1F170 ~ 1F174 with VS16
1168
1169     ;
1170
1171   label.SetProperty(TextLabel::Property::TEXT, emojiSequences);
1172   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
1173   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
1174   label.SetProperty(TextLabel::Property::ELLIPSIS, false);
1175
1176   application.SendNotification();
1177   application.Render();
1178   END_TEST;
1179 }
1180
1181 int UtcDaliToolkitTextlabelScrollingP(void)
1182 {
1183   ToolkitTestApplication application;
1184   tet_infoline(" UtcDaliToolkitTextLabelScrollingP");
1185   TextLabel labelImmediate = TextLabel::New("Some text to scroll");
1186   TextLabel labelFinished  = TextLabel::New("مرحبا بالعالم");
1187
1188   DALI_TEST_CHECK(labelImmediate);
1189   DALI_TEST_CHECK(labelFinished);
1190   // Avoid a crash when core load gl resources.
1191   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
1192   application.GetScene().Add(labelImmediate);
1193   // Turn on all the effects
1194   labelImmediate.SetProperty(TextLabel::Property::MULTI_LINE, false);
1195   labelImmediate.SetProperty(TextLabel::Property::AUTO_SCROLL_GAP, 50.0f);
1196   labelImmediate.SetProperty(TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, 3);
1197   labelImmediate.SetProperty(TextLabel::Property::AUTO_SCROLL_SPEED, 80.0f);
1198   labelImmediate.SetProperty(TextLabel::Property::AUTO_SCROLL_STOP_MODE, TextLabel::AutoScrollStopMode::IMMEDIATE);
1199
1200   application.GetScene().Add(labelFinished);
1201   // Turn on all the effects
1202   labelFinished.SetProperty(TextLabel::Property::MULTI_LINE, false);
1203   labelFinished.SetProperty(TextLabel::Property::AUTO_SCROLL_GAP, 50.0f);
1204   labelFinished.SetProperty(TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, 3);
1205   labelFinished.SetProperty(TextLabel::Property::AUTO_SCROLL_SPEED, 80.0f);
1206   labelFinished.SetProperty(TextLabel::Property::AUTO_SCROLL_STOP_MODE, TextLabel::AutoScrollStopMode::FINISH_LOOP);
1207
1208   try
1209   {
1210     // Render some text with the shared atlas backend
1211     labelImmediate.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1212     labelFinished.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1213
1214     labelImmediate.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, false);
1215     labelFinished.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, false);
1216
1217     labelImmediate.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1218     labelFinished.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1219     application.SendNotification();
1220     application.Render();
1221
1222     labelImmediate.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, false);
1223     labelFinished.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, false);
1224     application.SendNotification();
1225     application.Render();
1226   }
1227   catch(...)
1228   {
1229     tet_result(TET_FAIL);
1230   }
1231
1232   END_TEST;
1233 }
1234
1235 int UtcDaliToolkitTextlabelScrollingCenterAlignP(void)
1236 {
1237   ToolkitTestApplication application;
1238   TextLabel              labelShort = TextLabel::New("Some text to scroll");
1239   TextLabel              labelLong  = TextLabel::New("Some text to scroll that is greater than the width of the text. The quick brown fox jumps over the lazy dog. Hello World, we meet again!");
1240
1241   DALI_TEST_CHECK(labelShort);
1242   DALI_TEST_CHECK(labelLong);
1243   // Avoid a crash when core load gl resources.
1244   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
1245   application.GetScene().Add(labelShort);
1246   // Turn on all the effects
1247   labelShort.SetProperty(TextLabel::Property::MULTI_LINE, false);
1248   labelShort.SetProperty(TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER");
1249   labelShort.SetProperty(TextLabel::Property::AUTO_SCROLL_GAP, 50.0f);
1250   labelShort.SetProperty(TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, 3);
1251   labelShort.SetProperty(TextLabel::Property::AUTO_SCROLL_SPEED, 80.0f);
1252   labelShort.SetProperty(TextLabel::Property::AUTO_SCROLL_STOP_MODE, TextLabel::AutoScrollStopMode::IMMEDIATE);
1253
1254   application.GetScene().Add(labelLong);
1255   // Turn on all the effects
1256   labelLong.SetProperty(TextLabel::Property::MULTI_LINE, false);
1257   labelLong.SetProperty(TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER");
1258   labelLong.SetProperty(TextLabel::Property::AUTO_SCROLL_GAP, 50.0f);
1259   labelLong.SetProperty(TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, 3);
1260   labelLong.SetProperty(TextLabel::Property::AUTO_SCROLL_SPEED, 80.0f);
1261   labelLong.SetProperty(TextLabel::Property::AUTO_SCROLL_STOP_MODE, TextLabel::AutoScrollStopMode::FINISH_LOOP);
1262
1263   try
1264   {
1265     // Render some text with the shared atlas backend
1266     labelShort.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1267     labelLong.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1268     application.SendNotification();
1269     application.Render();
1270
1271     labelShort.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, false);
1272     labelLong.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, false);
1273     application.SendNotification();
1274     application.Render();
1275   }
1276   catch(...)
1277   {
1278     tet_result(TET_FAIL);
1279   }
1280
1281   END_TEST;
1282 }
1283
1284 int UtcDaliToolkitTextlabelScrollingCenterAlignRTLP(void)
1285 {
1286   ToolkitTestApplication application;
1287   TextLabel              labelShort = TextLabel::New("مرحبا بالعالم");
1288   TextLabel              labelLong  = TextLabel::New("لكن لا بد أن أوضح لك أن كل هذه الأفكار المغلوطة حول استنكار  النشوة وتمجيد الألم نشأت بالفعل، وسأعرض لك التفاصيل لتكتشف حقيقة وأساس تلك السعادة البشرية، فلا أحد يرفض أو يكره أو يتجنب الشعور بالسعادة، ولكن بفضل هؤلاء الأشخاص الذين لا يدركون بأن السعادة لا بد أن نستشعرها بصورة أكثر عقلانية ومنطقية فيعرضهم هذا لمواجهة الظروف الأليمة، وأكرر بأنه لا يوجد من يرغب في الحب ونيل المنال ويتلذذ بالآلام، الألم هو الألم ولكن نتيجة لظروف ما قد تكمن السعاده فيما نتحمله من كد وأسي");
1289
1290   DALI_TEST_CHECK(labelShort);
1291   DALI_TEST_CHECK(labelLong);
1292   // Avoid a crash when core load gl resources.
1293   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
1294   application.GetScene().Add(labelShort);
1295   // Turn on all the effects
1296   labelShort.SetProperty(TextLabel::Property::MULTI_LINE, false);
1297   labelShort.SetProperty(TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER");
1298   labelShort.SetProperty(TextLabel::Property::AUTO_SCROLL_GAP, 50.0f);
1299   labelShort.SetProperty(TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, 3);
1300   labelShort.SetProperty(TextLabel::Property::AUTO_SCROLL_SPEED, 80.0f);
1301   labelShort.SetProperty(TextLabel::Property::AUTO_SCROLL_STOP_MODE, TextLabel::AutoScrollStopMode::IMMEDIATE);
1302
1303   application.GetScene().Add(labelLong);
1304   // Turn on all the effects
1305   labelLong.SetProperty(TextLabel::Property::MULTI_LINE, false);
1306   labelLong.SetProperty(TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER");
1307   labelLong.SetProperty(TextLabel::Property::AUTO_SCROLL_GAP, 50.0f);
1308   labelLong.SetProperty(TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, 3);
1309   labelLong.SetProperty(TextLabel::Property::AUTO_SCROLL_SPEED, 80.0f);
1310   labelLong.SetProperty(TextLabel::Property::AUTO_SCROLL_STOP_MODE, TextLabel::AutoScrollStopMode::FINISH_LOOP);
1311
1312   try
1313   {
1314     // Render some text with the shared atlas backend
1315     labelShort.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1316     labelLong.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1317     application.SendNotification();
1318     application.Render();
1319
1320     labelShort.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, false);
1321     labelLong.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, false);
1322     application.SendNotification();
1323     application.Render();
1324   }
1325   catch(...)
1326   {
1327     tet_result(TET_FAIL);
1328   }
1329
1330   END_TEST;
1331 }
1332
1333 int UtcDaliToolkitTextlabelScrollingEndAlignP(void)
1334 {
1335   ToolkitTestApplication application;
1336   TextLabel              labelShort = TextLabel::New("Some text to scroll");
1337   TextLabel              labelLong  = TextLabel::New("Some text to scroll that is greater than the width of the text. The quick brown fox jumps over the lazy dog. Hello World, we meet again!");
1338
1339   DALI_TEST_CHECK(labelShort);
1340   DALI_TEST_CHECK(labelLong);
1341   // Avoid a crash when core load gl resources.
1342   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
1343   application.GetScene().Add(labelShort);
1344   // Turn on all the effects
1345   labelShort.SetProperty(TextLabel::Property::MULTI_LINE, false);
1346   labelShort.SetProperty(TextLabel::Property::HORIZONTAL_ALIGNMENT, "END");
1347   labelShort.SetProperty(TextLabel::Property::AUTO_SCROLL_GAP, 50.0f);
1348   labelShort.SetProperty(TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, 3);
1349   labelShort.SetProperty(TextLabel::Property::AUTO_SCROLL_SPEED, 80.0f);
1350   labelShort.SetProperty(TextLabel::Property::AUTO_SCROLL_STOP_MODE, TextLabel::AutoScrollStopMode::IMMEDIATE);
1351
1352   application.GetScene().Add(labelLong);
1353   // Turn on all the effects
1354   labelLong.SetProperty(TextLabel::Property::MULTI_LINE, false);
1355   labelLong.SetProperty(TextLabel::Property::HORIZONTAL_ALIGNMENT, "END");
1356   labelLong.SetProperty(TextLabel::Property::AUTO_SCROLL_GAP, 50.0f);
1357   labelLong.SetProperty(TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, 3);
1358   labelLong.SetProperty(TextLabel::Property::AUTO_SCROLL_SPEED, 80.0f);
1359   labelLong.SetProperty(TextLabel::Property::AUTO_SCROLL_STOP_MODE, TextLabel::AutoScrollStopMode::FINISH_LOOP);
1360
1361   try
1362   {
1363     // Render some text with the shared atlas backend
1364     labelShort.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1365     labelLong.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1366     application.SendNotification();
1367     application.Render();
1368
1369     labelShort.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, false);
1370     labelLong.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, false);
1371     application.SendNotification();
1372     application.Render();
1373   }
1374   catch(...)
1375   {
1376     tet_result(TET_FAIL);
1377   }
1378
1379   END_TEST;
1380 }
1381
1382 int UtcDaliToolkitTextlabelScrollingEndAlignRTLP(void)
1383 {
1384   ToolkitTestApplication application;
1385   TextLabel              labelShort = TextLabel::New("مرحبا بالعالم");
1386   TextLabel              labelLong  = TextLabel::New("لكن لا بد أن أوضح لك أن كل هذه الأفكار المغلوطة حول استنكار  النشوة وتمجيد الألم نشأت بالفعل، وسأعرض لك التفاصيل لتكتشف حقيقة وأساس تلك السعادة البشرية، فلا أحد يرفض أو يكره أو يتجنب الشعور بالسعادة، ولكن بفضل هؤلاء الأشخاص الذين لا يدركون بأن السعادة لا بد أن نستشعرها بصورة أكثر عقلانية ومنطقية فيعرضهم هذا لمواجهة الظروف الأليمة، وأكرر بأنه لا يوجد من يرغب في الحب ونيل المنال ويتلذذ بالآلام، الألم هو الألم ولكن نتيجة لظروف ما قد تكمن السعاده فيما نتحمله من كد وأسي");
1387
1388   DALI_TEST_CHECK(labelShort);
1389   DALI_TEST_CHECK(labelLong);
1390   // Avoid a crash when core load gl resources.
1391   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
1392   application.GetScene().Add(labelShort);
1393   // Turn on all the effects
1394   labelShort.SetProperty(TextLabel::Property::MULTI_LINE, false);
1395   labelShort.SetProperty(TextLabel::Property::HORIZONTAL_ALIGNMENT, "END");
1396   labelShort.SetProperty(TextLabel::Property::AUTO_SCROLL_GAP, 50.0f);
1397   labelShort.SetProperty(TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, 3);
1398   labelShort.SetProperty(TextLabel::Property::AUTO_SCROLL_SPEED, 80.0f);
1399   labelShort.SetProperty(TextLabel::Property::AUTO_SCROLL_STOP_MODE, TextLabel::AutoScrollStopMode::IMMEDIATE);
1400
1401   application.GetScene().Add(labelLong);
1402   // Turn on all the effects
1403   labelLong.SetProperty(TextLabel::Property::MULTI_LINE, false);
1404   labelLong.SetProperty(TextLabel::Property::HORIZONTAL_ALIGNMENT, "END");
1405   labelLong.SetProperty(TextLabel::Property::AUTO_SCROLL_GAP, 50.0f);
1406   labelLong.SetProperty(TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, 3);
1407   labelLong.SetProperty(TextLabel::Property::AUTO_SCROLL_SPEED, 80.0f);
1408   labelLong.SetProperty(TextLabel::Property::AUTO_SCROLL_STOP_MODE, TextLabel::AutoScrollStopMode::FINISH_LOOP);
1409
1410   try
1411   {
1412     // Render some text with the shared atlas backend
1413     labelShort.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1414     labelLong.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1415     application.SendNotification();
1416     application.Render();
1417
1418     labelShort.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, false);
1419     labelLong.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, false);
1420     application.SendNotification();
1421     application.Render();
1422   }
1423   catch(...)
1424   {
1425     tet_result(TET_FAIL);
1426   }
1427
1428   END_TEST;
1429 }
1430
1431 int UtcDaliToolkitTextlabelScrollingInterruptedP(void)
1432 {
1433   ToolkitTestApplication application;
1434   tet_infoline(" UtcDaliToolkitTextlabelScrollingInterruptedP");
1435   TextLabel label = TextLabel::New("Some text to scroll");
1436   DALI_TEST_CHECK(label);
1437   // Avoid a crash when core load gl resources.
1438   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
1439   application.GetScene().Add(label);
1440   label.SetProperty(Actor::Property::SIZE, Vector2(360.0f, 20.f));
1441   // Turn on all the effects
1442   label.SetProperty(TextLabel::Property::MULTI_LINE, false);
1443   label.SetProperty(TextLabel::Property::AUTO_SCROLL_GAP, 50.0f);
1444   label.SetProperty(TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, 3);
1445   label.SetProperty(TextLabel::Property::AUTO_SCROLL_SPEED, 80.0f);
1446
1447   // Render the text.
1448   application.SendNotification();
1449   application.Render();
1450
1451   unsigned int actorCount1 = label.GetChildCount();
1452   tet_printf("Initial actor count is(%d)\n", actorCount1);
1453
1454   try
1455   {
1456     // Render some text with the shared atlas backend
1457     label.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1458     application.SendNotification();
1459     application.Render(2000);
1460
1461     unsigned int actorCount1 = label.GetChildCount();
1462     tet_printf("Actor count after scrolling is(%d)\n", actorCount1);
1463
1464     label.SetProperty(TextLabel::Property::TEXT_COLOR, Color::RED);
1465
1466     // Render the text.
1467     application.SendNotification();
1468     application.Render();
1469
1470     unsigned int actorCount2 = label.GetChildCount();
1471     tet_printf("After changing color the actor count is(%d)\n", actorCount2);
1472
1473     DALI_TEST_EQUALS(actorCount1, actorCount2, TEST_LOCATION);
1474   }
1475   catch(...)
1476   {
1477     tet_result(TET_FAIL);
1478   }
1479
1480   END_TEST;
1481 }
1482
1483 int UtcDaliToolkitTextlabelScrollingN(void)
1484 {
1485   ToolkitTestApplication application;
1486   tet_infoline(" UtcDaliToolkitTextlabelScrollingN");
1487
1488   TextLabel label = TextLabel::New("Some text to scroll");
1489   DALI_TEST_CHECK(label);
1490
1491   application.GetScene().Add(label);
1492
1493   // Avoid a crash when core load gl resources.
1494   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
1495
1496   // The text scrolling works only on single line text.
1497   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
1498
1499   // Turn on all the effects.
1500   label.SetProperty(TextLabel::Property::AUTO_SCROLL_GAP, 50.0f);
1501   label.SetProperty(TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, 3);
1502   label.SetProperty(TextLabel::Property::AUTO_SCROLL_SPEED, 80.0f);
1503
1504   // Enable the auto scrolling effect.
1505   label.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1506
1507   // The auto scrolling shouldn't be enabled.
1508   const bool enabled = label.GetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL).Get<bool>();
1509   DALI_TEST_CHECK(!enabled);
1510
1511
1512   label.SetProperty(TextLabel::Property::MULTI_LINE, false);
1513   label.SetProperty(TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, 1);
1514   label.SetProperty(TextLabel::Property::AUTO_SCROLL_SPEED, 9999.0f);
1515   label.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1516
1517   try
1518   {
1519     // Render the text.
1520     application.SendNotification();
1521     application.Render(1000);
1522
1523     application.GetScene().Remove(label);
1524     application.SendNotification();
1525     application.Render();
1526
1527     DALI_TEST_CHECK(!label.GetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL).Get<bool>());
1528
1529     label.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1530     application.GetScene().Add(label);
1531
1532     application.SendNotification();
1533     application.Render();
1534
1535     DALI_TEST_CHECK(label.GetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL).Get<bool>());
1536
1537     label.SetProperty(TextLabel::Property::AUTO_SCROLL_STOP_MODE, (Toolkit::TextLabel::AutoScrollStopMode::Type)2); // invalid type
1538     label.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, false);
1539
1540     application.SendNotification();
1541     application.Render();
1542
1543     DALI_TEST_CHECK(label.GetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL).Get<bool>());
1544   }
1545   catch(...)
1546   {
1547     tet_result(TET_FAIL);
1548   }
1549
1550   END_TEST;
1551 }
1552
1553 int UtcDaliToolkitTextlabelScrollingWithEllipsis(void)
1554 {
1555   ToolkitTestApplication application;
1556   tet_infoline(" UtcDaliToolkitTextlabelScrollingWithEllipsis");
1557
1558   TextLabel label = TextLabel::New("Some text to scroll");
1559   DALI_TEST_CHECK(label);
1560
1561   application.GetScene().Add(label);
1562
1563   // Avoid a crash when core load gl resources.
1564   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
1565
1566   // Turn on all the effects.
1567   label.SetProperty(TextLabel::Property::AUTO_SCROLL_GAP, 50.0f);
1568   label.SetProperty(TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, 3);
1569   label.SetProperty(TextLabel::Property::AUTO_SCROLL_SPEED, 80.0f);
1570
1571   try
1572   {
1573     // Enable the auto scrolling effect.
1574     label.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1575     label.SetProperty(TextLabel::Property::AUTO_SCROLL_STOP_MODE, TextLabel::AutoScrollStopMode::IMMEDIATE);
1576
1577     // Disable the ellipsis
1578     label.SetProperty(TextLabel::Property::ELLIPSIS, false);
1579
1580     // Render the text.
1581     application.SendNotification();
1582     application.Render();
1583
1584     // Stop auto scrolling
1585     label.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, false);
1586
1587     // Check the ellipsis property
1588     DALI_TEST_CHECK(!label.GetProperty<bool>(TextLabel::Property::ELLIPSIS));
1589   }
1590   catch(...)
1591   {
1592     tet_result(TET_FAIL);
1593   }
1594
1595   END_TEST;
1596 }
1597
1598 int UtcDaliToolkitTextlabelEllipsis(void)
1599 {
1600   ToolkitTestApplication application;
1601   tet_infoline(" UtcDaliToolkitTextlabelEllipsis");
1602
1603   TextLabel label = TextLabel::New("Hello world");
1604   DALI_TEST_CHECK(label);
1605
1606   // Avoid a crash when core load gl resources.
1607   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
1608
1609   application.GetScene().Add(label);
1610
1611   // Turn on all the effects
1612   label.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
1613   label.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
1614   label.SetProperty(Actor::Property::SIZE, Vector2(360.0f, 10.f));
1615
1616   try
1617   {
1618     // Render the text.
1619     application.SendNotification();
1620     application.Render();
1621   }
1622   catch(...)
1623   {
1624     tet_result(TET_FAIL);
1625   }
1626
1627   label.SetProperty(TextLabel::Property::TEXT, "Hello world                                        ");
1628   label.SetProperty(DevelTextLabel::Property::IGNORE_SPACES_AFTER_TEXT, false);
1629   label.SetProperty(Actor::Property::SIZE, Vector2(400.0f, 10.f));
1630
1631   try
1632   {
1633     // Render the text.
1634     application.SendNotification();
1635     application.Render();
1636   }
1637   catch(...)
1638   {
1639     tet_result(TET_FAIL);
1640   }
1641
1642   label.SetProperty(TextLabel::Property::TEXT, "Hello world");
1643   label.SetProperty(DevelTextLabel::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION, true);
1644   label.SetProperty(Actor::Property::SIZE, Vector2(400.0f, 10.f));
1645
1646   try
1647   {
1648     // Render the text.
1649     application.SendNotification();
1650     application.Render();
1651   }
1652   catch(...)
1653   {
1654     tet_result(TET_FAIL);
1655   }
1656
1657   END_TEST;
1658 }
1659
1660 int UtcDaliToolkitTextlabelTextWrapMode(void)
1661 {
1662   ToolkitTestApplication application;
1663   tet_infoline(" UtcDaliToolkitTextlabelTextWarpMode");
1664
1665   int lineCount = 0;
1666
1667   TextLabel label = TextLabel::New();
1668   label.SetProperty(Actor::Property::SIZE, Vector2(300.0f, 300.f));
1669   label.SetProperty(TextLabel::Property::TEXT, "Hello world Hello world");
1670   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
1671
1672   //label.SetProperty( TextLabel::Property::POINT_SIZE, 18 );
1673   application.GetScene().Add(label);
1674
1675   label.SetProperty(TextLabel::Property::LINE_WRAP_MODE, "WORD");
1676   DALI_TEST_EQUALS(label.GetProperty<int>(TextLabel::Property::LINE_WRAP_MODE), static_cast<int>(Text::LineWrap::WORD), TEST_LOCATION);
1677
1678   application.SendNotification();
1679   application.Render();
1680
1681   lineCount = label.GetProperty<int>(TextLabel::Property::LINE_COUNT);
1682   DALI_TEST_EQUALS(lineCount, 2, TEST_LOCATION);
1683
1684   label.SetProperty(TextLabel::Property::LINE_WRAP_MODE, "CHARACTER");
1685   DALI_TEST_EQUALS(label.GetProperty<int>(TextLabel::Property::LINE_WRAP_MODE), static_cast<int>(Text::LineWrap::CHARACTER), TEST_LOCATION);
1686
1687   application.SendNotification();
1688   application.Render();
1689
1690   label.SetProperty(TextLabel::Property::LINE_WRAP_MODE, Text::LineWrap::WORD);
1691   DALI_TEST_EQUALS(label.GetProperty<int>(TextLabel::Property::LINE_WRAP_MODE), static_cast<int>(Text::LineWrap::WORD), TEST_LOCATION);
1692
1693   application.SendNotification();
1694   application.Render();
1695
1696   lineCount = label.GetProperty<int>(TextLabel::Property::LINE_COUNT);
1697   DALI_TEST_EQUALS(lineCount, 2, TEST_LOCATION);
1698
1699   label.SetProperty(TextLabel::Property::LINE_WRAP_MODE, Text::LineWrap::CHARACTER);
1700   DALI_TEST_EQUALS(label.GetProperty<int>(TextLabel::Property::LINE_WRAP_MODE), static_cast<int>(Text::LineWrap::CHARACTER), TEST_LOCATION);
1701
1702   application.SendNotification();
1703   application.Render();
1704
1705   lineCount = label.GetProperty<int>(TextLabel::Property::LINE_COUNT);
1706   DALI_TEST_EQUALS(lineCount, 2, TEST_LOCATION);
1707
1708   tet_infoline("Ensure invalid string does not change wrapping mode");
1709   label.SetProperty(TextLabel::Property::LINE_WRAP_MODE, "InvalidWrapMode");
1710   DALI_TEST_EQUALS(label.GetProperty<int>(TextLabel::Property::LINE_WRAP_MODE), static_cast<int>(Text::LineWrap::CHARACTER), TEST_LOCATION);
1711
1712   END_TEST;
1713 }
1714
1715 int UtcDaliToolkitTextLabelColorComponents(void)
1716 {
1717   ToolkitTestApplication application;
1718
1719   TextLabel label = TextLabel::New();
1720   label.SetProperty(TextLabel::Property::TEXT_COLOR, Color::RED);
1721   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_RED), 1.0f, TEST_LOCATION);
1722   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_GREEN), 0.0f, TEST_LOCATION);
1723   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_BLUE), 0.0f, TEST_LOCATION);
1724   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_ALPHA), 1.0f, TEST_LOCATION);
1725
1726   label.SetProperty(TextLabel::Property::TEXT_COLOR, Color::GREEN);
1727   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_RED), 0.0f, TEST_LOCATION);
1728   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_GREEN), 1.0f, TEST_LOCATION);
1729   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_BLUE), 0.0f, TEST_LOCATION);
1730   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_ALPHA), 1.0f, TEST_LOCATION);
1731
1732   label.SetProperty(TextLabel::Property::TEXT_COLOR, Color::BLUE);
1733   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_RED), 0.0f, TEST_LOCATION);
1734   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_GREEN), 0.0f, TEST_LOCATION);
1735   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_BLUE), 1.0f, TEST_LOCATION);
1736   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_ALPHA), 1.0f, TEST_LOCATION);
1737
1738   label.SetProperty(TextLabel::Property::TEXT_COLOR_ALPHA, 0.6f);
1739   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_ALPHA), 0.6f, TEST_LOCATION);
1740   DALI_TEST_EQUALS(label.GetProperty<Vector4>(TextLabel::Property::TEXT_COLOR), Vector4(0.0f, 0.0f, 1.0f, 0.6f), TEST_LOCATION);
1741
1742   // Test a transparent text - Rendering should be skipped.
1743   label.SetProperty(TextLabel::Property::TEXT, "Hello world Hello world");
1744   label.SetProperty(TextLabel::Property::TEXT_COLOR, Color::BLUE);
1745
1746   application.GetScene().Add(label);
1747
1748   TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1749   drawTrace.Enable(true);
1750
1751   application.SendNotification();
1752   application.Render();
1753
1754   DALI_TEST_EQUALS(drawTrace.FindMethod("DrawArrays"), true, TEST_LOCATION); // Should be rendered
1755
1756   label.SetProperty(TextLabel::Property::TEXT_COLOR, Color::TRANSPARENT);
1757
1758   drawTrace.Reset();
1759
1760   application.SendNotification();
1761   application.Render();
1762
1763   DALI_TEST_EQUALS(drawTrace.FindMethod("DrawArrays"), false, TEST_LOCATION); // Rendering should be skipped
1764
1765   label.SetProperty(TextLabel::Property::TEXT_COLOR, Color::RED);
1766
1767   drawTrace.Reset();
1768
1769   application.SendNotification();
1770   application.Render();
1771
1772   DALI_TEST_EQUALS(drawTrace.FindMethod("DrawArrays"), true, TEST_LOCATION); // Should be rendered again
1773
1774   END_TEST;
1775 }
1776
1777 int UtcDaliToolkitTextlabelTextStyle01(void)
1778 {
1779   ToolkitTestApplication application;
1780   tet_infoline(" UtcDaliToolkitTextlabelTextStyle Setting Outline after Shadow");
1781
1782   TextLabel label = TextLabel::New();
1783   label.SetProperty(Actor::Property::SIZE, Vector2(300.0f, 300.f));
1784   label.SetProperty(TextLabel::Property::TEXT, "Hello world Hello world");
1785   label.SetProperty(TextLabel::Property::POINT_SIZE, 12);
1786   application.GetScene().Add(label);
1787
1788   Property::Map outlineMapSet;
1789   Property::Map outlineMapGet;
1790
1791   outlineMapSet["color"] = Color::BLUE;
1792   outlineMapSet["width"] = 2.0f;
1793   label.SetProperty(TextLabel::Property::OUTLINE, outlineMapSet);
1794
1795   application.SendNotification();
1796   application.Render();
1797
1798   Property::Map shadowMapSet;
1799   shadowMapSet.Insert("color", "green");
1800   shadowMapSet.Insert("offset", "2 2");
1801   shadowMapSet.Insert("blurRadius", "3");
1802   label.SetProperty(TextLabel::Property::SHADOW, shadowMapSet);
1803
1804   outlineMapSet["color"] = Color::RED;
1805   outlineMapSet["width"] = 0.0f;
1806   label.SetProperty(TextLabel::Property::OUTLINE, outlineMapSet);
1807
1808   application.SendNotification();
1809   application.Render();
1810
1811   outlineMapGet = label.GetProperty<Property::Map>(TextLabel::Property::OUTLINE);
1812
1813   Property::Value* colorValue = outlineMapGet.Find("color");
1814
1815   bool colorMatched(false);
1816
1817   if(colorValue)
1818   {
1819     Property::Type valueType = colorValue->GetType();
1820
1821     if(Property::STRING == valueType)
1822     {
1823       std::string stringValue;
1824       colorValue->Get(stringValue);
1825       if(stringValue == "red")
1826       {
1827         colorMatched = true;
1828       }
1829     }
1830     else if(Property::VECTOR4 == valueType)
1831     {
1832       Vector4 colorVector4;
1833       colorValue->Get(colorVector4);
1834       if(colorVector4 == Color::RED)
1835       {
1836         colorMatched = true;
1837       }
1838     }
1839   }
1840
1841   DALI_TEST_EQUALS(colorMatched, true, TEST_LOCATION);
1842
1843   END_TEST;
1844 }
1845
1846 int UtcDaliToolkitTextlabelMultiline(void)
1847 {
1848   ToolkitTestApplication application;
1849   tet_infoline(" UtcDaliToolkitTextlabelMultiline");
1850
1851   TextLabel label = TextLabel::New();
1852   label.SetProperty(TextLabel::Property::TEXT, "Hello world Hello world Hello world Hello world Hello world Hello world");
1853   label.SetProperty(TextLabel::Property::POINT_SIZE, 20);
1854   label.SetProperty(TextLabel::Property::MULTI_LINE, false);
1855   application.GetScene().Add(label);
1856
1857   application.SendNotification();
1858   application.Render();
1859
1860   int lineCount = label.GetProperty<int>(TextLabel::Property::LINE_COUNT);
1861   DALI_TEST_EQUALS(lineCount, 1, TEST_LOCATION);
1862
1863   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
1864
1865   application.SendNotification();
1866   application.Render();
1867
1868   lineCount = label.GetProperty<int>(TextLabel::Property::LINE_COUNT);
1869   DALI_TEST_EQUALS(true, (lineCount > 1), TEST_LOCATION);
1870
1871   END_TEST;
1872 }
1873
1874 int UtcDaliToolkitTextlabelTextDirection(void)
1875 {
1876   ToolkitTestApplication application;
1877   tet_infoline(" UtcDaliToolkitTextlabelTextDirection");
1878
1879   TextLabel label = TextLabel::New();
1880   DALI_TEST_EQUALS(label.GetProperty<int>(DevelTextLabel::Property::TEXT_DIRECTION), static_cast<int>(Toolkit::DevelText::TextDirection::LEFT_TO_RIGHT), TEST_LOCATION);
1881
1882   label.SetProperty(TextLabel::Property::TEXT, "Hello world");
1883   label.SetProperty(TextLabel::Property::POINT_SIZE, 20);
1884   label.SetProperty(DevelTextLabel::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION, false);
1885   application.GetScene().Add(label);
1886
1887   // Test LTR text
1888   DALI_TEST_EQUALS(label.GetProperty<int>(DevelTextLabel::Property::TEXT_DIRECTION), static_cast<int>(Toolkit::DevelText::TextDirection::LEFT_TO_RIGHT), TEST_LOCATION);
1889
1890   // Test RTL text
1891   label.SetProperty(TextLabel::Property::TEXT, "ﻡﺮﺤﺑﺍ ﺏﺎﻠﻋﺎﻠﻣ ﻡﺮﺤﺑﺍ");
1892   DALI_TEST_EQUALS(label.GetProperty<int>(DevelTextLabel::Property::TEXT_DIRECTION), static_cast<int>(Toolkit::DevelText::TextDirection::RIGHT_TO_LEFT), TEST_LOCATION);
1893
1894   // Test RTL text starting with weak character
1895   label.SetProperty(TextLabel::Property::TEXT, "()ﻡﺮﺤﺑﺍ ﺏﺎﻠﻋﺎﻠﻣ ﻡﺮﺤﺑﺍ");
1896   DALI_TEST_EQUALS(label.GetProperty<int>(DevelTextLabel::Property::TEXT_DIRECTION), static_cast<int>(Toolkit::DevelText::TextDirection::RIGHT_TO_LEFT), TEST_LOCATION);
1897
1898   // Test RTL text string with emoji and weak character
1899   label.SetProperty(TextLabel::Property::TEXT, "\xF0\x9F\x98\x81 () ﻡﺮﺤﺑﺍ ﺏﺎﻠﻋﺎﻠﻣ ﻡﺮﺤﺑﺍ");
1900   DALI_TEST_EQUALS(label.GetProperty<int>(DevelTextLabel::Property::TEXT_DIRECTION), static_cast<int>(Toolkit::DevelText::TextDirection::RIGHT_TO_LEFT), TEST_LOCATION);
1901
1902   END_TEST;
1903 }
1904
1905 int UtcDaliToolkitTextlabelVerticalLineAlignment(void)
1906 {
1907   ToolkitTestApplication application;
1908   tet_infoline(" UtcDaliToolkitTextlabelVerticalLineAlignment");
1909
1910   TextLabel label = TextLabel::New();
1911
1912   label.SetProperty(DevelTextLabel::Property::VERTICAL_LINE_ALIGNMENT, DevelText::VerticalLineAlignment::TOP);
1913   label.SetProperty(TextLabel::Property::TEXT, "Hello world");
1914   label.SetProperty(TextLabel::Property::POINT_SIZE, 15);
1915   label.SetProperty(TextLabel::Property::LINE_SPACING, 12);
1916   application.GetScene().Add(label);
1917   DALI_TEST_EQUALS(label.GetProperty<int>(DevelTextLabel::Property::VERTICAL_LINE_ALIGNMENT), static_cast<int>(Toolkit::DevelText::VerticalLineAlignment::TOP), TEST_LOCATION);
1918
1919   label.SetProperty(DevelTextLabel::Property::VERTICAL_LINE_ALIGNMENT, DevelText::VerticalLineAlignment::MIDDLE);
1920   DALI_TEST_EQUALS(label.GetProperty<int>(DevelTextLabel::Property::VERTICAL_LINE_ALIGNMENT), static_cast<int>(Toolkit::DevelText::VerticalLineAlignment::MIDDLE), TEST_LOCATION);
1921
1922   label.SetProperty(DevelTextLabel::Property::VERTICAL_LINE_ALIGNMENT, DevelText::VerticalLineAlignment::BOTTOM);
1923   DALI_TEST_EQUALS(label.GetProperty<int>(DevelTextLabel::Property::VERTICAL_LINE_ALIGNMENT), static_cast<int>(Toolkit::DevelText::VerticalLineAlignment::BOTTOM), TEST_LOCATION);
1924
1925   END_TEST;
1926 }
1927
1928 int UtcDaliToolkitTextLabelBitmapFont(void)
1929 {
1930   ToolkitTestApplication application;
1931   tet_infoline(" UtcDaliToolkitTextLabelBitmapFont");
1932
1933   DevelText::BitmapFontDescription fontDescription;
1934   fontDescription.name               = "Digits";
1935   fontDescription.underlinePosition  = 0.f;
1936   fontDescription.underlineThickness = 0.f;
1937
1938   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0030.png", ":", 34.f, 0.f});
1939   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0031.png", "0", 34.f, 0.f});
1940   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0032.png", "1", 34.f, 0.f});
1941   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0033.png", "2", 34.f, 0.f});
1942   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0034.png", "3", 34.f, 0.f});
1943   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0035.png", "4", 34.f, 0.f});
1944   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0036.png", "5", 34.f, 0.f});
1945   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0037.png", "6", 34.f, 0.f});
1946   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0038.png", "7", 34.f, 0.f});
1947   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0039.png", "8", 34.f, 0.f});
1948   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u003a.png", "9", 34.f, 0.f});
1949
1950   TextAbstraction::BitmapFont bitmapFont;
1951   DevelText::CreateBitmapFont(fontDescription, bitmapFont);
1952
1953   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
1954   fontClient.GetFontId(bitmapFont);
1955
1956   TextLabel label = TextLabel::New();
1957
1958   label.SetProperty(TextLabel::Property::TEXT, "0123456789:");
1959   label.SetProperty(TextLabel::Property::FONT_FAMILY, "Digits");
1960
1961   // The text has been laid out with the bitmap font if the natural size is the sum of all the width (322) and 34 height.
1962   DALI_TEST_EQUALS(label.GetNaturalSize(), Vector3(322.f, 34.f, 0.f), Math::MACHINE_EPSILON_1000, TEST_LOCATION);
1963
1964   application.GetScene().Add(label);
1965
1966   application.SendNotification();
1967   application.Render();
1968
1969   // The text has been rendered if the height of the text-label is the height of the line.
1970   DALI_TEST_EQUALS(label.GetCurrentProperty<Vector3>(Actor::Property::SIZE).height, 34.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
1971
1972   END_TEST;
1973 }
1974
1975 int ConvertPointToPixel(float point)
1976 {
1977   unsigned int                horizontalDpi = 0u;
1978   unsigned int                verticalDpi   = 0u;
1979   TextAbstraction::FontClient fontClient    = TextAbstraction::FontClient::Get();
1980   fontClient.GetDpi(horizontalDpi, verticalDpi);
1981
1982   return (point * 72.f) / static_cast<float>(horizontalDpi);
1983 }
1984
1985 int UtcDaliToolkitTextlabelTextFit(void)
1986 {
1987   ToolkitTestApplication application;
1988   tet_infoline(" UtcDaliToolkitTextlabelTextFit");
1989   TextLabel label = TextLabel::New();
1990   Vector2   size(460.0f, 100.0f);
1991   label.SetProperty(Actor::Property::SIZE, size);
1992   label.SetProperty(TextLabel::Property::TEXT, "Hello world");
1993
1994   // connect to the text git changed signal.
1995   ConnectionTracker* testTracker = new ConnectionTracker();
1996   DevelTextLabel::TextFitChangedSignal(label).Connect(&TestTextFitChangedCallback);
1997   bool textFitChangedSignal = false;
1998   label.ConnectSignal(testTracker, "textFitChanged", CallbackFunctor(&textFitChangedSignal));
1999   gTextFitChangedCallBackCalled = false;
2000
2001   // check point size
2002   Property::Map textFitMapSet;
2003   textFitMapSet["enable"]       = true;
2004   textFitMapSet["minSize"]      = 10.f;
2005   textFitMapSet["maxSize"]      = 100.f;
2006   textFitMapSet["stepSize"]     = -1.f;
2007   textFitMapSet["fontSizeType"] = "pointSize";
2008
2009   label.SetProperty(Toolkit::DevelTextLabel::Property::TEXT_FIT, textFitMapSet);
2010   label.SetProperty(TextLabel::Property::POINT_SIZE, 120.f);
2011
2012   application.GetScene().Add(label);
2013
2014   application.SendNotification();
2015   application.Render();
2016
2017   const Vector3 EXPECTED_NATURAL_SIZE(450.0f, 96.0f, 0.0f);
2018   DALI_TEST_EQUALS(EXPECTED_NATURAL_SIZE, label.GetNaturalSize(), TEST_LOCATION);
2019
2020   DALI_TEST_CHECK(gTextFitChangedCallBackCalled);
2021   DALI_TEST_CHECK(textFitChangedSignal);
2022
2023   // check pixel size
2024   textFitMapSet.Clear();
2025   textFitMapSet["enable"]       = true;
2026   textFitMapSet["minSize"]      = ConvertPointToPixel(10.f);
2027   textFitMapSet["maxSize"]      = ConvertPointToPixel(100.f);
2028   textFitMapSet["stepSize"]     = ConvertPointToPixel(1.f);
2029   textFitMapSet["fontSizeType"] = "pixelSize";
2030
2031   label.SetProperty(Toolkit::DevelTextLabel::Property::TEXT_FIT, textFitMapSet);
2032
2033   application.SendNotification();
2034   application.Render();
2035
2036   DALI_TEST_EQUALS(EXPECTED_NATURAL_SIZE, label.GetNaturalSize(), TEST_LOCATION);
2037
2038   END_TEST;
2039 }
2040
2041 int UtcDaliToolkitTextlabelMaxTextureSet(void)
2042 {
2043   ToolkitTestApplication application;
2044   tet_infoline(" UtcDaliToolkitTextlabelMaxTextureSet");
2045
2046   DevelText::BitmapFontDescription fontDescription;
2047   fontDescription.name = "Digits";
2048   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0030.png", ":", 200.f, 0.f});
2049
2050   TextAbstraction::BitmapFont bitmapFont;
2051   DevelText::CreateBitmapFont(fontDescription, bitmapFont);
2052
2053   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
2054   fontClient.GetFontId(bitmapFont);
2055
2056   TextLabel label = TextLabel::New();
2057   label.SetProperty(TextLabel::Property::FONT_FAMILY, "Digits");
2058   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2059   label.SetProperty(TextLabel::Property::TEXT, ":This is a long sample text made to allow max texture size to be exceeded.");
2060   label.SetProperty(TextLabel::Property::POINT_SIZE, 200.f);
2061   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
2062
2063   Property::Map underlineMapSet;
2064   underlineMapSet.Clear();
2065   underlineMapSet.Insert("enable", true);
2066   underlineMapSet.Insert("color", Color::RED);
2067   underlineMapSet.Insert("height", 1);
2068   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
2069   label.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::BLUE);
2070
2071   Property::Map strikethroughMapSet;
2072   strikethroughMapSet.Clear();
2073   strikethroughMapSet.Insert("enable", true);
2074   strikethroughMapSet.Insert("color", Color::RED);
2075   strikethroughMapSet.Insert("height", 2.0f);
2076   label.SetProperty(DevelTextLabel::Property::STRIKETHROUGH, strikethroughMapSet);
2077   label.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::BLUE);
2078
2079   application.GetScene().Add(label);
2080
2081   application.SendNotification();
2082   application.Render();
2083
2084   const int maxTextureSize = Dali::GetMaxTextureSize();
2085   // Whether the rendered text is greater than maxTextureSize
2086   DALI_TEST_CHECK(label.GetCurrentProperty<Vector3>(Actor::Property::SIZE).height > maxTextureSize);
2087
2088   // Check if the number of renderers is greater than 1.
2089   DALI_TEST_CHECK(label.GetRendererCount() > 1u);
2090
2091   //DASHED
2092   underlineMapSet.Clear();
2093   underlineMapSet.Insert("enable", false);
2094   underlineMapSet.Insert("color", Color::BLUE);
2095   underlineMapSet.Insert("height", 0);
2096   underlineMapSet.Insert("type", Text::Underline::DASHED);
2097   underlineMapSet.Insert("dashWidth", 2);
2098   underlineMapSet.Insert("dashGap", 1);
2099   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
2100   label.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::BLUE);
2101
2102   application.GetScene().Add(label);
2103
2104   application.SendNotification();
2105   application.Render();
2106
2107   // Whether the rendered text is greater than maxTextureSize
2108   DALI_TEST_CHECK(label.GetCurrentProperty<Vector3>(Actor::Property::SIZE).height > maxTextureSize);
2109
2110   // Check if the number of renderers is greater than 1.
2111   DALI_TEST_CHECK(label.GetRendererCount() > 1u);
2112
2113   //DOUBLE
2114   underlineMapSet.Clear();
2115   underlineMapSet.Insert("enable", false);
2116   underlineMapSet.Insert("color", Color::BLUE);
2117   underlineMapSet.Insert("height", 0);
2118   underlineMapSet.Insert("type", Text::Underline::DOUBLE);
2119   underlineMapSet.Insert("dashWidth", 2);
2120   underlineMapSet.Insert("dashGap", 1);
2121   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
2122   label.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::BLUE);
2123
2124   application.GetScene().Add(label);
2125
2126   application.SendNotification();
2127   application.Render();
2128
2129   // Whether the rendered text is greater than maxTextureSize
2130   DALI_TEST_CHECK(label.GetCurrentProperty<Vector3>(Actor::Property::SIZE).height > maxTextureSize);
2131
2132   // Check if the number of renderers is greater than 1.
2133   DALI_TEST_CHECK(label.GetRendererCount() > 1u);
2134
2135   // Coverage test for case of layoutSize is bigger than maxTextureSize
2136   float max_value = static_cast<float>(std::numeric_limits<uint16_t>::max());
2137   label.SetProperty(Actor::Property::SIZE, Vector2(max_value, 30.0f));
2138   application.SendNotification();
2139   application.Render();
2140
2141
2142   END_TEST;
2143 }
2144
2145 int UtcDaliToolkitTextlabelStrikethroughExceedsWidthAndHeight(void)
2146 {
2147   ToolkitTestApplication application;
2148   tet_infoline(" UtcDaliToolkitTextlabelStrikethroughExceedsWidthAndHeight");
2149
2150   TextLabel label = TextLabel::New();
2151   label.SetProperty(TextLabel::Property::TEXT, "Test");
2152   label.SetProperty(TextLabel::Property::FONT_FAMILY, "DejaVu Sans");
2153   //Exeeding BufferWidth
2154   label.SetProperty(Actor::Property::SIZE, Vector2(200.f, 400.0f));
2155   label.SetProperty(TextLabel::Property::HORIZONTAL_ALIGNMENT, HorizontalAlignment::RIGHT);
2156   label.SetProperty(TextLabel::Property::POINT_SIZE, 200.f);
2157
2158   application.GetScene().Add(label);
2159   application.SendNotification();
2160   application.Render();
2161
2162   Property::Map strikethroughMapSet;
2163   strikethroughMapSet.Clear();
2164   strikethroughMapSet.Insert("enable", true);
2165   strikethroughMapSet.Insert("color", Color::BLUE);
2166   strikethroughMapSet.Insert("height", 2.0f);
2167   label.SetProperty(TextLabel::Property::TEXT, "Test1");
2168   label.SetProperty(DevelTextLabel::Property::STRIKETHROUGH, strikethroughMapSet);
2169   label.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::BLUE);
2170   application.GetScene().Add(label);
2171   application.SendNotification();
2172   application.Render();
2173   // Check if the number of renderers is 1.
2174   DALI_TEST_EQUALS(1, label.GetRendererCount(), TEST_LOCATION);
2175
2176   label = TextLabel::New();
2177   label.SetProperty(TextLabel::Property::TEXT, "Test");
2178   label.SetProperty(TextLabel::Property::FONT_FAMILY, "DejaVu Sans");
2179
2180   //Exeeding BufferHeight
2181   label.SetProperty(Actor::Property::SIZE, Vector2(200.f, 100.0f));
2182   label.SetProperty(TextLabel::Property::HORIZONTAL_ALIGNMENT, HorizontalAlignment::RIGHT);
2183   label.SetProperty(TextLabel::Property::POINT_SIZE, 200.f);
2184
2185   application.GetScene().Add(label);
2186   application.SendNotification();
2187   application.Render();
2188
2189   strikethroughMapSet.Clear();
2190   strikethroughMapSet.Insert("enable", true);
2191   strikethroughMapSet.Insert("color", Color::BLUE);
2192   strikethroughMapSet.Insert("height", 2.0f);
2193   label.SetProperty(TextLabel::Property::TEXT, "Test2");
2194   label.SetProperty(DevelTextLabel::Property::STRIKETHROUGH, strikethroughMapSet);
2195   label.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::BLUE);
2196   application.GetScene().Add(label);
2197   application.SendNotification();
2198   application.Render();
2199   // Check if the number of renderers is 1.
2200   DALI_TEST_EQUALS(1, label.GetRendererCount(), TEST_LOCATION);
2201
2202   END_TEST;
2203 }
2204
2205 int UtcDaliToolkitTextlabelUnderlineExceedsWidth(void)
2206 {
2207   ToolkitTestApplication application;
2208   tet_infoline(" UtcDaliToolkitTextlabelUnderlineExceedsWidth");
2209
2210   TextLabel label = TextLabel::New();
2211   label.SetProperty(TextLabel::Property::TEXT, "Test");
2212   label.SetProperty(TextLabel::Property::FONT_FAMILY, "DejaVu Sans");
2213   //Exeeding BufferWidth
2214   label.SetProperty(Actor::Property::SIZE, Vector2(200.f, 400.0f));
2215   label.SetProperty(TextLabel::Property::HORIZONTAL_ALIGNMENT, HorizontalAlignment::RIGHT);
2216   label.SetProperty(TextLabel::Property::POINT_SIZE, 200.f);
2217
2218   application.GetScene().Add(label);
2219   application.SendNotification();
2220   application.Render();
2221
2222   Property::Map underlineMapSet;
2223
2224   //SOLID
2225   underlineMapSet.Clear();
2226   underlineMapSet.Insert("enable", true);
2227   underlineMapSet.Insert("color", Color::BLUE);
2228   underlineMapSet.Insert("height", 1);
2229   underlineMapSet.Insert("type", Text::Underline::SOLID);
2230   underlineMapSet.Insert("dashWidth", 2);
2231   underlineMapSet.Insert("dashGap", 1);
2232   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
2233   label.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::BLUE);
2234
2235   application.GetScene().Add(label);
2236
2237   application.SendNotification();
2238   application.Render();
2239
2240   // Check if the number of renderers is 1.
2241   DALI_TEST_EQUALS(1, label.GetRendererCount(), TEST_LOCATION);
2242
2243   //DASHED
2244   underlineMapSet.Clear();
2245   underlineMapSet.Insert("enable", true);
2246   underlineMapSet.Insert("color", Color::BLUE);
2247   underlineMapSet.Insert("height", 1);
2248   underlineMapSet.Insert("type", Text::Underline::DASHED);
2249   underlineMapSet.Insert("dashWidth", 2);
2250   underlineMapSet.Insert("dashGap", 1);
2251   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
2252   label.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::BLUE);
2253
2254   application.GetScene().Add(label);
2255
2256   application.SendNotification();
2257   application.Render();
2258
2259   // Check if the number of renderers is 1.
2260   DALI_TEST_EQUALS(1, label.GetRendererCount(), TEST_LOCATION);
2261
2262   //DOUBLE
2263   underlineMapSet.Clear();
2264   underlineMapSet.Insert("enable", true);
2265   underlineMapSet.Insert("color", Color::BLUE);
2266   underlineMapSet.Insert("height", 1);
2267   underlineMapSet.Insert("type", Text::Underline::DOUBLE);
2268   underlineMapSet.Insert("dashWidth", 2);
2269   underlineMapSet.Insert("dashGap", 1);
2270   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
2271   label.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::BLUE);
2272
2273   application.GetScene().Add(label);
2274
2275   application.SendNotification();
2276   application.Render();
2277
2278   // Check if the number of renderers is 1.
2279   DALI_TEST_EQUALS(1, label.GetRendererCount(), TEST_LOCATION);
2280
2281   END_TEST;
2282 }
2283
2284 int UtcDaliToolkitTextlabelLastCharacterIndex(void)
2285 {
2286   ToolkitTestApplication application;
2287   tet_infoline(" UtcDaliToolkitTextlabelLastCharacterIndex");
2288
2289   Vector2 size(300.0f, 100.0f);
2290
2291   Dali::Toolkit::DevelText::RendererParameters textParameters;
2292   textParameters.text              = "This is a sample text to get the last index.";
2293   textParameters.layout            = "multiLine";
2294   textParameters.fontSize          = 20.f;
2295   textParameters.textWidth         = 300u;
2296   textParameters.textHeight        = 100u;
2297   textParameters.ellipsisEnabled   = true;
2298   Dali::Property::Array indexArray = Dali::Toolkit::DevelText::GetLastCharacterIndex(textParameters);
2299
2300   DALI_TEST_CHECK(!indexArray.Empty());
2301   DALI_TEST_EQUALS(indexArray.GetElementAt(0).Get<int>(), 10, TEST_LOCATION);
2302
2303   END_TEST;
2304 }
2305
2306 int UtcDaliToolkitTextlabelFontSizeScale(void)
2307 {
2308   ToolkitTestApplication application;
2309   tet_infoline(" UtcDaliToolkitTextlabelFontSizeScale");
2310
2311   TextLabel label = TextLabel::New();
2312   label.SetProperty(TextLabel::Property::POINT_SIZE, 30.f);
2313   label.SetProperty(TextLabel::Property::TEXT, "Test");
2314   Vector3 nonScaledSize = label.GetNaturalSize();
2315
2316   TextLabel labelScaled = TextLabel::New();
2317   labelScaled.SetProperty(TextLabel::Property::POINT_SIZE, 15.f);
2318   labelScaled.SetProperty(Toolkit::DevelTextLabel::Property::FONT_SIZE_SCALE, 2.f);
2319   labelScaled.SetProperty(TextLabel::Property::TEXT, "Test");
2320   Vector3 scaledSize = labelScaled.GetNaturalSize();
2321
2322   DALI_TEST_EQUALS(nonScaledSize, scaledSize, TEST_LOCATION);
2323
2324   label.SetProperty(TextLabel::Property::PIXEL_SIZE, 30.f);
2325   label.SetProperty(TextLabel::Property::TEXT, "Test");
2326   nonScaledSize = label.GetNaturalSize();
2327
2328   labelScaled.SetProperty(TextLabel::Property::PIXEL_SIZE, 15.f);
2329   labelScaled.SetProperty(Toolkit::DevelTextLabel::Property::FONT_SIZE_SCALE, 2.f);
2330   labelScaled.SetProperty(TextLabel::Property::TEXT, "Test");
2331   scaledSize = labelScaled.GetNaturalSize();
2332
2333   DALI_TEST_EQUALS(nonScaledSize, scaledSize, TEST_LOCATION);
2334
2335   END_TEST;
2336 }
2337
2338 // Positive test for the anchorClicked signal.
2339 int UtcDaliToolkitTextlabelAnchorClicked(void)
2340 {
2341   ToolkitTestApplication application;
2342   tet_infoline(" UtcDaliToolkitTextlabelAnchorClicked");
2343   TextLabel label = TextLabel::New();
2344   DALI_TEST_CHECK(label);
2345
2346   application.GetScene().Add(label);
2347
2348   // connect to the anchor clicked signal.
2349   ConnectionTracker* testTracker = new ConnectionTracker();
2350   DevelTextLabel::AnchorClickedSignal(label).Connect(&TestAnchorClickedCallback);
2351   bool anchorClickedSignal = false;
2352   label.ConnectSignal(testTracker, "anchorClicked", CallbackFunctor(&anchorClickedSignal));
2353
2354   gAnchorClickedCallBackCalled = false;
2355   label.SetProperty(TextLabel::Property::TEXT, "<a href='https://www.tizen.org'>TIZEN</a>");
2356   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2357   label.SetProperty(Actor::Property::SIZE, Vector2(100.f, 50.f));
2358   label.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
2359   label.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
2360
2361   application.SendNotification();
2362   application.Render();
2363
2364   // Create a tap event to touch the text label.
2365   TestGenerateTap(application, 5.0f, 25.0f, 100);
2366   application.SendNotification();
2367   application.Render();
2368
2369   DALI_TEST_CHECK(gAnchorClickedCallBackCalled);
2370   DALI_TEST_CHECK(anchorClickedSignal);
2371
2372   // reset
2373   gAnchorClickedCallBackCalled = false;
2374   anchorClickedSignal          = false;
2375   label.SetProperty(TextLabel::Property::TEXT, "");
2376   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, false);
2377
2378   application.SendNotification();
2379   application.Render();
2380
2381   // sets anchor text
2382   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2383   label.SetProperty(TextLabel::Property::TEXT, "<a href='https://www.tizen.org'>TIZEN</a>");
2384   label.SetProperty(Actor::Property::SIZE, Vector2(100.f, 50.f));
2385   label.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
2386   label.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
2387
2388   application.SendNotification();
2389   application.Render();
2390
2391   // Create a tap event to touch the text label.
2392   TestGenerateTap(application, 5.0f, 25.0f, 200);
2393   application.SendNotification();
2394   application.Render();
2395
2396   DALI_TEST_CHECK(gAnchorClickedCallBackCalled);
2397   DALI_TEST_CHECK(anchorClickedSignal);
2398
2399   gAnchorClickedCallBackNotCalled = true;
2400   // Tap the outside of anchor, callback should not be called.
2401   TestGenerateTap(application, 150.f, 100.f, 300);
2402   application.SendNotification();
2403   application.Render();
2404
2405   DALI_TEST_CHECK(gAnchorClickedCallBackNotCalled);
2406
2407   END_TEST;
2408 }
2409
2410 int UtcDaliTextLabelAtlasLimitationIsEnabledForLargeFontPointSize(void)
2411 {
2412   ToolkitTestApplication application;
2413   tet_infoline(" UtcDaliTextLabelAtlasLimitationIsEnabledForLargeFontPointSize ");
2414
2415   //TextLabel is not using Atlas but this is to unify font-size on text-controllers
2416
2417   // +2: First one to handle the equal case. Second one to handle odd to even case of GetNaturalSize
2418   const uint32_t lessThanWidth  = TextAbstraction::FontClient::MAX_TEXT_ATLAS_WIDTH - TextAbstraction::FontClient::PADDING_TEXT_ATLAS_BLOCK + 2;
2419   const uint32_t lessThanHeight = TextAbstraction::FontClient::MAX_TEXT_ATLAS_HEIGHT - TextAbstraction::FontClient::PADDING_TEXT_ATLAS_BLOCK + 2;
2420
2421   // Create a text editor
2422   TextLabel textLabel = TextLabel::New();
2423   //Set size to avoid automatic eliding
2424   textLabel.SetProperty(Actor::Property::SIZE, Vector2(1025, 1025));
2425   //Set very large font-size using point-size
2426   textLabel.SetProperty(TextLabel::Property::POINT_SIZE, 1000);
2427   //Specify font-family
2428   textLabel.SetProperty(TextLabel::Property::FONT_FAMILY, "DejaVu Sans");
2429   //Set text to check if appear or not
2430   textLabel.SetProperty(TextLabel::Property::TEXT, "A");
2431
2432   application.GetScene().Add(textLabel);
2433
2434   application.SendNotification();
2435   application.Render();
2436   //Use GetNaturalSize to verify that size of block does not exceed Atlas size
2437   Vector3 naturalSize = textLabel.GetNaturalSize();
2438
2439   DALI_TEST_GREATER(lessThanWidth, static_cast<uint32_t>(naturalSize.width), TEST_LOCATION);
2440   DALI_TEST_GREATER(lessThanHeight, static_cast<uint32_t>(naturalSize.height), TEST_LOCATION);
2441
2442   END_TEST;
2443 }
2444
2445 int UtcDaliTextLabelHyphenWrapMode(void)
2446 {
2447   ToolkitTestApplication application;
2448   tet_infoline(" UtcDaliTextLabelHyphenWrapMode ");
2449
2450   int       lineCount = 0;
2451   TextLabel label     = TextLabel::New();
2452   label.SetProperty(Actor::Property::SIZE, Vector2(150.0f, 300.f));
2453   label.SetProperty(TextLabel::Property::POINT_SIZE, 12.f);
2454   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
2455   application.GetScene().Add(label);
2456   application.SendNotification();
2457   application.Render();
2458
2459   label.SetProperty(TextLabel::Property::TEXT, "Hi Experimen");
2460   label.SetProperty(TextLabel::Property::LINE_WRAP_MODE, DevelText::LineWrap::HYPHENATION);
2461   DALI_TEST_EQUALS(label.GetProperty<int>(TextLabel::Property::LINE_WRAP_MODE), static_cast<int>(DevelText::LineWrap::HYPHENATION), TEST_LOCATION);
2462
2463   application.SendNotification();
2464   application.Render();
2465
2466   lineCount = label.GetProperty<int>(TextLabel::Property::LINE_COUNT);
2467   /*
2468     text will be :
2469     Hi Exp-
2470     erimen
2471   */
2472   DALI_TEST_EQUALS(lineCount, 2, TEST_LOCATION);
2473
2474   label.SetProperty(TextLabel::Property::TEXT, "Hi Experimen");
2475   label.SetProperty(TextLabel::Property::LINE_WRAP_MODE, DevelText::LineWrap::MIXED);
2476   DALI_TEST_EQUALS(label.GetProperty<int>(TextLabel::Property::LINE_WRAP_MODE), static_cast<int>(DevelText::LineWrap::MIXED), TEST_LOCATION);
2477
2478   application.SendNotification();
2479   application.Render();
2480
2481   lineCount = label.GetProperty<int>(TextLabel::Property::LINE_COUNT);
2482   /*
2483     text will be :
2484     Hi
2485     Experi-
2486     men
2487   */
2488   DALI_TEST_EQUALS(lineCount, 3, TEST_LOCATION);
2489
2490   END_TEST;
2491 }
2492
2493 int utcDaliTextLabelGetHeightForWidthChangeLineCountWhenTextChanged(void)
2494 {
2495   ToolkitTestApplication application;
2496
2497   tet_infoline(" utcDaliTextLabelGetHeightForWidthChangeLineCountWhenTextChanged ");
2498
2499   int lineCountBefore = 0;
2500   int lineCountAfter  = 0;
2501
2502   // Create a text editor
2503   TextLabel textLabel = TextLabel::New();
2504   //Set very large font-size using point-size
2505   textLabel.SetProperty(TextLabel::Property::POINT_SIZE, 10);
2506   //Specify font-family
2507   textLabel.SetProperty(TextLabel::Property::FONT_FAMILY, "DejaVu Sans");
2508   //Specify size
2509   textLabel.SetProperty(Actor::Property::SIZE, Vector2(200.f, 100.f));
2510   //Set text longer than width of textLabel
2511   textLabel.SetProperty(TextLabel::Property::TEXT, "Short text");
2512   //Set line wrap mode Character
2513   textLabel.SetProperty(TextLabel::Property::LINE_WRAP_MODE, "CHARACTER");
2514   textLabel.SetProperty(TextLabel::Property::MULTI_LINE, true);
2515
2516   application.GetScene().Add(textLabel);
2517
2518   application.SendNotification();
2519   application.Render();
2520
2521   lineCountBefore = textLabel.GetProperty<int>(TextLabel::Property::LINE_COUNT);
2522
2523   textLabel.SetProperty(TextLabel::Property::TEXT, "This is very loooooooooooooooooooooooooooooooooooong text for test");
2524   lineCountAfter = textLabel.GetProperty<int>(TextLabel::Property::LINE_COUNT);
2525
2526   // When the text changed, the Line-count should be updated according to new text.
2527   // Because the GetHeightForWidth is called in Controller::GetLineCount(float width)
2528   DALI_TEST_EQUALS(lineCountBefore, 1, TEST_LOCATION);
2529   DALI_TEST_GREATER(lineCountAfter, 1, TEST_LOCATION);
2530
2531   END_TEST;
2532 }
2533
2534 int utcDaliTextLabelGeometryRTL(void)
2535 {
2536   ToolkitTestApplication application;
2537   tet_infoline(" utcDaliTextLabelGeometryRTL");
2538
2539   TextLabel label = TextLabel::New();
2540   DALI_TEST_CHECK(label);
2541
2542   application.GetScene().Add(label);
2543
2544   label.SetProperty(TextLabel::Property::POINT_SIZE, 7.f);
2545   label.SetProperty(Actor::Property::SIZE, Vector2(150.f, 100.f));
2546   label.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
2547   label.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
2548   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2549   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
2550   label.SetProperty(TextLabel::Property::TEXT, "line1 \nline2\nline 3\nالاخيرالسطر");
2551
2552   // Avoid a crash when core load gl resources.
2553   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
2554
2555   // Render and notify
2556   application.SendNotification();
2557   application.Render();
2558
2559   unsigned int expectedCount = 4;
2560   unsigned int startIndex    = 3;
2561   unsigned int endIndex      = 24;
2562
2563   Vector<Vector2> positionsList = DevelTextLabel::GetTextPosition(label, startIndex, endIndex);
2564   Vector<Vector2> sizeList      = DevelTextLabel::GetTextSize(label, startIndex, endIndex);
2565
2566   DALI_TEST_EQUALS(positionsList.Size(), expectedCount, TEST_LOCATION);
2567   DALI_TEST_EQUALS(sizeList.Size(), expectedCount, TEST_LOCATION);
2568
2569   Vector<Vector2> expectedSizes;
2570   Vector<Vector2> expectedPositions;
2571
2572   expectedPositions.PushBack(Vector2(24, 0));
2573   expectedSizes.PushBack(Vector2(33, 25));
2574
2575   expectedPositions.PushBack(Vector2(-1, 25));
2576   expectedSizes.PushBack(Vector2(52, 25));
2577
2578   expectedPositions.PushBack(Vector2(-1, 50));
2579   expectedSizes.PushBack(Vector2(59, 25));
2580
2581   expectedPositions.PushBack(Vector2(73, 75));
2582   expectedSizes.PushBack(Vector2(37, 25));
2583
2584   TestTextGeometryUtils::CheckGeometryResult(positionsList, sizeList, expectedPositions, expectedSizes);
2585
2586   END_TEST;
2587 }
2588
2589 int utcDaliTextLabelGeometryGlyphMiddle(void)
2590 {
2591   ToolkitTestApplication application;
2592   tet_infoline(" utcDaliTextLabelGeometryGlyphMiddle");
2593
2594   TextLabel label = TextLabel::New();
2595   DALI_TEST_CHECK(label);
2596
2597   application.GetScene().Add(label);
2598
2599   label.SetProperty(TextLabel::Property::POINT_SIZE, 7.f);
2600   label.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
2601   label.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
2602   label.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
2603   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2604   label.SetProperty(TextLabel::Property::TEXT, "لا تحتوي على لا");
2605
2606   // Avoid a crash when core load gl resources.
2607   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
2608
2609   // Render and notify
2610   application.SendNotification();
2611   application.Render();
2612
2613   unsigned int expectedCount = 1;
2614   unsigned int startIndex    = 1;
2615   unsigned int endIndex      = 13;
2616
2617   Vector<Vector2> positionsList = DevelTextLabel::GetTextPosition(label, startIndex, endIndex);
2618   Vector<Vector2> sizeList      = DevelTextLabel::GetTextSize(label, startIndex, endIndex);
2619
2620   DALI_TEST_EQUALS(positionsList.Size(), expectedCount, TEST_LOCATION);
2621   DALI_TEST_EQUALS(sizeList.Size(), expectedCount, TEST_LOCATION);
2622
2623   Vector<Vector2> expectedSizes;
2624   Vector<Vector2> expectedPositions;
2625
2626   expectedPositions.PushBack(Vector2(6, 0));
2627   expectedSizes.PushBack(Vector2(124, 25));
2628
2629   TestTextGeometryUtils::CheckGeometryResult(positionsList, sizeList, expectedPositions, expectedSizes);
2630
2631   END_TEST;
2632 }
2633
2634 int utcDaliTextLabelGeometryOneGlyph(void)
2635 {
2636   ToolkitTestApplication application;
2637   tet_infoline(" utcDaliTextLabelGeometryOneGlyph ");
2638
2639   TextLabel label = TextLabel::New();
2640   DALI_TEST_CHECK(label);
2641
2642   application.GetScene().Add(label);
2643
2644   label.SetProperty(TextLabel::Property::POINT_SIZE, 7.f);
2645   label.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
2646   label.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
2647   label.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
2648   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2649   label.SetProperty(TextLabel::Property::TEXT, "H");
2650
2651   // Avoid a crash when core load gl resources.
2652   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
2653
2654   // Render and notify
2655   application.SendNotification();
2656   application.Render();
2657
2658   unsigned int expectedCount = 1;
2659   unsigned int startIndex    = 0;
2660   unsigned int endIndex      = 0;
2661
2662   Vector<Vector2> positionsList = DevelTextLabel::GetTextPosition(label, startIndex, endIndex);
2663   Vector<Vector2> sizeList      = DevelTextLabel::GetTextSize(label, startIndex, endIndex);
2664
2665   DALI_TEST_EQUALS(positionsList.Size(), expectedCount, TEST_LOCATION);
2666   DALI_TEST_EQUALS(sizeList.Size(), expectedCount, TEST_LOCATION);
2667
2668   Vector<Vector2> expectedSizes;
2669   Vector<Vector2> expectedPositions;
2670
2671   expectedPositions.PushBack(Vector2(-2, 0));
2672   expectedSizes.PushBack(Vector2(16, 25));
2673
2674   TestTextGeometryUtils::CheckGeometryResult(positionsList, sizeList, expectedPositions, expectedSizes);
2675
2676   END_TEST;
2677 }
2678
2679
2680 int utcDaliTextLabelGeometryNullPtr(void)
2681 {
2682   ToolkitTestApplication application;
2683   tet_infoline("utcDaliTextLabelGeometryNullPtr");
2684
2685   TextLabel label = TextLabel::New();
2686   DALI_TEST_CHECK(label);
2687
2688   application.GetScene().Add(label);
2689
2690   label.SetProperty(TextLabel::Property::POINT_SIZE, 7.f);
2691   label.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
2692   label.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
2693   label.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
2694   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2695   label.SetProperty(TextLabel::Property::TEXT, "");
2696
2697   // Avoid a crash when core load gl resources.
2698   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
2699
2700   unsigned int expectedCount = 0;
2701   unsigned int startIndex    = 0;
2702   unsigned int endIndex      = 0;
2703
2704   Vector<Vector2> positionsList = DevelTextLabel::GetTextPosition(label, startIndex, endIndex);
2705   Vector<Vector2> sizeList      = DevelTextLabel::GetTextSize(label, startIndex, endIndex);
2706
2707   // Render and notify
2708   application.SendNotification();
2709   application.Render();
2710
2711   DALI_TEST_EQUALS(positionsList.Size(), expectedCount, TEST_LOCATION);
2712   DALI_TEST_EQUALS(sizeList.Size(), expectedCount, TEST_LOCATION);
2713
2714   END_TEST;
2715 }
2716
2717 int UtcDaliToolkitTextlabelEllipsisPositionProperty(void)
2718 {
2719   ToolkitTestApplication application;
2720   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty ");
2721   TextLabel textLabel = TextLabel::New();
2722
2723   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Default is END");
2724   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::END), TEST_LOCATION);
2725
2726   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to START");
2727   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, DevelText::EllipsisPosition::START);
2728   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::START), TEST_LOCATION);
2729
2730   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to MIDDLE");
2731   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, DevelText::EllipsisPosition::MIDDLE);
2732   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::MIDDLE), TEST_LOCATION);
2733
2734   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to END");
2735   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, DevelText::EllipsisPosition::END);
2736   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::END), TEST_LOCATION);
2737
2738   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to START using integer");
2739   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, 1);
2740   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::START), TEST_LOCATION);
2741
2742   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to MIDDLE using integer");
2743   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, 2);
2744   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::MIDDLE), TEST_LOCATION);
2745
2746   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to END using integer");
2747   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, 0);
2748   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::END), TEST_LOCATION);
2749
2750   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to START using string - uppercase");
2751   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, "START");
2752   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::START), TEST_LOCATION);
2753
2754   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to MIDDLE using string - uppercase");
2755   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, "MIDDLE");
2756   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::MIDDLE), TEST_LOCATION);
2757
2758   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to END using string - uppercase");
2759   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, "END");
2760   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::END), TEST_LOCATION);
2761
2762   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to START using string - lowercase");
2763   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, "start");
2764   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::START), TEST_LOCATION);
2765
2766   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to MIDDLE using string - lowercase");
2767   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, "middle");
2768   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::MIDDLE), TEST_LOCATION);
2769
2770   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to END using string - lowercase");
2771   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, "end");
2772   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::END), TEST_LOCATION);
2773
2774   END_TEST;
2775 }
2776
2777 int UtcDaliToolkitTextLabelStrikethroughGeneration(void)
2778 {
2779   ToolkitTestApplication application;
2780   tet_infoline(" UtcDaliToolkitTextLabelStrikethroughGeneration");
2781
2782   TextLabel textLabel = TextLabel::New();
2783   textLabel.SetProperty(TextLabel::Property::TEXT, "Test");
2784   textLabel.SetProperty(Actor::Property::SIZE, Vector2(200.0f, 100.f));
2785   textLabel.SetProperty(TextLabel::Property::POINT_SIZE, 10);
2786   textLabel.SetProperty(TextLabel::Property::FONT_FAMILY, "DejaVu Sans");
2787
2788   application.GetScene().Add(textLabel);
2789   application.SendNotification();
2790   application.Render();
2791
2792   Property::Map strikethroughMapSet;
2793   Property::Map strikethroughMapGet;
2794
2795   strikethroughMapSet.Insert("enable", true);
2796   strikethroughMapSet.Insert("color", Color::RED);
2797   strikethroughMapSet.Insert("height", 2.0f);
2798
2799   // Check the strikethrough property
2800   textLabel.SetProperty(DevelTextLabel::Property::STRIKETHROUGH, strikethroughMapSet);
2801   strikethroughMapGet = textLabel.GetProperty<Property::Map>(DevelTextLabel::Property::STRIKETHROUGH);
2802   textLabel.SetProperty(TextLabel::Property::TEXT, "Test1");
2803   DALI_TEST_EQUALS(strikethroughMapGet.Count(), strikethroughMapSet.Count(), TEST_LOCATION);
2804   DALI_TEST_EQUALS(DaliTestCheckMaps(strikethroughMapGet, strikethroughMapSet), true, TEST_LOCATION);
2805
2806   // Render and notify
2807   application.SendNotification();
2808   application.Render();
2809
2810   strikethroughMapSet.Clear();
2811   strikethroughMapGet.Clear();
2812
2813   END_TEST;
2814 }
2815
2816 int UtcDaliToolkitTextLabelMarkupRelativeLineHeight(void)
2817 {
2818   ToolkitTestApplication application;
2819   tet_infoline(" UtcDaliToolkitTextLabelMarkupRelativeLineHeight");
2820
2821   TextLabel label = TextLabel::New();
2822   label.SetProperty(Actor::Property::SIZE, Vector2(200.0f, 300.f));
2823   label.SetProperty(TextLabel::Property::POINT_SIZE, 10);
2824   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
2825   label.SetProperty(TextLabel::Property::TEXT, "line 1\nline 2\nline 3\nline 4\nline 5");
2826   label.SetProperty(DevelTextLabel::Property::RELATIVE_LINE_SIZE, 1.0f);
2827   label.SetProperty(TextLabel::Property::ELLIPSIS, false);
2828   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2829
2830   TextLabel labelSingleLineParagraph = TextLabel::New();
2831   labelSingleLineParagraph.SetProperty(Actor::Property::SIZE, Vector2(200.0f, 300.f));
2832   labelSingleLineParagraph.SetProperty(TextLabel::Property::POINT_SIZE, 10);
2833   labelSingleLineParagraph.SetProperty(TextLabel::Property::MULTI_LINE, true);
2834   labelSingleLineParagraph.SetProperty(TextLabel::Property::TEXT, "<p>line 1</p><p rel-line-height=0.5>line 2</p>line 3<p rel-line-height=3>line 4</p>line 5");
2835   labelSingleLineParagraph.SetProperty(DevelTextLabel::Property::RELATIVE_LINE_SIZE, 1.0f);
2836   labelSingleLineParagraph.SetProperty(TextLabel::Property::ELLIPSIS, false);
2837   labelSingleLineParagraph.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2838
2839   TextLabel labelMultiLineParagraph = TextLabel::New();
2840   labelMultiLineParagraph.SetProperty(Actor::Property::SIZE, Vector2(200.0f, 300.f));
2841   labelMultiLineParagraph.SetProperty(TextLabel::Property::POINT_SIZE, 10);
2842   labelMultiLineParagraph.SetProperty(TextLabel::Property::MULTI_LINE, true);
2843   labelMultiLineParagraph.SetProperty(TextLabel::Property::TEXT, "<p>line 1</p><p rel-line-height=0.5>line\n2</p>line 3<p rel-line-height=3>line\n4</p>line 5");
2844   labelMultiLineParagraph.SetProperty(DevelTextLabel::Property::RELATIVE_LINE_SIZE, 1.0f);
2845   labelMultiLineParagraph.SetProperty(TextLabel::Property::ELLIPSIS, false);
2846   labelMultiLineParagraph.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2847
2848   application.GetScene().Add(label);
2849   application.GetScene().Add(labelSingleLineParagraph);
2850   application.GetScene().Add(labelMultiLineParagraph);
2851   application.SendNotification();
2852   application.Render();
2853
2854   Vector3 naturalSize               = label.GetNaturalSize();
2855   Vector3 relativeSingleNaturalSize = labelSingleLineParagraph.GetNaturalSize();
2856   Vector3 relativeMultiNaturalSize  = labelMultiLineParagraph.GetNaturalSize();
2857
2858   float lineSize = naturalSize.y / 5.0f; //total size/number of lines
2859
2860   //no effect of relative line size for paragraph with single line
2861   DALI_TEST_EQUALS(naturalSize.y, relativeSingleNaturalSize.y, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
2862
2863   DALI_TEST_EQUALS(lineSize * 8.5f, relativeMultiNaturalSize.y, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
2864
2865   END_TEST;
2866 }
2867
2868 int UtcDaliToolkitTextLabelRelativeLineHeight(void)
2869 {
2870   ToolkitTestApplication application;
2871   tet_infoline(" UtcDaliToolkitTextLabelRelativeLineHeight");
2872
2873   TextLabel label = TextLabel::New();
2874   label.SetProperty(Actor::Property::SIZE, Vector2(200.0f, 300.f));
2875   label.SetProperty(TextLabel::Property::POINT_SIZE, 10);
2876   label.SetProperty(TextLabel::Property::TEXT, "Hello\nWorld");
2877
2878   application.GetScene().Add(label);
2879   application.SendNotification();
2880   application.Render();
2881
2882   Vector3 naturalSize = label.GetNaturalSize();
2883
2884   label.SetProperty(DevelTextLabel::Property::RELATIVE_LINE_SIZE, 0.5f);
2885
2886   application.SendNotification();
2887   application.Render();
2888
2889   Vector3 relativeNaturalSize = label.GetNaturalSize();
2890
2891   DALI_TEST_EQUALS(naturalSize.y, relativeNaturalSize.y, TEST_LOCATION);
2892
2893   label.SetProperty(DevelTextLabel::Property::RELATIVE_LINE_SIZE, 2.0f);
2894
2895   application.SendNotification();
2896   application.Render();
2897
2898   relativeNaturalSize = label.GetNaturalSize();
2899
2900   DALI_TEST_EQUALS(naturalSize.y * 2, relativeNaturalSize.y, TEST_LOCATION);
2901   END_TEST;
2902 }
2903
2904 int UtcDaliTextLabelCharacterSpacing(void)
2905 {
2906   ToolkitTestApplication application;
2907   tet_infoline(" UtcDaliTextLabelCharacterSpacing ");
2908
2909   TextLabel textLabel = TextLabel::New();
2910
2911   textLabel.SetProperty(Actor::Property::SIZE, Vector2(150.0f, 300.f));
2912
2913   application.GetScene().Add(textLabel);
2914   application.SendNotification();
2915   application.Render();
2916
2917   textLabel.SetProperty(TextLabel::Property::TEXT, "Hi Experiment");
2918   textLabel.SetProperty(DevelTextLabel::Property::CHARACTER_SPACING, 10.f);
2919   DALI_TEST_EQUALS(textLabel.GetProperty<float>(DevelTextLabel::Property::CHARACTER_SPACING), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
2920
2921   application.SendNotification();
2922   application.Render();
2923
2924   END_TEST;
2925 }
2926
2927 int UtcDaliTextTextLabelSizeNegativeLineSpacing(void)
2928 {
2929   ToolkitTestApplication application;
2930   tet_infoline("UtcDaliTextTextLabelSizeNegativeLineSpacing");
2931
2932   TextLabel label = TextLabel::New();
2933
2934   float lineSpacing = -20.f;
2935
2936   label.SetProperty(Actor::Property::SIZE, Vector2(450.0f, 300.f));
2937   label.SetProperty(TextLabel::Property::POINT_SIZE, 10.f);
2938   label.SetProperty(DevelTextLabel::Property::LINE_SPACING, lineSpacing);
2939   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
2940   label.SetProperty(TextLabel::Property::TEXT, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
2941
2942   application.GetScene().Add(label);
2943   application.SendNotification();
2944   application.Render();
2945
2946   Vector<Vector2> positionsList = DevelTextLabel::GetTextPosition(label, 0, 123);
2947   Vector<Vector2> sizeList      = DevelTextLabel::GetTextSize(label, 0, 123);
2948
2949   Vector2 lastLinePos  = positionsList[positionsList.Size() - 1];
2950   Vector2 lastLineSize = sizeList[sizeList.Size() - 1];
2951
2952   DALI_TEST_EQUALS(sizeList[0].y * (sizeList.Size() - 1), lastLinePos.y, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
2953   DALI_TEST_EQUALS(sizeList[0].y - lineSpacing, lastLineSize.y, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
2954
2955   application.SendNotification();
2956   application.Render();
2957
2958   END_TEST;
2959 }
2960
2961 int UtcDaliTextLabelNegativeLineSpacingWithEllipsis(void)
2962 {
2963   ToolkitTestApplication application;
2964   tet_infoline("UtcDaliTextLabelNegativeLineSpacingWithEllipsis");
2965
2966   TextLabel label = TextLabel::New();
2967
2968   float lineSpacing = -20.f;
2969
2970   label.SetProperty(Actor::Property::SIZE, Vector2(480.0f, 100.f));
2971   label.SetProperty(TextLabel::Property::POINT_SIZE, 11.0f);
2972   label.SetProperty(DevelTextLabel::Property::LINE_SPACING, lineSpacing);
2973   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
2974   label.SetProperty(TextLabel::Property::TEXT, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
2975   label.SetProperty(TextLabel::Property::ELLIPSIS, true);
2976
2977   application.GetScene().Add(label);
2978   application.SendNotification();
2979   application.Render();
2980
2981   Vector<Vector2> sizeList = DevelTextLabel::GetTextSize(label, 0, 123);
2982
2983   int lineCount = sizeList.Size();
2984   DALI_TEST_EQUALS(4, lineCount, TEST_LOCATION);
2985
2986   application.SendNotification();
2987   application.Render();
2988
2989   END_TEST;
2990 }
2991
2992 int UtcDaliToolkitTextlabelParagraphTag(void)
2993 {
2994   ToolkitTestApplication application;
2995   tet_infoline(" UtcDaliToolkitTextlabelParagraphTag");
2996   TextLabel labelNewlineSeparator = TextLabel::New();
2997   TextLabel labelParagraphTag     = TextLabel::New();
2998   DALI_TEST_CHECK(labelNewlineSeparator);
2999   DALI_TEST_CHECK(labelParagraphTag);
3000
3001   application.GetScene().Add(labelNewlineSeparator);
3002   application.GetScene().Add(labelParagraphTag);
3003
3004   //Same utterance uses new-line to split paragraphs should give similar results for paragraph tag.
3005   labelNewlineSeparator.SetProperty(TextLabel::Property::MULTI_LINE, true);
3006   labelNewlineSeparator.SetProperty(TextLabel::Property::ELLIPSIS, false);
3007   labelNewlineSeparator.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
3008   labelNewlineSeparator.SetProperty(Actor::Property::SIZE, Vector2(100.f, 50.f));
3009   labelNewlineSeparator.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
3010   labelNewlineSeparator.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
3011   labelNewlineSeparator.SetProperty(TextLabel::Property::TEXT, "test paragraph tag \ntest paragraph tag \ntest paragraph tag ");
3012
3013   labelParagraphTag.SetProperty(TextLabel::Property::MULTI_LINE, true);
3014   labelParagraphTag.SetProperty(TextLabel::Property::ELLIPSIS, false);
3015   labelParagraphTag.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
3016   labelParagraphTag.SetProperty(Actor::Property::SIZE, Vector2(100.f, 50.f));
3017   labelParagraphTag.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
3018   labelParagraphTag.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
3019   labelParagraphTag.SetProperty(TextLabel::Property::TEXT, "test paragraph tag <p>test paragraph tag </p>test paragraph tag ");
3020
3021   application.SendNotification();
3022   application.Render();
3023
3024   Vector3 textNaturalSizeNewlineSeparator = labelNewlineSeparator.GetNaturalSize();
3025   Vector3 textNaturalSizeParagraphTag     = labelParagraphTag.GetNaturalSize();
3026
3027   DALI_TEST_EQUALS(textNaturalSizeNewlineSeparator, textNaturalSizeParagraphTag, TEST_LOCATION);
3028
3029   application.SendNotification();
3030   application.Render();
3031
3032   END_TEST;
3033 }