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