1*ae771770SStanislav Sedov /*
2*ae771770SStanislav Sedov * Copyright (c) 2008 Kungliga Tekniska Högskolan
3*ae771770SStanislav Sedov * (Royal Institute of Technology, Stockholm, Sweden).
4*ae771770SStanislav Sedov * All rights reserved.
5*ae771770SStanislav Sedov *
6*ae771770SStanislav Sedov * Redistribution and use in source and binary forms, with or without
7*ae771770SStanislav Sedov * modification, are permitted provided that the following conditions
8*ae771770SStanislav Sedov * are met:
9*ae771770SStanislav Sedov *
10*ae771770SStanislav Sedov * 1. Redistributions of source code must retain the above copyright
11*ae771770SStanislav Sedov * notice, this list of conditions and the following disclaimer.
12*ae771770SStanislav Sedov *
13*ae771770SStanislav Sedov * 2. Redistributions in binary form must reproduce the above copyright
14*ae771770SStanislav Sedov * notice, this list of conditions and the following disclaimer in the
15*ae771770SStanislav Sedov * documentation and/or other materials provided with the distribution.
16*ae771770SStanislav Sedov *
17*ae771770SStanislav Sedov * 3. Neither the name of the Institute nor the names of its contributors
18*ae771770SStanislav Sedov * may be used to endorse or promote products derived from this software
19*ae771770SStanislav Sedov * without specific prior written permission.
20*ae771770SStanislav Sedov *
21*ae771770SStanislav Sedov * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22*ae771770SStanislav Sedov * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23*ae771770SStanislav Sedov * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24*ae771770SStanislav Sedov * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25*ae771770SStanislav Sedov * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26*ae771770SStanislav Sedov * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27*ae771770SStanislav Sedov * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28*ae771770SStanislav Sedov * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29*ae771770SStanislav Sedov * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30*ae771770SStanislav Sedov * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31*ae771770SStanislav Sedov * SUCH DAMAGE.
32*ae771770SStanislav Sedov */
33*ae771770SStanislav Sedov
34*ae771770SStanislav Sedov #include "windlocl.h"
35*ae771770SStanislav Sedov #include <stdio.h>
36*ae771770SStanislav Sedov #include <err.h>
37*ae771770SStanislav Sedov #include <assert.h>
38*ae771770SStanislav Sedov
39*ae771770SStanislav Sedov #define MAX_LENGTH 10
40*ae771770SStanislav Sedov
41*ae771770SStanislav Sedov
42*ae771770SStanislav Sedov struct testcase {
43*ae771770SStanislav Sedov unsigned int in_flags;
44*ae771770SStanislav Sedov size_t in_len;
45*ae771770SStanislav Sedov const char *in_ptr;
46*ae771770SStanislav Sedov int ret;
47*ae771770SStanislav Sedov size_t ucs2_len;
48*ae771770SStanislav Sedov uint16_t ucs2[MAX_LENGTH];
49*ae771770SStanislav Sedov unsigned int out_flags;
50*ae771770SStanislav Sedov } testcases[] = {
51*ae771770SStanislav Sedov {
52*ae771770SStanislav Sedov WIND_RW_BOM,
53*ae771770SStanislav Sedov 4, "\xff\xfe\x20\x00",
54*ae771770SStanislav Sedov 0,
55*ae771770SStanislav Sedov 1, { 0x0020 },
56*ae771770SStanislav Sedov WIND_RW_LE
57*ae771770SStanislav Sedov },
58*ae771770SStanislav Sedov {
59*ae771770SStanislav Sedov WIND_RW_BOM,
60*ae771770SStanislav Sedov 4, "\xfe\xff\x00\x20",
61*ae771770SStanislav Sedov 0,
62*ae771770SStanislav Sedov 1, { 0x0020 },
63*ae771770SStanislav Sedov WIND_RW_BE
64*ae771770SStanislav Sedov },
65*ae771770SStanislav Sedov /* only BE BOM */
66*ae771770SStanislav Sedov {
67*ae771770SStanislav Sedov WIND_RW_BOM,
68*ae771770SStanislav Sedov 2, "\xfe\xff",
69*ae771770SStanislav Sedov 0,
70*ae771770SStanislav Sedov 0, { 0 },
71*ae771770SStanislav Sedov WIND_RW_BE
72*ae771770SStanislav Sedov },
73*ae771770SStanislav Sedov /* no input */
74*ae771770SStanislav Sedov {
75*ae771770SStanislav Sedov WIND_RW_BOM,
76*ae771770SStanislav Sedov 0, "",
77*ae771770SStanislav Sedov 0,
78*ae771770SStanislav Sedov 0, { 0 },
79*ae771770SStanislav Sedov WIND_RW_BOM
80*ae771770SStanislav Sedov },
81*ae771770SStanislav Sedov /* BOM only */
82*ae771770SStanislav Sedov {
83*ae771770SStanislav Sedov WIND_RW_BOM,
84*ae771770SStanislav Sedov 2, "\xff\xfe",
85*ae771770SStanislav Sedov 0,
86*ae771770SStanislav Sedov 0, { 0 },
87*ae771770SStanislav Sedov WIND_RW_LE
88*ae771770SStanislav Sedov },
89*ae771770SStanislav Sedov /* water + z */
90*ae771770SStanislav Sedov {
91*ae771770SStanislav Sedov WIND_RW_BOM|WIND_RW_LE,
92*ae771770SStanislav Sedov 4, "\x34\x6C\x7A\x00",
93*ae771770SStanislav Sedov 0,
94*ae771770SStanislav Sedov 2, { 0x6C34, 0x7a },
95*ae771770SStanislav Sedov WIND_RW_LE
96*ae771770SStanislav Sedov },
97*ae771770SStanislav Sedov /* water + z */
98*ae771770SStanislav Sedov {
99*ae771770SStanislav Sedov WIND_RW_LE,
100*ae771770SStanislav Sedov 4, "\x34\x6C\x7A\x00",
101*ae771770SStanislav Sedov 0,
102*ae771770SStanislav Sedov 2, { 0x6C34, 0x7a },
103*ae771770SStanislav Sedov WIND_RW_LE
104*ae771770SStanislav Sedov },
105*ae771770SStanislav Sedov /* BOM + water + z */
106*ae771770SStanislav Sedov {
107*ae771770SStanislav Sedov WIND_RW_BOM,
108*ae771770SStanislav Sedov 6, "\xFF\xFE\x34\x6C\x7A\x00",
109*ae771770SStanislav Sedov 0,
110*ae771770SStanislav Sedov 2, { 0x6C34, 0x7a },
111*ae771770SStanislav Sedov WIND_RW_LE
112*ae771770SStanislav Sedov },
113*ae771770SStanislav Sedov /* BOM + water + z */
114*ae771770SStanislav Sedov {
115*ae771770SStanislav Sedov WIND_RW_BOM,
116*ae771770SStanislav Sedov 6, "\xFE\xFF\x6C\x34\x00\x7A",
117*ae771770SStanislav Sedov 0,
118*ae771770SStanislav Sedov 2, { 0x6C34, 0x7a },
119*ae771770SStanislav Sedov WIND_RW_BE
120*ae771770SStanislav Sedov },
121*ae771770SStanislav Sedov /* error, odd length */
122*ae771770SStanislav Sedov {
123*ae771770SStanislav Sedov WIND_RW_BOM,
124*ae771770SStanislav Sedov 1, "\xfe",
125*ae771770SStanislav Sedov WIND_ERR_LENGTH_NOT_MOD2,
126*ae771770SStanislav Sedov 0, { 0 },
127*ae771770SStanislav Sedov WIND_RW_BOM
128*ae771770SStanislav Sedov },
129*ae771770SStanislav Sedov /* error, missing BOM */
130*ae771770SStanislav Sedov {
131*ae771770SStanislav Sedov WIND_RW_BOM,
132*ae771770SStanislav Sedov 2, "\x00\x20",
133*ae771770SStanislav Sedov WIND_ERR_NO_BOM,
134*ae771770SStanislav Sedov 0, { 0 },
135*ae771770SStanislav Sedov WIND_RW_BOM
136*ae771770SStanislav Sedov },
137*ae771770SStanislav Sedov /* error, overrun */
138*ae771770SStanislav Sedov {
139*ae771770SStanislav Sedov WIND_RW_BE,
140*ae771770SStanislav Sedov 4, "\x00\x20\x00\x20",
141*ae771770SStanislav Sedov WIND_ERR_OVERRUN,
142*ae771770SStanislav Sedov 1, { 0x20 },
143*ae771770SStanislav Sedov WIND_RW_BOM
144*ae771770SStanislav Sedov }
145*ae771770SStanislav Sedov
146*ae771770SStanislav Sedov };
147*ae771770SStanislav Sedov
148*ae771770SStanislav Sedov int
main(void)149*ae771770SStanislav Sedov main(void)
150*ae771770SStanislav Sedov {
151*ae771770SStanislav Sedov unsigned int n, m, flags;
152*ae771770SStanislav Sedov uint16_t data[MAX_LENGTH];
153*ae771770SStanislav Sedov size_t datalen;
154*ae771770SStanislav Sedov int ret;
155*ae771770SStanislav Sedov
156*ae771770SStanislav Sedov for (n = 0; n < sizeof(testcases)/sizeof(testcases[0]); n++) {
157*ae771770SStanislav Sedov flags = testcases[n].in_flags;
158*ae771770SStanislav Sedov
159*ae771770SStanislav Sedov datalen = testcases[n].ucs2_len;
160*ae771770SStanislav Sedov assert(datalen < sizeof(data));
161*ae771770SStanislav Sedov
162*ae771770SStanislav Sedov ret = wind_ucs2read(testcases[n].in_ptr,
163*ae771770SStanislav Sedov testcases[n].in_len,
164*ae771770SStanislav Sedov &flags,
165*ae771770SStanislav Sedov data,
166*ae771770SStanislav Sedov &datalen);
167*ae771770SStanislav Sedov if (ret != testcases[n].ret)
168*ae771770SStanislav Sedov errx(1, "testcases %u: wind_ucs2read: %d", n, ret);
169*ae771770SStanislav Sedov
170*ae771770SStanislav Sedov /* on error, skip all other tests */
171*ae771770SStanislav Sedov if (ret)
172*ae771770SStanislav Sedov continue;
173*ae771770SStanislav Sedov
174*ae771770SStanislav Sedov if (flags != testcases[n].out_flags)
175*ae771770SStanislav Sedov errx(1, "testcases %u: flags wrong", n);
176*ae771770SStanislav Sedov
177*ae771770SStanislav Sedov if (datalen != testcases[n].ucs2_len)
178*ae771770SStanislav Sedov errx(1, "testcases %u: ucs len wrong", n);
179*ae771770SStanislav Sedov
180*ae771770SStanislav Sedov for (m = 0; m < datalen; m++)
181*ae771770SStanislav Sedov if (testcases[n].ucs2[m] != data[m])
182*ae771770SStanislav Sedov errx(1, "testcases %u: char %u wrong", n, m);
183*ae771770SStanislav Sedov }
184*ae771770SStanislav Sedov
185*ae771770SStanislav Sedov return 0;
186*ae771770SStanislav Sedov }
187