2 * Copyright (c) 2018 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 = ( data.text.size() == 0 ) ? 0 :
60 Utf8ToUtf32( reinterpret_cast<const uint8_t* const>( data.text.c_str() ),
64 utf32.Resize( numberOfCharacters );
66 // 2) Set the line break info for the whole text.
67 Vector<LineBreakInfo> lineBreakInfo;
68 lineBreakInfo.Resize( numberOfCharacters );
70 SetLineBreakInfo( utf32,
75 // 3) Update the word text info if it's requested for part of the text.
76 if( ( 0u != data.index ) &&
77 ( numberOfCharacters != data.numberOfCharacters ) )
79 // Clear part of the line break info.
80 lineBreakInfo.Erase( lineBreakInfo.Begin() + data.index,
81 lineBreakInfo.Begin() + data.index + data.numberOfCharacters );
83 // Update the word line info.
84 SetLineBreakInfo( utf32,
86 data.numberOfCharacters,
90 // 4) compare the results
91 std::ostringstream breakInfo;
93 for( unsigned int index = 0u; index < numberOfCharacters; ++index )
95 breakInfo << static_cast<unsigned int>( lineBreakInfo[index] );
98 if( data.breakInfo != breakInfo.str() )
100 std::cout << " text : [" << data.text << "]" << std::endl;
101 std::cout << " index : " << data.index << std::endl;
102 std::cout << " numberOfCharacters : " << data.numberOfCharacters << std::endl;
103 std::cout << " expected : [" << data.breakInfo << "]" << std::endl;
104 std::cout << " got : [" << breakInfo.str() << "]" << std::endl;
111 bool WordBreakInfoTest( const BreakInfoData& data )
113 // 1) Convert to utf32
114 Vector<Character> utf32;
115 utf32.Resize( data.text.size() );
117 const uint32_t numberOfCharacters = ( data.text.size() == 0 ) ? 0 :
118 Utf8ToUtf32( reinterpret_cast<const uint8_t* const>( data.text.c_str() ),
122 utf32.Resize( numberOfCharacters );
124 // 2) Set the word break info for the whole text.
125 Vector<WordBreakInfo> wordBreakInfo;
126 wordBreakInfo.Resize( numberOfCharacters );
128 SetWordBreakInfo( utf32,
133 // 3) Update the word text info if it's requested for part of the text.
134 if( ( 0u != data.index ) &&
135 ( numberOfCharacters != data.numberOfCharacters ) )
137 // Clear part of the word break info.
138 wordBreakInfo.Erase( wordBreakInfo.Begin() + data.index,
139 wordBreakInfo.Begin() + data.index + data.numberOfCharacters );
141 // Update the word break info.
142 SetWordBreakInfo( utf32,
144 data.numberOfCharacters,
148 // 4) compare the results
149 std::ostringstream breakInfo;
151 for( unsigned int index = 0u; index < numberOfCharacters; ++index )
153 breakInfo << static_cast<unsigned int>( wordBreakInfo[index] );
156 if( data.breakInfo != breakInfo.str() )
158 std::cout << " text : [" << data.text << "]" << std::endl;
159 std::cout << " index : " << data.index << std::endl;
160 std::cout << " numberOfCharacters : " << data.numberOfCharacters << std::endl;
161 std::cout << " expected : [" << data.breakInfo << "]" << std::endl;
162 std::cout << " got : [" << breakInfo.str() << "]" << std::endl;
171 //////////////////////////////////////////////////////////
173 int UtcDaliTextSegnemtationSetLineBreakInfo(void)
175 tet_infoline(" UtcDaliTextSegnemtationSetLineBreakInfo");
177 struct BreakInfoData data[] =
188 "Lorem ipsum dolor sit amet, aeque definiebas ea mei, posse iracundia ne cum.\n"
189 "Usu ne nisl maiorum iudicabit, veniam epicurei oporteat eos an.\n"
190 "Ne nec nulla regione albucius, mea doctus delenit ad!\n"
191 "Et everti blandit adversarium mei, eam porro neglegentur suscipiantur an.\n"
192 "Quidam corpora at duo. An eos possim scripserit?",
195 "22222122222122222122212222212222212222222222122122221222221222222222122122220"
196 "2221221222212222222122222222221222222122222222122222222122212220"
197 "221222122222122222221222222222122212222221222222212220"
198 "22122222212222222122222222222122221222122222122222222222122222222222212220"
199 "222222122222221221222212212221222222122222222220",
202 "Latin script. Update initial paragraphs.",
203 "Lorem ipsum dolor sit amet, aeque definiebas ea mei, posse iracundia ne cum.\n"
204 "Usu ne nisl maiorum iudicabit, veniam epicurei oporteat eos an.\n"
205 "Ne nec nulla regione albucius, mea doctus delenit ad!\n"
206 "Et everti blandit adversarium mei, eam porro neglegentur suscipiantur an.\n"
207 "Quidam corpora at duo. An eos possim scripserit?",
210 "22222122222122222122212222212222212222222222122122221222221222222222122122220"
211 "2221221222212222222122222222221222222122222222122222222122212220"
212 "221222122222122222221222222222122212222221222222212220"
213 "22122222212222222122222222222122221222122222122222222222122222222222212220"
214 "222222122222221221222212212221222222122222222220",
217 "Latin script. Update mid paragraphs.",
218 "Lorem ipsum dolor sit amet, aeque definiebas ea mei, posse iracundia ne cum.\n"
219 "Usu ne nisl maiorum iudicabit, veniam epicurei oporteat eos an.\n"
220 "Ne nec nulla regione albucius, mea doctus delenit ad!\n"
221 "Et everti blandit adversarium mei, eam porro neglegentur suscipiantur an.\n"
222 "Quidam corpora at duo. An eos possim scripserit?",
225 "22222122222122222122212222212222212222222222122122221222221222222222122122220"
226 "2221221222212222222122222222221222222122222222122222222122212220"
227 "221222122222122222221222222222122212222221222222212220"
228 "22122222212222222122222222222122221222122222122222222222122222222222212220"
229 "222222122222221221222212212221222222122222222220",
232 "Latin script. Update final paragraphs.",
233 "Lorem ipsum dolor sit amet, aeque definiebas ea mei, posse iracundia ne cum.\n"
234 "Usu ne nisl maiorum iudicabit, veniam epicurei oporteat eos an.\n"
235 "Ne nec nulla regione albucius, mea doctus delenit ad!\n"
236 "Et everti blandit adversarium mei, eam porro neglegentur suscipiantur an.\n"
237 "Quidam corpora at duo. An eos possim scripserit?",
240 "22222122222122222122212222212222212222222222122122221222221222222222122122220"
241 "2221221222212222222122222222221222222122222222122222222122212220"
242 "221222122222122222221222222222122212222221222222212220"
243 "22122222212222222122222222222122221222122222122222222222122222222222212220"
244 "222222122222221221222212212221222222122222222220",
248 "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
249 "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
250 "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
253 "1111111111111111111111220"
254 "111111211111111111111111111111111111111111111111111220"
255 "11111111121111122211111212211211111111111111111111120",
259 "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
261 "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
264 "11112112111111112111111112111111121121220"
266 "21111112112111111111111211121111111111120",
269 const unsigned int numberOfTests = 7u;
271 for( unsigned int index = 0u; index < numberOfTests; ++index )
273 ToolkitTestApplication application;
274 if( !LineBreakInfoTest( data[index] ) )
276 tet_result(TET_FAIL);
280 tet_result(TET_PASS);
284 int UtcDaliTextSegnemtationSetWordBreakInfo(void)
286 tet_infoline(" UtcDaliTextSegnemtationSetWordBreakInfo");
288 struct BreakInfoData data[] =
298 "Latin script, full text.",
299 "Lorem ipsum dolor sit amet, aeque definiebas ea mei, posse iracundia ne cum.\n"
300 "Usu ne nisl maiorum iudicabit, veniam epicurei oporteat eos an.\n"
301 "Ne nec nulla regione albucius, mea doctus delenit ad!\n"
302 "Et everti blandit adversarium mei, eam porro neglegentur suscipiantur an.\n"
303 "Quidam corpora at duo. An eos possim scripserit?",
306 "11110011110011110011001110001111001111111110010011000111100111111110010011000"
307 "1100100111001111110011111111000111110011111110011111110011001000"
308 "100110011110011111100111111100011001111100111111001000"
309 "10011111001111110011111111110011000110011110011111111110011111111111001000"
310 "111110011111100100110001001100111110011111111100",
313 "Latin script, update first paragraph.",
314 "Lorem ipsum dolor sit amet, aeque definiebas ea mei, posse iracundia ne cum.\n"
315 "Usu ne nisl maiorum iudicabit, veniam epicurei oporteat eos an.\n"
316 "Ne nec nulla regione albucius, mea doctus delenit ad!\n"
317 "Et everti blandit adversarium mei, eam porro neglegentur suscipiantur an.\n"
318 "Quidam corpora at duo. An eos possim scripserit?",
321 "11110011110011110011001110001111001111111110010011000111100111111110010011000"
322 "1100100111001111110011111111000111110011111110011111110011001000"
323 "100110011110011111100111111100011001111100111111001000"
324 "10011111001111110011111111110011000110011110011111111110011111111111001000"
325 "111110011111100100110001001100111110011111111100",
328 "Latin script, update middle paragraphs.",
329 "Lorem ipsum dolor sit amet, aeque definiebas ea mei, posse iracundia ne cum.\n"
330 "Usu ne nisl maiorum iudicabit, veniam epicurei oporteat eos an.\n"
331 "Ne nec nulla regione albucius, mea doctus delenit ad!\n"
332 "Et everti blandit adversarium mei, eam porro neglegentur suscipiantur an.\n"
333 "Quidam corpora at duo. An eos possim scripserit?",
336 "11110011110011110011001110001111001111111110010011000111100111111110010011000"
337 "1100100111001111110011111111000111110011111110011111110011001000"
338 "100110011110011111100111111100011001111100111111001000"
339 "10011111001111110011111111110011000110011110011111111110011111111111001000"
340 "111110011111100100110001001100111110011111111100",
343 "Latin script, update last paragraph.",
344 "Lorem ipsum dolor sit amet, aeque definiebas ea mei, posse iracundia ne cum.\n"
345 "Usu ne nisl maiorum iudicabit, veniam epicurei oporteat eos an.\n"
346 "Ne nec nulla regione albucius, mea doctus delenit ad!\n"
347 "Et everti blandit adversarium mei, eam porro neglegentur suscipiantur an.\n"
348 "Quidam corpora at duo. An eos possim scripserit?",
351 "11110011110011110011001110001111001111111110010011000111100111111110010011000"
352 "1100100111001111110011111111000111110011111110011111110011001000"
353 "100110011110011111100111111100011001111100111111001000"
354 "10011111001111110011111111110011000110011110011111111110011111111111001000"
355 "111110011111100100110001001100111110011111111100",
358 "Japanese script, full text.",
359 "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
360 "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
361 "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
364 "0000000000000010000000000"
365 "000000000000000000000000000000000000000000000000000000"
366 "00000000010000011100110001100000000000000000000000000",
369 "Japanese script, update first paragraph.",
370 "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
371 "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
372 "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
375 "0000000000000010000000000"
376 "000000000000000000000000000000000000000000000000000000"
377 "00000000010000011100110001100000000000000000000000000",
380 "Japanese script, update middle paragraph.",
381 "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
382 "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
383 "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
386 "0000000000000010000000000"
387 "000000000000000000000000000000000000000000000000000000"
388 "00000000010000011100110001100000000000000000000000000",
391 "Japanese script, update last paragraph.",
392 "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
393 "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
394 "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
397 "0000000000000010000000000"
398 "000000000000000000000000000000000000000000000000000000"
399 "00000000010000011100110001100000000000000000000000000",
402 "Chinese script, full text.",
403 "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
405 "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
408 "00001000000000001000000000000000010010000"
410 "10000001001000000000000000010000000000000",
413 "Chinese script, update first paragraph.",
414 "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
416 "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
419 "00001000000000001000000000000000010010000"
421 "10000001001000000000000000010000000000000",
424 "Chinese script, update middle paragraph.",
425 "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
427 "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
430 "00001000000000001000000000000000010010000"
432 "10000001001000000000000000010000000000000",
435 "Chinese script, update last paragraph.",
436 "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
438 "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
441 "00001000000000001000000000000000010010000"
443 "10000001001000000000000000010000000000000",
446 const unsigned int numberOfTests = 13u;
448 for( unsigned int index = 0u; index < numberOfTests; ++index )
450 ToolkitTestApplication application;
451 if( !WordBreakInfoTest( data[index] ) )
453 tet_result(TET_FAIL);
457 tet_result(TET_PASS);