test-ctype: macrofy
Rewrite test-ctype to use a global variable and a macro instead of wrapper functions for each character class and complicated structs with loops going through them. The resulting code may be uglier, but that's OK for a test program, and it's actually easier to read and extend. And much shorter. Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx> Signed-off-by: Junio C Hamano <gitster@pobox.com>
René Scharfe committed
Oct 1, 2011 at 18:36 UTC
c37c004b0e22806fd976abe5ece800656af2653e
1 file changed
+21
-58
test-ctype.c
+21
-58
@@ -1,78 +1,41 @@
1
#include "cache.h"
2
3
+static int rc;
4
4
-static int test_isdigit(int c)
5
+static void report_error(const char *class, int ch)
6
{
6
- return isdigit(c);
7
+ printf("%s classifies char %d (0x%02x) wrongly\n", class, ch, ch);
8
+ rc = 1;
9
}
10
9
-static int test_isspace(int c)
11
+static int is_in(const char *s, int ch)
12
{
11
- return isspace(c);
13
+ /* We can't find NUL using strchr. It's classless anyway. */
14
+ if (ch == '\0')
15
+ return 0;
16
+ return !!strchr(s, ch);
17
}
18
14
-static int test_isalpha(int c)
15
-{
16
- return isalpha(c);
17
-}
18
-
19
-static int test_isalnum(int c)
20
-{
21
- return isalnum(c);
22
-}
23
-
24
-static int test_is_glob_special(int c)
25
-{
26
- return is_glob_special(c);
27
-}
28
-
29
-static int test_is_regex_special(int c)
30
-{
31
- return is_regex_special(c);
19
+#define TEST_CLASS(t,s) { \
20
+ int i; \
21
+ for (i = 0; i < 256; i++) { \
22
+ if (is_in(s, i) != t(i)) \
23
+ report_error(#t, i); \
24
+ } \
25
}
26
27
#define DIGIT "0123456789"
28
#define LOWER "abcdefghijklmnopqrstuvwxyz"
29
#define UPPER "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
30
38
-static const struct ctype_class {
39
- const char *name;
40
- int (*test_fn)(int);
41
- const char *members;
42
-} classes[] = {
43
- { "isdigit", test_isdigit, DIGIT },
44
- { "isspace", test_isspace, " \n\r\t" },
45
- { "isalpha", test_isalpha, LOWER UPPER },
46
- { "isalnum", test_isalnum, LOWER UPPER DIGIT },
47
- { "is_glob_special", test_is_glob_special, "*?[\\" },
48
- { "is_regex_special", test_is_regex_special, "$()*+.?[\\^{|" },
49
- { NULL }
50
-};
51
-
52
-static int test_class(const struct ctype_class *test)
53
-{
54
- int i, rc = 0;
55
-
56
- for (i = 0; i < 256; i++) {
57
- int expected = i ? !!strchr(test->members, i) : 0;
58
- int actual = test->test_fn(i);
59
-
60
- if (actual != expected) {
61
- rc = 1;
62
- printf("%s classifies char %d (0x%02x) wrongly\n",
63
- test->name, i, i);
64
- }
65
- }
66
- return rc;
67
-}
68
-
31
int main(int argc, char **argv)
32
{
71
- const struct ctype_class *test;
72
- int rc = 0;
73
-
74
- for (test = classes; test->name; test++)
75
- rc |= test_class(test);
33
+ TEST_CLASS(isdigit, DIGIT);
34
+ TEST_CLASS(isspace, " \n\r\t");
35
+ TEST_CLASS(isalpha, LOWER UPPER);
36
+ TEST_CLASS(isalnum, LOWER UPPER DIGIT);
37
+ TEST_CLASS(is_glob_special, "*?[\\");
38
+ TEST_CLASS(is_regex_special, "$()*+.?[\\^{|");
39
40
return rc;
41
}