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
18static 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
116static 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=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
223static 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
310U_CFUNC void
311addTranslitTest(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