2
* TEST SUITE FOR MB/WC FUNCTIONS IN C LIBRARY
6
* Definitions of macros
13
#define C_SUCCESS 'S' /* test case test passed */
14
#define C_FAILURE 'F' /* test case failed */
15
#define C_IGNORED 'I' /* test case/result ignored (not tested) */
16
#define C_INVALID 'D' /* test data may be wrong */
17
#define C_LOCALES 'L' /* can't set locale (skip) */
20
extern int result (FILE * fp, char res, const char *func, const char *loc,
21
int rec_no, int seq_num, int case_no, const char *msg);
23
#define Result(C, S, E, M) \
24
result (fp, (C), (S), locale, rec+1, seq_num+1, (E), (M))
37
#define MS_PASSED "PASSED"
40
#define MS_NOTEST "NOTEST"
41
#define MS_ABORTU "ABEND0"
42
#define MS_ABORT "ABEND1"
44
#define MK_PASSED 0x00
46
#define MK_NOTEST 0x02
47
#define MK_ABORTU 0x04
52
/* ------------------ COMMON MACROS ------------------ */
54
#define TST_ABS(x) (((x) > 0) ? (x) : -(x))
56
#define TMD_ERRET(_type_) int err_val; \
60
#define TMD_RECHEAD(_FUNC_) \
63
TIN_##_FUNC_##_REC input; \
64
TEX_##_FUNC_##_REC expect; \
66
} TST_##_FUNC_##_REC; \
69
TST_##_FUNC_##_REC rec[ MAX_LOC_TEST ]; \
72
#define TST_FTYP(func) tst_##func##_loc
73
#define TST_HEAD(func) tst_##func##_loc[ loc ].hd
74
#define TST_INPUT(func) tst_##func##_loc[ loc ].rec[ rec ].input
75
#define TST_EXPECT(func) tst_##func##_loc[ loc ].rec[ rec ].expect
76
#define TST_INPUT_SEQ(func) \
77
tst_##func##_loc[ loc ].rec[ rec ].input.seq[ seq_num ]
78
#define TST_EXPECT_SEQ(func) \
79
tst_##func##_loc[ loc ].rec[ rec ].expect.seq[ seq_num ]
80
#define TST_IS_LAST(func) \
81
tst_##func##_loc[ loc ].rec[ rec ].is_last
84
#define TST_DECL_VARS(_type_) \
85
int loc, rec, err_count = 0; \
86
int warn_count __attribute__ ((unused)); \
87
int func_id, seq_num = 0; \
89
int err_exp, ret_flg; \
94
#define TST_DO_TEST(o_func) \
95
for (loc = 0; strcmp (TST_HEAD (o_func).locale, TST_LOC_end); ++loc)
98
#define TST_HEAD_LOCALE(ofunc, s_func) \
99
func_id = TST_HEAD (ofunc).func_id; \
100
locale = TST_HEAD (ofunc).locale; \
101
if (setlocale (LC_ALL, locale) == NULL) \
103
fprintf (stderr, "Warning : can't set locale: %s\nskipping ...\n", \
105
result (fp, C_LOCALES, s_func, locale, 0, 0, 0, "can't set locale"); \
110
#define TST_DO_REC(ofunc) \
111
for (rec=0; !TST_IS_LAST (ofunc); ++rec)
113
#define TST_DO_SEQ(_count_) \
114
for (seq_num=0; seq_num < _count_; seq_num++)
116
#define TST_GET_ERRET(_ofunc_) \
117
err_exp = TST_EXPECT (_ofunc_).err_val; \
118
ret_flg = TST_EXPECT (_ofunc_).ret_flg; \
119
ret_exp = TST_EXPECT (_ofunc_).ret_val
121
#define TST_GET_ERRET_SEQ(_ofunc_) \
122
err_exp = TST_EXPECT_SEQ (_ofunc_).err_val; \
123
ret_flg = TST_EXPECT_SEQ (_ofunc_).ret_flg; \
124
ret_exp = TST_EXPECT_SEQ (_ofunc_).ret_val
126
#define TST_CLEAR_ERRNO \
129
#define TST_SAVE_ERRNO \
132
/* Test value of ret and of errno if it should have a value. */
133
#define TST_IF_RETURN(_s_func_) \
136
if (errno_save == err_exp) \
138
result (fp, C_SUCCESS, _s_func_, locale, rec+1, seq_num+1, 1, \
144
result (fp, C_FAILURE, _s_func_, locale, rec+1, seq_num+1, 1, \
145
"the value of errno is different from an expected value"); \
151
if (ret == ret_exp) \
153
result (fp, C_SUCCESS, _s_func_, locale, rec+1, seq_num+1, 2, \
159
result (fp, C_FAILURE, _s_func_, locale, rec+1, seq_num+1, 2, \
160
"the return value is different from an expected value"); \
165
#define TEX_ERRET_REC(_type_) \
167
TMD_ERRET (_type_); \
170
#define TEX_ERRET_REC_SEQ(_type_, _count_) \
173
TMD_ERRET (_type_); \
179
/* ------------------ FUNCTION: ISW*() ------------------- */
181
#define TST_ISW_STRUCT(_FUNC_, _func_) \
185
} TIN_ISW##_FUNC_##_REC; \
187
TEX_ERRET_REC (int) TEX_ISW##_FUNC_##_REC; \
188
TMD_RECHEAD (ISW##_FUNC_)
190
#define TST_FUNC_ISW(_FUNC_, _func_) \
192
tst_isw##_func_ (FILE *fp, int debug_flg) \
194
TST_DECL_VARS(int); \
196
TST_DO_TEST (isw##_func_) \
198
TST_HEAD_LOCALE (isw##_func_, S_ISW##_FUNC_); \
199
TST_DO_REC(isw##_func_) \
201
TST_GET_ERRET (isw##_func_); \
202
wc = TST_INPUT (isw##_func_).wc; \
203
ret = isw##_func_ (wc); \
206
fprintf (stdout, "isw*() [ %s : %d ] ret = %d\n", locale, \
210
TST_IF_RETURN (S_ISW##_FUNC_) \
214
result (fp, C_SUCCESS, S_ISW##_FUNC_, locale, rec+1, \
215
seq_num+1, 3, MS_PASSED); \
220
result (fp, C_FAILURE, S_ISW##_FUNC_, locale, rec+1, \
222
"the function returned 0, but should be non-zero"); \
233
/* ------------------ FUNCTION: TOW*() ------------------ */
235
#define TST_TOW_STRUCT(_FUNC_, _func_) \
239
} TIN_TOW##_FUNC_##_REC; \
241
TEX_ERRET_REC (wint_t) TEX_TOW##_FUNC_##_REC; \
242
TMD_RECHEAD (TOW##_FUNC_)
244
#define TST_FUNC_TOW(_FUNC_, _func_) \
246
tst_tow##_func_ (FILE *fp, int debug_flg) \
248
TST_DECL_VARS (wint_t); \
250
TST_DO_TEST (tow##_func_) \
252
TST_HEAD_LOCALE (tow##_func_, S_TOW##_FUNC_); \
253
TST_DO_REC (tow##_func_) \
255
TST_GET_ERRET (tow##_func_); \
256
wc = TST_INPUT (tow##_func_).wc; \
257
ret = tow##_func_ (wc); \
260
fprintf (stdout, "tow*() [ %s : %d ] ret = 0x%x\n", \
261
locale, rec+1, ret); \
264
TST_IF_RETURN (S_TOW##_FUNC_) { }; \
272
#endif /* TST_FUNCS_H */