1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/intl/lwbrk/tests/TestLineBreak.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,494 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 +#include <stdio.h> 1.9 +#include "nsXPCOM.h" 1.10 +#include "nsIComponentManager.h" 1.11 +#include "nsISupports.h" 1.12 +#include "nsServiceManagerUtils.h" 1.13 +#include "nsILineBreaker.h" 1.14 +#include "nsIWordBreaker.h" 1.15 +#include "nsLWBrkCIID.h" 1.16 +#include "nsStringAPI.h" 1.17 +#include "nsEmbedString.h" 1.18 +#include "TestHarness.h" 1.19 + 1.20 +#define WORK_AROUND_SERVICE_MANAGER_ASSERT 1.21 + 1.22 +NS_DEFINE_CID(kLBrkCID, NS_LBRK_CID); 1.23 +NS_DEFINE_CID(kWBrkCID, NS_WBRK_CID); 1.24 + 1.25 + 1.26 +static char teng1[] = 1.27 +// 1 2 3 4 5 6 7 1.28 +//01234567890123456789012345678901234567890123456789012345678901234567890123456789 1.29 + "This is a test to test(reasonable) line break. This 0.01123 = 45 x 48."; 1.30 + 1.31 +static uint32_t exp1[] = { 1.32 + 4,7,9,14,17,34,39,40,41,42,49,54,62,64,67,69,73 1.33 +}; 1.34 + 1.35 +static uint32_t wexp1[] = { 1.36 + 1.37 + 4,5,7,8,9,10,14,15,17,18,22,23,33,34,35,39,43,48,49,50,54,55,56,57,62,63, 1.38 + 64,65,67,68,69,70,72 1.39 +}; 1.40 +// 1 2 3 4 5 6 7 1.41 +//01234567890123456789012345678901234567890123456789012345678901234567890123456789 1.42 +static char teng2[] = 1.43 + "()((reasonab(l)e) line break. .01123=45x48."; 1.44 + 1.45 +static uint32_t lexp2[] = { 1.46 + 17,22,23,30,44 1.47 +}; 1.48 +static uint32_t wexp2[] = { 1.49 + 4,12,13,14,15,16,17,18,22,24,29,30,31,32,37,38,43 1.50 +}; 1.51 + 1.52 +// 1 2 3 4 5 6 7 1.53 +//01234567890123456789012345678901234567890123456789012345678901234567890123456789 1.54 +static char teng3[] = 1.55 + "It's a test to test(ronae ) line break...."; 1.56 +static uint32_t exp3[] = { 1.57 + 4,6,11,14,25,27,32,42 1.58 +}; 1.59 +static uint32_t wexp3[] = { 1.60 + 2,3,4,5,6,7,11,12,14,15,19,20,25,26,27,28,32,33,38 1.61 +}; 1.62 + 1.63 +static char ruler1[] = 1.64 +" 1 2 3 4 5 6 7 "; 1.65 +static char ruler2[] = 1.66 +"0123456789012345678901234567890123456789012345678901234567890123456789012"; 1.67 + 1.68 + 1.69 +bool TestASCIILB(nsILineBreaker *lb, 1.70 + const char* in, const uint32_t len, 1.71 + const uint32_t* out, uint32_t outlen) 1.72 +{ 1.73 + NS_ConvertASCIItoUTF16 eng1(in); 1.74 + uint32_t i,j; 1.75 + uint32_t res[256]; 1.76 + bool ok = true; 1.77 + int32_t curr; 1.78 + for(i = 0, curr = 0; (curr != NS_LINEBREAKER_NEED_MORE_TEXT) && 1.79 + (i < 256); i++) 1.80 + { 1.81 + curr = lb->Next(eng1.get(), eng1.Length(), curr); 1.82 + res [i] = curr != NS_LINEBREAKER_NEED_MORE_TEXT ? curr : eng1.Length(); 1.83 + 1.84 + } 1.85 + if (i != outlen) 1.86 + { 1.87 + ok = false; 1.88 + printf("WARNING!!! return size wrong, expect %d but got %d \n", 1.89 + outlen, i); 1.90 + } 1.91 + printf("string = \n%s\n", in); 1.92 + printf("%s\n", ruler1); 1.93 + printf("%s\n", ruler2); 1.94 + printf("Expect = \n"); 1.95 + for(j=0;j<outlen;j++) 1.96 + { 1.97 + printf("%d,", out[j]); 1.98 + } 1.99 + printf("\nResult = \n"); 1.100 + for(j=0;j<i;j++) 1.101 + { 1.102 + printf("%d,", res[j]); 1.103 + } 1.104 + printf("\n"); 1.105 + for(j=0;j<i;j++) 1.106 + { 1.107 + if(j < outlen) 1.108 + { 1.109 + if (res[j] != out[j]) 1.110 + { 1.111 + ok = false; 1.112 + printf("[%d] expect %d but got %d\n", j, out[j], res[j]); 1.113 + } 1.114 + } else { 1.115 + ok = false; 1.116 + printf("[%d] additional %d\n", j, res[j]); 1.117 + } 1.118 + } 1.119 + return ok; 1.120 +} 1.121 + 1.122 +bool TestASCIIWB(nsIWordBreaker *lb, 1.123 + const char* in, const uint32_t len, 1.124 + const uint32_t* out, uint32_t outlen) 1.125 +{ 1.126 + NS_ConvertASCIItoUTF16 eng1(in); 1.127 + 1.128 + uint32_t i,j; 1.129 + uint32_t res[256]; 1.130 + bool ok = true; 1.131 + int32_t curr = 0; 1.132 + 1.133 + for(i = 0, curr = lb->NextWord(eng1.get(), eng1.Length(), curr); 1.134 + (curr != NS_WORDBREAKER_NEED_MORE_TEXT) && (i < 256); 1.135 + curr = lb->NextWord(eng1.get(), eng1.Length(), curr), i++) 1.136 + { 1.137 + res [i] = curr != NS_WORDBREAKER_NEED_MORE_TEXT ? curr : eng1.Length(); 1.138 + } 1.139 + if (i != outlen) 1.140 + { 1.141 + ok = false; 1.142 + printf("WARNING!!! return size wrong, expect %d but got %d\n", 1.143 + outlen, i); 1.144 + } 1.145 + printf("string = \n%s\n", in); 1.146 + printf("%s\n", ruler1); 1.147 + printf("%s\n", ruler2); 1.148 + printf("Expect = \n"); 1.149 + for(j=0;j<outlen;j++) 1.150 + { 1.151 + printf("%d,", out[j]); 1.152 + } 1.153 + printf("\nResult = \n"); 1.154 + for(j=0;j<i;j++) 1.155 + { 1.156 + printf("%d,", res[j]); 1.157 + } 1.158 + printf("\n"); 1.159 + for(j=0;j<i;j++) 1.160 + { 1.161 + if(j < outlen) 1.162 + { 1.163 + if (res[j] != out[j]) 1.164 + { 1.165 + ok = false; 1.166 + printf("[%d] expect %d but got %d\n", j, out[j], res[j]); 1.167 + } 1.168 + } else { 1.169 + ok = false; 1.170 + printf("[%d] additional %d\n", j, res[j]); 1.171 + } 1.172 + } 1.173 + return ok; 1.174 +} 1.175 + 1.176 + 1.177 +bool TestLineBreaker() 1.178 +{ 1.179 + printf("===========================\n"); 1.180 + printf("Finish nsILineBreaker Test \n"); 1.181 + printf("===========================\n"); 1.182 + nsILineBreaker *t = nullptr; 1.183 + nsresult res; 1.184 + bool ok = true; 1.185 + res = CallGetService(kLBrkCID, &t); 1.186 + 1.187 + printf("Test 1 - GetService():\n"); 1.188 + if (NS_FAILED(res) || !t) { 1.189 + printf("\t1st GetService failed\n"); 1.190 + ok = false; 1.191 + } 1.192 + 1.193 + NS_IF_RELEASE(t); 1.194 + 1.195 + res = CallGetService(kLBrkCID, &t); 1.196 + 1.197 + if (NS_FAILED(res) || !t) { 1.198 + printf("\t2nd GetService failed\n"); 1.199 + ok = false; 1.200 + } else { 1.201 + printf("Test 4 - {First,Next}ForwardBreak():\n"); 1.202 + if( TestASCIILB(t, teng1, sizeof(teng1)/sizeof(char), 1.203 + exp1, sizeof(exp1)/sizeof(uint32_t)) ) 1.204 + { 1.205 + printf("Test 4 Passed\n\n"); 1.206 + } else { 1.207 + ok = false; 1.208 + printf("Test 4 Failed\n\n"); 1.209 + } 1.210 + 1.211 + printf("Test 5 - {First,Next}ForwardBreak():\n"); 1.212 + if(TestASCIILB(t, teng2, sizeof(teng2)/sizeof(char), 1.213 + lexp2, sizeof(lexp2)/sizeof(uint32_t)) ) 1.214 + { 1.215 + printf("Test 5 Passed\n\n"); 1.216 + } else { 1.217 + ok = false; 1.218 + printf("Test 5 Failed\n\n"); 1.219 + } 1.220 + 1.221 + printf("Test 6 - {First,Next}ForwardBreak():\n"); 1.222 + if(TestASCIILB(t, teng3, sizeof(teng3)/sizeof(char), 1.223 + exp3, sizeof(exp3)/sizeof(uint32_t)) ) 1.224 + { 1.225 + printf("Test 6 Passed\n\n"); 1.226 + } else { 1.227 + ok = false; 1.228 + printf("Test 6 Failed\n\n"); 1.229 + } 1.230 + 1.231 + 1.232 + NS_RELEASE(t); 1.233 + 1.234 + } 1.235 + 1.236 + printf("===========================\n"); 1.237 + printf("Finish nsILineBreaker Test \n"); 1.238 + printf("===========================\n"); 1.239 + 1.240 + return ok; 1.241 +} 1.242 + 1.243 +bool TestWordBreaker() 1.244 +{ 1.245 + printf("===========================\n"); 1.246 + printf("Finish nsIWordBreaker Test \n"); 1.247 + printf("===========================\n"); 1.248 + nsIWordBreaker *t = nullptr; 1.249 + nsresult res; 1.250 + bool ok = true; 1.251 + res = CallGetService(kWBrkCID, &t); 1.252 + 1.253 + printf("Test 1 - GetService():\n"); 1.254 + if (NS_FAILED(res) || !t) { 1.255 + printf("\t1st GetService failed\n"); 1.256 + ok = false; 1.257 + } else { 1.258 + NS_RELEASE(t); 1.259 + } 1.260 + 1.261 + res = CallGetService(kWBrkCID, &t); 1.262 + 1.263 + if (NS_FAILED(res) || !t) { 1.264 + printf("\t2nd GetService failed\n"); 1.265 + ok = false; 1.266 + } else { 1.267 + 1.268 + printf("Test 4 - {First,Next}ForwardBreak():\n"); 1.269 + if( TestASCIIWB(t, teng1, sizeof(teng1)/sizeof(char), 1.270 + wexp1, sizeof(wexp1)/sizeof(uint32_t)) ) 1.271 + { 1.272 + printf("Test 4 Passed\n\n"); 1.273 + } else { 1.274 + ok = false; 1.275 + printf("Test 4 Failed\n\n"); 1.276 + } 1.277 + 1.278 + printf("Test 5 - {First,Next}ForwardBreak():\n"); 1.279 + if(TestASCIIWB(t, teng2, sizeof(teng2)/sizeof(char), 1.280 + wexp2, sizeof(wexp2)/sizeof(uint32_t)) ) 1.281 + { 1.282 + printf("Test 5 Passed\n\n"); 1.283 + } else { 1.284 + ok = false; 1.285 + printf("Test 5 Failed\n\n"); 1.286 + } 1.287 + 1.288 + printf("Test 6 - {First,Next}ForwardBreak():\n"); 1.289 + if(TestASCIIWB(t, teng3, sizeof(teng3)/sizeof(char), 1.290 + wexp3, sizeof(wexp3)/sizeof(uint32_t)) ) 1.291 + { 1.292 + printf("Test 6 Passed\n\n"); 1.293 + } else { 1.294 + ok = false; 1.295 + printf("Test 6 Failed\n\n"); 1.296 + } 1.297 + 1.298 + 1.299 + NS_RELEASE(t); 1.300 + } 1.301 + 1.302 + printf("===========================\n"); 1.303 + printf("Finish nsIWordBreaker Test \n"); 1.304 + printf("===========================\n"); 1.305 + 1.306 + return ok; 1.307 +} 1.308 + 1.309 +void SamplePrintWordWithBreak(); 1.310 +void SampleFindWordBreakFromPosition(uint32_t fragN, uint32_t offset); 1.311 +// Sample Code 1.312 + 1.313 +// 012345678901234 1.314 +static const char wb0[] = "T"; 1.315 +static const char wb1[] = "h"; 1.316 +static const char wb2[] = "is is a int"; 1.317 +static const char wb3[] = "ernationali"; 1.318 +static const char wb4[] = "zation work."; 1.319 + 1.320 +static const char* wb[] = {wb0,wb1,wb2,wb3,wb4}; 1.321 +void SampleWordBreakUsage() 1.322 +{ 1.323 + SamplePrintWordWithBreak(); 1.324 + SampleFindWordBreakFromPosition(0,0); // This 1.325 + SampleFindWordBreakFromPosition(1,0); // This 1.326 + SampleFindWordBreakFromPosition(2,0); // This 1.327 + SampleFindWordBreakFromPosition(2,1); // This 1.328 + SampleFindWordBreakFromPosition(2,9); // [space] 1.329 + SampleFindWordBreakFromPosition(2,10); // internationalization 1.330 + SampleFindWordBreakFromPosition(3,4); // internationalization 1.331 + SampleFindWordBreakFromPosition(3,8); // internationalization 1.332 + SampleFindWordBreakFromPosition(4,6); // [space] 1.333 + SampleFindWordBreakFromPosition(4,7); // work 1.334 +} 1.335 + 1.336 + 1.337 +void SamplePrintWordWithBreak() 1.338 +{ 1.339 + uint32_t numOfFragment = sizeof(wb) / sizeof(char*); 1.340 + nsIWordBreaker *wbk = nullptr; 1.341 + 1.342 + CallGetService(kWBrkCID, &wbk); 1.343 + 1.344 + nsAutoString result; 1.345 + 1.346 + for(uint32_t i = 0; i < numOfFragment; i++) 1.347 + { 1.348 + NS_ConvertASCIItoUTF16 fragText(wb[i]); 1.349 + 1.350 + int32_t cur = 0; 1.351 + cur = wbk->NextWord(fragText.get(), fragText.Length(), cur); 1.352 + uint32_t start = 0; 1.353 + for(uint32_t j = 0; cur != NS_WORDBREAKER_NEED_MORE_TEXT ; j++) 1.354 + { 1.355 + result.Append(Substring(fragText, start, cur - start)); 1.356 + result.Append('^'); 1.357 + start = (cur >= 0 ? cur : cur - start); 1.358 + cur = wbk->NextWord(fragText.get(), fragText.Length(), cur); 1.359 + } 1.360 + 1.361 + result.Append(Substring(fragText, fragText.Length() - start)); 1.362 + 1.363 + if( i != (numOfFragment -1 )) 1.364 + { 1.365 + NS_ConvertASCIItoUTF16 nextFragText(wb[i+1]); 1.366 + 1.367 + bool canBreak = true; 1.368 + canBreak = wbk->BreakInBetween( fragText.get(), 1.369 + fragText.Length(), 1.370 + nextFragText.get(), 1.371 + nextFragText.Length()); 1.372 + if(canBreak) 1.373 + result.Append('^'); 1.374 + 1.375 + fragText.Assign(nextFragText); 1.376 + } 1.377 + } 1.378 + printf("Output From SamplePrintWordWithBreak() \n\n"); 1.379 + printf("[%s]\n", NS_ConvertUTF16toUTF8(result).get()); 1.380 + 1.381 + NS_IF_RELEASE(wbk); 1.382 +} 1.383 + 1.384 +void SampleFindWordBreakFromPosition(uint32_t fragN, uint32_t offset) 1.385 +{ 1.386 + uint32_t numOfFragment = sizeof(wb) / sizeof(char*); 1.387 + nsIWordBreaker *wbk = nullptr; 1.388 + 1.389 + CallGetService(kWBrkCID, &wbk); 1.390 + 1.391 + NS_ConvertASCIItoUTF16 fragText(wb[fragN]); 1.392 + 1.393 + nsWordRange res = wbk->FindWord(fragText.get(), fragText.Length(), offset); 1.394 + 1.395 + bool canBreak; 1.396 + nsAutoString result(Substring(fragText, res.mBegin, res.mEnd-res.mBegin)); 1.397 + 1.398 + if((uint32_t)fragText.Length() == res.mEnd) // if we hit the end of the fragment 1.399 + { 1.400 + nsAutoString curFragText = fragText; 1.401 + for(uint32_t p = fragN +1; p < numOfFragment ;p++) 1.402 + { 1.403 + NS_ConvertASCIItoUTF16 nextFragText(wb[p]); 1.404 + canBreak = wbk->BreakInBetween(curFragText.get(), 1.405 + curFragText.Length(), 1.406 + nextFragText.get(), 1.407 + nextFragText.Length()); 1.408 + if(canBreak) 1.409 + break; 1.410 + 1.411 + nsWordRange r = wbk->FindWord(nextFragText.get(), nextFragText.Length(), 1.412 + 0); 1.413 + 1.414 + result.Append(Substring(nextFragText, r.mBegin, r.mEnd - r.mBegin)); 1.415 + 1.416 + if((uint32_t)nextFragText.Length() != r.mEnd) 1.417 + break; 1.418 + 1.419 + nextFragText.Assign(curFragText); 1.420 + } 1.421 + } 1.422 + 1.423 + if(0 == res.mBegin) // if we hit the beginning of the fragment 1.424 + { 1.425 + nsAutoString curFragText = fragText; 1.426 + for(uint32_t p = fragN ; p > 0 ;p--) 1.427 + { 1.428 + NS_ConvertASCIItoUTF16 prevFragText(wb[p-1]); 1.429 + canBreak = wbk->BreakInBetween(prevFragText.get(), 1.430 + prevFragText.Length(), 1.431 + curFragText.get(), 1.432 + curFragText.Length()); 1.433 + if(canBreak) 1.434 + break; 1.435 + 1.436 + nsWordRange r = wbk->FindWord(prevFragText.get(), prevFragText.Length(), 1.437 + prevFragText.Length()); 1.438 + 1.439 + result.Insert(Substring(prevFragText, r.mBegin, r.mEnd - r.mBegin), 0); 1.440 + 1.441 + if(0 != r.mBegin) 1.442 + break; 1.443 + 1.444 + prevFragText.Assign(curFragText); 1.445 + } 1.446 + } 1.447 + 1.448 + printf("Output From SamplePrintWordWithBreak() \n\n"); 1.449 + printf("[%s]\n", NS_ConvertUTF16toUTF8(result).get()); 1.450 + 1.451 + NS_IF_RELEASE(wbk); 1.452 +} 1.453 + 1.454 +// Main 1.455 + 1.456 +int main(int argc, char** argv) { 1.457 + 1.458 + int rv = 0; 1.459 + ScopedXPCOM xpcom("TestLineBreak"); 1.460 + if (xpcom.failed()) 1.461 + return -1; 1.462 + 1.463 + // -------------------------------------------- 1.464 + printf("Test Line Break\n"); 1.465 + 1.466 + bool lbok ; 1.467 + bool wbok ; 1.468 + lbok =TestWordBreaker(); 1.469 + if(lbok) 1.470 + passed("Line Break Test"); 1.471 + else { 1.472 + fail("Line Break Test"); 1.473 + rv = -1; 1.474 + } 1.475 + 1.476 + wbok = TestLineBreaker(); 1.477 + if(wbok) 1.478 + passed("Word Break Test"); 1.479 + else { 1.480 + fail("Word Break Test"); 1.481 + rv = -1; 1.482 + } 1.483 + 1.484 + SampleWordBreakUsage(); 1.485 + 1.486 + 1.487 + // -------------------------------------------- 1.488 + printf("Finish All The Test Cases\n"); 1.489 + 1.490 + if(lbok && wbok) 1.491 + passed("Line/Word Break Test"); 1.492 + else { 1.493 + fail("Line/Word Break Test"); 1.494 + rv = -1; 1.495 + } 1.496 + return rv; 1.497 +}