1
1
#include "test-lib.h"
2
2
3
- static int is_in (const char * s , int ch )
4
- {
5
- /*
6
- * We can't find NUL using strchr. Accept it as the first
7
- * character in the spec -- there are no empty classes.
8
- */
9
- if (ch == '\0' )
10
- return ch == * s ;
11
- if (* s == '\0' )
12
- s ++ ;
13
- return !!strchr (s , ch );
14
- }
15
-
16
- /* Macro to test a character type */
17
- #define TEST_CTYPE_FUNC (func , string ) \
18
- static void test_ctype_##func(void) { \
19
- for (int i = 0; i < 256; i++) { \
20
- if (!check_int(func(i), ==, is_in(string, i))) \
21
- test_msg(" i: 0x%02x", i); \
3
+ #define TEST_CHAR_CLASS (class , string ) do { \
4
+ size_t len = ARRAY_SIZE(string) - 1 + \
5
+ BUILD_ASSERT_OR_ZERO(ARRAY_SIZE(string) > 0) + \
6
+ BUILD_ASSERT_OR_ZERO(sizeof(string[0]) == sizeof(char)); \
7
+ int skip = test__run_begin(); \
8
+ if (!skip) { \
9
+ for (int i = 0; i < 256; i++) { \
10
+ if (!check_int(class(i), ==, !!memchr(string, i, len)))\
11
+ test_msg(" i: 0x%02x", i); \
12
+ } \
13
+ check(!class(EOF)); \
22
14
} \
23
- if (!check(!func(EOF))) \
24
- test_msg(" i: 0x%02x (EOF)", EOF); \
25
- }
26
-
27
- #define TEST_CHAR_CLASS (class ) TEST(test_ctype_##class(), #class " works")
15
+ test__run_end(!skip, TEST_LOCATION(), #class " works"); \
16
+ } while (0)
28
17
29
18
#define DIGIT "0123456789"
30
19
#define LOWER "abcdefghijklmnopqrstuvwxyz"
@@ -44,37 +33,21 @@ static void test_ctype_##func(void) { \
44
33
"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" \
45
34
"\x7f"
46
35
47
- TEST_CTYPE_FUNC (isdigit , DIGIT )
48
- TEST_CTYPE_FUNC (isspace , " \n\r\t" )
49
- TEST_CTYPE_FUNC (isalpha , LOWER UPPER )
50
- TEST_CTYPE_FUNC (isalnum , LOWER UPPER DIGIT )
51
- TEST_CTYPE_FUNC (is_glob_special , "*?[\\" )
52
- TEST_CTYPE_FUNC (is_regex_special , "$()*+.?[\\^{|" )
53
- TEST_CTYPE_FUNC (is_pathspec_magic , "!\"#%&',-/:;<=>@_`~" )
54
- TEST_CTYPE_FUNC (isascii , ASCII )
55
- TEST_CTYPE_FUNC (islower , LOWER )
56
- TEST_CTYPE_FUNC (isupper , UPPER )
57
- TEST_CTYPE_FUNC (iscntrl , CNTRL )
58
- TEST_CTYPE_FUNC (ispunct , PUNCT )
59
- TEST_CTYPE_FUNC (isxdigit , DIGIT "abcdefABCDEF" )
60
- TEST_CTYPE_FUNC (isprint , LOWER UPPER DIGIT PUNCT " " )
61
-
62
36
int cmd_main (int argc , const char * * argv ) {
63
- /* Run all character type tests */
64
- TEST_CHAR_CLASS (isspace );
65
- TEST_CHAR_CLASS (isdigit );
66
- TEST_CHAR_CLASS (isalpha );
67
- TEST_CHAR_CLASS (isalnum );
68
- TEST_CHAR_CLASS (is_glob_special );
69
- TEST_CHAR_CLASS (is_regex_special );
70
- TEST_CHAR_CLASS (is_pathspec_magic );
71
- TEST_CHAR_CLASS (isascii );
72
- TEST_CHAR_CLASS (islower );
73
- TEST_CHAR_CLASS (isupper );
74
- TEST_CHAR_CLASS (iscntrl );
75
- TEST_CHAR_CLASS (ispunct );
76
- TEST_CHAR_CLASS (isxdigit );
77
- TEST_CHAR_CLASS (isprint );
37
+ TEST_CHAR_CLASS (isspace , " \n\r\t" );
38
+ TEST_CHAR_CLASS (isdigit , DIGIT );
39
+ TEST_CHAR_CLASS (isalpha , LOWER UPPER );
40
+ TEST_CHAR_CLASS (isalnum , LOWER UPPER DIGIT );
41
+ TEST_CHAR_CLASS (is_glob_special , "*?[\\" );
42
+ TEST_CHAR_CLASS (is_regex_special , "$()*+.?[\\^{|" );
43
+ TEST_CHAR_CLASS (is_pathspec_magic , "!\"#%&',-/:;<=>@_`~" );
44
+ TEST_CHAR_CLASS (isascii , ASCII );
45
+ TEST_CHAR_CLASS (islower , LOWER );
46
+ TEST_CHAR_CLASS (isupper , UPPER );
47
+ TEST_CHAR_CLASS (iscntrl , CNTRL );
48
+ TEST_CHAR_CLASS (ispunct , PUNCT );
49
+ TEST_CHAR_CLASS (isxdigit , DIGIT "abcdefABCDEF" );
50
+ TEST_CHAR_CLASS (isprint , LOWER UPPER DIGIT PUNCT " " );
78
51
79
52
return test_done ();
80
53
}
0 commit comments