Add ctype test
Manipulating the character class table in ctype.c by hand is error prone. To ensure that typos are found quickly, add a test program and script. test-ctype checks the output of the character class macros isspace() et. al. by applying them on all possible char values and consulting a list of all characters in the particular class. It doesn't check tolower() and toupper(); this could be added later. The test script t0070-fundamental.sh is created because there is no good place for the ctype test, yet -- except for t0000-basic.sh perhaps, but it doesn't run well on Windows, yet. Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx> Signed-off-by: Junio C Hamano <gitster@pobox.com>
René Scharfe committed
Jan 17, 2009 at 16:50 UTC
b4285c71bcc43c4cc9939b8d170aaf8ddb25f09f
3 files changed
+92
-1
Makefile
+11
-1
@@ -1356,7 +1356,15 @@ endif
1356
1357
### Testing rules
1358
1359
-TEST_PROGRAMS = test-chmtime$X test-genrandom$X test-date$X test-delta$X test-sha1$X test-match-trees$X test-parse-options$X test-path-utils$X
1359
+TEST_PROGRAMS += test-chmtime$X
1360
+TEST_PROGRAMS += test-ctype$X
1361
+TEST_PROGRAMS += test-date$X
1362
+TEST_PROGRAMS += test-delta$X
1363
+TEST_PROGRAMS += test-genrandom$X
1364
+TEST_PROGRAMS += test-match-trees$X
1365
+TEST_PROGRAMS += test-parse-options$X
1366
+TEST_PROGRAMS += test-path-utils$X
1367
+TEST_PROGRAMS += test-sha1$X
1368
1369
all:: $(TEST_PROGRAMS)
1370
@@ -1369,6 +1377,8 @@ export NO_SVN_TESTS
1377
test: all
1378
$(MAKE) -C t/ all
1379
1380
+test-ctype$X: ctype.o
1381
+
1382
test-date$X: date.o ctype.o
1383
1384
test-delta$X: diff-delta.o patch-delta.o
t/t0070-fundamental.sh
new
+15
@@ -0,0 +1,15 @@
1
+#!/bin/sh
2
+
3
+test_description='check that the most basic functions work
4
+
5
+
6
+Verify wrappers and compatibility functions.
7
+'
8
+
9
+. ./test-lib.sh
10
+
11
+test_expect_success 'character classes (isspace, isalpha etc.)' '
12
+ test-ctype
13
+'
14
+
15
+test_done
test-ctype.c
new
+66
@@ -0,0 +1,66 @@
1
+#include "cache.h"
2
+
3
+
4
+static int test_isdigit(int c)
5
+{
6
+ return isdigit(c);
7
+}
8
+
9
+static int test_isspace(int c)
10
+{
11
+ return isspace(c);
12
+}
13
+
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
+#define DIGIT "0123456789"
25
+#define LOWER "abcdefghijklmnopqrstuvwxyz"
26
+#define UPPER "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
27
+
28
+static const struct ctype_class {
29
+ const char *name;
30
+ int (*test_fn)(int);
31
+ const char *members;
32
+} classes[] = {
33
+ { "isdigit", test_isdigit, DIGIT },
34
+ { "isspace", test_isspace, " \n\r\t" },
35
+ { "isalpha", test_isalpha, LOWER UPPER },
36
+ { "isalnum", test_isalnum, LOWER UPPER DIGIT },
37
+ { NULL }
38
+};
39
+
40
+static int test_class(const struct ctype_class *test)
41
+{
42
+ int i, rc = 0;
43
+
44
+ for (i = 0; i < 256; i++) {
45
+ int expected = i ? !!strchr(test->members, i) : 0;
46
+ int actual = test->test_fn(i);
47
+
48
+ if (actual != expected) {
49
+ rc = 1;
50
+ printf("%s classifies char %d (0x%02x) wrongly\n",
51
+ test->name, i, i);
52
+ }
53
+ }
54
+ return rc;
55
+}
56
+
57
+int main(int argc, char **argv)
58
+{
59
+ const struct ctype_class *test;
60
+ int rc = 0;
61
+
62
+ for (test = classes; test->name; test++)
63
+ rc |= test_class(test);
64
+
65
+ return rc;
66
+}