Home | History | Annotate | Download | only in cintltst
      1 /********************************************************************
      2  * COPYRIGHT:
      3  * Copyright (c) 1999-2013, International Business Machines Corporation and
      4  * others. All Rights Reserved.
      5  ********************************************************************/
      6 #include "unicode/utypes.h"
      7 #include "unicode/ustring.h"
      8 #include "unicode/ctest.h"
      9 #include "unicode/ucnv.h"
     10 
     11 void TestEuroRegression(void);
     12 void addTestEuroRegression(TestNode** root);
     13 
     14 #if !UCONFIG_NO_LEGACY_CONVERSION
     15 void addTestEuroRegression(TestNode** root)
     16 {
     17     addTest(root, &TestEuroRegression, "tsconv/eurocreg/TestEuroRegression");
     18 }
     19 
     20 /*
     21  * The table below lists codepages that are supposed to have roundtrip mappings for
     22  * the U+20AC Euro sign.
     23  *
     24  * Changes made 2000nov28 and marked as such are due to the following:
     25  *
     26  * After updating all ibm-*.ucm files with precise fallback indicators (|0, |1, |3),
     27  * some of these codepages failed the Euro regression test.
     28  * This means that the actuall mappings changed when only the preciseness of fallback
     29  * mappings should have changed.
     30  * My (Markus) suspicion is that some files got Euro sign mappings added manually,
     31  * changing their contents compared to the NLTC (IBM Toronto codepage database) definition.
     32  * Such changes are highly undesirable because they effectively define new codepages.
     33  * Codepage mapping files with "ibm-*.ucm" should always exactly match the files
     34  * from the IBM codepage database.
     35  * (If there are several mappings with the same number, then we choose the
     36  * default mappings with Private-Use Area assignments.)
     37  *
     38  * Also, in the past, some aliases were set such that e.g. cp850 became an alias for ibm-858.
     39  * This followed the practice of OS/2 that uses the old codepage number 850 for the new
     40  * codepage 858, with the main difference being the additional Euro sign.
     41  * However, we have documented that the "cp" prefix should be used for Microsoft-compatible
     42  * codepages, and Microsoft Windows 2000's codepage 850 does not contain a Euro sign mapping.
     43  * Therefore, cp850 must not support the Euro sign.
     44  * In these cases, I have changed the codepage name here to point to a newer codepage with the
     45  * Euro sign, using its new name.
     46  * I could not find such "updates" for codepages 1362 and 1363 - we might want to supply them later.
     47  */
     48 
     49 static const char convertersToCheck[][15] = {
     50   "cp1250",
     51   "cp1251",
     52   "cp1252",
     53   "cp1254",
     54   "cp1255",
     55   "cp1256",
     56   "cp1257",
     57   "cp1258",
     58   "ibm1140",
     59   "ibm1142",
     60   "ibm1143",
     61   "ibm1144",
     62   "ibm1145",
     63   "ibm1146",
     64   "ibm1147",
     65   "ibm1148",
     66   "ibm1149",
     67   "ibm1153",
     68   "ibm1154",
     69   "ibm1155",
     70   "ibm1156",
     71   "ibm1157",
     72   "ibm1158",
     73   /*"ibm-1159",*/ /* removed 2003Apr17 */
     74   "ibm12712",
     75   "ibm16804",
     76   "ibm-1160",
     77   "ibm-1162",
     78   "ibm-1164",
     79 
     80   "ibm-858", /* was "cp850" changed 2000nov28 */
     81   /* duplicate "cp850" removed 2000nov28 */
     82   /*"ibm-9049",*/ /* was "cp857" changed 2002nov25 */
     83   "ibm-12712", /* was "cp424" changed 2000nov28 */
     84   "ibm-4899", /* was "cp803" changed 2000nov28 */
     85   "ibm-867", /* was "cp862" changed 2002nov25 */
     86   "cp1258",
     87   "windows-950",
     88   "cp1253",
     89   /*  "cp819",
     90       "cp13488",*/
     91   "ibm-4971",
     92   /*"ibm-9061",*/ /* was "cp869" changed 2002nov25 */
     93   /* "cp813",*/
     94   /*"ibm-9044",*/ /* was "cp852" changed 2002nov25 */
     95   /*"ibm-872",*/ /* was "cp855" changed 2002nov25 */
     96   /*"ibm-808",*/ /* was "cp866" changed 2002nov25 */
     97 /*  "cp1131",
     98   "cp1125",*/
     99   "ibm-902", /* was "cp922" changed 2003jan08 */
    100   "ibm-901", /* was "cp921" changed 2003jan09 */
    101   /*"ibm-17248",*/ /* was "cp864" changed 2002nov25 */
    102   /*"cp1008",
    103   "cp1046",*/
    104   /*  "cp9066",
    105       "cp1129",*/
    106   "ibm-5123", /* was "cp1027" changed 2003jan08 */
    107   /* "cp300",*/
    108   /* "cp4930",*/
    109   "ibm-1364",
    110   /* "cp1362" removed 2000nov28 */
    111   "cp1363",
    112   /* "cp1114", removed 2002jul3
    113      "cp947", removed 2002jul3 */
    114   "gb18030",
    115   ""};
    116 
    117 UBool isEuroAware(UConverter*);
    118 
    119 void TestEuroRegression()
    120 {
    121     int32_t i=0;
    122 
    123     do
    124     {
    125         UErrorCode err = U_ZERO_ERROR;
    126         UConverter* myConv =  ucnv_open(convertersToCheck[i], &err);
    127         if (U_FAILURE(err)&&convertersToCheck[i][0])
    128             log_data_err("%s  \tMISSING [%s]\n", convertersToCheck[i], u_errorName(err));
    129         else
    130         {
    131             if (isEuroAware(myConv))
    132                 log_verbose("%s  \tsupports euro\n", convertersToCheck[i]);
    133             else
    134                 log_err("%s  \tDOES NOT support euro\n", convertersToCheck[i]);
    135             ucnv_close(myConv);
    136         }
    137     } while (convertersToCheck[++i][0]);
    138 }
    139 
    140 UBool isEuroAware(UConverter* myConv)
    141 {
    142     static const UChar euroString[2] = { 0x20AC, 0x0000 };
    143     char target[20];
    144     UChar euroBack[2];
    145     int32_t targetSize, euroBackSize;
    146     UErrorCode err = U_ZERO_ERROR;
    147     /*const char* myName =   ucnv_getName(myConv, &err);*/
    148 
    149     targetSize = ucnv_fromUChars(myConv,
    150             target,
    151             sizeof(target),
    152             euroString,
    153             -1,
    154             &err);
    155     if (U_FAILURE(err))
    156     {
    157       log_err("Failure Occured in ucnv_fromUChars euro roundtrip test\n");
    158       return FALSE;
    159     }
    160     euroBackSize = ucnv_toUChars(myConv,
    161             euroBack,
    162             2,
    163             target,
    164             targetSize,
    165             &err);
    166     (void)euroBackSize;    /* Suppress set but not used warning. */
    167     if (U_FAILURE(err))
    168     {
    169         log_err("Failure Occured in ucnv_toUChars euro roundtrip test\n");
    170         return FALSE;
    171     }
    172     if (u_strcmp(euroString, euroBack))
    173     {
    174         /*      log_err("%s FAILED Euro rountrip\n", myName);*/
    175         return FALSE;
    176     }
    177     else
    178     {
    179         /*      log_verbose("%s PASSED Euro rountrip\n", myName);*/
    180         return TRUE;
    181     }
    182 
    183 }
    184 #else
    185 void addTestEuroRegression(TestNode** root)
    186 {
    187     /* test nothing... */
    188 }
    189 #endif
    190