]> pd.if.org Git - pdclib/blob - testing/_PDCLIB_iotest.h
c3118dc95627d548d0d9a4a006ed4aae3c81fd1a
[pdclib] / testing / _PDCLIB_iotest.h
1 /* $Id$ */
2
3 /* PDCLib testing suite <_PDCLIB_test.h>
4
5    This file is part of the Public Domain C Library (PDCLib).
6    Permission is granted to use, modify, and / or redistribute at will.
7 */
8
9 /* -------------------------------------------------------------------------- */
10 /* Helper macros for printf() / scanf() tests                                 */
11 /* -------------------------------------------------------------------------- */
12 /* Tucked away in a seperate header because these are ugly, complex, and not  */
13 /* needed in 95% of all test cases.                                           */
14 /* -------------------------------------------------------------------------- */
15
16 /* ...printf() tests */
17 #if defined( _PDCLIB_FILEIO )
18    #define GET_RESULT \
19       rewind( target ); \
20       fread( result_buffer, 1, actual_rc, target );
21    #define RESULT_MISMATCH( act, exp ) strcmp( result_buffer, exp ) != 0
22    #define RESULT_STRING( tgt ) result_buffer
23 #elif defined( _PDCLIB_STRINGIO )
24    #define RESULT_MISMATCH( act, exp ) strcmp( act, exp ) != 0
25    #define GET_RESULT
26    #define RESULT_STRING( tgt ) tgt
27 #endif
28
29 #ifdef _PDCLIB_FILEIO
30 #define PREP_RESULT_BUFFER char result_buffer[100] = { 0 }; rewind( target );
31 #else
32 #define PREP_RESULT_BUFFER
33 #endif
34
35 #define GETFMT( fmt, ... ) (fmt)
36 #define PRINTF_TEST( expected_rc, expected_string, ... ) do { \
37         PREP_RESULT_BUFFER \
38         int actual_rc = testprintf( target, __VA_ARGS__ ); \
39         GET_RESULT \
40         if ( ( actual_rc != expected_rc ) || \
41              ( RESULT_MISMATCH( target, expected_string ) ) ) \
42         { \
43             ++TEST_RESULTS; \
44             fprintf( stderr, \
45                 "FAILED: " __FILE__ " (" _PDCLIB_FILEID "), line %d\n" \
46                 "        format string \"%s\"\n" \
47                 "        expected %2d, \"%s\"\n" \
48                 "        actual   %2d, \"%s\"\n", \
49                  __LINE__, GETFMT(__VA_ARGS__, 0), expected_rc, \
50                  expected_string, actual_rc, RESULT_STRING( target ) ); \
51         } \
52     } while ( 0 )
53
54 /* ...scanf() tests */
55 #if defined( _PDCLIB_FILEIO )
56     #define PREPARE_SOURCE( input_string ) \
57         rewind( source ); \
58         fwrite( input_string, 1, sizeof( input_string ), source ); \
59         rewind( source );
60 #elif defined( _PDCLIB_STRINGIO )
61     #define PREPARE_SOURCE( input_string ) \
62         memcpy( source, input_string, sizeof( input_string ) );
63 #endif
64
65 #define SCANF_TEST( expected_rc, input_string, ... ) do { \
66         int actual_rc; \
67         PREPARE_SOURCE( input_string ); \
68         actual_rc = testscanf( source, __VA_ARGS__ ); \
69         if ( actual_rc != expected_rc ) \
70         { \
71             ++TEST_RESULTS; \
72             fprintf( stderr, "FAILED: " __FILE__ " (" _PDCLIB_FILEID "), line %d\n        expected %2d,        actual   %2d\n", __LINE__, expected_rc, actual_rc ); \
73         } \
74     } while ( 0 )
75
76 /* Virtually everything in the printf() / scanf() test drivers is heavily
77    depending on the platform, i.e. the width of the integer values. To do
78    proper domain tests, we need the limits of the integers (largest and
79    smallest value), which we can get from <limits.h>. But we also need the
80    string representations of these numbers, to the various bases, which of
81    course vary depending on how the platform defines 'int' and 'long'.
82 */
83
84 #define sym2v( x ) #x
85 #define sym2s( x ) sym2v( x )
86
87 #if INT_MAX >> 15 == 1
88
89 #define UINT_DIG 5
90 #define INT_DIG  5
91 #define INT_DIG_LESS1 "4"
92 #define INT_DIG_PLUS1 "6"
93 #define INT_DIG_PLUS2 "7"
94 #define INT_HEXDIG "FFF"
95 #define INT_hexdig "fff"
96 #define INT_OCTDIG "177777"
97 #define INT_MAX_DEZ_STR  "32767"
98 #define INT_MIN_DEZ_STR  "32768"
99 #define UINT_MAX_DEZ_STR "65535"
100 #define INT_MAX_OCT_STR
101 #define INT_MIN_OCT_STR
102 #define UINT_MAX_OCT_STR
103 #define INT_MAX_HEX_STR
104 #define INT_MIN_HEX_STR
105 #define UINT_MAX_HEX_STR
106
107 #elif UINT_MAX >> 31 == 1
108
109 #define UINT_DIG 10
110 #define INT_DIG  10
111 #define INT_DIG_LESS1 "9"
112 #define INT_DIG_PLUS1 "11"
113 #define INT_DIG_PLUS2 "12"
114 #define INT_HEXDIG "FFFFFFF"
115 #define INT_hexdig "fffffff"
116 #define INT_OCTDIG "37777777777"
117 #define INT_MAX_DEZ_STR  "2147483647"
118 #define INT_MIN_DEZ_STR  "2147483648"
119 #define UINT_MAX_DEZ_STR "4294967295"
120 #define INT_MAX_OCT_STR
121 #define INT_MIN_OCT_STR
122 #define UINT_MAX_OCT_STR
123 #define INT_MAX_HEX_STR
124 #define INT_MIN_HEX_STR
125 #define UINT_MAX_HEX_STR
126
127 #elif UINT_MAX >> 63 == 1
128
129 #define UINT_DIG 20
130 #define INT_DIG  19
131 #define INT_DIG_LESS1 "18"
132 #define INT_DIG_PLUS1 "20"
133 #define INT_DIG_PLUS2 "21"
134 #define INT_HEXDIG "FFFFFFFFFFFFFFF"
135 #define INT_hexdig "fffffffffffffff"
136 #define INT_OCTDIG "1777777777777777777777"
137 #define INT_MAX_DEZ_STR   "9223372036854775807"
138 #define INT_MIN_DEZ_STR   "9223372036854775808"
139 #define UINT_MAX_DEZ_STR "18446744073709551615"
140 #define INT_MAX_OCT_STR
141 #define INT_MIN_OCT_STR
142 #define UINT_MAX_OCT_STR
143 #define INT_MAX_HEX_STR
144 #define INT_MIN_HEX_STR
145 #define UINT_MAX_HEX_STR
146
147 #else
148
149 #error Unsupported width of 'int' (neither 16, 32, nor 64 bit).
150
151 #endif
152
153
154 #if ULONG_MAX >> 31 == 1
155
156 #define ULONG_DIG 10
157 #define LONG_DIG  10
158 #define LONG_MAX_DEZ_STR  "2147483647"
159 #define LONG_MIN_DEZ_STR  "2147483648"
160 #define ULONG_MAX_DEZ_STR "4294967295"
161 #define LONG_MAX_OCT_STR
162 #define LONG_MIN_OCT_STR
163 #define ULONG_MAX_OCT_STR
164 #define LONG_MAX_HEX_STR
165 #define LONG_MIN_HEX_STR
166 #define ULONG_MAX_HEX_STR
167
168 #elif ULONG_MAX >> 63 == 1
169
170 #define ULONG_DIG 20
171 #define LONG_DIG  19
172 #define LONG_MAX_DEZ_STR   "9223372036854775807"
173 #define LONG_MIN_DEZ_STR   "9223372036854775808"
174 #define ULONG_MAX_DEZ_STR "18446744073709551615"
175 #define LONG_MAX_OCT_STR
176 #define LONG_MIN_OCT_STR
177 #define ULONG_MAX_OCT_STR
178 #define LONG_MAX_HEX_STR
179 #define LONG_MIN_HEX_STR
180 #define ULONG_MAX_HEX_STR
181
182 #else
183
184 #error Unsupported width of 'long' (neither 32 nor 64 bit).
185
186 #endif
187
188
189 #if ULLONG_MAX >> 63 == 1
190
191 #define ULLONG_DIG 20
192 #define LLONG_DIG  19
193 #define LLONG_MAX_DEZ_STR   "9223372036854775807"
194 #define LLONG_MIN_DEZ_STR   "9223372036854775808"
195 #define ULLONG_MAX_DEZ_STR "18446744073709551615"
196 #define LLONG_MAX_OCT_STR
197 #define LLONG_MIN_OCT_STR
198 #define ULLONG_MAX_OCT_STR
199 #define LLONG_MAX_HEX_STR
200 #define LLONG_MIN_HEX_STR
201 #define ULLONG_MAX_HEX_STR
202
203 #elif ULLONG_MAX >> 127 == 1
204
205 #define ULLONG_DIG 38
206 #define LLONG_DIG  38
207 #define LLONG_MAX_DEZ_STR  "170141183460469231731687303715884105727"
208 #define LLONG_MIN_DEZ_STR  "170141183460469231731687303715884105728"
209 #define ULLONG_MAX_DEZ_STR "340282366920938463463374607431768211455"
210 #define LLONG_MAX_OCT_STR
211 #define LLONG_MIN_OCT_STR
212 #define ULLONG_MAX_OCT_STR
213 #define LLONG_MAX_HEX_STR
214 #define LLONG_MIN_HEX_STR
215 #define ULLONG_MAX_HEX_STR
216
217 #else
218
219 #error Unsupported width of 'long long' (neither 64 nor 128 bit).
220
221 #endif