chiark / gitweb /
Fiddle with CSS+HTML in effort to get more consistent buttons
[disorder] / libtests / test.c
1 /*
2  * This file is part of DisOrder.
3  * Copyright (C) 2005, 2007, 2008 Richard Kettlewell
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18  * USA
19  */
20 /** @file lib/test.c @brief Library tests */
21
22 #include "test.h"
23 #include "version.h"
24 #include <getopt.h>
25
26 long long tests, errors;
27 int fail_first;
28 int verbose;
29 int skipped;
30
31 void count_error(void) {
32   ++errors;
33   if(fail_first)
34     abort();
35 }
36
37 const char *format(const char *s) {
38   struct dynstr d;
39   int c;
40   char buf[10];
41
42   dynstr_init(&d);
43   while((c = (unsigned char)*s++)) {
44     if(c >= ' ' && c <= '~')
45       dynstr_append(&d, c);
46     else {
47       sprintf(buf, "\\x%02X", (unsigned)c);
48       dynstr_append_string(&d, buf);
49     }
50   }
51   dynstr_terminate(&d);
52   return d.vec;
53 }
54
55 const char *format_utf32(const uint32_t *s) {
56   struct dynstr d;
57   uint32_t c;
58   char buf[64];
59
60   dynstr_init(&d);
61   while((c = *s++)) {
62     sprintf(buf, " %04lX", (long)c);
63     dynstr_append_string(&d, buf);
64   }
65   dynstr_terminate(&d);
66   return d.vec;
67 }
68
69 uint32_t *ucs4parse(const char *s) {
70   struct dynstr_ucs4 d;
71   char *e;
72
73   dynstr_ucs4_init(&d);
74   while(*s) {
75     errno = 0;
76     dynstr_ucs4_append(&d, strtoul(s, &e, 0));
77     if(errno) fatal(errno, "strtoul (%s)", s);
78     s = e;
79   }
80   dynstr_ucs4_terminate(&d);
81   return d.vec;
82 }
83
84 const char *do_printf(const char *fmt, ...) {
85   va_list ap;
86   char *s;
87   int rc;
88
89   va_start(ap, fmt);
90   rc = byte_vasprintf(&s, fmt, ap);
91   va_end(ap);
92   if(rc < 0)
93     return 0;
94   return s;
95 }
96
97 jmp_buf fatal_env;
98
99 void test_exitfn(int rc) {
100   assert(rc != 0);
101   longjmp(fatal_env, rc);
102 }
103
104 static const struct option options[] = {
105   { "verbose", no_argument, 0, 'v' },
106   { "fail-first", no_argument, 0, 'F' },
107   { "help", no_argument, 0, 'h' },
108   { "version", no_argument, 0, 'V' },
109 };
110
111 /* display usage message and terminate */
112 static void help(void) {
113   xprintf("Usage:\n"
114           "  %s [OPTIONS]\n"
115           "Options:\n"
116           "  --help, -h               Display usage message\n"
117           "  --version, -V            Display version number\n"
118           "  --verbose, -v            Verbose output\n"
119           "  --fail-first, -F         Stop on first failure\n",
120           progname);
121   xfclose(stdout);
122   exit(0);
123 }
124
125 void test_init(int argc, char **argv) {
126   int n;
127
128   set_progname(argv);
129   mem_init();
130   while((n = getopt_long(argc, argv, "vFhV", options, 0)) >= 0) {
131     switch(n) {
132     case 'v': verbose = 1; break;
133     case 'F': fail_first = 1; break;
134     case 'h': help();
135     case 'V': version(progname);
136     default: exit(1);
137     }
138   }
139   if(getenv("FAIL_FIRST"))
140     fail_first = 1;
141 }
142
143
144 /*
145 Local Variables:
146 c-basic-offset:2
147 comment-column:40
148 fill-column:79
149 indent-tabs-mode:nil
150 End:
151 */