Home | History | Annotate | Download | only in intltest
      1 /********************************************************************
      2  * COPYRIGHT:
      3  * Copyright (c) 1997-2010, International Business Machines Corporation and
      4  * others. All Rights Reserved.
      5  ********************************************************************/
      6 
      7 /***********************************************************************
      8 * Modification history
      9 * Date        Name        Description
     10 * 02/14/2001  synwee      Added attributes in TestTertiary and
     11 *                         TestSecondary
     12 ***********************************************************************/
     13 
     14 #include "unicode/utypes.h"
     15 
     16 #if !UCONFIG_NO_COLLATION
     17 
     18 #include "unicode/coll.h"
     19 #include "unicode/tblcoll.h"
     20 #include "unicode/unistr.h"
     21 #include "unicode/sortkey.h"
     22 #include "frcoll.h"
     23 
     24 #include "sfwdchit.h"
     25 
     26 CollationFrenchTest::CollationFrenchTest()
     27 : myCollation(0)
     28 {
     29     UErrorCode status = U_ZERO_ERROR;
     30     myCollation = Collator::createInstance(Locale::getCanadaFrench(), status);
     31     if(!myCollation || U_FAILURE(status)) {
     32         errcheckln(status, __FILE__ "failed to create! err " + UnicodeString(u_errorName(status)));
     33         /* if it wasn't already: */
     34         delete myCollation;
     35         myCollation = NULL;
     36     }
     37 }
     38 
     39 CollationFrenchTest::~CollationFrenchTest()
     40 {
     41     delete myCollation;
     42 }
     43 
     44 const UChar CollationFrenchTest::testSourceCases[][CollationFrenchTest::MAX_TOKEN_LEN] =
     45 {
     46     {0x0061/*'a'*/, 0x0062/*'b'*/, 0x0063/*'c'*/, 0x0000},
     47     {0x0043/*'C'*/, 0x004f/*'O'*/, 0x0054/*'T'*/, 0x0045/*'E'*/, 0x0000},
     48     {0x0063/*'c'*/, 0x006f/*'o'*/, 0x002d/*'-'*/, 0x006f/*'o'*/, 0x0070/*'p'*/, 0x0000},
     49     {0x0070/*'p'*/, 0x00EA, 0x0063/*'c'*/, 0x0068/*'h'*/, 0x0065/*'e'*/, 0x0000},
     50     {0x0070/*'p'*/, 0x00EA, 0x0063/*'c'*/, 0x0068/*'h'*/, 0x0065/*'e'*/, 0x0072/*'r'*/, 0x0000},
     51     {0x0070/*'p'*/, 0x00E9, 0x0063/*'c'*/, 0x0068/*'h'*/, 0x0065/*'e'*/, 0x0072/*'r'*/, 0x0000},
     52     {0x0070/*'p'*/, 0x00E9, 0x0063/*'c'*/, 0x0068/*'h'*/, 0x0065/*'e'*/, 0x0072/*'r'*/, 0x0000},
     53     {0x0048/*'H'*/, 0x0065/*'e'*/, 0x006c/*'l'*/, 0x006c/*'l'*/, 0x006f/*'o'*/, 0x0000},
     54     {0x01f1, 0x0000},
     55     {0xfb00, 0x0000},
     56     {0x01fa, 0x0000},
     57     {0x0101, 0x0000}
     58 };
     59 
     60 const UChar CollationFrenchTest::testTargetCases[][CollationFrenchTest::MAX_TOKEN_LEN] =
     61 {
     62     {0x0041/*'A'*/, 0x0042/*'B'*/, 0x0043/*'C'*/, 0x0000},
     63     {0x0063/*'c'*/, 0x00f4, 0x0074/*'t'*/, 0x0065/*'e'*/, 0x0000},
     64     {0x0043/*'C'*/, 0x004f/*'O'*/, 0x004f/*'O'*/, 0x0050/*'P'*/, 0x0000},
     65     {0x0070/*'p'*/, 0x00E9, 0x0063/*'c'*/, 0x0068/*'h'*/, 0x00E9, 0x0000},
     66     {0x0070/*'p'*/,  0x00E9, 0x0063/*'c'*/, 0x0068/*'h'*/, 0x00E9, 0x0000},
     67     {0x0070/*'p'*/, 0x00EA, 0x0063/*'c'*/, 0x0068/*'h'*/, 0x0065/*'e'*/, 0x0000},
     68     {0x0070/*'p'*/, 0x00EA, 0x0063/*'c'*/, 0x0068/*'h'*/, 0x0065/*'e'*/, 0x0072/*'r'*/, 0x0000},
     69     {0x0068/*'h'*/, 0x0065/*'e'*/, 0x006c/*'l'*/, 0x006c/*'l'*/, 0x004f/*'O'*/, 0x0000},
     70     {0x01ee, 0x0000},
     71     {0x25ca, 0x0000},
     72     {0x00e0, 0x0000},
     73     {0x01df, 0x0000}
     74 };
     75 
     76 const Collator::EComparisonResult CollationFrenchTest::results[] =
     77 {
     78     Collator::LESS,
     79     Collator::LESS,
     80     Collator::LESS, /*Collator::GREATER,*/
     81     Collator::LESS,
     82     Collator::GREATER,
     83     Collator::GREATER,
     84     Collator::LESS,
     85     Collator::GREATER,
     86     Collator::LESS, /*Collator::GREATER,*/
     87     Collator::GREATER,
     88     Collator::LESS,
     89     Collator::LESS
     90 };
     91 
     92 // 0x0300 is grave, 0x0301 is acute
     93 // the order of elements in this array must be different than the order in CollationEnglishTest
     94 const UChar CollationFrenchTest::testAcute[][CollationFrenchTest::MAX_TOKEN_LEN] =
     95 {
     96 /*00*/    {0x0065/*'e'*/, 0x0065/*'e'*/,  0x0000},
     97 /*01*/    {0x0065/*'e'*/, 0x0301, 0x0065/*'e'*/,  0x0000},
     98 /*02*/    {0x0065/*'e'*/, 0x0300, 0x0301, 0x0065/*'e'*/,  0x0000},
     99 /*03*/    {0x0065/*'e'*/, 0x0300, 0x0065/*'e'*/,  0x0000},
    100 /*04*/    {0x0065/*'e'*/, 0x0301, 0x0300, 0x0065/*'e'*/,  0x0000},
    101 /*05*/    {0x0065/*'e'*/, 0x0065/*'e'*/, 0x0301, 0x0000},
    102 /*06*/    {0x0065/*'e'*/, 0x0301, 0x0065/*'e'*/, 0x0301, 0x0000},
    103 /*07*/    {0x0065/*'e'*/, 0x0300, 0x0301, 0x0065/*'e'*/, 0x0301, 0x0000},
    104 /*08*/    {0x0065/*'e'*/, 0x0300, 0x0065/*'e'*/, 0x0301, 0x0000},
    105 /*09*/    {0x0065/*'e'*/, 0x0301, 0x0300, 0x0065/*'e'*/, 0x0301, 0x0000},
    106 /*0a*/    {0x0065/*'e'*/, 0x0065/*'e'*/, 0x0300, 0x0301, 0x0000},
    107 /*0b*/    {0x0065/*'e'*/, 0x0301, 0x0065/*'e'*/, 0x0300, 0x0301, 0x0000},
    108 /*0c*/    {0x0065/*'e'*/, 0x0300, 0x0301, 0x0065/*'e'*/, 0x0300, 0x0301, 0x0000},
    109 /*0d*/    {0x0065/*'e'*/, 0x0300, 0x0065/*'e'*/, 0x0300, 0x0301, 0x0000},
    110 /*0e*/    {0x0065/*'e'*/, 0x0301, 0x0300, 0x0065/*'e'*/, 0x0300, 0x0301, 0x0000},
    111 /*0f*/    {0x0065/*'e'*/, 0x0065/*'e'*/, 0x0300, 0x0000},
    112 /*10*/    {0x0065/*'e'*/, 0x0301, 0x0065/*'e'*/, 0x0300, 0x0000},
    113 /*11*/    {0x0065/*'e'*/, 0x0300, 0x0301, 0x0065/*'e'*/, 0x0300, 0x0000},
    114 /*12*/    {0x0065/*'e'*/, 0x0300, 0x0065/*'e'*/, 0x0300, 0x0000},
    115 /*13*/    {0x0065/*'e'*/, 0x0301, 0x0300, 0x0065/*'e'*/, 0x0300, 0x0000},
    116 /*14*/    {0x0065/*'e'*/, 0x0065/*'e'*/, 0x0301, 0x0300, 0x0000},
    117 /*15*/    {0x0065/*'e'*/, 0x0301, 0x0065/*'e'*/, 0x0301, 0x0300, 0x0000},
    118 /*16*/    {0x0065/*'e'*/, 0x0300, 0x0301, 0x0065/*'e'*/, 0x0301, 0x0300, 0x0000},
    119 /*17*/    {0x0065/*'e'*/, 0x0300, 0x0065/*'e'*/, 0x0301, 0x0300, 0x0000},
    120 /*18*/    {0x0065/*'e'*/, 0x0301, 0x0300, 0x0065/*'e'*/, 0x0301, 0x0300, 0x0000}
    121 };
    122 
    123 const UChar CollationFrenchTest::testBugs[][CollationFrenchTest::MAX_TOKEN_LEN] =
    124 {
    125     {0x0061/*'a'*/, 0x000},
    126     {0x0041/*'A'*/, 0x000},
    127     {0x0065/*'e'*/, 0x000},
    128     {0x0045/*'E'*/, 0x000},
    129     {0x00e9, 0x000},
    130     {0x00e8, 0x000},
    131     {0x00ea, 0x000},
    132     {0x00eb, 0x000},
    133     {0x0065/*'e'*/, 0x0061/*'a'*/, 0x000},
    134     {0x0078/*'x'*/, 0x000}
    135 };
    136 
    137 void CollationFrenchTest::TestTertiary(/* char* par */)
    138 {
    139     int32_t i = 0;
    140     UErrorCode status = U_ZERO_ERROR;
    141     myCollation->setStrength(Collator::TERTIARY);
    142     myCollation->setAttribute(UCOL_FRENCH_COLLATION, UCOL_ON, status);
    143     myCollation->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, status);
    144     if (U_FAILURE(status)) {
    145         errln("Error setting attribute in French collator");
    146     }
    147     else
    148     {
    149         for (i = 0; i < 12 ; i++)
    150         {
    151             doTest(myCollation, testSourceCases[i], testTargetCases[i], results[i]);
    152         }
    153     }
    154 }
    155 
    156 void CollationFrenchTest::TestSecondary(/* char* par */)
    157 {
    158     //test acute and grave ordering
    159     int32_t i = 0;
    160     int32_t j;
    161     Collator::EComparisonResult expected;
    162     UErrorCode status = U_ZERO_ERROR;
    163     //myCollation->setAttribute(UCOL_FRENCH_COLLATION, UCOL_ON, status);
    164     myCollation->setStrength(Collator::SECONDARY);
    165     if (U_FAILURE(status))
    166         errln("Error setting attribute in French collator");
    167     else
    168     {
    169         const int32_t testAcuteSize = (int32_t)(sizeof(testAcute) / sizeof(testAcute[0]));
    170         for (i = 0; i < testAcuteSize; i++)
    171         {
    172             for (j = 0; j < testAcuteSize; j++)
    173             {
    174                 if (i <  j)
    175                     expected = Collator::LESS;
    176                 else if (i == j)
    177                     expected = Collator::EQUAL;
    178                 else // (i >  j)
    179                     expected = Collator::GREATER;
    180                 doTest(myCollation, testAcute[i], testAcute[j], expected );
    181             }
    182         }
    183     }
    184 }
    185 
    186 void CollationFrenchTest::TestExtra(/* char* par */)
    187 {
    188     int32_t i, j;
    189     myCollation->setStrength(Collator::TERTIARY);
    190     for (i = 0; i < 9 ; i++)
    191     {
    192         for (j = i + 1; j < 10; j += 1)
    193         {
    194             doTest(myCollation, testBugs[i], testBugs[j], Collator::LESS);
    195         }
    196     }
    197 }
    198 
    199 void CollationFrenchTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
    200 {
    201     if (exec) logln("TestSuite CollationFrenchTest: ");
    202 
    203     if((!myCollation) && exec) {
    204         dataerrln(__FILE__ " cannot test - failed to create collator.");
    205         name = "some test";
    206         return;
    207     }
    208 
    209     switch (index) {
    210         case 0: name = "TestSecondary"; if (exec)   TestSecondary(/* par */); break;
    211         case 1: name = "TestTertiary";  if (exec)   TestTertiary(/* par */); break;
    212         case 2: name = "TestExtra";     if (exec)   TestExtra(/* par */); break;
    213         default: name = ""; break;
    214     }
    215 }
    216 
    217 #endif /* #if !UCONFIG_NO_COLLATION */
    218