[dali_2.3.20] Merge branch 'devel/master'
[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   label.SetProperty(TextLabel::Property::MULTI_LINE, false);
1512   label.SetProperty(TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, 1);
1513   label.SetProperty(TextLabel::Property::AUTO_SCROLL_SPEED, 9999.0f);
1514   label.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1515
1516   try
1517   {
1518     // Render the text.
1519     application.SendNotification();
1520     application.Render(1000);
1521
1522     application.GetScene().Remove(label);
1523     application.SendNotification();
1524     application.Render();
1525
1526     DALI_TEST_CHECK(!label.GetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL).Get<bool>());
1527
1528     label.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1529     application.GetScene().Add(label);
1530
1531     application.SendNotification();
1532     application.Render();
1533
1534     DALI_TEST_CHECK(label.GetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL).Get<bool>());
1535
1536     label.SetProperty(TextLabel::Property::AUTO_SCROLL_STOP_MODE, (Toolkit::TextLabel::AutoScrollStopMode::Type)2); // invalid type
1537     label.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, false);
1538
1539     application.SendNotification();
1540     application.Render();
1541
1542     DALI_TEST_CHECK(label.GetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL).Get<bool>());
1543   }
1544   catch(...)
1545   {
1546     tet_result(TET_FAIL);
1547   }
1548
1549   END_TEST;
1550 }
1551
1552 int UtcDaliToolkitTextlabelScrollingWithEllipsis(void)
1553 {
1554   ToolkitTestApplication application;
1555   tet_infoline(" UtcDaliToolkitTextlabelScrollingWithEllipsis");
1556
1557   TextLabel label = TextLabel::New("Some text to scroll");
1558   DALI_TEST_CHECK(label);
1559
1560   application.GetScene().Add(label);
1561
1562   // Avoid a crash when core load gl resources.
1563   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
1564
1565   // Turn on all the effects.
1566   label.SetProperty(TextLabel::Property::AUTO_SCROLL_GAP, 50.0f);
1567   label.SetProperty(TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, 3);
1568   label.SetProperty(TextLabel::Property::AUTO_SCROLL_SPEED, 80.0f);
1569
1570   try
1571   {
1572     // Enable the auto scrolling effect.
1573     label.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
1574     label.SetProperty(TextLabel::Property::AUTO_SCROLL_STOP_MODE, TextLabel::AutoScrollStopMode::IMMEDIATE);
1575
1576     // Disable the ellipsis
1577     label.SetProperty(TextLabel::Property::ELLIPSIS, false);
1578
1579     // Render the text.
1580     application.SendNotification();
1581     application.Render();
1582
1583     // Stop auto scrolling
1584     label.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, false);
1585
1586     // Check the ellipsis property
1587     DALI_TEST_CHECK(!label.GetProperty<bool>(TextLabel::Property::ELLIPSIS));
1588   }
1589   catch(...)
1590   {
1591     tet_result(TET_FAIL);
1592   }
1593
1594   END_TEST;
1595 }
1596
1597 int UtcDaliToolkitTextlabelEllipsis(void)
1598 {
1599   ToolkitTestApplication application;
1600   tet_infoline(" UtcDaliToolkitTextlabelEllipsis");
1601
1602   TextLabel label = TextLabel::New("Hello world");
1603   DALI_TEST_CHECK(label);
1604
1605   // Avoid a crash when core load gl resources.
1606   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
1607
1608   application.GetScene().Add(label);
1609
1610   // Turn on all the effects
1611   label.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
1612   label.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
1613   label.SetProperty(Actor::Property::SIZE, Vector2(360.0f, 10.f));
1614
1615   try
1616   {
1617     // Render the text.
1618     application.SendNotification();
1619     application.Render();
1620   }
1621   catch(...)
1622   {
1623     tet_result(TET_FAIL);
1624   }
1625
1626   label.SetProperty(TextLabel::Property::TEXT, "Hello world                                        ");
1627   label.SetProperty(DevelTextLabel::Property::IGNORE_SPACES_AFTER_TEXT, false);
1628   label.SetProperty(Actor::Property::SIZE, Vector2(400.0f, 10.f));
1629
1630   try
1631   {
1632     // Render the text.
1633     application.SendNotification();
1634     application.Render();
1635   }
1636   catch(...)
1637   {
1638     tet_result(TET_FAIL);
1639   }
1640
1641   label.SetProperty(TextLabel::Property::TEXT, "Hello world");
1642   label.SetProperty(DevelTextLabel::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION, true);
1643   label.SetProperty(Actor::Property::SIZE, Vector2(400.0f, 10.f));
1644
1645   try
1646   {
1647     // Render the text.
1648     application.SendNotification();
1649     application.Render();
1650   }
1651   catch(...)
1652   {
1653     tet_result(TET_FAIL);
1654   }
1655
1656   END_TEST;
1657 }
1658
1659 int UtcDaliToolkitTextlabelTextWrapMode(void)
1660 {
1661   ToolkitTestApplication application;
1662   tet_infoline(" UtcDaliToolkitTextlabelTextWarpMode");
1663
1664   int lineCount = 0;
1665
1666   TextLabel label = TextLabel::New();
1667   label.SetProperty(Actor::Property::SIZE, Vector2(300.0f, 300.f));
1668   label.SetProperty(TextLabel::Property::TEXT, "Hello world Hello world");
1669   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
1670
1671   //label.SetProperty( TextLabel::Property::POINT_SIZE, 18 );
1672   application.GetScene().Add(label);
1673
1674   label.SetProperty(TextLabel::Property::LINE_WRAP_MODE, "WORD");
1675   DALI_TEST_EQUALS(label.GetProperty<int>(TextLabel::Property::LINE_WRAP_MODE), static_cast<int>(Text::LineWrap::WORD), TEST_LOCATION);
1676
1677   application.SendNotification();
1678   application.Render();
1679
1680   lineCount = label.GetProperty<int>(TextLabel::Property::LINE_COUNT);
1681   DALI_TEST_EQUALS(lineCount, 2, TEST_LOCATION);
1682
1683   label.SetProperty(TextLabel::Property::LINE_WRAP_MODE, "CHARACTER");
1684   DALI_TEST_EQUALS(label.GetProperty<int>(TextLabel::Property::LINE_WRAP_MODE), static_cast<int>(Text::LineWrap::CHARACTER), TEST_LOCATION);
1685
1686   application.SendNotification();
1687   application.Render();
1688
1689   label.SetProperty(TextLabel::Property::LINE_WRAP_MODE, Text::LineWrap::WORD);
1690   DALI_TEST_EQUALS(label.GetProperty<int>(TextLabel::Property::LINE_WRAP_MODE), static_cast<int>(Text::LineWrap::WORD), TEST_LOCATION);
1691
1692   application.SendNotification();
1693   application.Render();
1694
1695   lineCount = label.GetProperty<int>(TextLabel::Property::LINE_COUNT);
1696   DALI_TEST_EQUALS(lineCount, 2, TEST_LOCATION);
1697
1698   label.SetProperty(TextLabel::Property::LINE_WRAP_MODE, Text::LineWrap::CHARACTER);
1699   DALI_TEST_EQUALS(label.GetProperty<int>(TextLabel::Property::LINE_WRAP_MODE), static_cast<int>(Text::LineWrap::CHARACTER), TEST_LOCATION);
1700
1701   application.SendNotification();
1702   application.Render();
1703
1704   lineCount = label.GetProperty<int>(TextLabel::Property::LINE_COUNT);
1705   DALI_TEST_EQUALS(lineCount, 2, TEST_LOCATION);
1706
1707   tet_infoline("Ensure invalid string does not change wrapping mode");
1708   label.SetProperty(TextLabel::Property::LINE_WRAP_MODE, "InvalidWrapMode");
1709   DALI_TEST_EQUALS(label.GetProperty<int>(TextLabel::Property::LINE_WRAP_MODE), static_cast<int>(Text::LineWrap::CHARACTER), TEST_LOCATION);
1710
1711   END_TEST;
1712 }
1713
1714 int UtcDaliToolkitTextLabelColorComponents(void)
1715 {
1716   ToolkitTestApplication application;
1717
1718   TextLabel label = TextLabel::New();
1719   label.SetProperty(TextLabel::Property::TEXT_COLOR, Color::RED);
1720   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_RED), 1.0f, TEST_LOCATION);
1721   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_GREEN), 0.0f, TEST_LOCATION);
1722   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_BLUE), 0.0f, TEST_LOCATION);
1723   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_ALPHA), 1.0f, TEST_LOCATION);
1724
1725   label.SetProperty(TextLabel::Property::TEXT_COLOR, Color::GREEN);
1726   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_RED), 0.0f, TEST_LOCATION);
1727   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_GREEN), 1.0f, TEST_LOCATION);
1728   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_BLUE), 0.0f, TEST_LOCATION);
1729   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_ALPHA), 1.0f, TEST_LOCATION);
1730
1731   label.SetProperty(TextLabel::Property::TEXT_COLOR, Color::BLUE);
1732   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_RED), 0.0f, TEST_LOCATION);
1733   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_GREEN), 0.0f, TEST_LOCATION);
1734   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_BLUE), 1.0f, TEST_LOCATION);
1735   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_ALPHA), 1.0f, TEST_LOCATION);
1736
1737   label.SetProperty(TextLabel::Property::TEXT_COLOR_ALPHA, 0.6f);
1738   DALI_TEST_EQUALS(label.GetProperty<float>(TextLabel::Property::TEXT_COLOR_ALPHA), 0.6f, TEST_LOCATION);
1739   DALI_TEST_EQUALS(label.GetProperty<Vector4>(TextLabel::Property::TEXT_COLOR), Vector4(0.0f, 0.0f, 1.0f, 0.6f), TEST_LOCATION);
1740
1741   // Test a transparent text - Rendering should be skipped.
1742   label.SetProperty(TextLabel::Property::TEXT, "Hello world Hello world");
1743   label.SetProperty(TextLabel::Property::TEXT_COLOR, Color::BLUE);
1744
1745   application.GetScene().Add(label);
1746
1747   TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1748   drawTrace.Enable(true);
1749
1750   application.SendNotification();
1751   application.Render();
1752
1753   DALI_TEST_EQUALS(drawTrace.FindMethod("DrawArrays"), true, TEST_LOCATION); // Should be rendered
1754
1755   label.SetProperty(TextLabel::Property::TEXT_COLOR, Color::TRANSPARENT);
1756
1757   drawTrace.Reset();
1758
1759   application.SendNotification();
1760   application.Render();
1761
1762   DALI_TEST_EQUALS(drawTrace.FindMethod("DrawArrays"), false, TEST_LOCATION); // Rendering should be skipped
1763
1764   label.SetProperty(TextLabel::Property::TEXT_COLOR, Color::RED);
1765
1766   drawTrace.Reset();
1767
1768   application.SendNotification();
1769   application.Render();
1770
1771   DALI_TEST_EQUALS(drawTrace.FindMethod("DrawArrays"), true, TEST_LOCATION); // Should be rendered again
1772
1773   END_TEST;
1774 }
1775
1776 int UtcDaliToolkitTextlabelTextStyle01(void)
1777 {
1778   ToolkitTestApplication application;
1779   tet_infoline(" UtcDaliToolkitTextlabelTextStyle Setting Outline after Shadow");
1780
1781   TextLabel label = TextLabel::New();
1782   label.SetProperty(Actor::Property::SIZE, Vector2(300.0f, 300.f));
1783   label.SetProperty(TextLabel::Property::TEXT, "Hello world Hello world");
1784   label.SetProperty(TextLabel::Property::POINT_SIZE, 12);
1785   application.GetScene().Add(label);
1786
1787   Property::Map outlineMapSet;
1788   Property::Map outlineMapGet;
1789
1790   outlineMapSet["color"] = Color::BLUE;
1791   outlineMapSet["width"] = 2.0f;
1792   label.SetProperty(TextLabel::Property::OUTLINE, outlineMapSet);
1793
1794   application.SendNotification();
1795   application.Render();
1796
1797   Property::Map shadowMapSet;
1798   shadowMapSet.Insert("color", "green");
1799   shadowMapSet.Insert("offset", "2 2");
1800   shadowMapSet.Insert("blurRadius", "3");
1801   label.SetProperty(TextLabel::Property::SHADOW, shadowMapSet);
1802
1803   outlineMapSet["color"] = Color::RED;
1804   outlineMapSet["width"] = 0.0f;
1805   label.SetProperty(TextLabel::Property::OUTLINE, outlineMapSet);
1806
1807   application.SendNotification();
1808   application.Render();
1809
1810   outlineMapGet = label.GetProperty<Property::Map>(TextLabel::Property::OUTLINE);
1811
1812   Property::Value* colorValue = outlineMapGet.Find("color");
1813
1814   bool colorMatched(false);
1815
1816   if(colorValue)
1817   {
1818     Property::Type valueType = colorValue->GetType();
1819
1820     if(Property::STRING == valueType)
1821     {
1822       std::string stringValue;
1823       colorValue->Get(stringValue);
1824       if(stringValue == "red")
1825       {
1826         colorMatched = true;
1827       }
1828     }
1829     else if(Property::VECTOR4 == valueType)
1830     {
1831       Vector4 colorVector4;
1832       colorValue->Get(colorVector4);
1833       if(colorVector4 == Color::RED)
1834       {
1835         colorMatched = true;
1836       }
1837     }
1838   }
1839
1840   DALI_TEST_EQUALS(colorMatched, true, TEST_LOCATION);
1841
1842   END_TEST;
1843 }
1844
1845 int UtcDaliToolkitTextlabelMultiline(void)
1846 {
1847   ToolkitTestApplication application;
1848   tet_infoline(" UtcDaliToolkitTextlabelMultiline");
1849
1850   TextLabel label = TextLabel::New();
1851   label.SetProperty(TextLabel::Property::TEXT, "Hello world Hello world Hello world Hello world Hello world Hello world");
1852   label.SetProperty(TextLabel::Property::POINT_SIZE, 20);
1853   label.SetProperty(TextLabel::Property::MULTI_LINE, false);
1854   application.GetScene().Add(label);
1855
1856   application.SendNotification();
1857   application.Render();
1858
1859   int lineCount = label.GetProperty<int>(TextLabel::Property::LINE_COUNT);
1860   DALI_TEST_EQUALS(lineCount, 1, TEST_LOCATION);
1861
1862   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
1863
1864   application.SendNotification();
1865   application.Render();
1866
1867   lineCount = label.GetProperty<int>(TextLabel::Property::LINE_COUNT);
1868   DALI_TEST_EQUALS(true, (lineCount > 1), TEST_LOCATION);
1869
1870   END_TEST;
1871 }
1872
1873 int UtcDaliToolkitTextlabelTextDirection(void)
1874 {
1875   ToolkitTestApplication application;
1876   tet_infoline(" UtcDaliToolkitTextlabelTextDirection");
1877
1878   TextLabel label = TextLabel::New();
1879   DALI_TEST_EQUALS(label.GetProperty<int>(DevelTextLabel::Property::TEXT_DIRECTION), static_cast<int>(Toolkit::DevelText::TextDirection::LEFT_TO_RIGHT), TEST_LOCATION);
1880
1881   label.SetProperty(TextLabel::Property::TEXT, "Hello world");
1882   label.SetProperty(TextLabel::Property::POINT_SIZE, 20);
1883   label.SetProperty(DevelTextLabel::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION, false);
1884   application.GetScene().Add(label);
1885
1886   // Test LTR text
1887   DALI_TEST_EQUALS(label.GetProperty<int>(DevelTextLabel::Property::TEXT_DIRECTION), static_cast<int>(Toolkit::DevelText::TextDirection::LEFT_TO_RIGHT), TEST_LOCATION);
1888
1889   // Test RTL text
1890   label.SetProperty(TextLabel::Property::TEXT, "ﻡﺮﺤﺑﺍ ﺏﺎﻠﻋﺎﻠﻣ ﻡﺮﺤﺑﺍ");
1891   DALI_TEST_EQUALS(label.GetProperty<int>(DevelTextLabel::Property::TEXT_DIRECTION), static_cast<int>(Toolkit::DevelText::TextDirection::RIGHT_TO_LEFT), TEST_LOCATION);
1892
1893   // Test RTL text starting with weak character
1894   label.SetProperty(TextLabel::Property::TEXT, "()ﻡﺮﺤﺑﺍ ﺏﺎﻠﻋﺎﻠﻣ ﻡﺮﺤﺑﺍ");
1895   DALI_TEST_EQUALS(label.GetProperty<int>(DevelTextLabel::Property::TEXT_DIRECTION), static_cast<int>(Toolkit::DevelText::TextDirection::RIGHT_TO_LEFT), TEST_LOCATION);
1896
1897   // Test RTL text string with emoji and weak character
1898   label.SetProperty(TextLabel::Property::TEXT, "\xF0\x9F\x98\x81 () ﻡﺮﺤﺑﺍ ﺏﺎﻠﻋﺎﻠﻣ ﻡﺮﺤﺑﺍ");
1899   DALI_TEST_EQUALS(label.GetProperty<int>(DevelTextLabel::Property::TEXT_DIRECTION), static_cast<int>(Toolkit::DevelText::TextDirection::RIGHT_TO_LEFT), TEST_LOCATION);
1900
1901   END_TEST;
1902 }
1903
1904 int UtcDaliToolkitTextlabelVerticalLineAlignment(void)
1905 {
1906   ToolkitTestApplication application;
1907   tet_infoline(" UtcDaliToolkitTextlabelVerticalLineAlignment");
1908
1909   TextLabel label = TextLabel::New();
1910
1911   label.SetProperty(DevelTextLabel::Property::VERTICAL_LINE_ALIGNMENT, DevelText::VerticalLineAlignment::TOP);
1912   label.SetProperty(TextLabel::Property::TEXT, "Hello world");
1913   label.SetProperty(TextLabel::Property::POINT_SIZE, 15);
1914   label.SetProperty(TextLabel::Property::LINE_SPACING, 12);
1915   application.GetScene().Add(label);
1916   DALI_TEST_EQUALS(label.GetProperty<int>(DevelTextLabel::Property::VERTICAL_LINE_ALIGNMENT), static_cast<int>(Toolkit::DevelText::VerticalLineAlignment::TOP), TEST_LOCATION);
1917
1918   label.SetProperty(DevelTextLabel::Property::VERTICAL_LINE_ALIGNMENT, DevelText::VerticalLineAlignment::MIDDLE);
1919   DALI_TEST_EQUALS(label.GetProperty<int>(DevelTextLabel::Property::VERTICAL_LINE_ALIGNMENT), static_cast<int>(Toolkit::DevelText::VerticalLineAlignment::MIDDLE), TEST_LOCATION);
1920
1921   label.SetProperty(DevelTextLabel::Property::VERTICAL_LINE_ALIGNMENT, DevelText::VerticalLineAlignment::BOTTOM);
1922   DALI_TEST_EQUALS(label.GetProperty<int>(DevelTextLabel::Property::VERTICAL_LINE_ALIGNMENT), static_cast<int>(Toolkit::DevelText::VerticalLineAlignment::BOTTOM), TEST_LOCATION);
1923
1924   END_TEST;
1925 }
1926
1927 int UtcDaliToolkitTextLabelBitmapFont(void)
1928 {
1929   ToolkitTestApplication application;
1930   tet_infoline(" UtcDaliToolkitTextLabelBitmapFont");
1931
1932   DevelText::BitmapFontDescription fontDescription;
1933   fontDescription.name               = "Digits";
1934   fontDescription.underlinePosition  = 0.f;
1935   fontDescription.underlineThickness = 0.f;
1936
1937   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0030.png", ":", 34.f, 0.f});
1938   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0031.png", "0", 34.f, 0.f});
1939   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0032.png", "1", 34.f, 0.f});
1940   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0033.png", "2", 34.f, 0.f});
1941   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0034.png", "3", 34.f, 0.f});
1942   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0035.png", "4", 34.f, 0.f});
1943   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0036.png", "5", 34.f, 0.f});
1944   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0037.png", "6", 34.f, 0.f});
1945   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0038.png", "7", 34.f, 0.f});
1946   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0039.png", "8", 34.f, 0.f});
1947   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u003a.png", "9", 34.f, 0.f});
1948
1949   TextAbstraction::BitmapFont bitmapFont;
1950   DevelText::CreateBitmapFont(fontDescription, bitmapFont);
1951
1952   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
1953   fontClient.GetFontId(bitmapFont);
1954
1955   TextLabel label = TextLabel::New();
1956
1957   label.SetProperty(TextLabel::Property::TEXT, "0123456789:");
1958   label.SetProperty(TextLabel::Property::FONT_FAMILY, "Digits");
1959
1960   // 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.
1961   DALI_TEST_EQUALS(label.GetNaturalSize(), Vector3(322.f, 34.f, 0.f), Math::MACHINE_EPSILON_1000, TEST_LOCATION);
1962
1963   application.GetScene().Add(label);
1964
1965   application.SendNotification();
1966   application.Render();
1967
1968   // The text has been rendered if the height of the text-label is the height of the line.
1969   DALI_TEST_EQUALS(label.GetCurrentProperty<Vector3>(Actor::Property::SIZE).height, 34.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
1970
1971   END_TEST;
1972 }
1973
1974 int ConvertPointToPixel(float point)
1975 {
1976   unsigned int                horizontalDpi = 0u;
1977   unsigned int                verticalDpi   = 0u;
1978   TextAbstraction::FontClient fontClient    = TextAbstraction::FontClient::Get();
1979   fontClient.GetDpi(horizontalDpi, verticalDpi);
1980
1981   return (point * 72.f) / static_cast<float>(horizontalDpi);
1982 }
1983
1984 int UtcDaliToolkitTextlabelTextFit(void)
1985 {
1986   ToolkitTestApplication application;
1987   tet_infoline(" UtcDaliToolkitTextlabelTextFit");
1988   TextLabel label = TextLabel::New();
1989   Vector2   size(460.0f, 100.0f);
1990   label.SetProperty(Actor::Property::SIZE, size);
1991   label.SetProperty(TextLabel::Property::TEXT, "Hello world");
1992
1993   // connect to the text git changed signal.
1994   ConnectionTracker* testTracker = new ConnectionTracker();
1995   DevelTextLabel::TextFitChangedSignal(label).Connect(&TestTextFitChangedCallback);
1996   bool textFitChangedSignal = false;
1997   label.ConnectSignal(testTracker, "textFitChanged", CallbackFunctor(&textFitChangedSignal));
1998   gTextFitChangedCallBackCalled = false;
1999
2000   // check point size
2001   Property::Map textFitMapSet;
2002   textFitMapSet["enable"]       = true;
2003   textFitMapSet["minSize"]      = 10.f;
2004   textFitMapSet["maxSize"]      = 100.f;
2005   textFitMapSet["stepSize"]     = -1.f;
2006   textFitMapSet["fontSizeType"] = "pointSize";
2007
2008   label.SetProperty(Toolkit::DevelTextLabel::Property::TEXT_FIT, textFitMapSet);
2009   label.SetProperty(TextLabel::Property::POINT_SIZE, 120.f);
2010
2011   application.GetScene().Add(label);
2012
2013   application.SendNotification();
2014   application.Render();
2015
2016   const Vector3 EXPECTED_NATURAL_SIZE(450.0f, 96.0f, 0.0f);
2017   DALI_TEST_EQUALS(EXPECTED_NATURAL_SIZE, label.GetNaturalSize(), TEST_LOCATION);
2018
2019   DALI_TEST_CHECK(gTextFitChangedCallBackCalled);
2020   DALI_TEST_CHECK(textFitChangedSignal);
2021
2022   // check pixel size
2023   textFitMapSet.Clear();
2024   textFitMapSet["enable"]       = true;
2025   textFitMapSet["minSize"]      = ConvertPointToPixel(10.f);
2026   textFitMapSet["maxSize"]      = ConvertPointToPixel(100.f);
2027   textFitMapSet["stepSize"]     = ConvertPointToPixel(1.f);
2028   textFitMapSet["fontSizeType"] = "pixelSize";
2029
2030   label.SetProperty(Toolkit::DevelTextLabel::Property::TEXT_FIT, textFitMapSet);
2031
2032   application.SendNotification();
2033   application.Render();
2034
2035   DALI_TEST_EQUALS(EXPECTED_NATURAL_SIZE, label.GetNaturalSize(), TEST_LOCATION);
2036
2037   END_TEST;
2038 }
2039
2040 int UtcDaliToolkitTextlabelTextFitStressTest(void)
2041 {
2042   ToolkitTestApplication application;
2043   tet_infoline(" UtcDaliToolkitTextlabelTextFitStressTest");
2044   TextLabel label = TextLabel::New();
2045   Vector2   size(460.0f, 100.0f);
2046   label.SetProperty(Actor::Property::SIZE, size);
2047   label.SetProperty(TextLabel::Property::TEXT, "Hello world");
2048
2049   // connect to the text git changed signal.
2050   ConnectionTracker* testTracker = new ConnectionTracker();
2051   DevelTextLabel::TextFitChangedSignal(label).Connect(&TestTextFitChangedCallback);
2052   bool textFitChangedSignal = false;
2053   label.ConnectSignal(testTracker, "textFitChanged", CallbackFunctor(&textFitChangedSignal));
2054   gTextFitChangedCallBackCalled = false;
2055
2056   // check point size with veryvery big range
2057   Property::Map textFitMapSet;
2058   textFitMapSet["enable"]       = true;
2059   textFitMapSet["minSize"]      = 10.f;
2060   textFitMapSet["maxSize"]      = 10000.f;
2061   textFitMapSet["stepSize"]     = -1.0f;
2062   textFitMapSet["fontSizeType"] = "pointSize";
2063
2064   label.SetProperty(Toolkit::DevelTextLabel::Property::TEXT_FIT, textFitMapSet);
2065   label.SetProperty(TextLabel::Property::POINT_SIZE, 120.f);
2066
2067   application.GetScene().Add(label);
2068
2069   application.SendNotification();
2070   application.Render();
2071
2072   const Vector3 EXPECTED_NATURAL_SIZE(450.0f, 96.0f, 0.0f);
2073   DALI_TEST_EQUALS(EXPECTED_NATURAL_SIZE, label.GetNaturalSize(), TEST_LOCATION);
2074
2075   DALI_TEST_CHECK(gTextFitChangedCallBackCalled);
2076   DALI_TEST_CHECK(textFitChangedSignal);
2077
2078   END_TEST;
2079 }
2080
2081 int UtcDaliToolkitTextlabelMaxTextureSet(void)
2082 {
2083   ToolkitTestApplication application;
2084   tet_infoline(" UtcDaliToolkitTextlabelMaxTextureSet");
2085
2086   DevelText::BitmapFontDescription fontDescription;
2087   fontDescription.name = "Digits";
2088   fontDescription.glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0030.png", ":", 200.f, 0.f});
2089
2090   TextAbstraction::BitmapFont bitmapFont;
2091   DevelText::CreateBitmapFont(fontDescription, bitmapFont);
2092
2093   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
2094   fontClient.GetFontId(bitmapFont);
2095
2096   TextLabel label = TextLabel::New();
2097   label.SetProperty(TextLabel::Property::FONT_FAMILY, "Digits");
2098   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2099   label.SetProperty(TextLabel::Property::TEXT, ":This is a long sample text made to allow max texture size to be exceeded.");
2100   label.SetProperty(TextLabel::Property::POINT_SIZE, 200.f);
2101   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
2102
2103   Property::Map underlineMapSet;
2104   underlineMapSet.Clear();
2105   underlineMapSet.Insert("enable", true);
2106   underlineMapSet.Insert("color", Color::RED);
2107   underlineMapSet.Insert("height", 1);
2108   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
2109   label.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::BLUE);
2110
2111   Property::Map strikethroughMapSet;
2112   strikethroughMapSet.Clear();
2113   strikethroughMapSet.Insert("enable", true);
2114   strikethroughMapSet.Insert("color", Color::RED);
2115   strikethroughMapSet.Insert("height", 2.0f);
2116   label.SetProperty(DevelTextLabel::Property::STRIKETHROUGH, strikethroughMapSet);
2117   label.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::BLUE);
2118
2119   application.GetScene().Add(label);
2120
2121   application.SendNotification();
2122   application.Render();
2123
2124   const int maxTextureSize = Dali::GetMaxTextureSize();
2125   // Whether the rendered text is greater than maxTextureSize
2126   DALI_TEST_CHECK(label.GetCurrentProperty<Vector3>(Actor::Property::SIZE).height > maxTextureSize);
2127
2128   // Check if the number of renderers is greater than 1.
2129   DALI_TEST_CHECK(label.GetRendererCount() > 1u);
2130
2131   //DASHED
2132   underlineMapSet.Clear();
2133   underlineMapSet.Insert("enable", false);
2134   underlineMapSet.Insert("color", Color::BLUE);
2135   underlineMapSet.Insert("height", 0);
2136   underlineMapSet.Insert("type", Text::Underline::DASHED);
2137   underlineMapSet.Insert("dashWidth", 2);
2138   underlineMapSet.Insert("dashGap", 1);
2139   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
2140   label.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::BLUE);
2141
2142   application.GetScene().Add(label);
2143
2144   application.SendNotification();
2145   application.Render();
2146
2147   // Whether the rendered text is greater than maxTextureSize
2148   DALI_TEST_CHECK(label.GetCurrentProperty<Vector3>(Actor::Property::SIZE).height > maxTextureSize);
2149
2150   // Check if the number of renderers is greater than 1.
2151   DALI_TEST_CHECK(label.GetRendererCount() > 1u);
2152
2153   //DOUBLE
2154   underlineMapSet.Clear();
2155   underlineMapSet.Insert("enable", false);
2156   underlineMapSet.Insert("color", Color::BLUE);
2157   underlineMapSet.Insert("height", 0);
2158   underlineMapSet.Insert("type", Text::Underline::DOUBLE);
2159   underlineMapSet.Insert("dashWidth", 2);
2160   underlineMapSet.Insert("dashGap", 1);
2161   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
2162   label.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::BLUE);
2163
2164   application.GetScene().Add(label);
2165
2166   application.SendNotification();
2167   application.Render();
2168
2169   // Whether the rendered text is greater than maxTextureSize
2170   DALI_TEST_CHECK(label.GetCurrentProperty<Vector3>(Actor::Property::SIZE).height > maxTextureSize);
2171
2172   // Check if the number of renderers is greater than 1.
2173   DALI_TEST_CHECK(label.GetRendererCount() > 1u);
2174
2175   // Coverage test for case of layoutSize is bigger than maxTextureSize
2176   float max_value = static_cast<float>(std::numeric_limits<uint16_t>::max());
2177   label.SetProperty(Actor::Property::SIZE, Vector2(max_value, 30.0f));
2178   application.SendNotification();
2179   application.Render();
2180
2181   END_TEST;
2182 }
2183
2184 int UtcDaliToolkitTextlabelStrikethroughExceedsWidthAndHeight(void)
2185 {
2186   ToolkitTestApplication application;
2187   tet_infoline(" UtcDaliToolkitTextlabelStrikethroughExceedsWidthAndHeight");
2188
2189   TextLabel label = TextLabel::New();
2190   label.SetProperty(TextLabel::Property::TEXT, "Test");
2191   label.SetProperty(TextLabel::Property::FONT_FAMILY, "DejaVu Sans");
2192   //Exeeding BufferWidth
2193   label.SetProperty(Actor::Property::SIZE, Vector2(200.f, 400.0f));
2194   label.SetProperty(TextLabel::Property::HORIZONTAL_ALIGNMENT, HorizontalAlignment::RIGHT);
2195   label.SetProperty(TextLabel::Property::POINT_SIZE, 200.f);
2196
2197   application.GetScene().Add(label);
2198   application.SendNotification();
2199   application.Render();
2200
2201   Property::Map strikethroughMapSet;
2202   strikethroughMapSet.Clear();
2203   strikethroughMapSet.Insert("enable", true);
2204   strikethroughMapSet.Insert("color", Color::BLUE);
2205   strikethroughMapSet.Insert("height", 2.0f);
2206   label.SetProperty(TextLabel::Property::TEXT, "Test1");
2207   label.SetProperty(DevelTextLabel::Property::STRIKETHROUGH, strikethroughMapSet);
2208   label.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::BLUE);
2209   application.GetScene().Add(label);
2210   application.SendNotification();
2211   application.Render();
2212   // Check if the number of renderers is 1.
2213   DALI_TEST_EQUALS(1, label.GetRendererCount(), TEST_LOCATION);
2214
2215   label = TextLabel::New();
2216   label.SetProperty(TextLabel::Property::TEXT, "Test");
2217   label.SetProperty(TextLabel::Property::FONT_FAMILY, "DejaVu Sans");
2218
2219   //Exeeding BufferHeight
2220   label.SetProperty(Actor::Property::SIZE, Vector2(200.f, 100.0f));
2221   label.SetProperty(TextLabel::Property::HORIZONTAL_ALIGNMENT, HorizontalAlignment::RIGHT);
2222   label.SetProperty(TextLabel::Property::POINT_SIZE, 200.f);
2223
2224   application.GetScene().Add(label);
2225   application.SendNotification();
2226   application.Render();
2227
2228   strikethroughMapSet.Clear();
2229   strikethroughMapSet.Insert("enable", true);
2230   strikethroughMapSet.Insert("color", Color::BLUE);
2231   strikethroughMapSet.Insert("height", 2.0f);
2232   label.SetProperty(TextLabel::Property::TEXT, "Test2");
2233   label.SetProperty(DevelTextLabel::Property::STRIKETHROUGH, strikethroughMapSet);
2234   label.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::BLUE);
2235   application.GetScene().Add(label);
2236   application.SendNotification();
2237   application.Render();
2238   // Check if the number of renderers is 1.
2239   DALI_TEST_EQUALS(1, label.GetRendererCount(), TEST_LOCATION);
2240
2241   END_TEST;
2242 }
2243
2244 int UtcDaliToolkitTextlabelUnderlineExceedsWidth(void)
2245 {
2246   ToolkitTestApplication application;
2247   tet_infoline(" UtcDaliToolkitTextlabelUnderlineExceedsWidth");
2248
2249   TextLabel label = TextLabel::New();
2250   label.SetProperty(TextLabel::Property::TEXT, "Test");
2251   label.SetProperty(TextLabel::Property::FONT_FAMILY, "DejaVu Sans");
2252   //Exeeding BufferWidth
2253   label.SetProperty(Actor::Property::SIZE, Vector2(200.f, 400.0f));
2254   label.SetProperty(TextLabel::Property::HORIZONTAL_ALIGNMENT, HorizontalAlignment::RIGHT);
2255   label.SetProperty(TextLabel::Property::POINT_SIZE, 200.f);
2256
2257   application.GetScene().Add(label);
2258   application.SendNotification();
2259   application.Render();
2260
2261   Property::Map underlineMapSet;
2262
2263   //SOLID
2264   underlineMapSet.Clear();
2265   underlineMapSet.Insert("enable", true);
2266   underlineMapSet.Insert("color", Color::BLUE);
2267   underlineMapSet.Insert("height", 1);
2268   underlineMapSet.Insert("type", Text::Underline::SOLID);
2269   underlineMapSet.Insert("dashWidth", 2);
2270   underlineMapSet.Insert("dashGap", 1);
2271   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
2272   label.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::BLUE);
2273
2274   application.GetScene().Add(label);
2275
2276   application.SendNotification();
2277   application.Render();
2278
2279   // Check if the number of renderers is 1.
2280   DALI_TEST_EQUALS(1, label.GetRendererCount(), TEST_LOCATION);
2281
2282   //DASHED
2283   underlineMapSet.Clear();
2284   underlineMapSet.Insert("enable", true);
2285   underlineMapSet.Insert("color", Color::BLUE);
2286   underlineMapSet.Insert("height", 1);
2287   underlineMapSet.Insert("type", Text::Underline::DASHED);
2288   underlineMapSet.Insert("dashWidth", 2);
2289   underlineMapSet.Insert("dashGap", 1);
2290   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
2291   label.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::BLUE);
2292
2293   application.GetScene().Add(label);
2294
2295   application.SendNotification();
2296   application.Render();
2297
2298   // Check if the number of renderers is 1.
2299   DALI_TEST_EQUALS(1, label.GetRendererCount(), TEST_LOCATION);
2300
2301   //DOUBLE
2302   underlineMapSet.Clear();
2303   underlineMapSet.Insert("enable", true);
2304   underlineMapSet.Insert("color", Color::BLUE);
2305   underlineMapSet.Insert("height", 1);
2306   underlineMapSet.Insert("type", Text::Underline::DOUBLE);
2307   underlineMapSet.Insert("dashWidth", 2);
2308   underlineMapSet.Insert("dashGap", 1);
2309   label.SetProperty(TextLabel::Property::UNDERLINE, underlineMapSet);
2310   label.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::BLUE);
2311
2312   application.GetScene().Add(label);
2313
2314   application.SendNotification();
2315   application.Render();
2316
2317   // Check if the number of renderers is 1.
2318   DALI_TEST_EQUALS(1, label.GetRendererCount(), TEST_LOCATION);
2319
2320   END_TEST;
2321 }
2322
2323 int UtcDaliToolkitTextlabelLastCharacterIndex(void)
2324 {
2325   ToolkitTestApplication application;
2326   tet_infoline(" UtcDaliToolkitTextlabelLastCharacterIndex");
2327
2328   Vector2 size(300.0f, 100.0f);
2329
2330   Dali::Toolkit::DevelText::RendererParameters textParameters;
2331   textParameters.text              = "This is a sample text to get the last index.";
2332   textParameters.layout            = "multiLine";
2333   textParameters.fontSize          = 20.f;
2334   textParameters.textWidth         = 300u;
2335   textParameters.textHeight        = 100u;
2336   textParameters.ellipsisEnabled   = true;
2337   Dali::Property::Array indexArray = Dali::Toolkit::DevelText::GetLastCharacterIndex(textParameters);
2338
2339   DALI_TEST_CHECK(!indexArray.Empty());
2340   DALI_TEST_EQUALS(indexArray.GetElementAt(0).Get<int>(), 10, TEST_LOCATION);
2341
2342   END_TEST;
2343 }
2344
2345 int UtcDaliToolkitTextlabelFontSizeScale(void)
2346 {
2347   ToolkitTestApplication application;
2348   tet_infoline(" UtcDaliToolkitTextlabelFontSizeScale");
2349
2350   TextLabel label = TextLabel::New();
2351   label.SetProperty(TextLabel::Property::POINT_SIZE, 30.f);
2352   label.SetProperty(TextLabel::Property::TEXT, "Test");
2353   Vector3 nonScaledSize = label.GetNaturalSize();
2354
2355   TextLabel labelScaled = TextLabel::New();
2356   labelScaled.SetProperty(TextLabel::Property::POINT_SIZE, 15.f);
2357   labelScaled.SetProperty(Toolkit::DevelTextLabel::Property::FONT_SIZE_SCALE, 2.f);
2358   labelScaled.SetProperty(TextLabel::Property::TEXT, "Test");
2359   Vector3 scaledSize = labelScaled.GetNaturalSize();
2360
2361   DALI_TEST_EQUALS(nonScaledSize, scaledSize, TEST_LOCATION);
2362
2363   label.SetProperty(TextLabel::Property::PIXEL_SIZE, 30.f);
2364   label.SetProperty(TextLabel::Property::TEXT, "Test");
2365   nonScaledSize = label.GetNaturalSize();
2366
2367   labelScaled.SetProperty(TextLabel::Property::PIXEL_SIZE, 15.f);
2368   labelScaled.SetProperty(Toolkit::DevelTextLabel::Property::FONT_SIZE_SCALE, 2.f);
2369   labelScaled.SetProperty(TextLabel::Property::TEXT, "Test");
2370   scaledSize = labelScaled.GetNaturalSize();
2371
2372   DALI_TEST_EQUALS(nonScaledSize, scaledSize, TEST_LOCATION);
2373
2374   END_TEST;
2375 }
2376
2377 // Positive test for the anchorClicked signal.
2378 int UtcDaliToolkitTextlabelAnchorClicked(void)
2379 {
2380   ToolkitTestApplication application;
2381   tet_infoline(" UtcDaliToolkitTextlabelAnchorClicked");
2382   TextLabel label = TextLabel::New();
2383   DALI_TEST_CHECK(label);
2384
2385   application.GetScene().Add(label);
2386
2387   // connect to the anchor clicked signal.
2388   ConnectionTracker* testTracker = new ConnectionTracker();
2389   DevelTextLabel::AnchorClickedSignal(label).Connect(&TestAnchorClickedCallback);
2390   bool anchorClickedSignal = false;
2391   label.ConnectSignal(testTracker, "anchorClicked", CallbackFunctor(&anchorClickedSignal));
2392
2393   gAnchorClickedCallBackCalled = false;
2394   label.SetProperty(TextLabel::Property::TEXT, "<a href='https://www.tizen.org'>TIZEN</a>");
2395   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2396   label.SetProperty(Actor::Property::SIZE, Vector2(100.f, 50.f));
2397   label.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
2398   label.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
2399
2400   application.SendNotification();
2401   application.Render();
2402
2403   // Create a tap event to touch the text label.
2404   TestGenerateTap(application, 5.0f, 25.0f, 100);
2405   application.SendNotification();
2406   application.Render();
2407
2408   DALI_TEST_CHECK(gAnchorClickedCallBackCalled);
2409   DALI_TEST_CHECK(anchorClickedSignal);
2410
2411   // reset
2412   gAnchorClickedCallBackCalled = false;
2413   anchorClickedSignal          = false;
2414   label.SetProperty(TextLabel::Property::TEXT, "");
2415   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, false);
2416
2417   application.SendNotification();
2418   application.Render();
2419
2420   // sets anchor text
2421   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2422   label.SetProperty(TextLabel::Property::TEXT, "<a href='https://www.tizen.org'>TIZEN</a>");
2423   label.SetProperty(Actor::Property::SIZE, Vector2(100.f, 50.f));
2424   label.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
2425   label.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
2426
2427   application.SendNotification();
2428   application.Render();
2429
2430   // Create a tap event to touch the text label.
2431   TestGenerateTap(application, 5.0f, 25.0f, 200);
2432   application.SendNotification();
2433   application.Render();
2434
2435   DALI_TEST_CHECK(gAnchorClickedCallBackCalled);
2436   DALI_TEST_CHECK(anchorClickedSignal);
2437
2438   gAnchorClickedCallBackNotCalled = true;
2439   // Tap the outside of anchor, callback should not be called.
2440   TestGenerateTap(application, 150.f, 100.f, 300);
2441   application.SendNotification();
2442   application.Render();
2443
2444   DALI_TEST_CHECK(gAnchorClickedCallBackNotCalled);
2445
2446   END_TEST;
2447 }
2448
2449 int UtcDaliTextLabelAtlasLimitationIsEnabledForLargeFontPointSize(void)
2450 {
2451   ToolkitTestApplication application;
2452   tet_infoline(" UtcDaliTextLabelAtlasLimitationIsEnabledForLargeFontPointSize ");
2453
2454   //TextLabel is not using Atlas but this is to unify font-size on text-controllers
2455
2456   // +2: First one to handle the equal case. Second one to handle odd to even case of GetNaturalSize
2457   const uint32_t lessThanWidth  = TextAbstraction::FontClient::MAX_TEXT_ATLAS_WIDTH - TextAbstraction::FontClient::PADDING_TEXT_ATLAS_BLOCK + 2;
2458   const uint32_t lessThanHeight = TextAbstraction::FontClient::MAX_TEXT_ATLAS_HEIGHT - TextAbstraction::FontClient::PADDING_TEXT_ATLAS_BLOCK + 2;
2459
2460   // Create a text editor
2461   TextLabel textLabel = TextLabel::New();
2462   //Set size to avoid automatic eliding
2463   textLabel.SetProperty(Actor::Property::SIZE, Vector2(1025, 1025));
2464   //Set very large font-size using point-size
2465   textLabel.SetProperty(TextLabel::Property::POINT_SIZE, 1000);
2466   //Specify font-family
2467   textLabel.SetProperty(TextLabel::Property::FONT_FAMILY, "DejaVu Sans");
2468   //Set text to check if appear or not
2469   textLabel.SetProperty(TextLabel::Property::TEXT, "A");
2470
2471   application.GetScene().Add(textLabel);
2472
2473   application.SendNotification();
2474   application.Render();
2475   //Use GetNaturalSize to verify that size of block does not exceed Atlas size
2476   Vector3 naturalSize = textLabel.GetNaturalSize();
2477
2478   DALI_TEST_GREATER(lessThanWidth, static_cast<uint32_t>(naturalSize.width), TEST_LOCATION);
2479   DALI_TEST_GREATER(lessThanHeight, static_cast<uint32_t>(naturalSize.height), TEST_LOCATION);
2480
2481   END_TEST;
2482 }
2483
2484 int UtcDaliTextLabelHyphenWrapMode(void)
2485 {
2486   ToolkitTestApplication application;
2487   tet_infoline(" UtcDaliTextLabelHyphenWrapMode ");
2488
2489   int       lineCount = 0;
2490   TextLabel label     = TextLabel::New();
2491   label.SetProperty(Actor::Property::SIZE, Vector2(150.0f, 300.f));
2492   label.SetProperty(TextLabel::Property::POINT_SIZE, 12.f);
2493   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
2494   application.GetScene().Add(label);
2495   application.SendNotification();
2496   application.Render();
2497
2498   label.SetProperty(TextLabel::Property::TEXT, "Hi Experimen");
2499   label.SetProperty(TextLabel::Property::LINE_WRAP_MODE, DevelText::LineWrap::HYPHENATION);
2500   DALI_TEST_EQUALS(label.GetProperty<int>(TextLabel::Property::LINE_WRAP_MODE), static_cast<int>(DevelText::LineWrap::HYPHENATION), TEST_LOCATION);
2501
2502   application.SendNotification();
2503   application.Render();
2504
2505   lineCount = label.GetProperty<int>(TextLabel::Property::LINE_COUNT);
2506   /*
2507     text will be :
2508     Hi Exp-
2509     erimen
2510   */
2511   DALI_TEST_EQUALS(lineCount, 2, TEST_LOCATION);
2512
2513   label.SetProperty(TextLabel::Property::TEXT, "Hi Experimen");
2514   label.SetProperty(TextLabel::Property::LINE_WRAP_MODE, DevelText::LineWrap::MIXED);
2515   DALI_TEST_EQUALS(label.GetProperty<int>(TextLabel::Property::LINE_WRAP_MODE), static_cast<int>(DevelText::LineWrap::MIXED), TEST_LOCATION);
2516
2517   application.SendNotification();
2518   application.Render();
2519
2520   lineCount = label.GetProperty<int>(TextLabel::Property::LINE_COUNT);
2521   /*
2522     text will be :
2523     Hi
2524     Experi-
2525     men
2526   */
2527   DALI_TEST_EQUALS(lineCount, 3, TEST_LOCATION);
2528
2529   END_TEST;
2530 }
2531
2532 int utcDaliTextLabelGetHeightForWidthChangeLineCountWhenTextChanged(void)
2533 {
2534   ToolkitTestApplication application;
2535
2536   tet_infoline(" utcDaliTextLabelGetHeightForWidthChangeLineCountWhenTextChanged ");
2537
2538   int lineCountBefore = 0;
2539   int lineCountAfter  = 0;
2540
2541   // Create a text editor
2542   TextLabel textLabel = TextLabel::New();
2543   //Set very large font-size using point-size
2544   textLabel.SetProperty(TextLabel::Property::POINT_SIZE, 10);
2545   //Specify font-family
2546   textLabel.SetProperty(TextLabel::Property::FONT_FAMILY, "DejaVu Sans");
2547   //Specify size
2548   textLabel.SetProperty(Actor::Property::SIZE, Vector2(200.f, 100.f));
2549   //Set text longer than width of textLabel
2550   textLabel.SetProperty(TextLabel::Property::TEXT, "Short text");
2551   //Set line wrap mode Character
2552   textLabel.SetProperty(TextLabel::Property::LINE_WRAP_MODE, "CHARACTER");
2553   textLabel.SetProperty(TextLabel::Property::MULTI_LINE, true);
2554
2555   application.GetScene().Add(textLabel);
2556
2557   application.SendNotification();
2558   application.Render();
2559
2560   lineCountBefore = textLabel.GetProperty<int>(TextLabel::Property::LINE_COUNT);
2561
2562   textLabel.SetProperty(TextLabel::Property::TEXT, "This is very loooooooooooooooooooooooooooooooooooong text for test");
2563   lineCountAfter = textLabel.GetProperty<int>(TextLabel::Property::LINE_COUNT);
2564
2565   // When the text changed, the Line-count should be updated according to new text.
2566   // Because the GetHeightForWidth is called in Controller::GetLineCount(float width)
2567   DALI_TEST_EQUALS(lineCountBefore, 1, TEST_LOCATION);
2568   DALI_TEST_GREATER(lineCountAfter, 1, TEST_LOCATION);
2569
2570   END_TEST;
2571 }
2572
2573 int utcDaliTextLabelGeometryRTL(void)
2574 {
2575   ToolkitTestApplication application;
2576   tet_infoline(" utcDaliTextLabelGeometryRTL");
2577
2578   TextLabel label = TextLabel::New();
2579   DALI_TEST_CHECK(label);
2580
2581   application.GetScene().Add(label);
2582
2583   label.SetProperty(TextLabel::Property::POINT_SIZE, 7.f);
2584   label.SetProperty(Actor::Property::SIZE, Vector2(150.f, 100.f));
2585   label.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
2586   label.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
2587   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2588   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
2589   label.SetProperty(TextLabel::Property::TEXT, "line1 \nline2\nline 3\nالاخيرالسطر");
2590
2591   // Avoid a crash when core load gl resources.
2592   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
2593
2594   // Render and notify
2595   application.SendNotification();
2596   application.Render();
2597
2598   unsigned int expectedCount = 4;
2599   unsigned int startIndex    = 3;
2600   unsigned int endIndex      = 24;
2601
2602   Vector<Vector2> positionsList = DevelTextLabel::GetTextPosition(label, startIndex, endIndex);
2603   Vector<Vector2> sizeList      = DevelTextLabel::GetTextSize(label, startIndex, endIndex);
2604
2605   DALI_TEST_EQUALS(positionsList.Size(), expectedCount, TEST_LOCATION);
2606   DALI_TEST_EQUALS(sizeList.Size(), expectedCount, TEST_LOCATION);
2607
2608   Vector<Vector2> expectedSizes;
2609   Vector<Vector2> expectedPositions;
2610
2611   expectedPositions.PushBack(Vector2(24, 0));
2612   expectedSizes.PushBack(Vector2(33, 25));
2613
2614   expectedPositions.PushBack(Vector2(-1, 25));
2615   expectedSizes.PushBack(Vector2(52, 25));
2616
2617   expectedPositions.PushBack(Vector2(-1, 50));
2618   expectedSizes.PushBack(Vector2(59, 25));
2619
2620   expectedPositions.PushBack(Vector2(73, 75));
2621   expectedSizes.PushBack(Vector2(37, 25));
2622
2623   TestTextGeometryUtils::CheckGeometryResult(positionsList, sizeList, expectedPositions, expectedSizes);
2624
2625   END_TEST;
2626 }
2627
2628 int utcDaliTextLabelGeometryGlyphMiddle(void)
2629 {
2630   ToolkitTestApplication application;
2631   tet_infoline(" utcDaliTextLabelGeometryGlyphMiddle");
2632
2633   TextLabel label = TextLabel::New();
2634   DALI_TEST_CHECK(label);
2635
2636   application.GetScene().Add(label);
2637
2638   label.SetProperty(TextLabel::Property::POINT_SIZE, 7.f);
2639   label.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
2640   label.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
2641   label.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
2642   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2643   label.SetProperty(TextLabel::Property::TEXT, "لا تحتوي على لا");
2644
2645   // Avoid a crash when core load gl resources.
2646   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
2647
2648   // Render and notify
2649   application.SendNotification();
2650   application.Render();
2651
2652   unsigned int expectedCount = 1;
2653   unsigned int startIndex    = 1;
2654   unsigned int endIndex      = 13;
2655
2656   Vector<Vector2> positionsList = DevelTextLabel::GetTextPosition(label, startIndex, endIndex);
2657   Vector<Vector2> sizeList      = DevelTextLabel::GetTextSize(label, startIndex, endIndex);
2658
2659   DALI_TEST_EQUALS(positionsList.Size(), expectedCount, TEST_LOCATION);
2660   DALI_TEST_EQUALS(sizeList.Size(), expectedCount, TEST_LOCATION);
2661
2662   Vector<Vector2> expectedSizes;
2663   Vector<Vector2> expectedPositions;
2664
2665   expectedPositions.PushBack(Vector2(6, 0));
2666   expectedSizes.PushBack(Vector2(124, 25));
2667
2668   TestTextGeometryUtils::CheckGeometryResult(positionsList, sizeList, expectedPositions, expectedSizes);
2669
2670   END_TEST;
2671 }
2672
2673 int utcDaliTextLabelGeometryOneGlyph(void)
2674 {
2675   ToolkitTestApplication application;
2676   tet_infoline(" utcDaliTextLabelGeometryOneGlyph ");
2677
2678   TextLabel label = TextLabel::New();
2679   DALI_TEST_CHECK(label);
2680
2681   application.GetScene().Add(label);
2682
2683   label.SetProperty(TextLabel::Property::POINT_SIZE, 7.f);
2684   label.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
2685   label.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
2686   label.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
2687   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2688   label.SetProperty(TextLabel::Property::TEXT, "H");
2689
2690   // Avoid a crash when core load gl resources.
2691   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
2692
2693   // Render and notify
2694   application.SendNotification();
2695   application.Render();
2696
2697   unsigned int expectedCount = 1;
2698   unsigned int startIndex    = 0;
2699   unsigned int endIndex      = 0;
2700
2701   Vector<Vector2> positionsList = DevelTextLabel::GetTextPosition(label, startIndex, endIndex);
2702   Vector<Vector2> sizeList      = DevelTextLabel::GetTextSize(label, startIndex, endIndex);
2703
2704   DALI_TEST_EQUALS(positionsList.Size(), expectedCount, TEST_LOCATION);
2705   DALI_TEST_EQUALS(sizeList.Size(), expectedCount, TEST_LOCATION);
2706
2707   Vector<Vector2> expectedSizes;
2708   Vector<Vector2> expectedPositions;
2709
2710   expectedPositions.PushBack(Vector2(-2, 0));
2711   expectedSizes.PushBack(Vector2(16, 25));
2712
2713   TestTextGeometryUtils::CheckGeometryResult(positionsList, sizeList, expectedPositions, expectedSizes);
2714
2715   positionsList.Clear();
2716   sizeList.Clear();
2717
2718   startIndex = 2;
2719   endIndex   = 0;
2720
2721   positionsList = DevelTextLabel::GetTextPosition(label, startIndex, endIndex);
2722   sizeList      = DevelTextLabel::GetTextSize(label, startIndex, endIndex);
2723
2724   TestTextGeometryUtils::CheckGeometryResult(positionsList, sizeList, expectedPositions, expectedSizes);
2725
2726   END_TEST;
2727 }
2728
2729 int utcDaliTextLabelGeometryNullPtr(void)
2730 {
2731   ToolkitTestApplication application;
2732   tet_infoline("utcDaliTextLabelGeometryNullPtr");
2733
2734   TextLabel label = TextLabel::New();
2735   DALI_TEST_CHECK(label);
2736
2737   application.GetScene().Add(label);
2738
2739   label.SetProperty(TextLabel::Property::POINT_SIZE, 7.f);
2740   label.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
2741   label.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
2742   label.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
2743   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2744   label.SetProperty(TextLabel::Property::TEXT, "");
2745
2746   // Avoid a crash when core load gl resources.
2747   application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE);
2748
2749   unsigned int expectedCount = 0;
2750   unsigned int startIndex    = 0;
2751   unsigned int endIndex      = 0;
2752
2753   Vector<Vector2> positionsList = DevelTextLabel::GetTextPosition(label, startIndex, endIndex);
2754   Vector<Vector2> sizeList      = DevelTextLabel::GetTextSize(label, startIndex, endIndex);
2755
2756   // Render and notify
2757   application.SendNotification();
2758   application.Render();
2759
2760   DALI_TEST_EQUALS(positionsList.Size(), expectedCount, TEST_LOCATION);
2761   DALI_TEST_EQUALS(sizeList.Size(), expectedCount, TEST_LOCATION);
2762
2763   END_TEST;
2764 }
2765
2766 int UtcDaliToolkitTextlabelEllipsisPositionProperty(void)
2767 {
2768   ToolkitTestApplication application;
2769   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty ");
2770   TextLabel textLabel = TextLabel::New();
2771
2772   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Default is END");
2773   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::END), TEST_LOCATION);
2774
2775   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to START");
2776   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, DevelText::EllipsisPosition::START);
2777   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::START), TEST_LOCATION);
2778
2779   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to MIDDLE");
2780   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, DevelText::EllipsisPosition::MIDDLE);
2781   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::MIDDLE), TEST_LOCATION);
2782
2783   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to END");
2784   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, DevelText::EllipsisPosition::END);
2785   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::END), TEST_LOCATION);
2786
2787   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to START using integer");
2788   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, 1);
2789   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::START), TEST_LOCATION);
2790
2791   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to MIDDLE using integer");
2792   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, 2);
2793   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::MIDDLE), TEST_LOCATION);
2794
2795   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to END using integer");
2796   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, 0);
2797   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::END), TEST_LOCATION);
2798
2799   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to START using string - uppercase");
2800   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, "START");
2801   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::START), TEST_LOCATION);
2802
2803   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to MIDDLE using string - uppercase");
2804   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, "MIDDLE");
2805   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::MIDDLE), TEST_LOCATION);
2806
2807   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to END using string - uppercase");
2808   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, "END");
2809   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::END), TEST_LOCATION);
2810
2811   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to START using string - lowercase");
2812   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, "start");
2813   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::START), TEST_LOCATION);
2814
2815   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to MIDDLE using string - lowercase");
2816   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, "middle");
2817   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::MIDDLE), TEST_LOCATION);
2818
2819   tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to END using string - lowercase");
2820   textLabel.SetProperty(DevelTextLabel::Property::ELLIPSIS_POSITION, "end");
2821   DALI_TEST_EQUALS(textLabel.GetProperty<int>(DevelTextLabel::Property::ELLIPSIS_POSITION), static_cast<int>(Toolkit::DevelText::EllipsisPosition::END), TEST_LOCATION);
2822
2823   END_TEST;
2824 }
2825
2826 int UtcDaliToolkitTextLabelStrikethroughGeneration(void)
2827 {
2828   ToolkitTestApplication application;
2829   tet_infoline(" UtcDaliToolkitTextLabelStrikethroughGeneration");
2830
2831   TextLabel textLabel = TextLabel::New();
2832   textLabel.SetProperty(TextLabel::Property::TEXT, "Test");
2833   textLabel.SetProperty(Actor::Property::SIZE, Vector2(200.0f, 100.f));
2834   textLabel.SetProperty(TextLabel::Property::POINT_SIZE, 10);
2835   textLabel.SetProperty(TextLabel::Property::FONT_FAMILY, "DejaVu Sans");
2836
2837   application.GetScene().Add(textLabel);
2838   application.SendNotification();
2839   application.Render();
2840
2841   Property::Map strikethroughMapSet;
2842   Property::Map strikethroughMapGet;
2843
2844   strikethroughMapSet.Insert("enable", true);
2845   strikethroughMapSet.Insert("color", Color::RED);
2846   strikethroughMapSet.Insert("height", 2.0f);
2847
2848   // Check the strikethrough property
2849   textLabel.SetProperty(DevelTextLabel::Property::STRIKETHROUGH, strikethroughMapSet);
2850   strikethroughMapGet = textLabel.GetProperty<Property::Map>(DevelTextLabel::Property::STRIKETHROUGH);
2851   textLabel.SetProperty(TextLabel::Property::TEXT, "Test1");
2852   DALI_TEST_EQUALS(strikethroughMapGet.Count(), strikethroughMapSet.Count(), TEST_LOCATION);
2853   DALI_TEST_EQUALS(DaliTestCheckMaps(strikethroughMapGet, strikethroughMapSet), true, TEST_LOCATION);
2854
2855   // Render and notify
2856   application.SendNotification();
2857   application.Render();
2858
2859   strikethroughMapSet.Clear();
2860   strikethroughMapGet.Clear();
2861
2862   END_TEST;
2863 }
2864
2865 int UtcDaliToolkitTextLabelMarkupRelativeLineHeight(void)
2866 {
2867   ToolkitTestApplication application;
2868   tet_infoline(" UtcDaliToolkitTextLabelMarkupRelativeLineHeight");
2869
2870   TextLabel label = TextLabel::New();
2871   label.SetProperty(Actor::Property::SIZE, Vector2(200.0f, 300.f));
2872   label.SetProperty(TextLabel::Property::POINT_SIZE, 10);
2873   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
2874   label.SetProperty(TextLabel::Property::TEXT, "line 1\nline 2\nline 3\nline 4\nline 5");
2875   label.SetProperty(DevelTextLabel::Property::RELATIVE_LINE_SIZE, 1.0f);
2876   label.SetProperty(TextLabel::Property::ELLIPSIS, false);
2877   label.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2878
2879   TextLabel labelSingleLineParagraph = TextLabel::New();
2880   labelSingleLineParagraph.SetProperty(Actor::Property::SIZE, Vector2(200.0f, 300.f));
2881   labelSingleLineParagraph.SetProperty(TextLabel::Property::POINT_SIZE, 10);
2882   labelSingleLineParagraph.SetProperty(TextLabel::Property::MULTI_LINE, true);
2883   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");
2884   labelSingleLineParagraph.SetProperty(DevelTextLabel::Property::RELATIVE_LINE_SIZE, 1.0f);
2885   labelSingleLineParagraph.SetProperty(TextLabel::Property::ELLIPSIS, false);
2886   labelSingleLineParagraph.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2887
2888   TextLabel labelMultiLineParagraph = TextLabel::New();
2889   labelMultiLineParagraph.SetProperty(Actor::Property::SIZE, Vector2(200.0f, 300.f));
2890   labelMultiLineParagraph.SetProperty(TextLabel::Property::POINT_SIZE, 10);
2891   labelMultiLineParagraph.SetProperty(TextLabel::Property::MULTI_LINE, true);
2892   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");
2893   labelMultiLineParagraph.SetProperty(DevelTextLabel::Property::RELATIVE_LINE_SIZE, 1.0f);
2894   labelMultiLineParagraph.SetProperty(TextLabel::Property::ELLIPSIS, false);
2895   labelMultiLineParagraph.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
2896
2897   application.GetScene().Add(label);
2898   application.GetScene().Add(labelSingleLineParagraph);
2899   application.GetScene().Add(labelMultiLineParagraph);
2900   application.SendNotification();
2901   application.Render();
2902
2903   Vector3 naturalSize               = label.GetNaturalSize();
2904   Vector3 relativeSingleNaturalSize = labelSingleLineParagraph.GetNaturalSize();
2905   Vector3 relativeMultiNaturalSize  = labelMultiLineParagraph.GetNaturalSize();
2906
2907   float lineSize = naturalSize.y / 5.0f; //total size/number of lines
2908
2909   //no effect of relative line size for paragraph with single line
2910   DALI_TEST_EQUALS(naturalSize.y, relativeSingleNaturalSize.y, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
2911
2912   DALI_TEST_EQUALS(lineSize * 8.5f, relativeMultiNaturalSize.y, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
2913
2914   END_TEST;
2915 }
2916
2917 int UtcDaliToolkitTextLabelRelativeLineHeight(void)
2918 {
2919   ToolkitTestApplication application;
2920   tet_infoline(" UtcDaliToolkitTextLabelRelativeLineHeight");
2921
2922   TextLabel label = TextLabel::New();
2923   label.SetProperty(Actor::Property::SIZE, Vector2(200.0f, 300.f));
2924   label.SetProperty(TextLabel::Property::POINT_SIZE, 10);
2925   label.SetProperty(TextLabel::Property::TEXT, "Hello\nWorld");
2926
2927   application.GetScene().Add(label);
2928   application.SendNotification();
2929   application.Render();
2930
2931   Vector3 naturalSize = label.GetNaturalSize();
2932
2933   label.SetProperty(DevelTextLabel::Property::RELATIVE_LINE_SIZE, 0.5f);
2934
2935   application.SendNotification();
2936   application.Render();
2937
2938   Vector3 relativeNaturalSize = label.GetNaturalSize();
2939
2940   DALI_TEST_EQUALS(naturalSize.y, relativeNaturalSize.y, TEST_LOCATION);
2941
2942   label.SetProperty(DevelTextLabel::Property::RELATIVE_LINE_SIZE, 2.0f);
2943
2944   application.SendNotification();
2945   application.Render();
2946
2947   relativeNaturalSize = label.GetNaturalSize();
2948
2949   DALI_TEST_EQUALS(naturalSize.y * 2, relativeNaturalSize.y, TEST_LOCATION);
2950   END_TEST;
2951 }
2952
2953 int UtcDaliTextLabelCharacterSpacing(void)
2954 {
2955   ToolkitTestApplication application;
2956   tet_infoline(" UtcDaliTextLabelCharacterSpacing ");
2957
2958   TextLabel textLabel = TextLabel::New();
2959
2960   textLabel.SetProperty(Actor::Property::SIZE, Vector2(150.0f, 300.f));
2961
2962   application.GetScene().Add(textLabel);
2963   application.SendNotification();
2964   application.Render();
2965
2966   textLabel.SetProperty(TextLabel::Property::TEXT, "Hi Experiment");
2967   textLabel.SetProperty(DevelTextLabel::Property::CHARACTER_SPACING, 10.f);
2968   DALI_TEST_EQUALS(textLabel.GetProperty<float>(DevelTextLabel::Property::CHARACTER_SPACING), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
2969
2970   application.SendNotification();
2971   application.Render();
2972
2973   END_TEST;
2974 }
2975
2976 int UtcDaliTextTextLabelSizeNegativeLineSpacing(void)
2977 {
2978   ToolkitTestApplication application;
2979   tet_infoline("UtcDaliTextTextLabelSizeNegativeLineSpacing");
2980
2981   TextLabel label = TextLabel::New();
2982
2983   float lineSpacing = -20.f;
2984
2985   label.SetProperty(Actor::Property::SIZE, Vector2(450.0f, 300.f));
2986   label.SetProperty(TextLabel::Property::POINT_SIZE, 10.f);
2987   label.SetProperty(DevelTextLabel::Property::LINE_SPACING, lineSpacing);
2988   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
2989   label.SetProperty(TextLabel::Property::TEXT, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
2990
2991   application.GetScene().Add(label);
2992   application.SendNotification();
2993   application.Render();
2994
2995   Vector<Vector2> positionsList = DevelTextLabel::GetTextPosition(label, 0, 123);
2996   Vector<Vector2> sizeList      = DevelTextLabel::GetTextSize(label, 0, 123);
2997
2998   Vector2 lastLinePos  = positionsList[positionsList.Size() - 1];
2999   Vector2 lastLineSize = sizeList[sizeList.Size() - 1];
3000
3001   DALI_TEST_EQUALS(sizeList[0].y * (sizeList.Size() - 1), lastLinePos.y, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
3002   DALI_TEST_EQUALS(sizeList[0].y - lineSpacing, lastLineSize.y, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
3003
3004   application.SendNotification();
3005   application.Render();
3006
3007   END_TEST;
3008 }
3009
3010 int UtcDaliTextLabelNegativeLineSpacingWithEllipsis(void)
3011 {
3012   ToolkitTestApplication application;
3013   tet_infoline("UtcDaliTextLabelNegativeLineSpacingWithEllipsis");
3014
3015   TextLabel label = TextLabel::New();
3016
3017   float lineSpacing = -20.f;
3018
3019   label.SetProperty(Actor::Property::SIZE, Vector2(480.0f, 100.f));
3020   label.SetProperty(TextLabel::Property::POINT_SIZE, 11.0f);
3021   label.SetProperty(DevelTextLabel::Property::LINE_SPACING, lineSpacing);
3022   label.SetProperty(TextLabel::Property::MULTI_LINE, true);
3023   label.SetProperty(TextLabel::Property::TEXT, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
3024   label.SetProperty(TextLabel::Property::ELLIPSIS, true);
3025
3026   application.GetScene().Add(label);
3027   application.SendNotification();
3028   application.Render();
3029
3030   Vector<Vector2> sizeList = DevelTextLabel::GetTextSize(label, 0, 123);
3031
3032   int lineCount = sizeList.Size();
3033   DALI_TEST_EQUALS(4, lineCount, TEST_LOCATION);
3034
3035   application.SendNotification();
3036   application.Render();
3037
3038   END_TEST;
3039 }
3040
3041 int UtcDaliToolkitTextlabelParagraphTag(void)
3042 {
3043   ToolkitTestApplication application;
3044   tet_infoline(" UtcDaliToolkitTextlabelParagraphTag");
3045   TextLabel labelNewlineSeparator = TextLabel::New();
3046   TextLabel labelParagraphTag     = TextLabel::New();
3047   DALI_TEST_CHECK(labelNewlineSeparator);
3048   DALI_TEST_CHECK(labelParagraphTag);
3049
3050   application.GetScene().Add(labelNewlineSeparator);
3051   application.GetScene().Add(labelParagraphTag);
3052
3053   //Same utterance uses new-line to split paragraphs should give similar results for paragraph tag.
3054   labelNewlineSeparator.SetProperty(TextLabel::Property::MULTI_LINE, true);
3055   labelNewlineSeparator.SetProperty(TextLabel::Property::ELLIPSIS, false);
3056   labelNewlineSeparator.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
3057   labelNewlineSeparator.SetProperty(Actor::Property::SIZE, Vector2(100.f, 50.f));
3058   labelNewlineSeparator.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
3059   labelNewlineSeparator.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
3060   labelNewlineSeparator.SetProperty(TextLabel::Property::TEXT, "test paragraph tag \ntest paragraph tag \ntest paragraph tag ");
3061
3062   labelParagraphTag.SetProperty(TextLabel::Property::MULTI_LINE, true);
3063   labelParagraphTag.SetProperty(TextLabel::Property::ELLIPSIS, false);
3064   labelParagraphTag.SetProperty(TextLabel::Property::ENABLE_MARKUP, true);
3065   labelParagraphTag.SetProperty(Actor::Property::SIZE, Vector2(100.f, 50.f));
3066   labelParagraphTag.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
3067   labelParagraphTag.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
3068   labelParagraphTag.SetProperty(TextLabel::Property::TEXT, "test paragraph tag <p>test paragraph tag </p>test paragraph tag ");
3069
3070   application.SendNotification();
3071   application.Render();
3072
3073   Vector3 textNaturalSizeNewlineSeparator = labelNewlineSeparator.GetNaturalSize();
3074   Vector3 textNaturalSizeParagraphTag     = labelParagraphTag.GetNaturalSize();
3075
3076   DALI_TEST_EQUALS(textNaturalSizeNewlineSeparator, textNaturalSizeParagraphTag, TEST_LOCATION);
3077
3078   application.SendNotification();
3079   application.Render();
3080
3081   END_TEST;
3082 }