• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
addTestEuroRegression(TestNode ** root)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 
TestEuroRegression()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 
isEuroAware(UConverter * myConv)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
addTestEuroRegression(TestNode ** root)185 void addTestEuroRegression(TestNode** root)
186 {
187     /* test nothing... */
188 }
189 #endif
190