Home | History | Annotate | Download | only in cintltst
      1 /********************************************************************
      2  * COPYRIGHT:
      3  * Copyright (c) 1997-2009, International Business Machines Corporation and
      4  * others. All Rights Reserved.
      5  ********************************************************************/
      6 /********************************************************************************
      7 *
      8 * File CJAPTST.C
      9 *
     10 * Modification History:
     11 *        Name                     Description
     12 *     Madhu Katragadda            Ported for C API
     13 * synwee                          Added TestBase, TestPlainDakutenHandakuten,
     14 *                                 TestSmallLarge, TestKatakanaHiragana,
     15 *                                 TestChooonKigoo
     16 *********************************************************************************/
     17 /**
     18  * CollationKannaTest is a third level test class.  This tests the locale
     19  * specific primary, secondary and tertiary rules.  For example, the ignorable
     20  * character '-' in string "black-bird".  The en_US locale uses the default
     21  * collation rules as its sorting sequence.
     22  */
     23 
     24 #include <stdlib.h>
     25 
     26 #include "unicode/utypes.h"
     27 
     28 #if !UCONFIG_NO_COLLATION
     29 
     30 #include "unicode/ucol.h"
     31 #include "unicode/uloc.h"
     32 #include "cintltst.h"
     33 #include "ccolltst.h"
     34 #include "callcoll.h"
     35 #include "cjaptst.h"
     36 #include "unicode/ustring.h"
     37 #include "string.h"
     38 
     39 static UCollator *myCollation;
     40 const static UChar testSourceCases[][MAX_TOKEN_LEN] = {
     41     {0xff9E, 0x0000},
     42     {0x3042, 0x0000},
     43     {0x30A2, 0x0000},
     44     {0x3042, 0x3042, 0x0000},
     45     {0x30A2, 0x30FC, 0x0000},
     46     {0x30A2, 0x30FC, 0x30C8, 0x0000}                               /*  6 */
     47 };
     48 
     49 const static UChar testTargetCases[][MAX_TOKEN_LEN] = {
     50     {0xFF9F, 0x0000},
     51     {0x30A2, 0x0000},
     52     {0x3042, 0x3042, 0x0000},
     53     {0x30A2, 0x30FC, 0x0000},
     54     {0x30A2, 0x30FC, 0x30C8, 0x0000},
     55     {0x3042, 0x3042, 0x3068, 0x0000}                              /*  6 */
     56 };
     57 
     58 const static UCollationResult results[] = {
     59     UCOL_LESS,
     60     UCOL_EQUAL, /*UCOL_LESS*/   /* Katakanas and Hiraganas are equal on tertiary level(ICU 2.0)*/
     61     UCOL_LESS,
     62     UCOL_GREATER, /*UCOL_LESS*/ /* Prolonged sound mark sorts BEFORE equivalent vowel (ICU 2.0)*/
     63     UCOL_LESS,
     64     UCOL_LESS, /*UCOL_GREATER*/ /* Prolonged sound mark sorts BEFORE equivalent vowel (ICU 2.0)*//*  6 */
     65 };
     66 
     67 const static UChar testBaseCases[][MAX_TOKEN_LEN] = {
     68   {0x30AB, 0x0000},
     69   {0x30AB, 0x30AD, 0x0000},
     70   {0x30AD, 0x0000},
     71   {0x30AD, 0x30AD, 0x0000}
     72 };
     73 
     74 const static UChar testPlainDakutenHandakutenCases[][MAX_TOKEN_LEN] = {
     75   {0x30CF, 0x30AB, 0x0000},
     76   {0x30D0, 0x30AB, 0x0000},
     77   {0x30CF, 0x30AD, 0x0000},
     78   {0x30D0, 0x30AD, 0x0000}
     79 };
     80 
     81 const static UChar testSmallLargeCases[][MAX_TOKEN_LEN] = {
     82   {0x30C3, 0x30CF, 0x0000},
     83   {0x30C4, 0x30CF, 0x0000},
     84   {0x30C3, 0x30D0, 0x0000},
     85   {0x30C4, 0x30D0, 0x0000}
     86 };
     87 
     88 const static UChar testKatakanaHiraganaCases[][MAX_TOKEN_LEN] = {
     89   {0x3042, 0x30C3, 0x0000},
     90   {0x30A2, 0x30C3, 0x0000},
     91   {0x3042, 0x30C4, 0x0000},
     92   {0x30A2, 0x30C4, 0x0000}
     93 };
     94 
     95 const static UChar testChooonKigooCases[][MAX_TOKEN_LEN] = {
     96   /*0*/ {0x30AB, 0x30FC, 0x3042, 0x0000},
     97   /*1*/ {0x30AB, 0x30FC, 0x30A2, 0x0000},
     98   /*2*/ {0x30AB, 0x30A4, 0x3042, 0x0000},
     99   /*3*/ {0x30AB, 0x30A4, 0x30A2, 0x0000},
    100   /*6*/ {0x30AD, 0x30FC, 0x3042, 0x0000}, /* Prolonged sound mark sorts BEFORE equivalent vowel (ICU 2.0)*/
    101   /*7*/ {0x30AD, 0x30FC, 0x30A2, 0x0000}, /* Prolonged sound mark sorts BEFORE equivalent vowel (ICU 2.0)*/
    102   /*4*/ {0x30AD, 0x30A4, 0x3042, 0x0000},
    103   /*5*/ {0x30AD, 0x30A4, 0x30A2, 0x0000},
    104 };
    105 
    106 void addKannaCollTest(TestNode** root)
    107 {
    108     addTest(root, &TestTertiary, "tscoll/cjacoll/TestTertiary");
    109     addTest(root, &TestBase, "tscoll/cjacoll/TestBase");
    110     addTest(root, &TestPlainDakutenHandakuten, "tscoll/cjacoll/TestPlainDakutenHandakuten");
    111     addTest(root, &TestSmallLarge, "tscoll/cjacoll/TestSmallLarge");
    112     addTest(root, &TestKatakanaHiragana, "tscoll/cjacoll/TestKatakanaHiragana");
    113     addTest(root, &TestChooonKigoo, "tscoll/cjacoll/TestChooonKigoo");
    114 }
    115 
    116 static void TestTertiary( )
    117 {
    118     int32_t i;
    119     UErrorCode status = U_ZERO_ERROR;
    120     myCollation = ucol_open("ja_JP", &status);
    121     if(U_FAILURE(status)){
    122         log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status));
    123         return;
    124     }
    125     log_verbose("Testing Kanna(Japan) Collation with Tertiary strength\n");
    126     ucol_setStrength(myCollation, UCOL_TERTIARY);
    127     ucol_setAttribute(myCollation, UCOL_CASE_LEVEL, UCOL_ON, &status);
    128     for (i = 0; i < 6 ; i++)
    129     {
    130         doTest(myCollation, testSourceCases[i], testTargetCases[i], results[i]);
    131     }
    132     ucol_close(myCollation);
    133 }
    134 
    135 /* Testing base letters */
    136 static void TestBase()
    137 {
    138     int32_t i;
    139     UErrorCode status = U_ZERO_ERROR;
    140     myCollation = ucol_open("ja_JP", &status);
    141     if (U_FAILURE(status))
    142     {
    143         log_err_status(status, "ERROR: in creation of rule based collator: %s\n",
    144             myErrorName(status));
    145         return;
    146     }
    147 
    148     log_verbose("Testing Japanese Base Characters Collation\n");
    149     ucol_setStrength(myCollation, UCOL_PRIMARY);
    150     for (i = 0; i < 3 ; i++)
    151         doTest(myCollation, testBaseCases[i], testBaseCases[i + 1], UCOL_LESS);
    152 
    153     ucol_close(myCollation);
    154 }
    155 
    156 /* Testing plain, Daku-ten, Handaku-ten letters */
    157 static void TestPlainDakutenHandakuten(void)
    158 {
    159     int32_t i;
    160     UErrorCode status = U_ZERO_ERROR;
    161     myCollation = ucol_open("ja_JP", &status);
    162     if (U_FAILURE(status))
    163     {
    164         log_err_status(status, "ERROR: in creation of rule based collator: %s\n",
    165             myErrorName(status));
    166         return;
    167     }
    168 
    169     log_verbose("Testing plain, Daku-ten, Handaku-ten letters Japanese Characters Collation\n");
    170     ucol_setStrength(myCollation, UCOL_SECONDARY);
    171     for (i = 0; i < 3 ; i++)
    172         doTest(myCollation, testPlainDakutenHandakutenCases[i],
    173         testPlainDakutenHandakutenCases[i + 1], UCOL_LESS);
    174 
    175     ucol_close(myCollation);
    176 }
    177 
    178 /*
    179 * Test Small, Large letters
    180 */
    181 static void TestSmallLarge(void)
    182 {
    183     int32_t i;
    184     UErrorCode status = U_ZERO_ERROR;
    185     myCollation = ucol_open("ja_JP", &status);
    186     if (U_FAILURE(status))
    187     {
    188         log_err_status(status, "ERROR: in creation of rule based collator: %s\n",
    189             myErrorName(status));
    190         return;
    191     }
    192 
    193     log_verbose("Testing Japanese Small and Large Characters Collation\n");
    194     ucol_setStrength(myCollation, UCOL_TERTIARY);
    195     ucol_setAttribute(myCollation, UCOL_CASE_LEVEL, UCOL_ON, &status);
    196     for (i = 0; i < 3 ; i++)
    197         doTest(myCollation, testSmallLargeCases[i], testSmallLargeCases[i + 1],
    198         UCOL_LESS);
    199 
    200     ucol_close(myCollation);
    201 }
    202 
    203 /*
    204 * Test Katakana, Hiragana letters
    205 */
    206 static void TestKatakanaHiragana(void)
    207 {
    208     int32_t i;
    209     UErrorCode status = U_ZERO_ERROR;
    210     myCollation = ucol_open("ja_JP", &status);
    211     if (U_FAILURE(status))
    212     {
    213         log_err_status(status, "ERROR: in creation of rule based collator: %s\n",
    214             myErrorName(status));
    215         return;
    216     }
    217 
    218     log_verbose("Testing Japanese Katakana, Hiragana Characters Collation\n");
    219     ucol_setStrength(myCollation, UCOL_QUATERNARY);
    220     ucol_setAttribute(myCollation, UCOL_CASE_LEVEL, UCOL_ON, &status);
    221     for (i = 0; i < 3 ; i++) {
    222         doTest(myCollation, testKatakanaHiraganaCases[i],
    223             testKatakanaHiraganaCases[i + 1], UCOL_LESS);
    224     }
    225 
    226     ucol_close(myCollation);
    227 }
    228 
    229 /*
    230 * Test Choo-on kigoo
    231 */
    232 static void TestChooonKigoo(void)
    233 {
    234     int32_t i;
    235     UErrorCode status = U_ZERO_ERROR;
    236     myCollation = ucol_open("ja_JP", &status);
    237     if (U_FAILURE(status))
    238     {
    239         log_err_status(status, "ERROR: in creation of rule based collator: %s\n",
    240             myErrorName(status));
    241         return;
    242     }
    243 
    244     log_verbose("Testing Japanese Choo-on Kigoo Characters Collation\n");
    245     ucol_setAttribute(myCollation, UCOL_STRENGTH, UCOL_QUATERNARY, &status);
    246     ucol_setAttribute(myCollation, UCOL_CASE_LEVEL, UCOL_ON, &status);
    247     for (i = 0; i < 7 ; i++) {
    248         doTest(myCollation, testChooonKigooCases[i], testChooonKigooCases[i + 1],
    249             UCOL_LESS);
    250     }
    251 
    252     ucol_close(myCollation);
    253 }
    254 
    255 #endif /* #if !UCONFIG_NO_COLLATION */
    256