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