1 /*
2 * Copyright (C) 2023 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "gtest/gtest.h"
18
19 #include <ctype.h>
20
TEST(Ctype,CharType)21 TEST(Ctype, CharType) {
22 EXPECT_TRUE(isalnum('A'));
23 EXPECT_TRUE(isalpha('A'));
24 EXPECT_TRUE(isascii('A'));
25 EXPECT_FALSE(isblank('A'));
26 EXPECT_FALSE(iscntrl('A'));
27 EXPECT_FALSE(isdigit('A'));
28 EXPECT_TRUE(isgraph('A'));
29 EXPECT_FALSE(islower('A'));
30 EXPECT_TRUE(isprint('A'));
31 EXPECT_FALSE(ispunct('A'));
32 EXPECT_FALSE(isspace('A'));
33 EXPECT_TRUE(isupper('A'));
34 EXPECT_TRUE(isxdigit('A'));
35
36 EXPECT_TRUE(isalnum('0'));
37 EXPECT_FALSE(isalpha('0'));
38 EXPECT_TRUE(isascii('0'));
39 EXPECT_FALSE(isblank('A'));
40 EXPECT_FALSE(iscntrl('0'));
41 EXPECT_TRUE(isdigit('0'));
42 EXPECT_TRUE(isgraph('0'));
43 EXPECT_FALSE(islower('0'));
44 EXPECT_TRUE(isprint('0'));
45 EXPECT_FALSE(ispunct('0'));
46 EXPECT_FALSE(isspace('0'));
47 EXPECT_FALSE(isupper('0'));
48 EXPECT_TRUE(isxdigit('0'));
49
50 EXPECT_FALSE(isalnum(' '));
51 EXPECT_FALSE(isalpha(' '));
52 EXPECT_TRUE(isascii(' '));
53 EXPECT_TRUE(isblank(' '));
54 EXPECT_FALSE(iscntrl(' '));
55 EXPECT_FALSE(isdigit(' '));
56 EXPECT_FALSE(isgraph(' '));
57 EXPECT_FALSE(islower(' '));
58 EXPECT_TRUE(isprint(' '));
59 EXPECT_FALSE(ispunct(' '));
60 EXPECT_TRUE(isspace(' '));
61 EXPECT_FALSE(isupper(' '));
62 EXPECT_FALSE(isxdigit(' '));
63
64 EXPECT_FALSE(isblank('\n'));
65 EXPECT_TRUE(isspace('\n'));
66 EXPECT_TRUE(ispunct(','));
67 EXPECT_FALSE(isprint(1));
68 EXPECT_TRUE(iscntrl(1));
69 EXPECT_FALSE(isascii(-1));
70 }
71
72 using CharTypeFunc = int (*)(int chr);
73
74 // The ctype functions must not be inlined to test their function trampolines. To prevent inlining,
75 // make an indirect call through a volatile function pointer.
76 #define NO_INLINE(func) \
77 volatile CharTypeFunc func##_tmp = func; \
78 CharTypeFunc func = func##_tmp;
79
TEST(Ctype,CharTypeNoInline)80 TEST(Ctype, CharTypeNoInline) {
81 NO_INLINE(isalnum);
82 NO_INLINE(isalpha);
83 NO_INLINE(isascii);
84 NO_INLINE(iscntrl);
85 NO_INLINE(isdigit);
86 NO_INLINE(isgraph);
87 NO_INLINE(islower);
88 NO_INLINE(isprint);
89 NO_INLINE(ispunct);
90 NO_INLINE(isspace);
91 NO_INLINE(isupper);
92 NO_INLINE(isxdigit);
93
94 EXPECT_TRUE(isalnum('A'));
95 EXPECT_TRUE(isalpha('A'));
96 EXPECT_TRUE(isascii('A'));
97 EXPECT_FALSE(isblank('A'));
98 EXPECT_FALSE(iscntrl('A'));
99 EXPECT_FALSE(isdigit('A'));
100 EXPECT_TRUE(isgraph('A'));
101 EXPECT_FALSE(islower('A'));
102 EXPECT_TRUE(isprint('A'));
103 EXPECT_FALSE(ispunct('A'));
104 EXPECT_FALSE(isspace('A'));
105 EXPECT_TRUE(isupper('A'));
106 EXPECT_TRUE(isxdigit('A'));
107
108 EXPECT_TRUE(isalnum('0'));
109 EXPECT_FALSE(isalpha('0'));
110 EXPECT_TRUE(isascii('0'));
111 EXPECT_FALSE(isblank('0'));
112 EXPECT_FALSE(iscntrl('0'));
113 EXPECT_TRUE(isdigit('0'));
114 EXPECT_TRUE(isgraph('0'));
115 EXPECT_FALSE(islower('0'));
116 EXPECT_TRUE(isprint('0'));
117 EXPECT_FALSE(ispunct('0'));
118 EXPECT_FALSE(isspace('0'));
119 EXPECT_FALSE(isupper('0'));
120 EXPECT_TRUE(isxdigit('0'));
121
122 EXPECT_FALSE(isalnum(' '));
123 EXPECT_FALSE(isalpha(' '));
124 EXPECT_TRUE(isascii(' '));
125 EXPECT_TRUE(isblank(' '));
126 EXPECT_FALSE(iscntrl(' '));
127 EXPECT_FALSE(isdigit(' '));
128 EXPECT_FALSE(isgraph(' '));
129 EXPECT_FALSE(islower(' '));
130 EXPECT_TRUE(isprint(' '));
131 EXPECT_FALSE(ispunct(' '));
132 EXPECT_TRUE(isspace(' '));
133 EXPECT_FALSE(isupper(' '));
134 EXPECT_FALSE(isxdigit(' '));
135
136 EXPECT_FALSE(isblank('\n'));
137 EXPECT_TRUE(isspace('\n'));
138 EXPECT_TRUE(ispunct(','));
139 EXPECT_FALSE(isprint(1));
140 EXPECT_TRUE(iscntrl(1));
141 EXPECT_FALSE(isascii(-1));
142 }
143
TEST(Ctype,ToLower)144 TEST(Ctype, ToLower) {
145 EXPECT_EQ('a', tolower('A'));
146 EXPECT_EQ('a', tolower('a'));
147 EXPECT_EQ('0', tolower('0'));
148 }
149
TEST(Ctype,ToLowerNoInline)150 TEST(Ctype, ToLowerNoInline) {
151 NO_INLINE(tolower);
152 EXPECT_EQ('a', tolower('A'));
153 EXPECT_EQ('a', tolower('a'));
154 EXPECT_EQ('0', tolower('0'));
155 }
156
TEST(Ctype,ToUpper)157 TEST(Ctype, ToUpper) {
158 EXPECT_EQ('A', toupper('a'));
159 EXPECT_EQ('A', toupper('A'));
160 EXPECT_EQ('0', toupper('0'));
161 }
162
TEST(Ctype,ToUpperNoInline)163 TEST(Ctype, ToUpperNoInline) {
164 NO_INLINE(toupper);
165 EXPECT_EQ('A', toupper('a'));
166 EXPECT_EQ('A', toupper('A'));
167 EXPECT_EQ('0', toupper('0'));
168 }
169
TEST(Ctype,ToAscii)170 TEST(Ctype, ToAscii) {
171 EXPECT_EQ(0x7f, toascii(0xff));
172 }
173
TEST(Ctype,ToAsciiNoInline)174 TEST(Ctype, ToAsciiNoInline) {
175 NO_INLINE(toascii);
176 EXPECT_EQ(0x7f, toascii(0xff));
177 }
178