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