TextModel - Shape the given number of characters inside a text.
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-Text-Segmentation.cpp
1 /*
2  * Copyright (c) 2015 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 = Utf8ToUtf32( reinterpret_cast<const uint8_t* const>( data.text.c_str() ),
60                                                    data.text.size(),
61                                                    &utf32[0u] );
62
63   utf32.Resize( numberOfCharacters );
64
65   // 2) Set the line break info.
66   Vector<LineBreakInfo> lineBreakInfo;
67   lineBreakInfo.Resize( numberOfCharacters );
68
69   SetLineBreakInfo( utf32, lineBreakInfo );
70
71   // 3) compare the results
72   std::ostringstream breakInfo;
73
74   for( unsigned int index = 0u; index < numberOfCharacters; ++index )
75   {
76     breakInfo << static_cast<unsigned int>( lineBreakInfo[index] );
77   }
78
79   if( data.breakInfo != breakInfo.str() )
80   {
81     std::cout << "  expected : [" << data.breakInfo << "]" << std::endl;
82     std::cout << "       got : [" << breakInfo.str() << "]" << std::endl;
83     return false;
84   }
85
86   return true;
87 }
88
89 bool WordBreakInfoTest( const BreakInfoData& data )
90 {
91   // 1) Convert to utf32
92   Vector<Character> utf32;
93   utf32.Resize( data.text.size() );
94
95   const uint32_t numberOfCharacters = Utf8ToUtf32( reinterpret_cast<const uint8_t* const>( data.text.c_str() ),
96                                                    data.text.size(),
97                                                    &utf32[0u] );
98
99   utf32.Resize( numberOfCharacters );
100
101   // 2) Set the word break info for the whole text.
102   Vector<WordBreakInfo> wordBreakInfo;
103   wordBreakInfo.Resize( numberOfCharacters );
104
105   SetWordBreakInfo( utf32,
106                     0u,
107                     numberOfCharacters,
108                     wordBreakInfo );
109
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 ) )
113   {
114     // Clear part of the word break info.
115     wordBreakInfo.Erase( wordBreakInfo.Begin() + data.index,
116                          wordBreakInfo.Begin() + data.index + data.numberOfCharacters );
117
118     // Update the word break info.
119     SetWordBreakInfo( utf32,
120                       data.index,
121                       data.numberOfCharacters,
122                       wordBreakInfo );
123   }
124
125   // 4) compare the results
126   std::ostringstream breakInfo;
127
128   for( unsigned int index = 0u; index < numberOfCharacters; ++index )
129   {
130     breakInfo << static_cast<unsigned int>( wordBreakInfo[index] );
131   }
132
133   if( data.breakInfo != breakInfo.str() )
134   {
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;
140     return false;
141   }
142
143   return true;
144 }
145
146 } // namespace
147
148 //////////////////////////////////////////////////////////
149
150 int UtcDaliTextSegnemtationSetLineBreakInfo(void)
151 {
152   ToolkitTestApplication application;
153   tet_infoline(" UtcDaliTextSegnemtationSetLineBreakInfo");
154
155   struct BreakInfoData data[] =
156   {
157     {
158       "Zero characters",
159       "",
160       0u,
161       0u,
162       "",
163     },
164     {
165       "Latin script",
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?",
171       0u,
172       317u,
173       "22222122222122222122212222212222212222222222122122221222221222222222122122220"
174       "2221221222212222222122222222221222222122222222122222222122212220"
175       "221222122222122222221222222222122212222221222222212220"
176       "22122222212222222122222222222122221222122222122222222222122222222222212220"
177       "222222122222221221222212212221222222122222222220",
178     },
179     {
180       "Japanese script",
181       "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
182       "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
183       "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
184       0u,
185       132u,
186       "1111111111111111111111220"
187       "111111211111111111111111111111111111111111111111111220"
188       "11111111121111122211111212211211111111111111111111120",
189     },
190     {
191       "Chinese script",
192       "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
193       "38人中有1人獲准保釋。\n"
194       "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
195       0u,
196       95u,
197       "11112112111111112111111112111111121121220"
198       "2111111111220"
199       "21111112112111111111111211121111111111120",
200     }
201   };
202   const unsigned int numberOfTests = 4u;
203
204   for( unsigned int index = 0u; index < numberOfTests; ++index )
205   {
206     if( !LineBreakInfoTest( data[index] ) )
207     {
208       tet_result(TET_FAIL);
209     }
210   }
211
212   tet_result(TET_PASS);
213   END_TEST;
214 }
215
216 int UtcDaliTextSegnemtationSetWordBreakInfo(void)
217 {
218   ToolkitTestApplication application;
219   tet_infoline(" UtcDaliTextSegnemtationSetWordBreakInfo");
220
221   struct BreakInfoData data[] =
222   {
223     {
224       "Zero characters.",
225       "",
226       0u,
227       0u,
228       "",
229     },
230     {
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?",
237       0u,
238       317u,
239       "11110011110011110011001110001111001111111110010011000111100111111110010011000"
240       "1100100111001111110011111111000111110011111110011111110011001000"
241       "100110011110011111100111111100011001111100111111001000"
242       "10011111001111110011111111110011000110011110011111111110011111111111001000"
243       "111110011111100100110001001100111110011111111100",
244     },
245     {
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?",
252       0u,
253       77u,
254       "11110011110011110011001110001111001111111110010011000111100111111110010011000"
255       "1100100111001111110011111111000111110011111110011111110011001000"
256       "100110011110011111100111111100011001111100111111001000"
257       "10011111001111110011111111110011000110011110011111111110011111111111001000"
258       "111110011111100100110001001100111110011111111100",
259     },
260     {
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?",
267       77u,
268       118u,
269       "11110011110011110011001110001111001111111110010011000111100111111110010011000"
270       "1100100111001111110011111111000111110011111110011111110011001000"
271       "100110011110011111100111111100011001111100111111001000"
272       "10011111001111110011111111110011000110011110011111111110011111111111001000"
273       "111110011111100100110001001100111110011111111100",
274     },
275     {
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?",
282       269u,
283       48u,
284       "11110011110011110011001110001111001111111110010011000111100111111110010011000"
285       "1100100111001111110011111111000111110011111110011111110011001000"
286       "100110011110011111100111111100011001111100111111001000"
287       "10011111001111110011111111110011000110011110011111111110011111111111001000"
288       "111110011111100100110001001100111110011111111100",
289     },
290     {
291       "Japanese script, full text.",
292       "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
293       "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
294       "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
295       0u,
296       132u,
297       "0000000000000010000000000"
298       "000000000000000000000000000000000000000000000000000000"
299       "00000000010000011100110001100000000000000000000000000",
300     },
301     {
302       "Japanese script, update first paragraph.",
303       "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
304       "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
305       "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
306       0u,
307       25u,
308       "0000000000000010000000000"
309       "000000000000000000000000000000000000000000000000000000"
310       "00000000010000011100110001100000000000000000000000000",
311     },
312     {
313       "Japanese script, update middle paragraph.",
314       "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
315       "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
316       "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
317       25u,
318       54u,
319       "0000000000000010000000000"
320       "000000000000000000000000000000000000000000000000000000"
321       "00000000010000011100110001100000000000000000000000000",
322     },
323     {
324       "Japanese script, update last paragraph.",
325       "韓国側は北朝鮮当局を通じて米ドルで賃金を支払う。\n"
326       "国際社会から様々な経済制裁を受ける北朝鮮にとっては出稼ぎ労働などと並んで重要な外貨稼ぎの手段となっている。\n"
327       "韓国統一省によると15年だけで1320億ウォン(約130億円)が同工業団地を通じ北朝鮮に支払われたという。",
328       79u,
329       53u,
330       "0000000000000010000000000"
331       "000000000000000000000000000000000000000000000000000000"
332       "00000000010000011100110001100000000000000000000000000",
333     },
334     {
335       "Chinese script, full text.",
336       "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
337       "38人中有1人獲准保釋。\n"
338       "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
339       0u,
340       95u,
341       "00001000000000001000000000000000010010000"
342       "1000000000000"
343       "10000001001000000000000000010000000000000",
344     },
345     {
346       "Chinese script, update first paragraph.",
347       "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
348       "38人中有1人獲准保釋。\n"
349       "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
350       0u,
351       41u,
352       "00001000000000001000000000000000010010000"
353       "1000000000000"
354       "10000001001000000000000000010000000000000",
355     },
356     {
357       "Chinese script, update middle paragraph.",
358       "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
359       "38人中有1人獲准保釋。\n"
360       "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
361       41u,
362       13u,
363       "00001000000000001000000000000000010010000"
364       "1000000000000"
365       "10000001001000000000000000010000000000000",
366     },
367     {
368       "Chinese script, update last paragraph.",
369       "在被捕的64人中,警方落案起訴了35名男子和3名女子,他們年齡介乎15到70歲。\n"
370       "38人中有1人獲准保釋。\n"
371       "16名年齡介乎14到33歲的被捕人士獲准保釋候查,另有10人仍被拘留作進一步調查。",
372       54u,
373       41u,
374       "00001000000000001000000000000000010010000"
375       "1000000000000"
376       "10000001001000000000000000010000000000000",
377     }
378   };
379   const unsigned int numberOfTests = 13u;
380
381   for( unsigned int index = 0u; index < numberOfTests; ++index )
382   {
383     if( !WordBreakInfoTest( data[index] ) )
384     {
385       tet_result(TET_FAIL);
386     }
387   }
388
389   tet_result(TET_PASS);
390   END_TEST;
391 }