intl/lwbrk/tests/TestLineBreak.cpp

changeset 0
6474c204b198
     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 +}

mercurial