|  | //===- unittests/Basic/CharInfoTest.cpp -- ASCII classification tests -----===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "clang/Basic/CharInfo.h" | 
|  | #include "gtest/gtest.h" | 
|  |  | 
|  | using namespace llvm; | 
|  | using namespace clang; | 
|  |  | 
|  | // Check that the CharInfo table has been constructed reasonably. | 
|  | TEST(CharInfoTest, validateInfoTable) { | 
|  | using namespace charinfo; | 
|  | EXPECT_EQ((unsigned)CHAR_SPACE,   InfoTable[(unsigned)' ']); | 
|  | EXPECT_EQ((unsigned)CHAR_HORZ_WS, InfoTable[(unsigned)'\t']); | 
|  | EXPECT_EQ((unsigned)CHAR_HORZ_WS, InfoTable[(unsigned)'\f']); // ?? | 
|  | EXPECT_EQ((unsigned)CHAR_HORZ_WS, InfoTable[(unsigned)'\v']); // ?? | 
|  | EXPECT_EQ((unsigned)CHAR_VERT_WS, InfoTable[(unsigned)'\n']); | 
|  | EXPECT_EQ((unsigned)CHAR_VERT_WS, InfoTable[(unsigned)'\r']); | 
|  | EXPECT_EQ((unsigned)CHAR_UNDER,   InfoTable[(unsigned)'_']); | 
|  | EXPECT_EQ((unsigned)CHAR_PERIOD,  InfoTable[(unsigned)'.']); | 
|  |  | 
|  | for (unsigned i = 'a'; i <= 'f'; ++i) { | 
|  | EXPECT_EQ((unsigned)CHAR_XLOWER, InfoTable[i]); | 
|  | EXPECT_EQ((unsigned)CHAR_XUPPER, InfoTable[i+'A'-'a']); | 
|  | } | 
|  |  | 
|  | for (unsigned i = 'g'; i <= 'z'; ++i) { | 
|  | EXPECT_EQ((unsigned)CHAR_LOWER, InfoTable[i]); | 
|  | EXPECT_EQ((unsigned)CHAR_UPPER, InfoTable[i+'A'-'a']); | 
|  | } | 
|  |  | 
|  | for (unsigned i = '0'; i <= '9'; ++i) | 
|  | EXPECT_EQ((unsigned)CHAR_DIGIT, InfoTable[i]); | 
|  | } | 
|  |  | 
|  | // Check various predicates. | 
|  | TEST(CharInfoTest, isASCII) { | 
|  | EXPECT_TRUE(isASCII('\0')); | 
|  | EXPECT_TRUE(isASCII('\n')); | 
|  | EXPECT_TRUE(isASCII(' ')); | 
|  | EXPECT_TRUE(isASCII('a')); | 
|  | EXPECT_TRUE(isASCII('\x7f')); | 
|  | EXPECT_FALSE(isASCII('\x80')); | 
|  | EXPECT_FALSE(isASCII('\xc2')); | 
|  | EXPECT_FALSE(isASCII('\xff')); | 
|  | } | 
|  |  | 
|  | TEST(CharInfoTest, isAsciiIdentifierStart) { | 
|  | EXPECT_TRUE(isAsciiIdentifierStart('a')); | 
|  | EXPECT_TRUE(isAsciiIdentifierStart('A')); | 
|  | EXPECT_TRUE(isAsciiIdentifierStart('z')); | 
|  | EXPECT_TRUE(isAsciiIdentifierStart('Z')); | 
|  | EXPECT_TRUE(isAsciiIdentifierStart('_')); | 
|  |  | 
|  | EXPECT_FALSE(isAsciiIdentifierStart('0')); | 
|  | EXPECT_FALSE(isAsciiIdentifierStart('.')); | 
|  | EXPECT_FALSE(isAsciiIdentifierStart('`')); | 
|  | EXPECT_FALSE(isAsciiIdentifierStart('\0')); | 
|  |  | 
|  | EXPECT_FALSE(isAsciiIdentifierStart('$')); | 
|  | EXPECT_TRUE(isAsciiIdentifierStart('$', /*AllowDollar=*/true)); | 
|  |  | 
|  | EXPECT_FALSE(isAsciiIdentifierStart('\x80')); | 
|  | EXPECT_FALSE(isAsciiIdentifierStart('\xc2')); | 
|  | EXPECT_FALSE(isAsciiIdentifierStart('\xff')); | 
|  | } | 
|  |  | 
|  | TEST(CharInfoTest, isAsciiIdentifierContinue) { | 
|  | EXPECT_TRUE(isAsciiIdentifierContinue('a')); | 
|  | EXPECT_TRUE(isAsciiIdentifierContinue('A')); | 
|  | EXPECT_TRUE(isAsciiIdentifierContinue('z')); | 
|  | EXPECT_TRUE(isAsciiIdentifierContinue('Z')); | 
|  | EXPECT_TRUE(isAsciiIdentifierContinue('_')); | 
|  |  | 
|  | EXPECT_TRUE(isAsciiIdentifierContinue('0')); | 
|  | EXPECT_FALSE(isAsciiIdentifierContinue('.')); | 
|  | EXPECT_FALSE(isAsciiIdentifierContinue('`')); | 
|  | EXPECT_FALSE(isAsciiIdentifierContinue('\0')); | 
|  |  | 
|  | EXPECT_FALSE(isAsciiIdentifierContinue('$')); | 
|  | EXPECT_TRUE(isAsciiIdentifierContinue('$', /*AllowDollar=*/true)); | 
|  |  | 
|  | EXPECT_FALSE(isAsciiIdentifierContinue('\x80')); | 
|  | EXPECT_FALSE(isAsciiIdentifierContinue('\xc2')); | 
|  | EXPECT_FALSE(isAsciiIdentifierContinue('\xff')); | 
|  | } | 
|  |  | 
|  | TEST(CharInfoTest, isHorizontalWhitespace) { | 
|  | EXPECT_FALSE(isHorizontalWhitespace('a')); | 
|  | EXPECT_FALSE(isHorizontalWhitespace('_')); | 
|  | EXPECT_FALSE(isHorizontalWhitespace('0')); | 
|  | EXPECT_FALSE(isHorizontalWhitespace('.')); | 
|  | EXPECT_FALSE(isHorizontalWhitespace('`')); | 
|  | EXPECT_FALSE(isHorizontalWhitespace('\0')); | 
|  | EXPECT_FALSE(isHorizontalWhitespace('\x7f')); | 
|  |  | 
|  | EXPECT_TRUE(isHorizontalWhitespace(' ')); | 
|  | EXPECT_TRUE(isHorizontalWhitespace('\t')); | 
|  | EXPECT_TRUE(isHorizontalWhitespace('\f')); // ?? | 
|  | EXPECT_TRUE(isHorizontalWhitespace('\v')); // ?? | 
|  |  | 
|  | EXPECT_FALSE(isHorizontalWhitespace('\n')); | 
|  | EXPECT_FALSE(isHorizontalWhitespace('\r')); | 
|  |  | 
|  | EXPECT_FALSE(isHorizontalWhitespace('\x80')); | 
|  | EXPECT_FALSE(isHorizontalWhitespace('\xc2')); | 
|  | EXPECT_FALSE(isHorizontalWhitespace('\xff')); | 
|  | } | 
|  |  | 
|  | TEST(CharInfoTest, isVerticalWhitespace) { | 
|  | EXPECT_FALSE(isVerticalWhitespace('a')); | 
|  | EXPECT_FALSE(isVerticalWhitespace('_')); | 
|  | EXPECT_FALSE(isVerticalWhitespace('0')); | 
|  | EXPECT_FALSE(isVerticalWhitespace('.')); | 
|  | EXPECT_FALSE(isVerticalWhitespace('`')); | 
|  | EXPECT_FALSE(isVerticalWhitespace('\0')); | 
|  | EXPECT_FALSE(isVerticalWhitespace('\x7f')); | 
|  |  | 
|  | EXPECT_FALSE(isVerticalWhitespace(' ')); | 
|  | EXPECT_FALSE(isVerticalWhitespace('\t')); | 
|  | EXPECT_FALSE(isVerticalWhitespace('\f')); // ?? | 
|  | EXPECT_FALSE(isVerticalWhitespace('\v')); // ?? | 
|  |  | 
|  | EXPECT_TRUE(isVerticalWhitespace('\n')); | 
|  | EXPECT_TRUE(isVerticalWhitespace('\r')); | 
|  |  | 
|  | EXPECT_FALSE(isVerticalWhitespace('\x80')); | 
|  | EXPECT_FALSE(isVerticalWhitespace('\xc2')); | 
|  | EXPECT_FALSE(isVerticalWhitespace('\xff')); | 
|  | } | 
|  |  | 
|  | TEST(CharInfoTest, isWhitespace) { | 
|  | EXPECT_FALSE(isWhitespace('a')); | 
|  | EXPECT_FALSE(isWhitespace('_')); | 
|  | EXPECT_FALSE(isWhitespace('0')); | 
|  | EXPECT_FALSE(isWhitespace('.')); | 
|  | EXPECT_FALSE(isWhitespace('`')); | 
|  | EXPECT_FALSE(isWhitespace('\0')); | 
|  | EXPECT_FALSE(isWhitespace('\x7f')); | 
|  |  | 
|  | EXPECT_TRUE(isWhitespace(' ')); | 
|  | EXPECT_TRUE(isWhitespace('\t')); | 
|  | EXPECT_TRUE(isWhitespace('\f')); | 
|  | EXPECT_TRUE(isWhitespace('\v')); | 
|  |  | 
|  | EXPECT_TRUE(isWhitespace('\n')); | 
|  | EXPECT_TRUE(isWhitespace('\r')); | 
|  |  | 
|  | EXPECT_FALSE(isWhitespace('\x80')); | 
|  | EXPECT_FALSE(isWhitespace('\xc2')); | 
|  | EXPECT_FALSE(isWhitespace('\xff')); | 
|  | } | 
|  |  | 
|  | TEST(CharInfoTest, isDigit) { | 
|  | EXPECT_TRUE(isDigit('0')); | 
|  | EXPECT_TRUE(isDigit('9')); | 
|  |  | 
|  | EXPECT_FALSE(isDigit('a')); | 
|  | EXPECT_FALSE(isDigit('A')); | 
|  |  | 
|  | EXPECT_FALSE(isDigit('z')); | 
|  | EXPECT_FALSE(isDigit('Z')); | 
|  |  | 
|  | EXPECT_FALSE(isDigit('.')); | 
|  | EXPECT_FALSE(isDigit('_')); | 
|  |  | 
|  | EXPECT_FALSE(isDigit('/')); | 
|  | EXPECT_FALSE(isDigit('\0')); | 
|  |  | 
|  | EXPECT_FALSE(isDigit('\x80')); | 
|  | EXPECT_FALSE(isDigit('\xc2')); | 
|  | EXPECT_FALSE(isDigit('\xff')); | 
|  | } | 
|  |  | 
|  | TEST(CharInfoTest, isHexDigit) { | 
|  | EXPECT_TRUE(isHexDigit('0')); | 
|  | EXPECT_TRUE(isHexDigit('9')); | 
|  |  | 
|  | EXPECT_TRUE(isHexDigit('a')); | 
|  | EXPECT_TRUE(isHexDigit('A')); | 
|  |  | 
|  | EXPECT_FALSE(isHexDigit('z')); | 
|  | EXPECT_FALSE(isHexDigit('Z')); | 
|  |  | 
|  | EXPECT_FALSE(isHexDigit('.')); | 
|  | EXPECT_FALSE(isHexDigit('_')); | 
|  |  | 
|  | EXPECT_FALSE(isHexDigit('/')); | 
|  | EXPECT_FALSE(isHexDigit('\0')); | 
|  |  | 
|  | EXPECT_FALSE(isHexDigit('\x80')); | 
|  | EXPECT_FALSE(isHexDigit('\xc2')); | 
|  | EXPECT_FALSE(isHexDigit('\xff')); | 
|  | } | 
|  |  | 
|  | TEST(CharInfoTest, isLetter) { | 
|  | EXPECT_FALSE(isLetter('0')); | 
|  | EXPECT_FALSE(isLetter('9')); | 
|  |  | 
|  | EXPECT_TRUE(isLetter('a')); | 
|  | EXPECT_TRUE(isLetter('A')); | 
|  |  | 
|  | EXPECT_TRUE(isLetter('z')); | 
|  | EXPECT_TRUE(isLetter('Z')); | 
|  |  | 
|  | EXPECT_FALSE(isLetter('.')); | 
|  | EXPECT_FALSE(isLetter('_')); | 
|  |  | 
|  | EXPECT_FALSE(isLetter('/')); | 
|  | EXPECT_FALSE(isLetter('(')); | 
|  | EXPECT_FALSE(isLetter('\0')); | 
|  |  | 
|  | EXPECT_FALSE(isLetter('\x80')); | 
|  | EXPECT_FALSE(isLetter('\xc2')); | 
|  | EXPECT_FALSE(isLetter('\xff')); | 
|  | } | 
|  |  | 
|  | TEST(CharInfoTest, isLowercase) { | 
|  | EXPECT_FALSE(isLowercase('0')); | 
|  | EXPECT_FALSE(isLowercase('9')); | 
|  |  | 
|  | EXPECT_TRUE(isLowercase('a')); | 
|  | EXPECT_FALSE(isLowercase('A')); | 
|  |  | 
|  | EXPECT_TRUE(isLowercase('z')); | 
|  | EXPECT_FALSE(isLowercase('Z')); | 
|  |  | 
|  | EXPECT_FALSE(isLowercase('.')); | 
|  | EXPECT_FALSE(isLowercase('_')); | 
|  |  | 
|  | EXPECT_FALSE(isLowercase('/')); | 
|  | EXPECT_FALSE(isLowercase('(')); | 
|  | EXPECT_FALSE(isLowercase('\0')); | 
|  |  | 
|  | EXPECT_FALSE(isLowercase('\x80')); | 
|  | EXPECT_FALSE(isLowercase('\xc2')); | 
|  | EXPECT_FALSE(isLowercase('\xff')); | 
|  | } | 
|  |  | 
|  | TEST(CharInfoTest, isUppercase) { | 
|  | EXPECT_FALSE(isUppercase('0')); | 
|  | EXPECT_FALSE(isUppercase('9')); | 
|  |  | 
|  | EXPECT_FALSE(isUppercase('a')); | 
|  | EXPECT_TRUE(isUppercase('A')); | 
|  |  | 
|  | EXPECT_FALSE(isUppercase('z')); | 
|  | EXPECT_TRUE(isUppercase('Z')); | 
|  |  | 
|  | EXPECT_FALSE(isUppercase('.')); | 
|  | EXPECT_FALSE(isUppercase('_')); | 
|  |  | 
|  | EXPECT_FALSE(isUppercase('/')); | 
|  | EXPECT_FALSE(isUppercase('(')); | 
|  | EXPECT_FALSE(isUppercase('\0')); | 
|  |  | 
|  | EXPECT_FALSE(isUppercase('\x80')); | 
|  | EXPECT_FALSE(isUppercase('\xc2')); | 
|  | EXPECT_FALSE(isUppercase('\xff')); | 
|  | } | 
|  |  | 
|  | TEST(CharInfoTest, isAlphanumeric) { | 
|  | EXPECT_TRUE(isAlphanumeric('0')); | 
|  | EXPECT_TRUE(isAlphanumeric('9')); | 
|  |  | 
|  | EXPECT_TRUE(isAlphanumeric('a')); | 
|  | EXPECT_TRUE(isAlphanumeric('A')); | 
|  |  | 
|  | EXPECT_TRUE(isAlphanumeric('z')); | 
|  | EXPECT_TRUE(isAlphanumeric('Z')); | 
|  |  | 
|  | EXPECT_FALSE(isAlphanumeric('.')); | 
|  | EXPECT_FALSE(isAlphanumeric('_')); | 
|  |  | 
|  | EXPECT_FALSE(isAlphanumeric('/')); | 
|  | EXPECT_FALSE(isAlphanumeric('(')); | 
|  | EXPECT_FALSE(isAlphanumeric('\0')); | 
|  |  | 
|  | EXPECT_FALSE(isAlphanumeric('\x80')); | 
|  | EXPECT_FALSE(isAlphanumeric('\xc2')); | 
|  | EXPECT_FALSE(isAlphanumeric('\xff')); | 
|  | } | 
|  |  | 
|  | TEST(CharInfoTest, isPunctuation) { | 
|  | EXPECT_FALSE(isPunctuation('0')); | 
|  | EXPECT_FALSE(isPunctuation('9')); | 
|  |  | 
|  | EXPECT_FALSE(isPunctuation('a')); | 
|  | EXPECT_FALSE(isPunctuation('A')); | 
|  |  | 
|  | EXPECT_FALSE(isPunctuation('z')); | 
|  | EXPECT_FALSE(isPunctuation('Z')); | 
|  |  | 
|  | EXPECT_TRUE(isPunctuation('.')); | 
|  | EXPECT_TRUE(isPunctuation('_')); | 
|  |  | 
|  | EXPECT_TRUE(isPunctuation('/')); | 
|  | EXPECT_TRUE(isPunctuation('(')); | 
|  |  | 
|  | EXPECT_FALSE(isPunctuation(' ')); | 
|  | EXPECT_FALSE(isPunctuation('\n')); | 
|  | EXPECT_FALSE(isPunctuation('\0')); | 
|  |  | 
|  | EXPECT_FALSE(isPunctuation('\x80')); | 
|  | EXPECT_FALSE(isPunctuation('\xc2')); | 
|  | EXPECT_FALSE(isPunctuation('\xff')); | 
|  | } | 
|  |  | 
|  | TEST(CharInfoTest, isPrintable) { | 
|  | EXPECT_TRUE(isPrintable('0')); | 
|  | EXPECT_TRUE(isPrintable('9')); | 
|  |  | 
|  | EXPECT_TRUE(isPrintable('a')); | 
|  | EXPECT_TRUE(isPrintable('A')); | 
|  |  | 
|  | EXPECT_TRUE(isPrintable('z')); | 
|  | EXPECT_TRUE(isPrintable('Z')); | 
|  |  | 
|  | EXPECT_TRUE(isPrintable('.')); | 
|  | EXPECT_TRUE(isPrintable('_')); | 
|  |  | 
|  | EXPECT_TRUE(isPrintable('/')); | 
|  | EXPECT_TRUE(isPrintable('(')); | 
|  |  | 
|  | EXPECT_TRUE(isPrintable(' ')); | 
|  | EXPECT_FALSE(isPrintable('\t')); | 
|  | EXPECT_FALSE(isPrintable('\n')); | 
|  | EXPECT_FALSE(isPrintable('\0')); | 
|  |  | 
|  | EXPECT_FALSE(isPrintable('\x80')); | 
|  | EXPECT_FALSE(isPrintable('\xc2')); | 
|  | EXPECT_FALSE(isPrintable('\xff')); | 
|  | } | 
|  |  | 
|  | TEST(CharInfoTest, isPreprocessingNumberBody) { | 
|  | EXPECT_TRUE(isPreprocessingNumberBody('0')); | 
|  | EXPECT_TRUE(isPreprocessingNumberBody('9')); | 
|  |  | 
|  | EXPECT_TRUE(isPreprocessingNumberBody('a')); | 
|  | EXPECT_TRUE(isPreprocessingNumberBody('A')); | 
|  |  | 
|  | EXPECT_TRUE(isPreprocessingNumberBody('z')); | 
|  | EXPECT_TRUE(isPreprocessingNumberBody('Z')); | 
|  | EXPECT_TRUE(isPreprocessingNumberBody('.')); | 
|  | EXPECT_TRUE(isPreprocessingNumberBody('_')); | 
|  |  | 
|  | EXPECT_FALSE(isPreprocessingNumberBody('/')); | 
|  | EXPECT_FALSE(isPreprocessingNumberBody('(')); | 
|  | EXPECT_FALSE(isPreprocessingNumberBody('\0')); | 
|  |  | 
|  | EXPECT_FALSE(isPreprocessingNumberBody('\x80')); | 
|  | EXPECT_FALSE(isPreprocessingNumberBody('\xc2')); | 
|  | EXPECT_FALSE(isPreprocessingNumberBody('\xff')); | 
|  | } | 
|  |  | 
|  | TEST(CharInfoTest, isRawStringDelimBody) { | 
|  | EXPECT_TRUE(isRawStringDelimBody('0')); | 
|  | EXPECT_TRUE(isRawStringDelimBody('9')); | 
|  |  | 
|  | EXPECT_TRUE(isRawStringDelimBody('a')); | 
|  | EXPECT_TRUE(isRawStringDelimBody('A')); | 
|  |  | 
|  | EXPECT_TRUE(isRawStringDelimBody('z')); | 
|  | EXPECT_TRUE(isRawStringDelimBody('Z')); | 
|  | EXPECT_TRUE(isRawStringDelimBody('.')); | 
|  | EXPECT_TRUE(isRawStringDelimBody('_')); | 
|  |  | 
|  | EXPECT_TRUE(isRawStringDelimBody('/')); | 
|  | EXPECT_FALSE(isRawStringDelimBody('(')); | 
|  | EXPECT_FALSE(isRawStringDelimBody('\0')); | 
|  |  | 
|  | EXPECT_FALSE(isRawStringDelimBody('\x80')); | 
|  | EXPECT_FALSE(isRawStringDelimBody('\xc2')); | 
|  | EXPECT_FALSE(isRawStringDelimBody('\xff')); | 
|  | } | 
|  |  | 
|  | TEST(CharInfoTest, toLowercase) { | 
|  | EXPECT_EQ('0', toLowercase('0')); | 
|  | EXPECT_EQ('9', toLowercase('9')); | 
|  |  | 
|  | EXPECT_EQ('a', toLowercase('a')); | 
|  | EXPECT_EQ('a', toLowercase('A')); | 
|  |  | 
|  | EXPECT_EQ('z', toLowercase('z')); | 
|  | EXPECT_EQ('z', toLowercase('Z')); | 
|  |  | 
|  | EXPECT_EQ('.', toLowercase('.')); | 
|  | EXPECT_EQ('_', toLowercase('_')); | 
|  |  | 
|  | EXPECT_EQ('/', toLowercase('/')); | 
|  | EXPECT_EQ('\0', toLowercase('\0')); | 
|  | } | 
|  |  | 
|  | TEST(CharInfoTest, toUppercase) { | 
|  | EXPECT_EQ('0', toUppercase('0')); | 
|  | EXPECT_EQ('9', toUppercase('9')); | 
|  |  | 
|  | EXPECT_EQ('A', toUppercase('a')); | 
|  | EXPECT_EQ('A', toUppercase('A')); | 
|  |  | 
|  | EXPECT_EQ('Z', toUppercase('z')); | 
|  | EXPECT_EQ('Z', toUppercase('Z')); | 
|  |  | 
|  | EXPECT_EQ('.', toUppercase('.')); | 
|  | EXPECT_EQ('_', toUppercase('_')); | 
|  |  | 
|  | EXPECT_EQ('/', toUppercase('/')); | 
|  | EXPECT_EQ('\0', toUppercase('\0')); | 
|  | } | 
|  |  | 
|  | TEST(CharInfoTest, isValidAsciiIdentifier) { | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("")); | 
|  |  | 
|  | // 1 character | 
|  | EXPECT_FALSE(isValidAsciiIdentifier(".")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("\n")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier(" ")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("\x80")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("\xc2")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("\xff")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("$")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("1")); | 
|  |  | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("_")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("a")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("z")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("A")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("Z")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("$", /*AllowDollar=*/true)); | 
|  |  | 
|  | // 2 characters, '_' suffix | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("._")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("\n_")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier(" _")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("\x80_")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("\xc2_")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("\xff_")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("$_")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("1_")); | 
|  |  | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("__")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("a_")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("z_")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("A_")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("Z_")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("$_", /*AllowDollar=*/true)); | 
|  |  | 
|  | // 2 characters, '_' prefix | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("_.")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("_\n")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("_ ")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("_\x80")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("_\xc2")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("_\xff")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("_$")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("_1")); | 
|  |  | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("__")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("_a")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("_z")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("_A")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("_Z")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("_$", /*AllowDollar=*/true)); | 
|  |  | 
|  | // 3 characters, '__' prefix | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("__.")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("__\n")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("__ ")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("__\x80")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("__\xc2")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("__\xff")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("__$")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("__1")); | 
|  |  | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("___")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("__a")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("__z")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("__A")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("__Z")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("__$", /*AllowDollar=*/true)); | 
|  |  | 
|  | // 3 characters, '_' prefix and suffix | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("_._")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("_\n_")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("_ _")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("_\x80_")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("_\xc2_")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("_\xff_")); | 
|  | EXPECT_FALSE(isValidAsciiIdentifier("_$_")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("_1_")); | 
|  |  | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("___")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("_a_")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("_z_")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("_A_")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("_Z_")); | 
|  | EXPECT_TRUE(isValidAsciiIdentifier("_$_", /*AllowDollar=*/true)); | 
|  | } |