-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* rs/test-ctype: test-ctype: add test for is_pathspec_magic test-ctype: macrofy
- Loading branch information
Showing
1 changed file
with
22 additions
and
58 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,78 +1,42 @@ | ||
#include "cache.h" | ||
|
||
static int rc; | ||
|
||
static int test_isdigit(int c) | ||
static void report_error(const char *class, int ch) | ||
{ | ||
return isdigit(c); | ||
printf("%s classifies char %d (0x%02x) wrongly\n", class, ch, ch); | ||
rc = 1; | ||
} | ||
|
||
static int test_isspace(int c) | ||
static int is_in(const char *s, int ch) | ||
{ | ||
return isspace(c); | ||
/* We can't find NUL using strchr. It's classless anyway. */ | ||
if (ch == '\0') | ||
return 0; | ||
return !!strchr(s, ch); | ||
} | ||
|
||
static int test_isalpha(int c) | ||
{ | ||
return isalpha(c); | ||
} | ||
|
||
static int test_isalnum(int c) | ||
{ | ||
return isalnum(c); | ||
} | ||
|
||
static int test_is_glob_special(int c) | ||
{ | ||
return is_glob_special(c); | ||
} | ||
|
||
static int test_is_regex_special(int c) | ||
{ | ||
return is_regex_special(c); | ||
#define TEST_CLASS(t,s) { \ | ||
int i; \ | ||
for (i = 0; i < 256; i++) { \ | ||
if (is_in(s, i) != t(i)) \ | ||
report_error(#t, i); \ | ||
} \ | ||
} | ||
|
||
#define DIGIT "0123456789" | ||
#define LOWER "abcdefghijklmnopqrstuvwxyz" | ||
#define UPPER "ABCDEFGHIJKLMNOPQRSTUVWXYZ" | ||
|
||
static const struct ctype_class { | ||
const char *name; | ||
int (*test_fn)(int); | ||
const char *members; | ||
} classes[] = { | ||
{ "isdigit", test_isdigit, DIGIT }, | ||
{ "isspace", test_isspace, " \n\r\t" }, | ||
{ "isalpha", test_isalpha, LOWER UPPER }, | ||
{ "isalnum", test_isalnum, LOWER UPPER DIGIT }, | ||
{ "is_glob_special", test_is_glob_special, "*?[\\" }, | ||
{ "is_regex_special", test_is_regex_special, "$()*+.?[\\^{|" }, | ||
{ NULL } | ||
}; | ||
|
||
static int test_class(const struct ctype_class *test) | ||
{ | ||
int i, rc = 0; | ||
|
||
for (i = 0; i < 256; i++) { | ||
int expected = i ? !!strchr(test->members, i) : 0; | ||
int actual = test->test_fn(i); | ||
|
||
if (actual != expected) { | ||
rc = 1; | ||
printf("%s classifies char %d (0x%02x) wrongly\n", | ||
test->name, i, i); | ||
} | ||
} | ||
return rc; | ||
} | ||
|
||
int main(int argc, char **argv) | ||
{ | ||
const struct ctype_class *test; | ||
int rc = 0; | ||
|
||
for (test = classes; test->name; test++) | ||
rc |= test_class(test); | ||
TEST_CLASS(isdigit, DIGIT); | ||
TEST_CLASS(isspace, " \n\r\t"); | ||
TEST_CLASS(isalpha, LOWER UPPER); | ||
TEST_CLASS(isalnum, LOWER UPPER DIGIT); | ||
TEST_CLASS(is_glob_special, "*?[\\"); | ||
TEST_CLASS(is_regex_special, "$()*+.?[\\^{|"); | ||
TEST_CLASS(is_pathspec_magic, "!\"#%&',-/:;<=>@_`~"); | ||
|
||
return rc; | ||
} |