2 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 #include <dali-toolkit/internal/text/character-set-conversion.h>
22 #include <dali-toolkit/internal/text/segmentation.h>
23 #include <dali-toolkit-test-suite-utils.h>
24 #include <dali-toolkit/dali-toolkit.h>
28 using namespace Toolkit;
31 // Tests the following functions with different scripts.
32 // void SetLineBreakInfo( const Vector<Character>& text,
33 // Vector<LineBreakInfo>& lineBreakInfo );
34 // void SetWordBreakInfo( const Vector<Character>& text,
35 // CharacterIndex startIndex,
36 // Length numberOfCharacters,
37 // Vector<WordBreakInfo>& wordBreakInfo );
39 //////////////////////////////////////////////////////////
46 std::string description; ///< Description of the test.
47 std::string text; ///< input text.
48 uint32_t index; ///< The index from where to start to query the break info.
49 uint32_t numberOfCharacters; ///< The requested number of characters.
50 std::string breakInfo; ///< The expected break info.
53 bool LineBreakInfoTest( const BreakInfoData& data )
55 // 1) Convert to utf32
56 Vector<Character> utf32;
57 utf32.Resize( data.text.size() );
59 const uint32_t numberOfCharacters = Utf8ToUtf32( reinterpret_cast<const uint8_t* const>( data.text.c_str() ),
63 utf32.Resize( numberOfCharacters );
65 // 2) Set the line break info.
66 Vector<LineBreakInfo> lineBreakInfo;
67 lineBreakInfo.Resize( numberOfCharacters );
69 SetLineBreakInfo( utf32, lineBreakInfo );
71 // 3) compare the results
72 std::ostringstream breakInfo;
74 for( unsigned int index = 0u; index < numberOfCharacters; ++index )
76 breakInfo << static_cast<unsigned int>( lineBreakInfo[index] );
79 if( data.breakInfo != breakInfo.str() )
81 std::cout << " expected : [" << data.breakInfo << "]" << std::endl;
82 std::cout << " got : [" << breakInfo.str() << "]" << std::endl;
89 bool WordBreakInfoTest( const BreakInfoData& data )
91 // 1) Convert to utf32
92 Vector<Character> utf32;
93 utf32.Resize( data.text.size() );
95 const uint32_t numberOfCharacters = Utf8ToUtf32( reinterpret_cast<const uint8_t* const>( data.text.c_str() ),
99 utf32.Resize( numberOfCharacters );
101 // 2) Set the word break info for the whole text.
102 Vector<WordBreakInfo> wordBreakInfo;
103 wordBreakInfo.Resize( numberOfCharacters );
105 SetWordBreakInfo( utf32,
110 // 3) Update the word text info if it's requested for part of the text.
111 if( ( 0u != data.index ) &&
112 ( numberOfCharacters != data.numberOfCharacters ) )
114 // Clear part of the word break info.
115 wordBreakInfo.Erase( wordBreakInfo.Begin() + data.index,
116 wordBreakInfo.Begin() + data.index + data.numberOfCharacters );
118 // Update the word break info.
119 SetWordBreakInfo( utf32,
121 data.numberOfCharacters,
125 // 4) compare the results
126 std::ostringstream breakInfo;
128 for( unsigned int index = 0u; index < numberOfCharacters; ++index )
130 breakInfo << static_cast<unsigned int>( wordBreakInfo[index] );
133 if( data.breakInfo != breakInfo.str() )
135 std::cout << " text : [" << data.text << "]" << std::endl;
136 std::cout << " index : " << data.index << std::endl;
137 std::cout << " numberOfCharacters : " << data.numberOfCharacters << std::endl;
138 std::cout << " expected : [" << data.breakInfo << "]" << std::endl;
139 std::cout << " got : [" << breakInfo.str() << "]" << std::endl;
148 //////////////////////////////////////////////////////////
150 int UtcDaliTextSegnemtationSetLineBreakInfo(void)
152 ToolkitTestApplication application;
153 tet_infoline(" UtcDaliTextSegnemtationSetLineBreakInfo");
155 struct BreakInfoData data[] =
166 "Lorem ipsum dolor sit amet, aeque definiebas ea mei, posse iracundia ne cum.\n"
167 "Usu ne nisl maiorum iudicabit, veniam epicurei oporteat eos an.\n"
168 "Ne nec nulla regione albucius, mea doctus delenit ad!\n"
169 "Et everti blandit adversarium mei, eam porro neglegentur suscipiantur an.\n"
170 "Quidam corpora at duo. An eos possim scripserit?",
173 "22222122222122222122212222212222212222222222122122221222221222222222122122220"
174 "2221221222212222222122222222221222222122222222122222222122212220"
175 "221222122222122222221222222222122212222221222222212220"
176 "22122222212222222122222222222122221222122222122222222222122222222222212220"
177 "222222122222221221222212212221222222122222222220",
181 "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
182 "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
183 "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
186 "1111111111111111111111220"
187 "111111211111111111111111111111111111111111111111111220"
188 "11111111121111122211111212211211111111111111111111120",
192 "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
194 "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
197 "11112112111111112111111112111111121121220"
199 "21111112112111111111111211121111111111120",
202 const unsigned int numberOfTests = 4u;
204 for( unsigned int index = 0u; index < numberOfTests; ++index )
206 if( !LineBreakInfoTest( data[index] ) )
208 tet_result(TET_FAIL);
212 tet_result(TET_PASS);
216 int UtcDaliTextSegnemtationSetWordBreakInfo(void)
218 ToolkitTestApplication application;
219 tet_infoline(" UtcDaliTextSegnemtationSetWordBreakInfo");
221 struct BreakInfoData data[] =
231 "Latin script, full text.",
232 "Lorem ipsum dolor sit amet, aeque definiebas ea mei, posse iracundia ne cum.\n"
233 "Usu ne nisl maiorum iudicabit, veniam epicurei oporteat eos an.\n"
234 "Ne nec nulla regione albucius, mea doctus delenit ad!\n"
235 "Et everti blandit adversarium mei, eam porro neglegentur suscipiantur an.\n"
236 "Quidam corpora at duo. An eos possim scripserit?",
239 "11110011110011110011001110001111001111111110010011000111100111111110010011000"
240 "1100100111001111110011111111000111110011111110011111110011001000"
241 "100110011110011111100111111100011001111100111111001000"
242 "10011111001111110011111111110011000110011110011111111110011111111111001000"
243 "111110011111100100110001001100111110011111111100",
246 "Latin script, update first paragraph.",
247 "Lorem ipsum dolor sit amet, aeque definiebas ea mei, posse iracundia ne cum.\n"
248 "Usu ne nisl maiorum iudicabit, veniam epicurei oporteat eos an.\n"
249 "Ne nec nulla regione albucius, mea doctus delenit ad!\n"
250 "Et everti blandit adversarium mei, eam porro neglegentur suscipiantur an.\n"
251 "Quidam corpora at duo. An eos possim scripserit?",
254 "11110011110011110011001110001111001111111110010011000111100111111110010011000"
255 "1100100111001111110011111111000111110011111110011111110011001000"
256 "100110011110011111100111111100011001111100111111001000"
257 "10011111001111110011111111110011000110011110011111111110011111111111001000"
258 "111110011111100100110001001100111110011111111100",
261 "Latin script, update middle paragraphs.",
262 "Lorem ipsum dolor sit amet, aeque definiebas ea mei, posse iracundia ne cum.\n"
263 "Usu ne nisl maiorum iudicabit, veniam epicurei oporteat eos an.\n"
264 "Ne nec nulla regione albucius, mea doctus delenit ad!\n"
265 "Et everti blandit adversarium mei, eam porro neglegentur suscipiantur an.\n"
266 "Quidam corpora at duo. An eos possim scripserit?",
269 "11110011110011110011001110001111001111111110010011000111100111111110010011000"
270 "1100100111001111110011111111000111110011111110011111110011001000"
271 "100110011110011111100111111100011001111100111111001000"
272 "10011111001111110011111111110011000110011110011111111110011111111111001000"
273 "111110011111100100110001001100111110011111111100",
276 "Latin script, update last paragraph.",
277 "Lorem ipsum dolor sit amet, aeque definiebas ea mei, posse iracundia ne cum.\n"
278 "Usu ne nisl maiorum iudicabit, veniam epicurei oporteat eos an.\n"
279 "Ne nec nulla regione albucius, mea doctus delenit ad!\n"
280 "Et everti blandit adversarium mei, eam porro neglegentur suscipiantur an.\n"
281 "Quidam corpora at duo. An eos possim scripserit?",
284 "11110011110011110011001110001111001111111110010011000111100111111110010011000"
285 "1100100111001111110011111111000111110011111110011111110011001000"
286 "100110011110011111100111111100011001111100111111001000"
287 "10011111001111110011111111110011000110011110011111111110011111111111001000"
288 "111110011111100100110001001100111110011111111100",
291 "Japanese script, full text.",
292 "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
293 "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
294 "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
297 "0000000000000010000000000"
298 "000000000000000000000000000000000000000000000000000000"
299 "00000000010000011100110001100000000000000000000000000",
302 "Japanese script, update first paragraph.",
303 "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
304 "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
305 "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
308 "0000000000000010000000000"
309 "000000000000000000000000000000000000000000000000000000"
310 "00000000010000011100110001100000000000000000000000000",
313 "Japanese script, update middle paragraph.",
314 "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
315 "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
316 "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
319 "0000000000000010000000000"
320 "000000000000000000000000000000000000000000000000000000"
321 "00000000010000011100110001100000000000000000000000000",
324 "Japanese script, update last paragraph.",
325 "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
326 "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
327 "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
330 "0000000000000010000000000"
331 "000000000000000000000000000000000000000000000000000000"
332 "00000000010000011100110001100000000000000000000000000",
335 "Chinese script, full text.",
336 "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
338 "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
341 "00001000000000001000000000000000010010000"
343 "10000001001000000000000000010000000000000",
346 "Chinese script, update first paragraph.",
347 "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
349 "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
352 "00001000000000001000000000000000010010000"
354 "10000001001000000000000000010000000000000",
357 "Chinese script, update middle paragraph.",
358 "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
360 "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
363 "00001000000000001000000000000000010010000"
365 "10000001001000000000000000010000000000000",
368 "Chinese script, update last paragraph.",
369 "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
371 "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
374 "00001000000000001000000000000000010010000"
376 "10000001001000000000000000010000000000000",
379 const unsigned int numberOfTests = 13u;
381 for( unsigned int index = 0u; index < numberOfTests; ++index )
383 if( !WordBreakInfoTest( data[index] ) )
385 tet_result(TET_FAIL);
389 tet_result(TET_PASS);