1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /*
4 **********************************************************************
5 * Copyright (C) 2005-2016, International Business Machines
6 * Corporation and others. All Rights Reserved.
7 **********************************************************************
8 * file name: strtst.c
9 * created by: George Rhoten
10 */
11
12 #include "cmemory.h"
13 #include "iotest.h"
14 #include "unicode/ustdio.h"
15 #include "unicode/utrans.h"
16 #include "unicode/ustring.h"
17
TestTranslitOps(void)18 static void TestTranslitOps(void)
19 {
20 #if !UCONFIG_NO_TRANSLITERATION
21 UFILE *f;
22 UErrorCode err = U_ZERO_ERROR;
23 UTransliterator *a = NULL, *b = NULL, *c = NULL;
24
25 log_verbose("opening a transliterator and UFILE for testing\n");
26
27 f = u_fopen(STANDARD_TEST_FILE, "w", "en_US_POSIX", NULL);
28 if(f == NULL)
29 {
30 log_err("Couldn't open test file for writing\n");
31 return;
32 }
33
34 a = utrans_open("Latin-Greek", UTRANS_FORWARD, NULL, -1, NULL, &err);
35 if(U_FAILURE(err))
36 {
37 log_err("Error opening transliterator %s\n", u_errorName(err));
38 u_fclose(f);
39 return;
40 }
41
42
43 log_verbose("setting a transliterator\n");
44 b = u_fsettransliterator(f, U_WRITE, a, &err);
45 if(U_FAILURE(err))
46 {
47 log_err("Error setting transliterator %s\n", u_errorName(err));
48 u_fclose(f);
49 return;
50 }
51
52 if(b != NULL)
53 {
54 log_err("Error, a transliterator was already set!\n");
55 }
56
57 b = u_fsettransliterator(NULL, U_WRITE, a, &err);
58 if(err != U_ILLEGAL_ARGUMENT_ERROR)
59 {
60 log_err("Error setting transliterator on NULL file err=%s\n", u_errorName(err));
61 }
62
63 if(b != a)
64 {
65 log_err("Error getting the same transliterator was not returned on NULL file\n");
66 }
67
68 err = U_FILE_ACCESS_ERROR;
69 b = u_fsettransliterator(f, U_WRITE, a, &err);
70 if(err != U_FILE_ACCESS_ERROR)
71 {
72 log_err("Error setting transliterator on error status err=%s\n", u_errorName(err));
73 }
74
75 if(b != a)
76 {
77 log_err("Error getting the same transliterator on error status\n");
78 }
79 err = U_ZERO_ERROR;
80
81
82 log_verbose("un-setting transliterator (setting to null)\n");
83 c = u_fsettransliterator(f, U_WRITE, NULL, &err);
84 if(U_FAILURE(err))
85 {
86 log_err("Err setting transliterator %s\n", u_errorName(err));
87 u_fclose(f);
88 return;
89 }
90
91 if(c != a)
92 {
93 log_err("Err, transliterator that came back was not the original one.\n");
94 }
95
96 log_verbose("Trying to set read transliterator (should fail)\n");
97 b = u_fsettransliterator(f, U_READ, NULL, &err);
98 if(err != U_UNSUPPORTED_ERROR)
99 {
100 log_err("Should have U_UNSUPPORTED_ERROR setting Read transliterator but got %s - REVISIT AND UPDATE TEST\n", u_errorName(err));
101 u_fclose(f);
102 return;
103 }
104 else
105 {
106 log_verbose("Got %s error (expected) setting READ transliterator.\n", u_errorName(err));
107 err = U_ZERO_ERROR;
108 }
109
110
111 utrans_close(c);
112 u_fclose(f);
113 #endif
114 }
115
TestTranslitFileOut(void)116 static void TestTranslitFileOut(void)
117 {
118 #if !UCONFIG_NO_FORMATTING
119 #if !UCONFIG_NO_TRANSLITERATION
120 UFILE *f;
121 UErrorCode err = U_ZERO_ERROR;
122 UTransliterator *a = NULL, *b = NULL, *c = NULL;
123 FILE *infile;
124 UChar compare[] = { 0xfeff, 0x03a3, 0x03c4, 0x03b5, 0x03c6, 0x1f00, 0x03bd, 0x03bf, 0x03c2, 0x043C, 0x0000 };
125 UChar ubuf[256];
126 int len;
127
128 log_verbose("opening a transliterator and UFILE for testing\n");
129
130 f = u_fopen(STANDARD_TEST_FILE, "w", "en_US_POSIX", "utf-16");
131 if(f == NULL)
132 {
133 log_err("Couldn't open test file for writing\n");
134 return;
135 }
136
137 a = utrans_open("Latin-Greek", UTRANS_FORWARD, NULL, -1, NULL, &err);
138 if(U_FAILURE(err))
139 {
140 log_err("Err opening transliterator %s\n", u_errorName(err));
141 u_fclose(f);
142 return;
143 }
144
145 log_verbose("setting a transliterator\n");
146 b = u_fsettransliterator(f, U_WRITE, a, &err);
147 if(U_FAILURE(err))
148 {
149 log_err("Err setting transliterator %s\n", u_errorName(err));
150 u_fclose(f);
151 return;
152 }
153
154 if(b != NULL)
155 {
156 log_err("Err, a transliterator was already set!\n");
157 }
158
159 u_fprintf(f, "Stephanos");
160
161 c = utrans_open("Latin-Cyrillic", UTRANS_FORWARD, NULL, -1, NULL, &err);
162 if(U_FAILURE(err))
163 {
164 log_err("Err opening transliterator %s\n", u_errorName(err));
165 u_fclose(f);
166 return;
167 }
168
169 log_verbose("setting a transliterator\n");
170 b = u_fsettransliterator(f, U_WRITE, c, &err);
171 if(U_FAILURE(err))
172 {
173 log_err("Err setting transliterator %s\n", u_errorName(err));
174 u_fclose(f);
175 return;
176 }
177
178 if(b != a)
179 {
180 log_err("Error: a different transliterator was returned!\n");
181 }
182 utrans_close(b);
183
184 u_fprintf(f, "m");
185
186 u_fclose(f);
187
188 log_verbose("Re reading test file to verify transliteration\n");
189 infile = fopen(STANDARD_TEST_FILE, "rb");
190 if(infile == NULL)
191 {
192 log_err("Couldn't reopen test file\n");
193 return;
194 }
195
196 len= (int)fread(ubuf, sizeof(UChar), u_strlen(compare), infile);
197 log_verbose("Read %d UChars\n", len);
198 if(len != u_strlen(compare))
199 {
200 log_err("Wanted %d UChars from file, got %d\n", u_strlen(compare), len);
201 }
202 ubuf[len]=0;
203
204 if(u_strlen(compare) != u_strlen(ubuf))
205 {
206 log_err("Wanted %d UChars from file, but u_strlen() returns %d\n", u_strlen(compare), len);
207 }
208
209 if(u_strcmp(compare, ubuf))
210 {
211 log_err("Read string doesn't match expected.\n");
212 }
213 else
214 {
215 log_verbose("Read string matches expected.\n");
216 }
217
218 fclose(infile);
219 #endif
220 #endif
221 }
222
TestTranslitStringOut(void)223 static void TestTranslitStringOut(void)
224 {
225 #if !UCONFIG_NO_FORMATTING
226 #if !UCONFIG_NO_TRANSLITERATION
227 UFILE *f;
228 UErrorCode err = U_ZERO_ERROR;
229 UTransliterator *a = NULL, *b = NULL, *c = NULL;
230 UChar compare[] = { 0x03a3, 0x03c4, 0x03b5, 0x03c6, 0x1f00, 0x03bd, 0x03bf, 0x03c2, 0x043C, 0x0000 };
231 UChar ubuf[256];
232
233 log_verbose("opening a transliterator and UFILE for testing\n");
234
235 f = u_fstropen(ubuf, UPRV_LENGTHOF(ubuf), "en_US_POSIX");
236 if(f == NULL)
237 {
238 log_err("Couldn't open test file for writing\n");
239 return;
240 }
241
242 a = utrans_open("Latin-Greek", UTRANS_FORWARD, NULL, -1, NULL, &err);
243 if(U_FAILURE(err))
244 {
245 log_err("Err opening transliterator %s\n", u_errorName(err));
246 u_fclose(f);
247 return;
248 }
249
250 log_verbose("setting a transliterator\n");
251 b = u_fsettransliterator(f, U_WRITE, a, &err);
252 if(U_FAILURE(err))
253 {
254 log_err("Err setting transliterator %s\n", u_errorName(err));
255 u_fclose(f);
256 return;
257 }
258
259 if(b != NULL)
260 {
261 log_err("Err, a transliterator was already set!\n");
262 }
263
264 u_fprintf(f, "Stephanos");
265
266 c = utrans_open("Latin-Cyrillic", UTRANS_FORWARD, NULL, -1, NULL, &err);
267 if(U_FAILURE(err))
268 {
269 log_err("Err opening transliterator %s\n", u_errorName(err));
270 u_fclose(f);
271 return;
272 }
273
274 log_verbose("setting a transliterator\n");
275 b = u_fsettransliterator(f, U_WRITE, c, &err);
276 if(U_FAILURE(err))
277 {
278 log_err("Err setting transliterator %s\n", u_errorName(err));
279 u_fclose(f);
280 return;
281 }
282
283 if(b != a)
284 {
285 log_err("Error: a different transliterator was returned!\n");
286 }
287 utrans_close(b);
288
289 u_fprintf(f, "m");
290
291 u_fclose(f);
292
293 if(u_strlen(compare) != u_strlen(ubuf))
294 {
295 log_err("Wanted %d UChars from file, but u_strlen() returns %d\n", u_strlen(compare), u_strlen(ubuf));
296 }
297
298 if(u_strcmp(compare, ubuf))
299 {
300 log_err("Read string doesn't match expected.\n");
301 }
302 else
303 {
304 log_verbose("Read string matches expected.\n");
305 }
306 #endif
307 #endif
308 }
309
310 U_CFUNC void
addTranslitTest(TestNode ** root)311 addTranslitTest(TestNode** root) {
312 #if !UCONFIG_NO_TRANSLITERATION
313 addTest(root, &TestTranslitOps, "translit/ops");
314 #if !UCONFIG_NO_FORMATTING
315 addTest(root, &TestTranslitFileOut, "translit/fileOut");
316 addTest(root, &TestTranslitStringOut, "translit/stringOut");
317 #endif
318 #endif
319 }
320