xref: /minix3/external/bsd/bind/dist/contrib/idn/idnkit-1.0-src/lib/tests/testsuite.h (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: testsuite.h,v 1.5 2014/12/10 04:37:56 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /* Id: testsuite.h,v 1.1 2003/06/04 00:27:03 marka Exp  */
4*00b67f09SDavid van Moolenbroek /*
5*00b67f09SDavid van Moolenbroek  * Copyright (c) 2002 Japan Network Information Center.
6*00b67f09SDavid van Moolenbroek  * All rights reserved.
7*00b67f09SDavid van Moolenbroek  *
8*00b67f09SDavid van Moolenbroek  * By using this file, you agree to the terms and conditions set forth bellow.
9*00b67f09SDavid van Moolenbroek  *
10*00b67f09SDavid van Moolenbroek  * 			LICENSE TERMS AND CONDITIONS
11*00b67f09SDavid van Moolenbroek  *
12*00b67f09SDavid van Moolenbroek  * The following License Terms and Conditions apply, unless a different
13*00b67f09SDavid van Moolenbroek  * license is obtained from Japan Network Information Center ("JPNIC"),
14*00b67f09SDavid van Moolenbroek  * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda,
15*00b67f09SDavid van Moolenbroek  * Chiyoda-ku, Tokyo 101-0047, Japan.
16*00b67f09SDavid van Moolenbroek  *
17*00b67f09SDavid van Moolenbroek  * 1. Use, Modification and Redistribution (including distribution of any
18*00b67f09SDavid van Moolenbroek  *    modified or derived work) in source and/or binary forms is permitted
19*00b67f09SDavid van Moolenbroek  *    under this License Terms and Conditions.
20*00b67f09SDavid van Moolenbroek  *
21*00b67f09SDavid van Moolenbroek  * 2. Redistribution of source code must retain the copyright notices as they
22*00b67f09SDavid van Moolenbroek  *    appear in each source code file, this License Terms and Conditions.
23*00b67f09SDavid van Moolenbroek  *
24*00b67f09SDavid van Moolenbroek  * 3. Redistribution in binary form must reproduce the Copyright Notice,
25*00b67f09SDavid van Moolenbroek  *    this License Terms and Conditions, in the documentation and/or other
26*00b67f09SDavid van Moolenbroek  *    materials provided with the distribution.  For the purposes of binary
27*00b67f09SDavid van Moolenbroek  *    distribution the "Copyright Notice" refers to the following language:
28*00b67f09SDavid van Moolenbroek  *    "Copyright (c) 2000-2002 Japan Network Information Center.  All rights reserved."
29*00b67f09SDavid van Moolenbroek  *
30*00b67f09SDavid van Moolenbroek  * 4. The name of JPNIC may not be used to endorse or promote products
31*00b67f09SDavid van Moolenbroek  *    derived from this Software without specific prior written approval of
32*00b67f09SDavid van Moolenbroek  *    JPNIC.
33*00b67f09SDavid van Moolenbroek  *
34*00b67f09SDavid van Moolenbroek  * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC
35*00b67f09SDavid van Moolenbroek  *    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
36*00b67f09SDavid van Moolenbroek  *    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
37*00b67f09SDavid van Moolenbroek  *    PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL JPNIC BE LIABLE
38*00b67f09SDavid van Moolenbroek  *    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
39*00b67f09SDavid van Moolenbroek  *    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
40*00b67f09SDavid van Moolenbroek  *    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
41*00b67f09SDavid van Moolenbroek  *    BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
42*00b67f09SDavid van Moolenbroek  *    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
43*00b67f09SDavid van Moolenbroek  *    OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
44*00b67f09SDavid van Moolenbroek  *    ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
45*00b67f09SDavid van Moolenbroek  */
46*00b67f09SDavid van Moolenbroek 
47*00b67f09SDavid van Moolenbroek #ifndef IDN_TESTSUITE_H
48*00b67f09SDavid van Moolenbroek #define IDN_TESTSUITE_H 1
49*00b67f09SDavid van Moolenbroek 
50*00b67f09SDavid van Moolenbroek #ifdef __cplusplus
51*00b67f09SDavid van Moolenbroek extern "C" {
52*00b67f09SDavid van Moolenbroek #endif
53*00b67f09SDavid van Moolenbroek 
54*00b67f09SDavid van Moolenbroek /*
55*00b67f09SDavid van Moolenbroek  * Result codes for test case.
56*00b67f09SDavid van Moolenbroek  */
57*00b67f09SDavid van Moolenbroek typedef enum {
58*00b67f09SDavid van Moolenbroek 	idn_teststatus_pass,
59*00b67f09SDavid van Moolenbroek 	idn_teststatus_fail,
60*00b67f09SDavid van Moolenbroek 	idn_teststatus_skip
61*00b67f09SDavid van Moolenbroek } idn_teststatus_t;
62*00b67f09SDavid van Moolenbroek 
63*00b67f09SDavid van Moolenbroek /*
64*00b67f09SDavid van Moolenbroek  * Testsuite manager type (opaque).
65*00b67f09SDavid van Moolenbroek  */
66*00b67f09SDavid van Moolenbroek typedef struct idn_testsuite *idn_testsuite_t;
67*00b67f09SDavid van Moolenbroek 
68*00b67f09SDavid van Moolenbroek /*
69*00b67f09SDavid van Moolenbroek  * Testcase function type.
70*00b67f09SDavid van Moolenbroek  */
71*00b67f09SDavid van Moolenbroek typedef void (*idn_testsuite_testproc_t)(idn_testsuite_t ctx);
72*00b67f09SDavid van Moolenbroek 
73*00b67f09SDavid van Moolenbroek /*
74*00b67f09SDavid van Moolenbroek  * Message handler type.
75*00b67f09SDavid van Moolenbroek  */
76*00b67f09SDavid van Moolenbroek typedef void (*idn_testsuite_msgproc_t)(const char *msg);
77*00b67f09SDavid van Moolenbroek 
78*00b67f09SDavid van Moolenbroek /*
79*00b67f09SDavid van Moolenbroek  * Create a testsuite manager context.
80*00b67f09SDavid van Moolenbroek  *
81*00b67f09SDavid van Moolenbroek  * Create an empty context and store it in '*ctxp'.
82*00b67f09SDavid van Moolenbroek  * Return 1 on success.  Return 0 if memory is exhausted.
83*00b67f09SDavid van Moolenbroek  */
84*00b67f09SDavid van Moolenbroek extern int
85*00b67f09SDavid van Moolenbroek idn_testsuite_create(idn_testsuite_t *ctxp);
86*00b67f09SDavid van Moolenbroek 
87*00b67f09SDavid van Moolenbroek /*
88*00b67f09SDavid van Moolenbroek  * Destory the testsuite manager context.
89*00b67f09SDavid van Moolenbroek  *
90*00b67f09SDavid van Moolenbroek  * Destroy the context created by idn_testsuite_create(), and release
91*00b67f09SDavid van Moolenbroek  * memory allocated to the context.
92*00b67f09SDavid van Moolenbroek  */
93*00b67f09SDavid van Moolenbroek extern void
94*00b67f09SDavid van Moolenbroek idn_testsuite_destroy(idn_testsuite_t ctx);
95*00b67f09SDavid van Moolenbroek 
96*00b67f09SDavid van Moolenbroek /*
97*00b67f09SDavid van Moolenbroek  * Add a test case to the `group' test group.
98*00b67f09SDavid van Moolenbroek  * Return 1 on success.  Return 0 if memory is exhausted.
99*00b67f09SDavid van Moolenbroek  */
100*00b67f09SDavid van Moolenbroek extern int
101*00b67f09SDavid van Moolenbroek idn_testsuite_addtestcase(idn_testsuite_t ctx, const char *title,
102*00b67f09SDavid van Moolenbroek 	                  idn_testsuite_testproc_t proc);
103*00b67f09SDavid van Moolenbroek 
104*00b67f09SDavid van Moolenbroek /*
105*00b67f09SDavid van Moolenbroek  * Return the number of test cases registered in the context.
106*00b67f09SDavid van Moolenbroek  */
107*00b67f09SDavid van Moolenbroek extern int
108*00b67f09SDavid van Moolenbroek idn_testsuite_ntestcases(idn_testsuite_t ctx);
109*00b67f09SDavid van Moolenbroek 
110*00b67f09SDavid van Moolenbroek /*
111*00b67f09SDavid van Moolenbroek  * Run test cases registered in the context.
112*00b67f09SDavid van Moolenbroek  */
113*00b67f09SDavid van Moolenbroek extern void
114*00b67f09SDavid van Moolenbroek idn_testsuite_runall(idn_testsuite_t ctx);
115*00b67f09SDavid van Moolenbroek extern void
116*00b67f09SDavid van Moolenbroek idn_testsuite_run(idn_testsuite_t ctx, char *titles[]);
117*00b67f09SDavid van Moolenbroek 
118*00b67f09SDavid van Moolenbroek /*
119*00b67f09SDavid van Moolenbroek  * Return the string description of `status'.
120*00b67f09SDavid van Moolenbroek  */
121*00b67f09SDavid van Moolenbroek extern const char *
122*00b67f09SDavid van Moolenbroek idn_teststatus_tostring(idn_teststatus_t status);
123*00b67f09SDavid van Moolenbroek 
124*00b67f09SDavid van Moolenbroek /*
125*00b67f09SDavid van Moolenbroek  * Return the number of passed/failed/skipped test cases.
126*00b67f09SDavid van Moolenbroek  */
127*00b67f09SDavid van Moolenbroek extern int
128*00b67f09SDavid van Moolenbroek idn_testsuite_npassed(idn_testsuite_t ctx);
129*00b67f09SDavid van Moolenbroek extern int
130*00b67f09SDavid van Moolenbroek idn_testsuite_nfailed(idn_testsuite_t ctx);
131*00b67f09SDavid van Moolenbroek extern int
132*00b67f09SDavid van Moolenbroek idn_testsuite_nskipped(idn_testsuite_t ctx);
133*00b67f09SDavid van Moolenbroek 
134*00b67f09SDavid van Moolenbroek /*
135*00b67f09SDavid van Moolenbroek  * Set/Get status of the test case running currently.
136*00b67f09SDavid van Moolenbroek  *
137*00b67f09SDavid van Moolenbroek  * These functions must be called by test case function.
138*00b67f09SDavid van Moolenbroek  */
139*00b67f09SDavid van Moolenbroek extern idn_teststatus_t
140*00b67f09SDavid van Moolenbroek idn_testsuite_getstatus(idn_testsuite_t ctx);
141*00b67f09SDavid van Moolenbroek extern void
142*00b67f09SDavid van Moolenbroek idn_testsuite_setstatus(idn_testsuite_t ctx, idn_teststatus_t status);
143*00b67f09SDavid van Moolenbroek 
144*00b67f09SDavid van Moolenbroek /*
145*00b67f09SDavid van Moolenbroek  * Enable/Disable verbose mode.
146*00b67f09SDavid van Moolenbroek  */
147*00b67f09SDavid van Moolenbroek extern void
148*00b67f09SDavid van Moolenbroek idn_testsuite_setverbose(idn_testsuite_t ctx);
149*00b67f09SDavid van Moolenbroek extern void
150*00b67f09SDavid van Moolenbroek idn_testsuite_unsetverbose(idn_testsuite_t ctx);
151*00b67f09SDavid van Moolenbroek 
152*00b67f09SDavid van Moolenbroek /*
153*00b67f09SDavid van Moolenbroek  * Generic assertion with message
154*00b67f09SDavid van Moolenbroek  */
155*00b67f09SDavid van Moolenbroek extern void
156*00b67f09SDavid van Moolenbroek idn_testsuite_assert(idn_testsuite_t ctx, const char *msg,
157*00b67f09SDavid van Moolenbroek 		     const char *file, int lineno);
158*00b67f09SDavid van Moolenbroek 
159*00b67f09SDavid van Moolenbroek #define ASSERT_THRU(msg) \
160*00b67f09SDavid van Moolenbroek     idn_testsuite_assert(ctx__, msg, __FILE__, __LINE__)
161*00b67f09SDavid van Moolenbroek #define ASSERT(msg) \
162*00b67f09SDavid van Moolenbroek   do { \
163*00b67f09SDavid van Moolenbroek     ASSERT_THRU(msg); \
164*00b67f09SDavid van Moolenbroek     if (idn_testsuite_getstatus(ctx__) != idn_teststatus_pass) \
165*00b67f09SDavid van Moolenbroek       goto EXIT__; \
166*00b67f09SDavid van Moolenbroek   } while (/*CONSTCOND*/0)
167*00b67f09SDavid van Moolenbroek 
168*00b67f09SDavid van Moolenbroek /*
169*00b67f09SDavid van Moolenbroek  * Assertion function and macro to compare two `int' values.
170*00b67f09SDavid van Moolenbroek  * The assertion passes if `gotten' is equal to `expected'.
171*00b67f09SDavid van Moolenbroek  */
172*00b67f09SDavid van Moolenbroek extern void
173*00b67f09SDavid van Moolenbroek idn_testsuite_assertint(idn_testsuite_t ctx, int gotten, int expected,
174*00b67f09SDavid van Moolenbroek 			const char *file, int lineno);
175*00b67f09SDavid van Moolenbroek 
176*00b67f09SDavid van Moolenbroek #define ASSERT_INT(gotten, expected) \
177*00b67f09SDavid van Moolenbroek   do { \
178*00b67f09SDavid van Moolenbroek     idn_testsuite_assertint(ctx__, gotten, expected, __FILE__, __LINE__); \
179*00b67f09SDavid van Moolenbroek     if (idn_testsuite_getstatus(ctx__) != idn_teststatus_pass) \
180*00b67f09SDavid van Moolenbroek       goto EXIT__; \
181*00b67f09SDavid van Moolenbroek   } while (/*CONSTCOND*/0)
182*00b67f09SDavid van Moolenbroek 
183*00b67f09SDavid van Moolenbroek /*
184*00b67f09SDavid van Moolenbroek  * Assertion function and macro to compare two strings.
185*00b67f09SDavid van Moolenbroek  * The assertion passes if `gotten' is lexically equal to `expected'.
186*00b67f09SDavid van Moolenbroek  */
187*00b67f09SDavid van Moolenbroek extern void
188*00b67f09SDavid van Moolenbroek idn_testsuite_assertstring(idn_testsuite_t ctx, const char *gotten,
189*00b67f09SDavid van Moolenbroek 			   const char *expected, const char *file, int lineno);
190*00b67f09SDavid van Moolenbroek 
191*00b67f09SDavid van Moolenbroek #define ASSERT_STRING(gotten, expected) \
192*00b67f09SDavid van Moolenbroek   do { \
193*00b67f09SDavid van Moolenbroek     idn_testsuite_assertstring(ctx__, gotten, expected, __FILE__, __LINE__); \
194*00b67f09SDavid van Moolenbroek     if (idn_testsuite_getstatus(ctx__) != idn_teststatus_pass) \
195*00b67f09SDavid van Moolenbroek       goto EXIT__; \
196*00b67f09SDavid van Moolenbroek   } while (/*CONSTCOND*/0)
197*00b67f09SDavid van Moolenbroek 
198*00b67f09SDavid van Moolenbroek /*
199*00b67f09SDavid van Moolenbroek  * Assertion function and macro to compare two pointers.
200*00b67f09SDavid van Moolenbroek  * The assertion passes if `gotten' is equal to `expected'.
201*00b67f09SDavid van Moolenbroek  */
202*00b67f09SDavid van Moolenbroek extern void
203*00b67f09SDavid van Moolenbroek idn_testsuite_assertptr(idn_testsuite_t ctx, const void *gotten,
204*00b67f09SDavid van Moolenbroek 			const void *expected, const char *file, int lineno);
205*00b67f09SDavid van Moolenbroek 
206*00b67f09SDavid van Moolenbroek #define ASSERT_PTR(gotten, expected) \
207*00b67f09SDavid van Moolenbroek   do { \
208*00b67f09SDavid van Moolenbroek     idn_testsuite_assertptr(ctx__, gotten, expected, __FILE__, __LINE__); \
209*00b67f09SDavid van Moolenbroek     if (idn_testsuite_getstatus(ctx__) != idn_teststatus_pass) \
210*00b67f09SDavid van Moolenbroek       goto EXIT__; \
211*00b67f09SDavid van Moolenbroek   } while (/*CONSTCOND*/0)
212*00b67f09SDavid van Moolenbroek 
213*00b67f09SDavid van Moolenbroek /*
214*00b67f09SDavid van Moolenbroek  * Assertion function and macro to compare two pointers.
215*00b67f09SDavid van Moolenbroek  * The assertion passes if `gotten' is NOT equal to `expected'.
216*00b67f09SDavid van Moolenbroek  */
217*00b67f09SDavid van Moolenbroek extern void
218*00b67f09SDavid van Moolenbroek idn_testsuite_assertptrne(idn_testsuite_t ctx,
219*00b67f09SDavid van Moolenbroek 			  const void *gotten, const void *unexpected,
220*00b67f09SDavid van Moolenbroek 			  const char *file, int lineno);
221*00b67f09SDavid van Moolenbroek 
222*00b67f09SDavid van Moolenbroek #define ASSERT_PTR_NE(gotten, unexpected) \
223*00b67f09SDavid van Moolenbroek   do { \
224*00b67f09SDavid van Moolenbroek     idn_testsuite_assertptrne(ctx__, gotten, unexpected, __FILE__, __LINE__); \
225*00b67f09SDavid van Moolenbroek     if (idn_testsuite_getstatus(ctx__) != idn_teststatus_pass) \
226*00b67f09SDavid van Moolenbroek       goto EXIT__; \
227*00b67f09SDavid van Moolenbroek   } while (/*CONSTCOND*/0)
228*00b67f09SDavid van Moolenbroek 
229*00b67f09SDavid van Moolenbroek /*
230*00b67f09SDavid van Moolenbroek  * Assertion function and macro to compare two `idn_result_t' values.
231*00b67f09SDavid van Moolenbroek  * The assertion passes if `gotten' is equal to `expected'.
232*00b67f09SDavid van Moolenbroek  */
233*00b67f09SDavid van Moolenbroek extern void
234*00b67f09SDavid van Moolenbroek idn_testsuite_assertresult(idn_testsuite_t ctx,
235*00b67f09SDavid van Moolenbroek 			   idn_result_t gotten, idn_result_t expected,
236*00b67f09SDavid van Moolenbroek 			   const char *file, int lineno);
237*00b67f09SDavid van Moolenbroek 
238*00b67f09SDavid van Moolenbroek #define ASSERT_RESULT(gotten, expected) \
239*00b67f09SDavid van Moolenbroek   do { \
240*00b67f09SDavid van Moolenbroek     idn_testsuite_assertresult(ctx__, gotten, expected, __FILE__, __LINE__); \
241*00b67f09SDavid van Moolenbroek     if (idn_testsuite_getstatus(ctx__) != idn_teststatus_pass) \
242*00b67f09SDavid van Moolenbroek       goto EXIT__; \
243*00b67f09SDavid van Moolenbroek   } while (/*CONSTCOND*/0)
244*00b67f09SDavid van Moolenbroek 
245*00b67f09SDavid van Moolenbroek /*
246*00b67f09SDavid van Moolenbroek  * Assertion function and macro to compare two UCS4 strings.
247*00b67f09SDavid van Moolenbroek  * The assertion passes if `gotten' is lexically equal to `expected'.
248*00b67f09SDavid van Moolenbroek  */
249*00b67f09SDavid van Moolenbroek extern void
250*00b67f09SDavid van Moolenbroek idn_testsuite_assertucs4string(idn_testsuite_t ctx,
251*00b67f09SDavid van Moolenbroek 			       const unsigned long *gotten,
252*00b67f09SDavid van Moolenbroek 			       const unsigned long *expected,
253*00b67f09SDavid van Moolenbroek 			       const char *file,
254*00b67f09SDavid van Moolenbroek 			       int lineno);
255*00b67f09SDavid van Moolenbroek 
256*00b67f09SDavid van Moolenbroek #define ASSERT_UCS4STRING_THRU(gotten, expected) \
257*00b67f09SDavid van Moolenbroek   idn_testsuite_assertucs4string(ctx__, gotten, expected, __FILE__, __LINE__)
258*00b67f09SDavid van Moolenbroek #define ASSERT_UCS4STRING(gotten, expected) \
259*00b67f09SDavid van Moolenbroek   do { \
260*00b67f09SDavid van Moolenbroek     ASSERT_UCS4STRING_THRU(gotten, expected); \
261*00b67f09SDavid van Moolenbroek     if (idn_testsuite_getstatus(ctx__) != idn_teststatus_pass) \
262*00b67f09SDavid van Moolenbroek       goto EXIT__; \
263*00b67f09SDavid van Moolenbroek   } while (/*CONSTCOND*/0)
264*00b67f09SDavid van Moolenbroek 
265*00b67f09SDavid van Moolenbroek /*
266*00b67f09SDavid van Moolenbroek  * Shorthands.
267*00b67f09SDavid van Moolenbroek  */
268*00b67f09SDavid van Moolenbroek #define SKIP_TESTCASE \
269*00b67f09SDavid van Moolenbroek   do { \
270*00b67f09SDavid van Moolenbroek        idn_testsuite_setstatus(ctx__, idn_teststatus_skip); \
271*00b67f09SDavid van Moolenbroek        goto EXIT__; \
272*00b67f09SDavid van Moolenbroek   } while (/*CONSTCOND*/0)
273*00b67f09SDavid van Moolenbroek 
274*00b67f09SDavid van Moolenbroek #ifdef __cplusplus
275*00b67f09SDavid van Moolenbroek }
276*00b67f09SDavid van Moolenbroek #endif
277*00b67f09SDavid van Moolenbroek 
278*00b67f09SDavid van Moolenbroek #endif /* IDN_TESTSUITE_H */
279