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