chiark / gitweb /
Merge disorder.macros branch.
[disorder] / lib / 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
30 void count_error(void) {
31   ++errors;
32   if(fail_first)
33     abort();
34 }
35
36 const char *format(const char *s) {
37   struct dynstr d;
38   int c;
39   char buf[10];
40
41   dynstr_init(&d);
42   while((c = (unsigned char)*s++)) {
43     if(c >= ' ' && c <= '~')
44       dynstr_append(&d, c);
45     else {
46       sprintf(buf, "\\x%02X", (unsigned)c);
47       dynstr_append_string(&d, buf);
48     }
49   }
50   dynstr_terminate(&d);
51   return d.vec;
52 }
53
54 const char *format_utf32(const uint32_t *s) {
55   struct dynstr d;
56   uint32_t c;
57   char buf[64];
58
59   dynstr_init(&d);
60   while((c = *s++)) {
61     sprintf(buf, " %04lX", (long)c);
62     dynstr_append_string(&d, buf);
63   }
64   dynstr_terminate(&d);
65   return d.vec;
66 }
67
68 uint32_t *ucs4parse(const char *s) {
69   struct dynstr_ucs4 d;
70   char *e;
71
72   dynstr_ucs4_init(&d);
73   while(*s) {
74     errno = 0;
75     dynstr_ucs4_append(&d, strtoul(s, &e, 0));
76     if(errno) fatal(errno, "strtoul (%s)", s);
77     s = e;
78   }
79   dynstr_ucs4_terminate(&d);
80   return d.vec;
81 }
82
83 const char *do_printf(const char *fmt, ...) {
84   va_list ap;
85   char *s;
86   int rc;
87
88   va_start(ap, fmt);
89   rc = byte_vasprintf(&s, fmt, ap);
90   va_end(ap);
91   if(rc < 0)
92     return 0;
93   return s;
94 }
95
96 static const struct option options[] = {
97   { "verbose", no_argument, 0, 'v' },
98   { "fail-first", no_argument, 0, 'F' },
99   { "help", no_argument, 0, 'h' },
100   { "version", no_argument, 0, 'V' },
101 };
102
103 /* display usage message and terminate */
104 static void help(void) {
105   xprintf("Usage:\n"
106           "  %s [OPTIONS]\n"
107           "Options:\n"
108           "  --help, -h               Display usage message\n"
109           "  --version, -V            Display version number\n"
110           "  --verbose, -v            Verbose output\n"
111           "  --fail-first, -F         Stop on first failure\n",
112           progname);
113   xfclose(stdout);
114   exit(0);
115 }
116
117 void test_init(int argc, char **argv) {
118   int n;
119
120   set_progname(argv);
121   mem_init();
122   while((n = getopt_long(argc, argv, "vFhV", options, 0)) >= 0) {
123     switch(n) {
124     case 'v': verbose = 1; break;
125     case 'F': fail_first = 1; break;
126     case 'h': help();
127     case 'V': version(progname);
128     default: exit(1);
129     }
130   }
131   if(getenv("FAIL_FIRST"))
132     fail_first = 1;
133 }
134
135
136 /*
137 Local Variables:
138 c-basic-offset:2
139 comment-column:40
140 fill-column:79
141 indent-tabs-mode:nil
142 End:
143 */