#include #include #include #include #include #include #include "ctap.h" /* global variable testnum? */ static int test = 0; /* the test number */ static int planned = 0; void plan(int tests) { test = 0; planned = tests; printf("1..%d\n", tests); } static void print_lazy_plan(void) { printf("1..%d\n", test); fflush(stdout); } void plan_lazy(void) { test = 0; planned = 0; atexit(print_lazy_plan); } void skip_all(const char *why, ...) { printf("1..0"); if (why) { va_list args; printf(" # skip "); va_start(args, why); vfprintf(stdout, why, args); va_end(args); } printf("\n"); } void okv(int pass, const char *fmt, va_list args) { printf("%sok %d", pass ? "" : "not ", ++test); if (fmt) { printf(" # "); vfprintf(stdout, fmt, args); } printf("\n"); } void ok(int pass, char *fmt, ...) { va_list args; printf("%sok %d", pass ? "" : "not ", ++test); if (fmt) { printf(" # "); va_start(args, fmt); vfprintf(stdout, fmt, args); va_end(args); } printf("\n"); } void ok_block(unsigned long count, int pass, const char *fmt, ...) { if (count == 0) { return; } if (fmt) { va_list args; va_list copy; va_start(args, fmt); while (count--) { va_copy(copy, args); okv(pass, fmt, copy); va_end(copy); } va_end(args); } else { while (count--) { ok(pass, NULL); } } } void skip(const char *why, ...) { va_list args; printf("ok %d # skip", ++test); if (why) { printf(" "); va_start(args, why); vfprintf(stdout, why, args); va_end(args); } printf("\n"); } void skip_block(unsigned long count, const char *why, ...) { if (why) { va_list args; va_list copy; va_start(args, why); while (count--) { va_copy(copy, args); printf("ok %d # skip", ++test); printf(" "); vfprintf(stdout, why, copy); va_end(copy); printf("\n"); } va_end(args); } else { printf("ok %d # skip\n", ++test); } } void bail(const char *fmt, ...) { va_list args; printf("Bail out!"); if (fmt) { va_start(args, fmt); vfprintf(stdout, fmt, args); va_end(args); } printf("\n"); fflush(stdout); exit(1); } void sysbail(const char *fmt, ...) { va_list args; printf("Bail out!"); if (fmt) { va_start(args, fmt); vfprintf(stdout, fmt, args); va_end(args); } printf(": %s\n", strerror(errno)); fflush(stdout); exit(1); } void sysdiag(const char *fmt, ...) { va_list args; if (!fmt) { return; } printf("# "); va_start(args, fmt); vfprintf(stdout, fmt, args); va_end(args); printf(": %s\n", strerror(errno)); } void diag(const char *fmt, ...) { va_list args; if (!fmt) { return; } printf("# "); va_start(args, fmt); vfprintf(stdout, fmt, args); va_end(args); printf("\n"); } void is_hex(unsigned long wanted, unsigned long seen, const char *fmt, ...) { va_list args; if (fmt) { va_start(args, fmt); okv(wanted == seen, fmt, args); va_end(args); } else { ok(wanted == seen, NULL); } if (wanted != seen) { diag("wanted: %ld", wanted); diag("got : %ld", seen); } } void is_int(long wanted, long seen, const char *fmt, ...) { va_list args; if (fmt) { va_start(args, fmt); okv(wanted == seen, fmt, args); va_end(args); } else { ok(wanted == seen, NULL); } if (wanted != seen) { diag("wanted: %ld", wanted); diag("got : %ld", seen); } } void is_double(double wanted, double seen, double eps, const char *fmt, ...) { int pass; va_list args; pass = fabs(wanted - seen) <= eps; if (fmt) { va_start(args, fmt); okv(pass, fmt, args); va_end(args); } else { ok(wanted == seen, NULL); } if (!pass) { diag("wanted: %f", wanted); diag("got : %f", seen); } } void is_string(const char *wanted, const char *seen, const char *fmt, ...) { int pass; va_list args; pass = !strcmp(wanted,seen); if (fmt) { va_start(args, fmt); okv(pass, fmt, args); va_end(args); } else { ok(wanted == seen, NULL); } if (!pass) { diag("wanted: %s", wanted); diag("got : %s", seen); } }