Reworked scanf() testing. General cleanups.
[fw/pdclib] / testing / printf_testcases.h
1     {
2
3 /* Be afraid. Be very afraid.
4    Virtually everything in the printf() / scanf() test drivers is heavily
5    depending on the platform, i.e. the width of the integer values. Since
6    we need widths, string representations in hex, octal and decimal and
7    whatnot, there is some heavy macro abuse coming up...
8 */
9
10 #define sym2v( x ) #x
11 #define sym2s( x ) sym2v( x )
12
13 #if INT_MAX >> 15 == 1
14
15 #define UINT_DIG 5
16 #define INT_DIG  5
17 #define INT_DIG_LESS1 "4"
18 #define INT_DIG_PLUS1 "6"
19 #define INT_DIG_PLUS2 "7"
20 #define INT_HEXDIG "FFF"
21 #define INT_hexdig "fff"
22 #define INT_OCTDIG "177777"
23 #define INT_MAX_DEZ_STR  "32767"
24 #define INT_MIN_DEZ_STR  "32768"
25 #define UINT_MAX_DEZ_STR "65535"
26 #define INT_MAX_OCT_STR
27 #define INT_MIN_OCT_STR
28 #define UINT_MAX_OCT_STR
29 #define INT_MAX_HEX_STR
30 #define INT_MIN_HEX_STR
31 #define UINT_MAX_HEX_STR
32
33 #elif UINT_MAX >> 31 == 1
34
35 #define UINT_DIG 10
36 #define INT_DIG  10
37 #define INT_DIG_LESS1 "9"
38 #define INT_DIG_PLUS1 "11"
39 #define INT_DIG_PLUS2 "12"
40 #define INT_HEXDIG "FFFFFFF"
41 #define INT_hexdig "fffffff"
42 #define INT_OCTDIG "37777777777"
43 #define INT_MAX_DEZ_STR  "2147483647"
44 #define INT_MIN_DEZ_STR  "2147483648"
45 #define UINT_MAX_DEZ_STR "4294967295"
46 #define INT_MAX_OCT_STR
47 #define INT_MIN_OCT_STR
48 #define UINT_MAX_OCT_STR
49 #define INT_MAX_HEX_STR
50 #define INT_MIN_HEX_STR
51 #define UINT_MAX_HEX_STR
52
53 #elif UINT_MAX >> 63 == 1
54
55 #define UINT_DIG 20
56 #define INT_DIG  19
57 #define INT_DIG_LESS1 "18"
58 #define INT_DIG_PLUS1 "20"
59 #define INT_DIG_PLUS2 "21"
60 #define INT_HEXDIG "FFFFFFFFFFFFFFF"
61 #define INT_hexdig "fffffffffffffff"
62 #define INT_OCTDIG "1777777777777777777777"
63 #define INT_MAX_DEZ_STR   "9223372036854775807"
64 #define INT_MIN_DEZ_STR   "9223372036854775808"
65 #define UINT_MAX_DEZ_STR "18446744073709551615"
66 #define INT_MAX_OCT_STR
67 #define INT_MIN_OCT_STR
68 #define UINT_MAX_OCT_STR
69 #define INT_MAX_HEX_STR
70 #define INT_MIN_HEX_STR
71 #define UINT_MAX_HEX_STR
72
73 #else
74
75 #error Unsupported width of 'int' (neither 16, 32, nor 64 bit).
76
77 #endif
78
79
80 #if ULONG_MAX >> 31 == 1
81
82 #define ULONG_DIG 10
83 #define LONG_DIG  10
84 #define LONG_MAX_DEZ_STR  "2147483647"
85 #define LONG_MIN_DEZ_STR  "2147483648"
86 #define ULONG_MAX_DEZ_STR "4294967295"
87 #define LONG_MAX_OCT_STR
88 #define LONG_MIN_OCT_STR
89 #define ULONG_MAX_OCT_STR
90 #define LONG_MAX_HEX_STR
91 #define LONG_MIN_HEX_STR
92 #define ULONG_MAX_HEX_STR
93
94 #elif ULONG_MAX >> 63 == 1
95
96 #define ULONG_DIG 20
97 #define LONG_DIG  19
98 #define LONG_MAX_DEZ_STR   "9223372036854775807"
99 #define LONG_MIN_DEZ_STR   "9223372036854775808"
100 #define ULONG_MAX_DEZ_STR "18446744073709551615"
101 #define LONG_MAX_OCT_STR
102 #define LONG_MIN_OCT_STR
103 #define ULONG_MAX_OCT_STR
104 #define LONG_MAX_HEX_STR
105 #define LONG_MIN_HEX_STR
106 #define ULONG_MAX_HEX_STR
107
108 #else
109
110 #error Unsupported width of 'long' (neither 32 nor 64 bit).
111
112 #endif
113
114
115 #if ULLONG_MAX >> 63 == 1
116
117 #define ULLONG_DIG 20
118 #define LLONG_DIG  19
119 #define LLONG_MAX_DEZ_STR   "9223372036854775807"
120 #define LLONG_MIN_DEZ_STR   "9223372036854775808"
121 #define ULLONG_MAX_DEZ_STR "18446744073709551615"
122 #define LLONG_MAX_OCT_STR
123 #define LLONG_MIN_OCT_STR
124 #define ULLONG_MAX_OCT_STR
125 #define LLONG_MAX_HEX_STR
126 #define LLONG_MIN_HEX_STR
127 #define ULLONG_MAX_HEX_STR
128
129 #elif ULLONG_MAX >> 127 == 1
130
131 #define ULLONG_DIG 38
132 #define LLONG_DIG  38
133 #define LLONG_MAX_DEZ_STR  "170141183460469231731687303715884105727"
134 #define LLONG_MIN_DEZ_STR  "170141183460469231731687303715884105728"
135 #define ULLONG_MAX_DEZ_STR "340282366920938463463374607431768211455"
136 #define LLONG_MAX_OCT_STR
137 #define LLONG_MIN_OCT_STR
138 #define ULLONG_MAX_OCT_STR
139 #define LLONG_MAX_HEX_STR
140 #define LLONG_MIN_HEX_STR
141 #define ULLONG_MAX_HEX_STR
142
143 #else
144
145 #error Unsupported width of 'long long' (neither 64 nor 128 bit).
146
147 #endif
148
149
150     PRINTF_TEST( 4,   "-128", "%hhd", CHAR_MIN );
151     PRINTF_TEST( 3,    "127", "%hhd", CHAR_MAX );
152     PRINTF_TEST( 1,      "0", "%hhd", 0 );
153     PRINTF_TEST( 6, "-32768",  "%hd", SHRT_MIN );
154     PRINTF_TEST( 5,  "32767",  "%hd", SHRT_MAX );
155     PRINTF_TEST( 1,      "0",  "%hd", 0 );
156     PRINTF_TEST( INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%d", INT_MIN );
157     PRINTF_TEST( INT_DIG, INT_MAX_DEZ_STR, "%d", INT_MAX );
158     PRINTF_TEST( 1, "0", "%d", 0 );
159     PRINTF_TEST( LONG_DIG + 1, "-" LONG_MIN_DEZ_STR, "%ld", LONG_MIN );
160     PRINTF_TEST( LONG_DIG, LONG_MAX_DEZ_STR, "%ld", LONG_MAX );
161     PRINTF_TEST( 1, "0", "%ld", 0l );
162     PRINTF_TEST( LLONG_DIG + 1, "-" LLONG_MIN_DEZ_STR, "%lld", LLONG_MIN );
163     PRINTF_TEST( LLONG_DIG, LLONG_MAX_DEZ_STR, "%lld", LLONG_MAX );
164     PRINTF_TEST( 1, "0", "%lld", 0ll );
165     PRINTF_TEST( 3, "255", "%hhu", UCHAR_MAX );
166     PRINTF_TEST( 3, "255", "%hhu", (unsigned char)-1 );
167     PRINTF_TEST( 5, "65535", "%hu", USHRT_MAX );
168     PRINTF_TEST( 5, "65535", "%hu", (unsigned short)-1 );
169     PRINTF_TEST( UINT_DIG, UINT_MAX_DEZ_STR, "%u", UINT_MAX );
170     PRINTF_TEST( UINT_DIG, UINT_MAX_DEZ_STR, "%u", -1u );
171     PRINTF_TEST( ULONG_DIG, ULONG_MAX_DEZ_STR, "%lu", ULONG_MAX );
172     PRINTF_TEST( ULONG_DIG, ULONG_MAX_DEZ_STR, "%lu", -1ul );
173     PRINTF_TEST( ULLONG_DIG, ULLONG_MAX_DEZ_STR, "%llu", ULLONG_MAX );
174     PRINTF_TEST( ULLONG_DIG, ULLONG_MAX_DEZ_STR, "%llu", -1ull );
175     PRINTF_TEST( (int)strlen( INT_HEXDIG ) + 1, "F" INT_HEXDIG, "%X", UINT_MAX );
176     PRINTF_TEST( (int)strlen( INT_HEXDIG ) + 3, "0XF" INT_HEXDIG, "%#X", -1u );
177     PRINTF_TEST( (int)strlen( INT_HEXDIG ) + 1, "f" INT_hexdig, "%x", UINT_MAX );
178     PRINTF_TEST( (int)strlen( INT_HEXDIG ) + 3, "0xf" INT_hexdig, "%#x", -1u );
179     PRINTF_TEST( (int)strlen( INT_OCTDIG ), INT_OCTDIG, "%o", UINT_MAX );
180     PRINTF_TEST( (int)strlen( INT_OCTDIG ) + 1, "0" INT_OCTDIG, "%#o", -1u );
181 #if 0
182     /* TODO: This test case is broken, doesn't test what it was intended to. */
183     PRINTF_TEST( 5, "%.0#o", "%.0#o", 0 );
184 #endif
185     PRINTF_TEST( INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%+d", INT_MIN );
186     PRINTF_TEST( INT_DIG + 1, "+" INT_MAX_DEZ_STR, "%+d", INT_MAX );
187     PRINTF_TEST( 2, "+0", "%+d", 0 );
188     PRINTF_TEST( UINT_DIG, UINT_MAX_DEZ_STR, "%+u", UINT_MAX );
189     PRINTF_TEST( UINT_DIG, UINT_MAX_DEZ_STR, "%+u", -1u );
190     PRINTF_TEST( INT_DIG + 1, "-" INT_MIN_DEZ_STR, "% d", INT_MIN );
191     PRINTF_TEST( INT_DIG + 1, " " INT_MAX_DEZ_STR, "% d", INT_MAX );
192     PRINTF_TEST( 2, " 0", "% d", 0 );
193     PRINTF_TEST( UINT_DIG, UINT_MAX_DEZ_STR, "% u", UINT_MAX );
194     PRINTF_TEST( UINT_DIG, UINT_MAX_DEZ_STR, "% u", -1u );
195     PRINTF_TEST( INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%" INT_DIG_LESS1 "d", INT_MIN );
196     PRINTF_TEST( INT_DIG, INT_MAX_DEZ_STR, "%" INT_DIG_LESS1 "d", INT_MAX );
197     PRINTF_TEST( INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%" sym2s(INT_DIG) "d", INT_MIN );
198     PRINTF_TEST( INT_DIG, INT_MAX_DEZ_STR, "%" sym2s(INT_DIG) "d", INT_MAX );
199     PRINTF_TEST( INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%" INT_DIG_PLUS1 "d", INT_MIN );
200     PRINTF_TEST( INT_DIG + 1, " " INT_MAX_DEZ_STR, "%" INT_DIG_PLUS1 "d", INT_MAX );
201     PRINTF_TEST( INT_DIG + 2, " -" INT_MIN_DEZ_STR, "%" INT_DIG_PLUS2 "d", INT_MIN );
202     PRINTF_TEST( INT_DIG + 2, "  " INT_MAX_DEZ_STR, "%" INT_DIG_PLUS2 "d", INT_MAX );
203     PRINTF_TEST( INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%-" INT_DIG_LESS1 "d", INT_MIN );
204     PRINTF_TEST( INT_DIG, INT_MAX_DEZ_STR, "%-" INT_DIG_LESS1 "d", INT_MAX );
205     PRINTF_TEST( INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%-" sym2s(INT_DIG) "d", INT_MIN );
206     PRINTF_TEST( INT_DIG, INT_MAX_DEZ_STR, "%-" sym2s(INT_DIG) "d", INT_MAX );
207     PRINTF_TEST( INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%-" INT_DIG_PLUS1 "d", INT_MIN );
208     PRINTF_TEST( INT_DIG + 1, INT_MAX_DEZ_STR " ", "%-" INT_DIG_PLUS1 "d", INT_MAX );
209     PRINTF_TEST( INT_DIG + 2, "-" INT_MIN_DEZ_STR " ", "%-" INT_DIG_PLUS2 "d", INT_MIN );
210     PRINTF_TEST( INT_DIG + 2, INT_MAX_DEZ_STR "  ", "%-" INT_DIG_PLUS2 "d", INT_MAX );
211     PRINTF_TEST( INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%0" INT_DIG_LESS1 "d", INT_MIN );
212     PRINTF_TEST( INT_DIG, INT_MAX_DEZ_STR, "%0" INT_DIG_LESS1 "d", INT_MAX );
213     PRINTF_TEST( INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%0" sym2s(INT_DIG) "d", INT_MIN );
214     PRINTF_TEST( INT_DIG, INT_MAX_DEZ_STR, "%0" sym2s(INT_DIG) "d", INT_MAX );
215     PRINTF_TEST( INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%0" INT_DIG_PLUS1 "d", INT_MIN );
216     PRINTF_TEST( INT_DIG + 1, "0" INT_MAX_DEZ_STR, "%0" INT_DIG_PLUS1 "d", INT_MAX );
217     PRINTF_TEST( INT_DIG + 2, "-0" INT_MIN_DEZ_STR, "%0" INT_DIG_PLUS2 "d", INT_MIN );
218     PRINTF_TEST( INT_DIG + 2, "00" INT_MAX_DEZ_STR, "%0" INT_DIG_PLUS2 "d", INT_MAX );
219     PRINTF_TEST( INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%-0" INT_DIG_LESS1 "d", INT_MIN );
220     PRINTF_TEST( INT_DIG, INT_MAX_DEZ_STR, "%-0" INT_DIG_LESS1 "d", INT_MAX );
221     PRINTF_TEST( INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%-0" sym2s(INT_DIG) "d", INT_MIN );
222     PRINTF_TEST( INT_DIG, INT_MAX_DEZ_STR, "%-0" sym2s(INT_DIG) "d", INT_MAX );
223     PRINTF_TEST( INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%-0" INT_DIG_PLUS1 "d", INT_MIN );
224     PRINTF_TEST( INT_DIG + 1, INT_MAX_DEZ_STR " ", "%-0" INT_DIG_PLUS1 "d", INT_MAX );
225     PRINTF_TEST( INT_DIG + 2, "-" INT_MIN_DEZ_STR " ", "%-0" INT_DIG_PLUS2 "d", INT_MIN );
226     PRINTF_TEST( INT_DIG + 2, INT_MAX_DEZ_STR "  ", "%-0" INT_DIG_PLUS2 "d", INT_MAX );
227     /* FIXME: This test not yet 32/64 bit agnostic */
228     PRINTF_TEST( 30, "          00000000002147483647", "%030.20d", INT_MAX );
229     PRINTF_TEST( (int)strlen( INT_HEXDIG ) + 1, "f" INT_hexdig, "%.6x", UINT_MAX );
230     PRINTF_TEST( (int)strlen( INT_HEXDIG ) + 3, "0xf" INT_hexdig, "%#6.3x", UINT_MAX );
231     PRINTF_TEST( (int)strlen( INT_HEXDIG ) + 3, "0xf" INT_hexdig, "%#3.6x", UINT_MAX );
232     PRINTF_TEST( INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%.6d", INT_MIN );
233     PRINTF_TEST( INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%6.3d", INT_MIN );
234     PRINTF_TEST( INT_DIG + 1., "-" INT_MIN_DEZ_STR, "%3.6d", INT_MIN );
235     PRINTF_TEST( UINT_DIG, "0xf" INT_hexdig, "%#0.6x", UINT_MAX );
236     PRINTF_TEST( UINT_DIG, "0xf" INT_hexdig, "%#06.3x", UINT_MAX );
237     PRINTF_TEST( UINT_DIG, "0xf" INT_hexdig, "%#03.6x", UINT_MAX );
238     PRINTF_TEST( INT_DIG, INT_MAX_DEZ_STR, "%#0.6d", INT_MAX );
239     PRINTF_TEST( INT_DIG, INT_MAX_DEZ_STR, "%#06.3d", INT_MAX );
240     PRINTF_TEST( INT_DIG, INT_MAX_DEZ_STR, "%#03.6d", INT_MAX );
241     PRINTF_TEST( INT_DIG + 1, "+" INT_MAX_DEZ_STR, "%#+.6d", INT_MAX );
242     PRINTF_TEST( INT_DIG + 1, "+" INT_MAX_DEZ_STR, "%#+6.3d", INT_MAX );
243     PRINTF_TEST( INT_DIG + 1, "+" INT_MAX_DEZ_STR, "%#+3.6d", INT_MAX );
244     PRINTF_TEST( INT_DIG + 1, "+" INT_MAX_DEZ_STR, "%+0.6d", INT_MAX );
245     PRINTF_TEST( INT_DIG + 1, "+" INT_MAX_DEZ_STR, "%+06.3d", INT_MAX );
246     PRINTF_TEST( INT_DIG + 1, "+" INT_MAX_DEZ_STR, "%+03.6d", INT_MAX );
247 #ifndef TEST_CONVERSION_ONLY
248     PRINTF_TEST( INT_DIG + 2, "- " INT_MAX_DEZ_STR, "- %d", INT_MAX );
249     PRINTF_TEST( INT_DIG * 2 + 6, "- " INT_MAX_DEZ_STR " % -" INT_MIN_DEZ_STR, "- %d %% %d", INT_MAX, INT_MIN );
250 #endif
251     PRINTF_TEST( 1, "x", "%c", 'x' );
252     PRINTF_TEST( 6, "abcdef", "%s", "abcdef" );
253     /* FIXME: This test not yet 32/64 bit agnostic */
254     PRINTF_TEST( 10, "0xdeadbeef", "%p", (void *)0xdeadbeef );
255     PRINTF_TEST( 6, "   0x1", "%#6x", 1 );
256 #ifndef TEST_CONVERSION_ONLY
257     {
258         int val1, val2;
259         PRINTF_TEST( 9, "123456789", "123456%n789%n", &val1, &val2 );
260         TESTCASE( val1 == 6 );
261         TESTCASE( val2 == 9 );
262     }
263 #endif
264     }