Merge "Added IGNORE_SPACES_AFTER_TEXT property" into devel/master
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-Text-Segmentation.cpp
1 /*
2  * Copyright (c) 2018 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 <iostream>
19
20 #include <stdlib.h>
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>
25
26
27 using namespace Dali;
28 using namespace Toolkit;
29 using namespace Text;
30
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 );
38
39 //////////////////////////////////////////////////////////
40
41 namespace
42 {
43
44 struct BreakInfoData
45 {
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.
51 };
52
53 bool LineBreakInfoTest( const BreakInfoData& data )
54 {
55   // 1) Convert to utf32
56   Vector<Character> utf32;
57   utf32.Resize( data.text.size() );
58
59   const uint32_t numberOfCharacters = ( data.text.size() == 0 ) ? 0 :
60     Utf8ToUtf32( reinterpret_cast<const uint8_t* const>( data.text.c_str() ),
61                  data.text.size(),
62                  &utf32[0u] );
63
64   utf32.Resize( numberOfCharacters );
65
66   // 2) Set the line break info for the whole text.
67   Vector<LineBreakInfo> lineBreakInfo;
68   lineBreakInfo.Resize( numberOfCharacters );
69
70   SetLineBreakInfo( utf32,
71                     0u,
72                     numberOfCharacters,
73                     lineBreakInfo );
74
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 ) )
78   {
79     // Clear part of the line break info.
80     lineBreakInfo.Erase( lineBreakInfo.Begin() + data.index,
81                          lineBreakInfo.Begin() + data.index + data.numberOfCharacters );
82
83     // Update the word line info.
84     SetLineBreakInfo( utf32,
85                       data.index,
86                       data.numberOfCharacters,
87                       lineBreakInfo );
88   }
89
90   // 4) compare the results
91   std::ostringstream breakInfo;
92
93   for( unsigned int index = 0u; index < numberOfCharacters; ++index )
94   {
95     breakInfo << static_cast<unsigned int>( lineBreakInfo[index] );
96   }
97
98   if( data.breakInfo != breakInfo.str() )
99   {
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;
105     return false;
106   }
107
108   return true;
109 }
110
111 bool WordBreakInfoTest( const BreakInfoData& data )
112 {
113   // 1) Convert to utf32
114   Vector<Character> utf32;
115   utf32.Resize( data.text.size() );
116
117   const uint32_t numberOfCharacters = ( data.text.size() == 0 ) ? 0 :
118     Utf8ToUtf32( reinterpret_cast<const uint8_t* const>( data.text.c_str() ),
119                  data.text.size(),
120                  &utf32[0u] );
121
122   utf32.Resize( numberOfCharacters );
123
124   // 2) Set the word break info for the whole text.
125   Vector<WordBreakInfo> wordBreakInfo;
126   wordBreakInfo.Resize( numberOfCharacters );
127
128   SetWordBreakInfo( utf32,
129                     0u,
130                     numberOfCharacters,
131                     wordBreakInfo );
132
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 ) )
136   {
137     // Clear part of the word break info.
138     wordBreakInfo.Erase( wordBreakInfo.Begin() + data.index,
139                          wordBreakInfo.Begin() + data.index + data.numberOfCharacters );
140
141     // Update the word break info.
142     SetWordBreakInfo( utf32,
143                       data.index,
144                       data.numberOfCharacters,
145                       wordBreakInfo );
146   }
147
148   // 4) compare the results
149   std::ostringstream breakInfo;
150
151   for( unsigned int index = 0u; index < numberOfCharacters; ++index )
152   {
153     breakInfo << static_cast<unsigned int>( wordBreakInfo[index] );
154   }
155
156   if( data.breakInfo != breakInfo.str() )
157   {
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;
163     return false;
164   }
165
166   return true;
167 }
168
169 } // namespace
170
171 //////////////////////////////////////////////////////////
172
173 int UtcDaliTextSegnemtationSetLineBreakInfo(void)
174 {
175   tet_infoline(" UtcDaliTextSegnemtationSetLineBreakInfo");
176
177   struct BreakInfoData data[] =
178   {
179     {
180       "Zero characters",
181       "",
182       0u,
183       0u,
184       "",
185     },
186     {
187       "Latin script",
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?",
193       0u,
194       317u,
195       "22222122222122222122212222212222212222222222122122221222221222222222122122220"
196       "2221221222212222222122222222221222222122222222122222222122212220"
197       "221222122222122222221222222222122212222221222222212220"
198       "22122222212222222122222222222122221222122222122222222222122222222222212220"
199       "222222122222221221222212212221222222122222222220",
200     },
201     {
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?",
208       0u,
209       141u,
210       "22222122222122222122212222212222212222222222122122221222221222222222122122220"
211       "2221221222212222222122222222221222222122222222122222222122212220"
212       "221222122222122222221222222222122212222221222222212220"
213       "22122222212222222122222222222122221222122222122222222222122222222222212220"
214       "222222122222221221222212212221222222122222222220",
215     },
216     {
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?",
223       141u,
224       128u,
225       "22222122222122222122212222212222212222222222122122221222221222222222122122220"
226       "2221221222212222222122222222221222222122222222122222222122212220"
227       "221222122222122222221222222222122212222221222222212220"
228       "22122222212222222122222222222122221222122222122222222222122222222222212220"
229       "222222122222221221222212212221222222122222222220",
230     },
231     {
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?",
238       195u,
239       122u,
240       "22222122222122222122212222212222212222222222122122221222221222222222122122220"
241       "2221221222212222222122222222221222222122222222122222222122212220"
242       "221222122222122222221222222222122212222221222222212220"
243       "22122222212222222122222222222122221222122222122222222222122222222222212220"
244       "222222122222221221222212212221222222122222222220",
245     },
246     {
247       "Japanese script",
248       "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
249       "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
250       "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
251       0u,
252       132u,
253       "1111111111111111111111220"
254       "111111211111111111111111111111111111111111111111111220"
255       "11111111121111122211111212211211111111111111111111120",
256     },
257     {
258       "Chinese script",
259       "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
260       "38人中有1人獲准保釋。\n"
261       "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
262       0u,
263       95u,
264       "11112112111111112111111112111111121121220"
265       "2111111111220"
266       "21111112112111111111111211121111111111120",
267     }
268   };
269   const unsigned int numberOfTests = 7u;
270
271   for( unsigned int index = 0u; index < numberOfTests; ++index )
272   {
273     ToolkitTestApplication application;
274     if( !LineBreakInfoTest( data[index] ) )
275     {
276       tet_result(TET_FAIL);
277     }
278   }
279
280   tet_result(TET_PASS);
281   END_TEST;
282 }
283
284 int UtcDaliTextSegnemtationSetWordBreakInfo(void)
285 {
286   tet_infoline(" UtcDaliTextSegnemtationSetWordBreakInfo");
287
288   struct BreakInfoData data[] =
289   {
290     {
291       "Zero characters.",
292       "",
293       0u,
294       0u,
295       "",
296     },
297     {
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?",
304       0u,
305       317u,
306       "11110011110011110011001110001111001111111110010011000111100111111110010011000"
307       "1100100111001111110011111111000111110011111110011111110011001000"
308       "100110011110011111100111111100011001111100111111001000"
309       "10011111001111110011111111110011000110011110011111111110011111111111001000"
310       "111110011111100100110001001100111110011111111100",
311     },
312     {
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?",
319       0u,
320       77u,
321       "11110011110011110011001110001111001111111110010011000111100111111110010011000"
322       "1100100111001111110011111111000111110011111110011111110011001000"
323       "100110011110011111100111111100011001111100111111001000"
324       "10011111001111110011111111110011000110011110011111111110011111111111001000"
325       "111110011111100100110001001100111110011111111100",
326     },
327     {
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?",
334       77u,
335       118u,
336       "11110011110011110011001110001111001111111110010011000111100111111110010011000"
337       "1100100111001111110011111111000111110011111110011111110011001000"
338       "100110011110011111100111111100011001111100111111001000"
339       "10011111001111110011111111110011000110011110011111111110011111111111001000"
340       "111110011111100100110001001100111110011111111100",
341     },
342     {
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?",
349       269u,
350       48u,
351       "11110011110011110011001110001111001111111110010011000111100111111110010011000"
352       "1100100111001111110011111111000111110011111110011111110011001000"
353       "100110011110011111100111111100011001111100111111001000"
354       "10011111001111110011111111110011000110011110011111111110011111111111001000"
355       "111110011111100100110001001100111110011111111100",
356     },
357     {
358       "Japanese script, full text.",
359       "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
360       "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
361       "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
362       0u,
363       132u,
364       "0000000000000010000000000"
365       "000000000000000000000000000000000000000000000000000000"
366       "00000000010000011100110001100000000000000000000000000",
367     },
368     {
369       "Japanese script, update first paragraph.",
370       "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
371       "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
372       "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
373       0u,
374       25u,
375       "0000000000000010000000000"
376       "000000000000000000000000000000000000000000000000000000"
377       "00000000010000011100110001100000000000000000000000000",
378     },
379     {
380       "Japanese script, update middle paragraph.",
381       "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
382       "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
383       "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
384       25u,
385       54u,
386       "0000000000000010000000000"
387       "000000000000000000000000000000000000000000000000000000"
388       "00000000010000011100110001100000000000000000000000000",
389     },
390     {
391       "Japanese script, update last paragraph.",
392       "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
393       "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
394       "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
395       79u,
396       53u,
397       "0000000000000010000000000"
398       "000000000000000000000000000000000000000000000000000000"
399       "00000000010000011100110001100000000000000000000000000",
400     },
401     {
402       "Chinese script, full text.",
403       "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
404       "38人中有1人獲准保釋。\n"
405       "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
406       0u,
407       95u,
408       "00001000000000001000000000000000010010000"
409       "1000000000000"
410       "10000001001000000000000000010000000000000",
411     },
412     {
413       "Chinese script, update first paragraph.",
414       "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
415       "38人中有1人獲准保釋。\n"
416       "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
417       0u,
418       41u,
419       "00001000000000001000000000000000010010000"
420       "1000000000000"
421       "10000001001000000000000000010000000000000",
422     },
423     {
424       "Chinese script, update middle paragraph.",
425       "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
426       "38人中有1人獲准保釋。\n"
427       "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
428       41u,
429       13u,
430       "00001000000000001000000000000000010010000"
431       "1000000000000"
432       "10000001001000000000000000010000000000000",
433     },
434     {
435       "Chinese script, update last paragraph.",
436       "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
437       "38人中有1人獲准保釋。\n"
438       "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
439       54u,
440       41u,
441       "00001000000000001000000000000000010010000"
442       "1000000000000"
443       "10000001001000000000000000010000000000000",
444     }
445   };
446   const unsigned int numberOfTests = 13u;
447
448   for( unsigned int index = 0u; index < numberOfTests; ++index )
449   {
450     ToolkitTestApplication application;
451     if( !WordBreakInfoTest( data[index] ) )
452     {
453       tet_result(TET_FAIL);
454     }
455   }
456
457   tet_result(TET_PASS);
458   END_TEST;
459 }