1 //===- unittests/Basic/CharInfoTest.cpp -- ASCII classification tests -----===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "clang/Basic/CharInfo.h" 11 #include "gtest/gtest.h" 12 13 using namespace llvm; 14 using namespace clang; 15 16 // Check that the CharInfo table has been constructed reasonably. 17 TEST(CharInfoTest, validateInfoTable) { 18 using namespace charinfo; 19 EXPECT_EQ((unsigned)CHAR_SPACE, InfoTable[(unsigned)' ']); 20 EXPECT_EQ((unsigned)CHAR_HORZ_WS, InfoTable[(unsigned)'\t']); 21 EXPECT_EQ((unsigned)CHAR_HORZ_WS, InfoTable[(unsigned)'\f']); // ?? 22 EXPECT_EQ((unsigned)CHAR_HORZ_WS, InfoTable[(unsigned)'\v']); // ?? 23 EXPECT_EQ((unsigned)CHAR_VERT_WS, InfoTable[(unsigned)'\n']); 24 EXPECT_EQ((unsigned)CHAR_VERT_WS, InfoTable[(unsigned)'\r']); 25 EXPECT_EQ((unsigned)CHAR_UNDER, InfoTable[(unsigned)'_']); 26 EXPECT_EQ((unsigned)CHAR_PERIOD, InfoTable[(unsigned)'.']); 27 28 for (unsigned i = 'a'; i <= 'f'; ++i) { 29 EXPECT_EQ((unsigned)CHAR_XLOWER, InfoTable[i]); 30 EXPECT_EQ((unsigned)CHAR_XUPPER, InfoTable[i+'A'-'a']); 31 } 32 33 for (unsigned i = 'g'; i <= 'z'; ++i) { 34 EXPECT_EQ((unsigned)CHAR_LOWER, InfoTable[i]); 35 EXPECT_EQ((unsigned)CHAR_UPPER, InfoTable[i+'A'-'a']); 36 } 37 38 for (unsigned i = '0'; i <= '9'; ++i) 39 EXPECT_EQ((unsigned)CHAR_DIGIT, InfoTable[i]); 40 } 41 42 // Check various predicates. 43 TEST(CharInfoTest, isASCII) { 44 EXPECT_TRUE(isASCII('\0')); 45 EXPECT_TRUE(isASCII('\n')); 46 EXPECT_TRUE(isASCII(' ')); 47 EXPECT_TRUE(isASCII('a')); 48 EXPECT_TRUE(isASCII('\x7f')); 49 EXPECT_FALSE(isASCII('\x80')); 50 EXPECT_FALSE(isASCII('\xc2')); 51 EXPECT_FALSE(isASCII('\xff')); 52 } 53 54 TEST(CharInfoTest, isIdentifierHead) { 55 EXPECT_TRUE(isIdentifierHead('a')); 56 EXPECT_TRUE(isIdentifierHead('A')); 57 EXPECT_TRUE(isIdentifierHead('z')); 58 EXPECT_TRUE(isIdentifierHead('Z')); 59 EXPECT_TRUE(isIdentifierHead('_')); 60 61 EXPECT_FALSE(isIdentifierHead('0')); 62 EXPECT_FALSE(isIdentifierHead('.')); 63 EXPECT_FALSE(isIdentifierHead('`')); 64 EXPECT_FALSE(isIdentifierHead('\0')); 65 66 EXPECT_FALSE(isIdentifierHead('$')); 67 EXPECT_TRUE(isIdentifierHead('$', /*AllowDollar=*/true)); 68 69 EXPECT_FALSE(isIdentifierHead('\x80')); 70 EXPECT_FALSE(isIdentifierHead('\xc2')); 71 EXPECT_FALSE(isIdentifierHead('\xff')); 72 } 73 74 TEST(CharInfoTest, isIdentifierBody) { 75 EXPECT_TRUE(isIdentifierBody('a')); 76 EXPECT_TRUE(isIdentifierBody('A')); 77 EXPECT_TRUE(isIdentifierBody('z')); 78 EXPECT_TRUE(isIdentifierBody('Z')); 79 EXPECT_TRUE(isIdentifierBody('_')); 80 81 EXPECT_TRUE(isIdentifierBody('0')); 82 EXPECT_FALSE(isIdentifierBody('.')); 83 EXPECT_FALSE(isIdentifierBody('`')); 84 EXPECT_FALSE(isIdentifierBody('\0')); 85 86 EXPECT_FALSE(isIdentifierBody('$')); 87 EXPECT_TRUE(isIdentifierBody('$', /*AllowDollar=*/true)); 88 89 EXPECT_FALSE(isIdentifierBody('\x80')); 90 EXPECT_FALSE(isIdentifierBody('\xc2')); 91 EXPECT_FALSE(isIdentifierBody('\xff')); 92 } 93 94 TEST(CharInfoTest, isHorizontalWhitespace) { 95 EXPECT_FALSE(isHorizontalWhitespace('a')); 96 EXPECT_FALSE(isHorizontalWhitespace('_')); 97 EXPECT_FALSE(isHorizontalWhitespace('0')); 98 EXPECT_FALSE(isHorizontalWhitespace('.')); 99 EXPECT_FALSE(isHorizontalWhitespace('`')); 100 EXPECT_FALSE(isHorizontalWhitespace('\0')); 101 EXPECT_FALSE(isHorizontalWhitespace('\x7f')); 102 103 EXPECT_TRUE(isHorizontalWhitespace(' ')); 104 EXPECT_TRUE(isHorizontalWhitespace('\t')); 105 EXPECT_TRUE(isHorizontalWhitespace('\f')); // ?? 106 EXPECT_TRUE(isHorizontalWhitespace('\v')); // ?? 107 108 EXPECT_FALSE(isHorizontalWhitespace('\n')); 109 EXPECT_FALSE(isHorizontalWhitespace('\r')); 110 111 EXPECT_FALSE(isHorizontalWhitespace('\x80')); 112 EXPECT_FALSE(isHorizontalWhitespace('\xc2')); 113 EXPECT_FALSE(isHorizontalWhitespace('\xff')); 114 } 115 116 TEST(CharInfoTest, isVerticalWhitespace) { 117 EXPECT_FALSE(isVerticalWhitespace('a')); 118 EXPECT_FALSE(isVerticalWhitespace('_')); 119 EXPECT_FALSE(isVerticalWhitespace('0')); 120 EXPECT_FALSE(isVerticalWhitespace('.')); 121 EXPECT_FALSE(isVerticalWhitespace('`')); 122 EXPECT_FALSE(isVerticalWhitespace('\0')); 123 EXPECT_FALSE(isVerticalWhitespace('\x7f')); 124 125 EXPECT_FALSE(isVerticalWhitespace(' ')); 126 EXPECT_FALSE(isVerticalWhitespace('\t')); 127 EXPECT_FALSE(isVerticalWhitespace('\f')); // ?? 128 EXPECT_FALSE(isVerticalWhitespace('\v')); // ?? 129 130 EXPECT_TRUE(isVerticalWhitespace('\n')); 131 EXPECT_TRUE(isVerticalWhitespace('\r')); 132 133 EXPECT_FALSE(isVerticalWhitespace('\x80')); 134 EXPECT_FALSE(isVerticalWhitespace('\xc2')); 135 EXPECT_FALSE(isVerticalWhitespace('\xff')); 136 } 137 138 TEST(CharInfoTest, isWhitespace) { 139 EXPECT_FALSE(isWhitespace('a')); 140 EXPECT_FALSE(isWhitespace('_')); 141 EXPECT_FALSE(isWhitespace('0')); 142 EXPECT_FALSE(isWhitespace('.')); 143 EXPECT_FALSE(isWhitespace('`')); 144 EXPECT_FALSE(isWhitespace('\0')); 145 EXPECT_FALSE(isWhitespace('\x7f')); 146 147 EXPECT_TRUE(isWhitespace(' ')); 148 EXPECT_TRUE(isWhitespace('\t')); 149 EXPECT_TRUE(isWhitespace('\f')); 150 EXPECT_TRUE(isWhitespace('\v')); 151 152 EXPECT_TRUE(isWhitespace('\n')); 153 EXPECT_TRUE(isWhitespace('\r')); 154 155 EXPECT_FALSE(isWhitespace('\x80')); 156 EXPECT_FALSE(isWhitespace('\xc2')); 157 EXPECT_FALSE(isWhitespace('\xff')); 158 } 159 160 TEST(CharInfoTest, isDigit) { 161 EXPECT_TRUE(isDigit('0')); 162 EXPECT_TRUE(isDigit('9')); 163 164 EXPECT_FALSE(isDigit('a')); 165 EXPECT_FALSE(isDigit('A')); 166 167 EXPECT_FALSE(isDigit('z')); 168 EXPECT_FALSE(isDigit('Z')); 169 170 EXPECT_FALSE(isDigit('.')); 171 EXPECT_FALSE(isDigit('_')); 172 173 EXPECT_FALSE(isDigit('/')); 174 EXPECT_FALSE(isDigit('\0')); 175 176 EXPECT_FALSE(isDigit('\x80')); 177 EXPECT_FALSE(isDigit('\xc2')); 178 EXPECT_FALSE(isDigit('\xff')); 179 } 180 181 TEST(CharInfoTest, isHexDigit) { 182 EXPECT_TRUE(isHexDigit('0')); 183 EXPECT_TRUE(isHexDigit('9')); 184 185 EXPECT_TRUE(isHexDigit('a')); 186 EXPECT_TRUE(isHexDigit('A')); 187 188 EXPECT_FALSE(isHexDigit('z')); 189 EXPECT_FALSE(isHexDigit('Z')); 190 191 EXPECT_FALSE(isHexDigit('.')); 192 EXPECT_FALSE(isHexDigit('_')); 193 194 EXPECT_FALSE(isHexDigit('/')); 195 EXPECT_FALSE(isHexDigit('\0')); 196 197 EXPECT_FALSE(isHexDigit('\x80')); 198 EXPECT_FALSE(isHexDigit('\xc2')); 199 EXPECT_FALSE(isHexDigit('\xff')); 200 } 201 202 TEST(CharInfoTest, isLetter) { 203 EXPECT_FALSE(isLetter('0')); 204 EXPECT_FALSE(isLetter('9')); 205 206 EXPECT_TRUE(isLetter('a')); 207 EXPECT_TRUE(isLetter('A')); 208 209 EXPECT_TRUE(isLetter('z')); 210 EXPECT_TRUE(isLetter('Z')); 211 212 EXPECT_FALSE(isLetter('.')); 213 EXPECT_FALSE(isLetter('_')); 214 215 EXPECT_FALSE(isLetter('/')); 216 EXPECT_FALSE(isLetter('(')); 217 EXPECT_FALSE(isLetter('\0')); 218 219 EXPECT_FALSE(isLetter('\x80')); 220 EXPECT_FALSE(isLetter('\xc2')); 221 EXPECT_FALSE(isLetter('\xff')); 222 } 223 224 TEST(CharInfoTest, isLowercase) { 225 EXPECT_FALSE(isLowercase('0')); 226 EXPECT_FALSE(isLowercase('9')); 227 228 EXPECT_TRUE(isLowercase('a')); 229 EXPECT_FALSE(isLowercase('A')); 230 231 EXPECT_TRUE(isLowercase('z')); 232 EXPECT_FALSE(isLowercase('Z')); 233 234 EXPECT_FALSE(isLowercase('.')); 235 EXPECT_FALSE(isLowercase('_')); 236 237 EXPECT_FALSE(isLowercase('/')); 238 EXPECT_FALSE(isLowercase('(')); 239 EXPECT_FALSE(isLowercase('\0')); 240 241 EXPECT_FALSE(isLowercase('\x80')); 242 EXPECT_FALSE(isLowercase('\xc2')); 243 EXPECT_FALSE(isLowercase('\xff')); 244 } 245 246 TEST(CharInfoTest, isUppercase) { 247 EXPECT_FALSE(isUppercase('0')); 248 EXPECT_FALSE(isUppercase('9')); 249 250 EXPECT_FALSE(isUppercase('a')); 251 EXPECT_TRUE(isUppercase('A')); 252 253 EXPECT_FALSE(isUppercase('z')); 254 EXPECT_TRUE(isUppercase('Z')); 255 256 EXPECT_FALSE(isUppercase('.')); 257 EXPECT_FALSE(isUppercase('_')); 258 259 EXPECT_FALSE(isUppercase('/')); 260 EXPECT_FALSE(isUppercase('(')); 261 EXPECT_FALSE(isUppercase('\0')); 262 263 EXPECT_FALSE(isUppercase('\x80')); 264 EXPECT_FALSE(isUppercase('\xc2')); 265 EXPECT_FALSE(isUppercase('\xff')); 266 } 267 268 TEST(CharInfoTest, isAlphanumeric) { 269 EXPECT_TRUE(isAlphanumeric('0')); 270 EXPECT_TRUE(isAlphanumeric('9')); 271 272 EXPECT_TRUE(isAlphanumeric('a')); 273 EXPECT_TRUE(isAlphanumeric('A')); 274 275 EXPECT_TRUE(isAlphanumeric('z')); 276 EXPECT_TRUE(isAlphanumeric('Z')); 277 278 EXPECT_FALSE(isAlphanumeric('.')); 279 EXPECT_FALSE(isAlphanumeric('_')); 280 281 EXPECT_FALSE(isAlphanumeric('/')); 282 EXPECT_FALSE(isAlphanumeric('(')); 283 EXPECT_FALSE(isAlphanumeric('\0')); 284 285 EXPECT_FALSE(isAlphanumeric('\x80')); 286 EXPECT_FALSE(isAlphanumeric('\xc2')); 287 EXPECT_FALSE(isAlphanumeric('\xff')); 288 } 289 290 TEST(CharInfoTest, isPunctuation) { 291 EXPECT_FALSE(isPunctuation('0')); 292 EXPECT_FALSE(isPunctuation('9')); 293 294 EXPECT_FALSE(isPunctuation('a')); 295 EXPECT_FALSE(isPunctuation('A')); 296 297 EXPECT_FALSE(isPunctuation('z')); 298 EXPECT_FALSE(isPunctuation('Z')); 299 300 EXPECT_TRUE(isPunctuation('.')); 301 EXPECT_TRUE(isPunctuation('_')); 302 303 EXPECT_TRUE(isPunctuation('/')); 304 EXPECT_TRUE(isPunctuation('(')); 305 306 EXPECT_FALSE(isPunctuation(' ')); 307 EXPECT_FALSE(isPunctuation('\n')); 308 EXPECT_FALSE(isPunctuation('\0')); 309 310 EXPECT_FALSE(isPunctuation('\x80')); 311 EXPECT_FALSE(isPunctuation('\xc2')); 312 EXPECT_FALSE(isPunctuation('\xff')); 313 } 314 315 TEST(CharInfoTest, isPrintable) { 316 EXPECT_TRUE(isPrintable('0')); 317 EXPECT_TRUE(isPrintable('9')); 318 319 EXPECT_TRUE(isPrintable('a')); 320 EXPECT_TRUE(isPrintable('A')); 321 322 EXPECT_TRUE(isPrintable('z')); 323 EXPECT_TRUE(isPrintable('Z')); 324 325 EXPECT_TRUE(isPrintable('.')); 326 EXPECT_TRUE(isPrintable('_')); 327 328 EXPECT_TRUE(isPrintable('/')); 329 EXPECT_TRUE(isPrintable('(')); 330 331 EXPECT_TRUE(isPrintable(' ')); 332 EXPECT_FALSE(isPrintable('\t')); 333 EXPECT_FALSE(isPrintable('\n')); 334 EXPECT_FALSE(isPrintable('\0')); 335 336 EXPECT_FALSE(isPrintable('\x80')); 337 EXPECT_FALSE(isPrintable('\xc2')); 338 EXPECT_FALSE(isPrintable('\xff')); 339 } 340 341 TEST(CharInfoTest, isPreprocessingNumberBody) { 342 EXPECT_TRUE(isPreprocessingNumberBody('0')); 343 EXPECT_TRUE(isPreprocessingNumberBody('9')); 344 345 EXPECT_TRUE(isPreprocessingNumberBody('a')); 346 EXPECT_TRUE(isPreprocessingNumberBody('A')); 347 348 EXPECT_TRUE(isPreprocessingNumberBody('z')); 349 EXPECT_TRUE(isPreprocessingNumberBody('Z')); 350 EXPECT_TRUE(isPreprocessingNumberBody('.')); 351 EXPECT_TRUE(isPreprocessingNumberBody('_')); 352 353 EXPECT_FALSE(isPreprocessingNumberBody('/')); 354 EXPECT_FALSE(isPreprocessingNumberBody('(')); 355 EXPECT_FALSE(isPreprocessingNumberBody('\0')); 356 357 EXPECT_FALSE(isPreprocessingNumberBody('\x80')); 358 EXPECT_FALSE(isPreprocessingNumberBody('\xc2')); 359 EXPECT_FALSE(isPreprocessingNumberBody('\xff')); 360 } 361 362 TEST(CharInfoTest, isRawStringDelimBody) { 363 EXPECT_TRUE(isRawStringDelimBody('0')); 364 EXPECT_TRUE(isRawStringDelimBody('9')); 365 366 EXPECT_TRUE(isRawStringDelimBody('a')); 367 EXPECT_TRUE(isRawStringDelimBody('A')); 368 369 EXPECT_TRUE(isRawStringDelimBody('z')); 370 EXPECT_TRUE(isRawStringDelimBody('Z')); 371 EXPECT_TRUE(isRawStringDelimBody('.')); 372 EXPECT_TRUE(isRawStringDelimBody('_')); 373 374 EXPECT_TRUE(isRawStringDelimBody('/')); 375 EXPECT_FALSE(isRawStringDelimBody('(')); 376 EXPECT_FALSE(isRawStringDelimBody('\0')); 377 378 EXPECT_FALSE(isRawStringDelimBody('\x80')); 379 EXPECT_FALSE(isRawStringDelimBody('\xc2')); 380 EXPECT_FALSE(isRawStringDelimBody('\xff')); 381 } 382 383 TEST(CharInfoTest, toLowercase) { 384 EXPECT_EQ('0', toLowercase('0')); 385 EXPECT_EQ('9', toLowercase('9')); 386 387 EXPECT_EQ('a', toLowercase('a')); 388 EXPECT_EQ('a', toLowercase('A')); 389 390 EXPECT_EQ('z', toLowercase('z')); 391 EXPECT_EQ('z', toLowercase('Z')); 392 393 EXPECT_EQ('.', toLowercase('.')); 394 EXPECT_EQ('_', toLowercase('_')); 395 396 EXPECT_EQ('/', toLowercase('/')); 397 EXPECT_EQ('\0', toLowercase('\0')); 398 } 399 400 TEST(CharInfoTest, toUppercase) { 401 EXPECT_EQ('0', toUppercase('0')); 402 EXPECT_EQ('9', toUppercase('9')); 403 404 EXPECT_EQ('A', toUppercase('a')); 405 EXPECT_EQ('A', toUppercase('A')); 406 407 EXPECT_EQ('Z', toUppercase('z')); 408 EXPECT_EQ('Z', toUppercase('Z')); 409 410 EXPECT_EQ('.', toUppercase('.')); 411 EXPECT_EQ('_', toUppercase('_')); 412 413 EXPECT_EQ('/', toUppercase('/')); 414 EXPECT_EQ('\0', toUppercase('\0')); 415 } 416 417 TEST(CharInfoTest, isValidIdentifier) { 418 EXPECT_FALSE(isValidIdentifier("")); 419 420 // 1 character 421 EXPECT_FALSE(isValidIdentifier(".")); 422 EXPECT_FALSE(isValidIdentifier("\n")); 423 EXPECT_FALSE(isValidIdentifier(" ")); 424 EXPECT_FALSE(isValidIdentifier("\x80")); 425 EXPECT_FALSE(isValidIdentifier("\xc2")); 426 EXPECT_FALSE(isValidIdentifier("\xff")); 427 EXPECT_FALSE(isValidIdentifier("$")); 428 EXPECT_FALSE(isValidIdentifier("1")); 429 430 EXPECT_TRUE(isValidIdentifier("_")); 431 EXPECT_TRUE(isValidIdentifier("a")); 432 EXPECT_TRUE(isValidIdentifier("z")); 433 EXPECT_TRUE(isValidIdentifier("A")); 434 EXPECT_TRUE(isValidIdentifier("Z")); 435 436 // 2 characters, '_' suffix 437 EXPECT_FALSE(isValidIdentifier("._")); 438 EXPECT_FALSE(isValidIdentifier("\n_")); 439 EXPECT_FALSE(isValidIdentifier(" _")); 440 EXPECT_FALSE(isValidIdentifier("\x80_")); 441 EXPECT_FALSE(isValidIdentifier("\xc2_")); 442 EXPECT_FALSE(isValidIdentifier("\xff_")); 443 EXPECT_FALSE(isValidIdentifier("$_")); 444 EXPECT_FALSE(isValidIdentifier("1_")); 445 446 EXPECT_TRUE(isValidIdentifier("__")); 447 EXPECT_TRUE(isValidIdentifier("a_")); 448 EXPECT_TRUE(isValidIdentifier("z_")); 449 EXPECT_TRUE(isValidIdentifier("A_")); 450 EXPECT_TRUE(isValidIdentifier("Z_")); 451 452 // 2 characters, '_' prefix 453 EXPECT_FALSE(isValidIdentifier("_.")); 454 EXPECT_FALSE(isValidIdentifier("_\n")); 455 EXPECT_FALSE(isValidIdentifier("_ ")); 456 EXPECT_FALSE(isValidIdentifier("_\x80")); 457 EXPECT_FALSE(isValidIdentifier("_\xc2")); 458 EXPECT_FALSE(isValidIdentifier("_\xff")); 459 EXPECT_FALSE(isValidIdentifier("_$")); 460 EXPECT_TRUE(isValidIdentifier("_1")); 461 462 EXPECT_TRUE(isValidIdentifier("__")); 463 EXPECT_TRUE(isValidIdentifier("_a")); 464 EXPECT_TRUE(isValidIdentifier("_z")); 465 EXPECT_TRUE(isValidIdentifier("_A")); 466 EXPECT_TRUE(isValidIdentifier("_Z")); 467 468 // 3 characters, '__' prefix 469 EXPECT_FALSE(isValidIdentifier("__.")); 470 EXPECT_FALSE(isValidIdentifier("__\n")); 471 EXPECT_FALSE(isValidIdentifier("__ ")); 472 EXPECT_FALSE(isValidIdentifier("__\x80")); 473 EXPECT_FALSE(isValidIdentifier("__\xc2")); 474 EXPECT_FALSE(isValidIdentifier("__\xff")); 475 EXPECT_FALSE(isValidIdentifier("__$")); 476 EXPECT_TRUE(isValidIdentifier("__1")); 477 478 EXPECT_TRUE(isValidIdentifier("___")); 479 EXPECT_TRUE(isValidIdentifier("__a")); 480 EXPECT_TRUE(isValidIdentifier("__z")); 481 EXPECT_TRUE(isValidIdentifier("__A")); 482 EXPECT_TRUE(isValidIdentifier("__Z")); 483 484 // 3 characters, '_' prefix and suffix 485 EXPECT_FALSE(isValidIdentifier("_._")); 486 EXPECT_FALSE(isValidIdentifier("_\n_")); 487 EXPECT_FALSE(isValidIdentifier("_ _")); 488 EXPECT_FALSE(isValidIdentifier("_\x80_")); 489 EXPECT_FALSE(isValidIdentifier("_\xc2_")); 490 EXPECT_FALSE(isValidIdentifier("_\xff_")); 491 EXPECT_FALSE(isValidIdentifier("_$_")); 492 EXPECT_TRUE(isValidIdentifier("_1_")); 493 494 EXPECT_TRUE(isValidIdentifier("___")); 495 EXPECT_TRUE(isValidIdentifier("_a_")); 496 EXPECT_TRUE(isValidIdentifier("_z_")); 497 EXPECT_TRUE(isValidIdentifier("_A_")); 498 EXPECT_TRUE(isValidIdentifier("_Z_")); 499 } 500