DALi Version 2.2.5
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-Text-TextSpannable.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-spannable.h>
25 #include <dali-toolkit/devel-api/text/spannable-string.h>
26 #include <dali-toolkit/devel-api/text/spans/font-span.h>
27 #include <dali-toolkit/devel-api/text/spans/foreground-color-span.h>
28 #include <dali-toolkit/devel-api/text/text-enumerations-devel.h>
29 #include <dali-toolkit/internal/controls/text-controls/text-editor-impl.h>
30 #include <dali-toolkit/internal/controls/text-controls/text-field-impl.h>
31 #include <dali-toolkit/internal/controls/text-controls/text-label-impl.h>
32 #include <dali-toolkit/internal/text/font-description-run.h>
33 #include <dali-toolkit/public-api/text/text-enumerations.h>
34
35 using namespace Dali;
36 using namespace Toolkit;
37
38 namespace
39 {
40 const std::string DEFAULT_FONT_DIR("/resources/fonts");
41 const float PIXEL_FORMAT_64_FACTOR = 64.f; ///< 64.f is used to convert from point size to 26.6 pixel format.
42 } // namespace
43
44 Text::SpannableString CreateSpannableStringForForegroundColorSpan()
45 {
46   Text::SpannableString spannableString = Text::SpannableString::New("Hello مرحبا");
47   DALI_TEST_CHECK(spannableString);
48
49   auto isAddedGreen = spannableString.AttachSpan(
50     Text::ForegroundColorSpan::New(Color::GREEN),
51     Text::Range::New(5u, 7u));
52   DALI_TEST_CHECK(isAddedGreen);
53
54   return spannableString;
55 }
56
57 Text::SpannableString CreateSpannableStringForFontSpan()
58 {
59   Text::SpannableString spannableString = Text::SpannableString::New("Hello World");
60   DALI_TEST_CHECK(spannableString);
61
62   auto isAddedFontSpan = spannableString.AttachSpan(
63     Text::FontSpan::New("TizenSans",
64                         45.0f,
65                         Dali::TextAbstraction::FontWeight::BOLD,
66                         Dali::TextAbstraction::FontWidth::SEMI_CONDENSED,
67                         Dali::TextAbstraction::FontSlant::OBLIQUE),
68     Text::Range::New(5u, 7u));
69   DALI_TEST_CHECK(isAddedFontSpan);
70
71   return spannableString;
72 }
73
74 void CheckColorIndices(const Text::ColorIndex* const colorIndicesBuffer,
75                        uint32_t                      numberOfIndices,
76                        std::vector<uint32_t>         indicesToCheck,
77                        std::vector<uint32_t>         expectedValues)
78 {
79   DALI_TEST_CHECK(colorIndicesBuffer);
80
81   for(uint32_t i = 0u; i < numberOfIndices; i++)
82   {
83     DALI_TEST_EQUALS(colorIndicesBuffer[indicesToCheck[i]], expectedValues[i], TEST_LOCATION);
84   }
85 }
86
87 int UtcDaliToolkitTextLabelSetSpannedText(void)
88 {
89   ToolkitTestApplication application;
90   tet_infoline(" UtcDaliToolkitTextLabelSetSpannedText");
91
92   TextLabel textLabel = TextLabel::New();
93   DALI_TEST_CHECK(textLabel);
94   application.GetScene().Add(textLabel);
95
96   Text::SpannableString spannableString = CreateSpannableStringForForegroundColorSpan();
97
98   Text::SetSpannedText(textLabel, spannableString);
99
100   application.SendNotification();
101   application.Render();
102
103   Toolkit::Internal::TextLabel& labelImpl           = GetImpl(textLabel);
104   const Text::ColorIndex* const colorIndicesBuffer  = labelImpl.GetTextController()->GetTextModel()->GetColorIndices();
105
106   CheckColorIndices(colorIndicesBuffer, 4u, {0u, 5u, 7u, 10u}, {0u, 1u, 1u, 0u});
107
108   END_TEST;
109 }
110
111 int UtcDaliToolkitTextEditorSetSpannedText(void)
112 {
113   ToolkitTestApplication application;
114   tet_infoline(" UtcDaliToolkitTextEditorSetSpannedText");
115
116   TextEditor textEditor = TextEditor::New();
117   DALI_TEST_CHECK(textEditor);
118   application.GetScene().Add(textEditor);
119
120   Text::SpannableString spannableString = CreateSpannableStringForForegroundColorSpan();
121
122   Text::SetSpannedText(textEditor, spannableString);
123
124   application.SendNotification();
125   application.Render();
126
127   Toolkit::Internal::TextEditor& labelImpl          = GetImpl(textEditor);
128   const Text::ColorIndex* const  colorIndicesBuffer = labelImpl.GetTextController()->GetTextModel()->GetColorIndices();
129
130   CheckColorIndices(colorIndicesBuffer, 4u, {0u, 5u, 7u, 10u}, {0u, 1u, 1u, 0u});
131
132   END_TEST;
133 }
134
135 int UtcDaliToolkitTextFieldSetSpannedText(void)
136 {
137   ToolkitTestApplication application;
138   tet_infoline(" UtcDaliToolkitTextFieldSetSpannedText");
139
140   TextField textField = TextField::New();
141   DALI_TEST_CHECK(textField);
142   application.GetScene().Add(textField);
143
144   Text::SpannableString spannableString = CreateSpannableStringForForegroundColorSpan();
145
146   Text::SetSpannedText(textField, spannableString);
147
148   application.SendNotification();
149   application.Render();
150
151   Toolkit::Internal::TextField& labelImpl          = GetImpl(textField);
152   const Text::ColorIndex* const colorIndicesBuffer = labelImpl.GetTextController()->GetTextModel()->GetColorIndices();
153
154   CheckColorIndices(colorIndicesBuffer, 4u, {0u, 5u, 7u, 10u}, {0u, 1u, 1u, 0u});
155
156   END_TEST;
157 }
158
159 int UtcDaliToolkitTextLabelSetSpannedText_FontSpan(void)
160 {
161   ToolkitTestApplication application;
162   tet_infoline(" UtcDaliToolkitTextLabelSetSpannedText_FontSpan ");
163
164   // Load some fonts to get the same metrics on different platforms.
165   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
166   fontClient.SetDpi(96u, 96u);
167
168   char*             pathNamePtr = get_current_dir_name();
169   const std::string pathName(pathNamePtr);
170   free(pathNamePtr);
171
172   fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf");
173
174   TextLabel textLabel = TextLabel::New();
175   DALI_TEST_CHECK(textLabel);
176   application.GetScene().Add(textLabel);
177
178   Text::SpannableString spannableString = CreateSpannableStringForFontSpan();
179
180   Text::SetSpannedText(textLabel, spannableString);
181
182   application.SendNotification();
183   application.Render();
184
185   Toolkit::Internal::TextLabel&               labelImpl  = GetImpl(textLabel);
186   const Vector<Dali::Toolkit::Text::FontRun>& validFontRuns = labelImpl.GetTextController()->GetTextModel()->GetFontRuns();
187
188   DALI_TEST_EQUALS(validFontRuns.Count(), 3u, TEST_LOCATION);
189
190   DALI_TEST_EQUALS(validFontRuns[0].fontId, validFontRuns[2].fontId, TEST_LOCATION);
191   DALI_TEST_NOT_EQUALS(validFontRuns[0].fontId, validFontRuns[1].fontId, Math::MACHINE_EPSILON_100, TEST_LOCATION);
192
193   DALI_TEST_EQUALS(validFontRuns[1].characterRun.characterIndex, 5u, TEST_LOCATION);
194   DALI_TEST_EQUALS(validFontRuns[1].characterRun.GetEndCharacterIndex(), 7u, TEST_LOCATION);
195   DALI_TEST_EQUALS(validFontRuns[1].isItalicRequired, true, TEST_LOCATION);
196   DALI_TEST_EQUALS(validFontRuns[1].isBoldRequired, true, TEST_LOCATION);
197
198   TextAbstraction::FontDescription spanFontDescription;
199
200   float expectedPointSize = 45.0f * PIXEL_FORMAT_64_FACTOR;
201   float fontPointSize     = fontClient.GetPointSize(validFontRuns[1].fontId);
202   DALI_TEST_EQUALS(fontPointSize, expectedPointSize, TEST_LOCATION);
203
204   const Vector<Dali::Toolkit::Text::FontDescriptionRun>& validFontDescriptionRuns = labelImpl.GetTextController()->GetTextModel()->GetFontDescriptionRuns();
205   DALI_TEST_EQUALS(validFontDescriptionRuns.Count(), 1u, TEST_LOCATION);
206   std::string familyName = validFontDescriptionRuns[0].familyName;
207
208   DALI_TEST_EQUALS(familyName, "TizenSans", TEST_LOCATION);
209   DALI_TEST_EQUALS(validFontDescriptionRuns[0].size, expectedPointSize, TEST_LOCATION);
210   DALI_TEST_EQUALS(validFontDescriptionRuns[0].weight, Dali::TextAbstraction::FontWeight::BOLD, TEST_LOCATION);
211   DALI_TEST_EQUALS(validFontDescriptionRuns[0].width, Dali::TextAbstraction::FontWidth::SEMI_CONDENSED, TEST_LOCATION);
212   DALI_TEST_EQUALS(validFontDescriptionRuns[0].slant, Dali::TextAbstraction::FontSlant::OBLIQUE, TEST_LOCATION);
213
214   END_TEST;
215 }