• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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