CharInfoTest.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. //===- unittests/Basic/CharInfoTest.cpp -- ASCII classification tests -----===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "clang/Basic/CharInfo.h"
  9. #include "gtest/gtest.h"
  10. using namespace llvm;
  11. using namespace clang;
  12. // Check that the CharInfo table has been constructed reasonably.
  13. TEST(CharInfoTest, validateInfoTable) {
  14. using namespace charinfo;
  15. EXPECT_EQ((unsigned)CHAR_SPACE, InfoTable[(unsigned)' ']);
  16. EXPECT_EQ((unsigned)CHAR_HORZ_WS, InfoTable[(unsigned)'\t']);
  17. EXPECT_EQ((unsigned)CHAR_HORZ_WS, InfoTable[(unsigned)'\f']); // ??
  18. EXPECT_EQ((unsigned)CHAR_HORZ_WS, InfoTable[(unsigned)'\v']); // ??
  19. EXPECT_EQ((unsigned)CHAR_VERT_WS, InfoTable[(unsigned)'\n']);
  20. EXPECT_EQ((unsigned)CHAR_VERT_WS, InfoTable[(unsigned)'\r']);
  21. EXPECT_EQ((unsigned)CHAR_UNDER, InfoTable[(unsigned)'_']);
  22. EXPECT_EQ((unsigned)CHAR_PERIOD, InfoTable[(unsigned)'.']);
  23. for (unsigned i = 'a'; i <= 'f'; ++i) {
  24. EXPECT_EQ((unsigned)CHAR_XLOWER, InfoTable[i]);
  25. EXPECT_EQ((unsigned)CHAR_XUPPER, InfoTable[i+'A'-'a']);
  26. }
  27. for (unsigned i = 'g'; i <= 'z'; ++i) {
  28. EXPECT_EQ((unsigned)CHAR_LOWER, InfoTable[i]);
  29. EXPECT_EQ((unsigned)CHAR_UPPER, InfoTable[i+'A'-'a']);
  30. }
  31. for (unsigned i = '0'; i <= '9'; ++i)
  32. EXPECT_EQ((unsigned)CHAR_DIGIT, InfoTable[i]);
  33. }
  34. // Check various predicates.
  35. TEST(CharInfoTest, isASCII) {
  36. EXPECT_TRUE(isASCII('\0'));
  37. EXPECT_TRUE(isASCII('\n'));
  38. EXPECT_TRUE(isASCII(' '));
  39. EXPECT_TRUE(isASCII('a'));
  40. EXPECT_TRUE(isASCII('\x7f'));
  41. EXPECT_FALSE(isASCII('\x80'));
  42. EXPECT_FALSE(isASCII('\xc2'));
  43. EXPECT_FALSE(isASCII('\xff'));
  44. }
  45. TEST(CharInfoTest, isIdentifierHead) {
  46. EXPECT_TRUE(isIdentifierHead('a'));
  47. EXPECT_TRUE(isIdentifierHead('A'));
  48. EXPECT_TRUE(isIdentifierHead('z'));
  49. EXPECT_TRUE(isIdentifierHead('Z'));
  50. EXPECT_TRUE(isIdentifierHead('_'));
  51. EXPECT_FALSE(isIdentifierHead('0'));
  52. EXPECT_FALSE(isIdentifierHead('.'));
  53. EXPECT_FALSE(isIdentifierHead('`'));
  54. EXPECT_FALSE(isIdentifierHead('\0'));
  55. EXPECT_FALSE(isIdentifierHead('$'));
  56. EXPECT_TRUE(isIdentifierHead('$', /*AllowDollar=*/true));
  57. EXPECT_FALSE(isIdentifierHead('\x80'));
  58. EXPECT_FALSE(isIdentifierHead('\xc2'));
  59. EXPECT_FALSE(isIdentifierHead('\xff'));
  60. }
  61. TEST(CharInfoTest, isIdentifierBody) {
  62. EXPECT_TRUE(isIdentifierBody('a'));
  63. EXPECT_TRUE(isIdentifierBody('A'));
  64. EXPECT_TRUE(isIdentifierBody('z'));
  65. EXPECT_TRUE(isIdentifierBody('Z'));
  66. EXPECT_TRUE(isIdentifierBody('_'));
  67. EXPECT_TRUE(isIdentifierBody('0'));
  68. EXPECT_FALSE(isIdentifierBody('.'));
  69. EXPECT_FALSE(isIdentifierBody('`'));
  70. EXPECT_FALSE(isIdentifierBody('\0'));
  71. EXPECT_FALSE(isIdentifierBody('$'));
  72. EXPECT_TRUE(isIdentifierBody('$', /*AllowDollar=*/true));
  73. EXPECT_FALSE(isIdentifierBody('\x80'));
  74. EXPECT_FALSE(isIdentifierBody('\xc2'));
  75. EXPECT_FALSE(isIdentifierBody('\xff'));
  76. }
  77. TEST(CharInfoTest, isHorizontalWhitespace) {
  78. EXPECT_FALSE(isHorizontalWhitespace('a'));
  79. EXPECT_FALSE(isHorizontalWhitespace('_'));
  80. EXPECT_FALSE(isHorizontalWhitespace('0'));
  81. EXPECT_FALSE(isHorizontalWhitespace('.'));
  82. EXPECT_FALSE(isHorizontalWhitespace('`'));
  83. EXPECT_FALSE(isHorizontalWhitespace('\0'));
  84. EXPECT_FALSE(isHorizontalWhitespace('\x7f'));
  85. EXPECT_TRUE(isHorizontalWhitespace(' '));
  86. EXPECT_TRUE(isHorizontalWhitespace('\t'));
  87. EXPECT_TRUE(isHorizontalWhitespace('\f')); // ??
  88. EXPECT_TRUE(isHorizontalWhitespace('\v')); // ??
  89. EXPECT_FALSE(isHorizontalWhitespace('\n'));
  90. EXPECT_FALSE(isHorizontalWhitespace('\r'));
  91. EXPECT_FALSE(isHorizontalWhitespace('\x80'));
  92. EXPECT_FALSE(isHorizontalWhitespace('\xc2'));
  93. EXPECT_FALSE(isHorizontalWhitespace('\xff'));
  94. }
  95. TEST(CharInfoTest, isVerticalWhitespace) {
  96. EXPECT_FALSE(isVerticalWhitespace('a'));
  97. EXPECT_FALSE(isVerticalWhitespace('_'));
  98. EXPECT_FALSE(isVerticalWhitespace('0'));
  99. EXPECT_FALSE(isVerticalWhitespace('.'));
  100. EXPECT_FALSE(isVerticalWhitespace('`'));
  101. EXPECT_FALSE(isVerticalWhitespace('\0'));
  102. EXPECT_FALSE(isVerticalWhitespace('\x7f'));
  103. EXPECT_FALSE(isVerticalWhitespace(' '));
  104. EXPECT_FALSE(isVerticalWhitespace('\t'));
  105. EXPECT_FALSE(isVerticalWhitespace('\f')); // ??
  106. EXPECT_FALSE(isVerticalWhitespace('\v')); // ??
  107. EXPECT_TRUE(isVerticalWhitespace('\n'));
  108. EXPECT_TRUE(isVerticalWhitespace('\r'));
  109. EXPECT_FALSE(isVerticalWhitespace('\x80'));
  110. EXPECT_FALSE(isVerticalWhitespace('\xc2'));
  111. EXPECT_FALSE(isVerticalWhitespace('\xff'));
  112. }
  113. TEST(CharInfoTest, isWhitespace) {
  114. EXPECT_FALSE(isWhitespace('a'));
  115. EXPECT_FALSE(isWhitespace('_'));
  116. EXPECT_FALSE(isWhitespace('0'));
  117. EXPECT_FALSE(isWhitespace('.'));
  118. EXPECT_FALSE(isWhitespace('`'));
  119. EXPECT_FALSE(isWhitespace('\0'));
  120. EXPECT_FALSE(isWhitespace('\x7f'));
  121. EXPECT_TRUE(isWhitespace(' '));
  122. EXPECT_TRUE(isWhitespace('\t'));
  123. EXPECT_TRUE(isWhitespace('\f'));
  124. EXPECT_TRUE(isWhitespace('\v'));
  125. EXPECT_TRUE(isWhitespace('\n'));
  126. EXPECT_TRUE(isWhitespace('\r'));
  127. EXPECT_FALSE(isWhitespace('\x80'));
  128. EXPECT_FALSE(isWhitespace('\xc2'));
  129. EXPECT_FALSE(isWhitespace('\xff'));
  130. }
  131. TEST(CharInfoTest, isDigit) {
  132. EXPECT_TRUE(isDigit('0'));
  133. EXPECT_TRUE(isDigit('9'));
  134. EXPECT_FALSE(isDigit('a'));
  135. EXPECT_FALSE(isDigit('A'));
  136. EXPECT_FALSE(isDigit('z'));
  137. EXPECT_FALSE(isDigit('Z'));
  138. EXPECT_FALSE(isDigit('.'));
  139. EXPECT_FALSE(isDigit('_'));
  140. EXPECT_FALSE(isDigit('/'));
  141. EXPECT_FALSE(isDigit('\0'));
  142. EXPECT_FALSE(isDigit('\x80'));
  143. EXPECT_FALSE(isDigit('\xc2'));
  144. EXPECT_FALSE(isDigit('\xff'));
  145. }
  146. TEST(CharInfoTest, isHexDigit) {
  147. EXPECT_TRUE(isHexDigit('0'));
  148. EXPECT_TRUE(isHexDigit('9'));
  149. EXPECT_TRUE(isHexDigit('a'));
  150. EXPECT_TRUE(isHexDigit('A'));
  151. EXPECT_FALSE(isHexDigit('z'));
  152. EXPECT_FALSE(isHexDigit('Z'));
  153. EXPECT_FALSE(isHexDigit('.'));
  154. EXPECT_FALSE(isHexDigit('_'));
  155. EXPECT_FALSE(isHexDigit('/'));
  156. EXPECT_FALSE(isHexDigit('\0'));
  157. EXPECT_FALSE(isHexDigit('\x80'));
  158. EXPECT_FALSE(isHexDigit('\xc2'));
  159. EXPECT_FALSE(isHexDigit('\xff'));
  160. }
  161. TEST(CharInfoTest, isLetter) {
  162. EXPECT_FALSE(isLetter('0'));
  163. EXPECT_FALSE(isLetter('9'));
  164. EXPECT_TRUE(isLetter('a'));
  165. EXPECT_TRUE(isLetter('A'));
  166. EXPECT_TRUE(isLetter('z'));
  167. EXPECT_TRUE(isLetter('Z'));
  168. EXPECT_FALSE(isLetter('.'));
  169. EXPECT_FALSE(isLetter('_'));
  170. EXPECT_FALSE(isLetter('/'));
  171. EXPECT_FALSE(isLetter('('));
  172. EXPECT_FALSE(isLetter('\0'));
  173. EXPECT_FALSE(isLetter('\x80'));
  174. EXPECT_FALSE(isLetter('\xc2'));
  175. EXPECT_FALSE(isLetter('\xff'));
  176. }
  177. TEST(CharInfoTest, isLowercase) {
  178. EXPECT_FALSE(isLowercase('0'));
  179. EXPECT_FALSE(isLowercase('9'));
  180. EXPECT_TRUE(isLowercase('a'));
  181. EXPECT_FALSE(isLowercase('A'));
  182. EXPECT_TRUE(isLowercase('z'));
  183. EXPECT_FALSE(isLowercase('Z'));
  184. EXPECT_FALSE(isLowercase('.'));
  185. EXPECT_FALSE(isLowercase('_'));
  186. EXPECT_FALSE(isLowercase('/'));
  187. EXPECT_FALSE(isLowercase('('));
  188. EXPECT_FALSE(isLowercase('\0'));
  189. EXPECT_FALSE(isLowercase('\x80'));
  190. EXPECT_FALSE(isLowercase('\xc2'));
  191. EXPECT_FALSE(isLowercase('\xff'));
  192. }
  193. TEST(CharInfoTest, isUppercase) {
  194. EXPECT_FALSE(isUppercase('0'));
  195. EXPECT_FALSE(isUppercase('9'));
  196. EXPECT_FALSE(isUppercase('a'));
  197. EXPECT_TRUE(isUppercase('A'));
  198. EXPECT_FALSE(isUppercase('z'));
  199. EXPECT_TRUE(isUppercase('Z'));
  200. EXPECT_FALSE(isUppercase('.'));
  201. EXPECT_FALSE(isUppercase('_'));
  202. EXPECT_FALSE(isUppercase('/'));
  203. EXPECT_FALSE(isUppercase('('));
  204. EXPECT_FALSE(isUppercase('\0'));
  205. EXPECT_FALSE(isUppercase('\x80'));
  206. EXPECT_FALSE(isUppercase('\xc2'));
  207. EXPECT_FALSE(isUppercase('\xff'));
  208. }
  209. TEST(CharInfoTest, isAlphanumeric) {
  210. EXPECT_TRUE(isAlphanumeric('0'));
  211. EXPECT_TRUE(isAlphanumeric('9'));
  212. EXPECT_TRUE(isAlphanumeric('a'));
  213. EXPECT_TRUE(isAlphanumeric('A'));
  214. EXPECT_TRUE(isAlphanumeric('z'));
  215. EXPECT_TRUE(isAlphanumeric('Z'));
  216. EXPECT_FALSE(isAlphanumeric('.'));
  217. EXPECT_FALSE(isAlphanumeric('_'));
  218. EXPECT_FALSE(isAlphanumeric('/'));
  219. EXPECT_FALSE(isAlphanumeric('('));
  220. EXPECT_FALSE(isAlphanumeric('\0'));
  221. EXPECT_FALSE(isAlphanumeric('\x80'));
  222. EXPECT_FALSE(isAlphanumeric('\xc2'));
  223. EXPECT_FALSE(isAlphanumeric('\xff'));
  224. }
  225. TEST(CharInfoTest, isPunctuation) {
  226. EXPECT_FALSE(isPunctuation('0'));
  227. EXPECT_FALSE(isPunctuation('9'));
  228. EXPECT_FALSE(isPunctuation('a'));
  229. EXPECT_FALSE(isPunctuation('A'));
  230. EXPECT_FALSE(isPunctuation('z'));
  231. EXPECT_FALSE(isPunctuation('Z'));
  232. EXPECT_TRUE(isPunctuation('.'));
  233. EXPECT_TRUE(isPunctuation('_'));
  234. EXPECT_TRUE(isPunctuation('/'));
  235. EXPECT_TRUE(isPunctuation('('));
  236. EXPECT_FALSE(isPunctuation(' '));
  237. EXPECT_FALSE(isPunctuation('\n'));
  238. EXPECT_FALSE(isPunctuation('\0'));
  239. EXPECT_FALSE(isPunctuation('\x80'));
  240. EXPECT_FALSE(isPunctuation('\xc2'));
  241. EXPECT_FALSE(isPunctuation('\xff'));
  242. }
  243. TEST(CharInfoTest, isPrintable) {
  244. EXPECT_TRUE(isPrintable('0'));
  245. EXPECT_TRUE(isPrintable('9'));
  246. EXPECT_TRUE(isPrintable('a'));
  247. EXPECT_TRUE(isPrintable('A'));
  248. EXPECT_TRUE(isPrintable('z'));
  249. EXPECT_TRUE(isPrintable('Z'));
  250. EXPECT_TRUE(isPrintable('.'));
  251. EXPECT_TRUE(isPrintable('_'));
  252. EXPECT_TRUE(isPrintable('/'));
  253. EXPECT_TRUE(isPrintable('('));
  254. EXPECT_TRUE(isPrintable(' '));
  255. EXPECT_FALSE(isPrintable('\t'));
  256. EXPECT_FALSE(isPrintable('\n'));
  257. EXPECT_FALSE(isPrintable('\0'));
  258. EXPECT_FALSE(isPrintable('\x80'));
  259. EXPECT_FALSE(isPrintable('\xc2'));
  260. EXPECT_FALSE(isPrintable('\xff'));
  261. }
  262. TEST(CharInfoTest, isPreprocessingNumberBody) {
  263. EXPECT_TRUE(isPreprocessingNumberBody('0'));
  264. EXPECT_TRUE(isPreprocessingNumberBody('9'));
  265. EXPECT_TRUE(isPreprocessingNumberBody('a'));
  266. EXPECT_TRUE(isPreprocessingNumberBody('A'));
  267. EXPECT_TRUE(isPreprocessingNumberBody('z'));
  268. EXPECT_TRUE(isPreprocessingNumberBody('Z'));
  269. EXPECT_TRUE(isPreprocessingNumberBody('.'));
  270. EXPECT_TRUE(isPreprocessingNumberBody('_'));
  271. EXPECT_FALSE(isPreprocessingNumberBody('/'));
  272. EXPECT_FALSE(isPreprocessingNumberBody('('));
  273. EXPECT_FALSE(isPreprocessingNumberBody('\0'));
  274. EXPECT_FALSE(isPreprocessingNumberBody('\x80'));
  275. EXPECT_FALSE(isPreprocessingNumberBody('\xc2'));
  276. EXPECT_FALSE(isPreprocessingNumberBody('\xff'));
  277. }
  278. TEST(CharInfoTest, isRawStringDelimBody) {
  279. EXPECT_TRUE(isRawStringDelimBody('0'));
  280. EXPECT_TRUE(isRawStringDelimBody('9'));
  281. EXPECT_TRUE(isRawStringDelimBody('a'));
  282. EXPECT_TRUE(isRawStringDelimBody('A'));
  283. EXPECT_TRUE(isRawStringDelimBody('z'));
  284. EXPECT_TRUE(isRawStringDelimBody('Z'));
  285. EXPECT_TRUE(isRawStringDelimBody('.'));
  286. EXPECT_TRUE(isRawStringDelimBody('_'));
  287. EXPECT_TRUE(isRawStringDelimBody('/'));
  288. EXPECT_FALSE(isRawStringDelimBody('('));
  289. EXPECT_FALSE(isRawStringDelimBody('\0'));
  290. EXPECT_FALSE(isRawStringDelimBody('\x80'));
  291. EXPECT_FALSE(isRawStringDelimBody('\xc2'));
  292. EXPECT_FALSE(isRawStringDelimBody('\xff'));
  293. }
  294. TEST(CharInfoTest, toLowercase) {
  295. EXPECT_EQ('0', toLowercase('0'));
  296. EXPECT_EQ('9', toLowercase('9'));
  297. EXPECT_EQ('a', toLowercase('a'));
  298. EXPECT_EQ('a', toLowercase('A'));
  299. EXPECT_EQ('z', toLowercase('z'));
  300. EXPECT_EQ('z', toLowercase('Z'));
  301. EXPECT_EQ('.', toLowercase('.'));
  302. EXPECT_EQ('_', toLowercase('_'));
  303. EXPECT_EQ('/', toLowercase('/'));
  304. EXPECT_EQ('\0', toLowercase('\0'));
  305. }
  306. TEST(CharInfoTest, toUppercase) {
  307. EXPECT_EQ('0', toUppercase('0'));
  308. EXPECT_EQ('9', toUppercase('9'));
  309. EXPECT_EQ('A', toUppercase('a'));
  310. EXPECT_EQ('A', toUppercase('A'));
  311. EXPECT_EQ('Z', toUppercase('z'));
  312. EXPECT_EQ('Z', toUppercase('Z'));
  313. EXPECT_EQ('.', toUppercase('.'));
  314. EXPECT_EQ('_', toUppercase('_'));
  315. EXPECT_EQ('/', toUppercase('/'));
  316. EXPECT_EQ('\0', toUppercase('\0'));
  317. }
  318. TEST(CharInfoTest, isValidIdentifier) {
  319. EXPECT_FALSE(isValidIdentifier(""));
  320. // 1 character
  321. EXPECT_FALSE(isValidIdentifier("."));
  322. EXPECT_FALSE(isValidIdentifier("\n"));
  323. EXPECT_FALSE(isValidIdentifier(" "));
  324. EXPECT_FALSE(isValidIdentifier("\x80"));
  325. EXPECT_FALSE(isValidIdentifier("\xc2"));
  326. EXPECT_FALSE(isValidIdentifier("\xff"));
  327. EXPECT_FALSE(isValidIdentifier("$"));
  328. EXPECT_FALSE(isValidIdentifier("1"));
  329. EXPECT_TRUE(isValidIdentifier("_"));
  330. EXPECT_TRUE(isValidIdentifier("a"));
  331. EXPECT_TRUE(isValidIdentifier("z"));
  332. EXPECT_TRUE(isValidIdentifier("A"));
  333. EXPECT_TRUE(isValidIdentifier("Z"));
  334. EXPECT_TRUE(isValidIdentifier("$", /*AllowDollar=*/true));
  335. // 2 characters, '_' suffix
  336. EXPECT_FALSE(isValidIdentifier("._"));
  337. EXPECT_FALSE(isValidIdentifier("\n_"));
  338. EXPECT_FALSE(isValidIdentifier(" _"));
  339. EXPECT_FALSE(isValidIdentifier("\x80_"));
  340. EXPECT_FALSE(isValidIdentifier("\xc2_"));
  341. EXPECT_FALSE(isValidIdentifier("\xff_"));
  342. EXPECT_FALSE(isValidIdentifier("$_"));
  343. EXPECT_FALSE(isValidIdentifier("1_"));
  344. EXPECT_TRUE(isValidIdentifier("__"));
  345. EXPECT_TRUE(isValidIdentifier("a_"));
  346. EXPECT_TRUE(isValidIdentifier("z_"));
  347. EXPECT_TRUE(isValidIdentifier("A_"));
  348. EXPECT_TRUE(isValidIdentifier("Z_"));
  349. EXPECT_TRUE(isValidIdentifier("$_", /*AllowDollar=*/true));
  350. // 2 characters, '_' prefix
  351. EXPECT_FALSE(isValidIdentifier("_."));
  352. EXPECT_FALSE(isValidIdentifier("_\n"));
  353. EXPECT_FALSE(isValidIdentifier("_ "));
  354. EXPECT_FALSE(isValidIdentifier("_\x80"));
  355. EXPECT_FALSE(isValidIdentifier("_\xc2"));
  356. EXPECT_FALSE(isValidIdentifier("_\xff"));
  357. EXPECT_FALSE(isValidIdentifier("_$"));
  358. EXPECT_TRUE(isValidIdentifier("_1"));
  359. EXPECT_TRUE(isValidIdentifier("__"));
  360. EXPECT_TRUE(isValidIdentifier("_a"));
  361. EXPECT_TRUE(isValidIdentifier("_z"));
  362. EXPECT_TRUE(isValidIdentifier("_A"));
  363. EXPECT_TRUE(isValidIdentifier("_Z"));
  364. EXPECT_TRUE(isValidIdentifier("_$", /*AllowDollar=*/true));
  365. // 3 characters, '__' prefix
  366. EXPECT_FALSE(isValidIdentifier("__."));
  367. EXPECT_FALSE(isValidIdentifier("__\n"));
  368. EXPECT_FALSE(isValidIdentifier("__ "));
  369. EXPECT_FALSE(isValidIdentifier("__\x80"));
  370. EXPECT_FALSE(isValidIdentifier("__\xc2"));
  371. EXPECT_FALSE(isValidIdentifier("__\xff"));
  372. EXPECT_FALSE(isValidIdentifier("__$"));
  373. EXPECT_TRUE(isValidIdentifier("__1"));
  374. EXPECT_TRUE(isValidIdentifier("___"));
  375. EXPECT_TRUE(isValidIdentifier("__a"));
  376. EXPECT_TRUE(isValidIdentifier("__z"));
  377. EXPECT_TRUE(isValidIdentifier("__A"));
  378. EXPECT_TRUE(isValidIdentifier("__Z"));
  379. EXPECT_TRUE(isValidIdentifier("__$", /*AllowDollar=*/true));
  380. // 3 characters, '_' prefix and suffix
  381. EXPECT_FALSE(isValidIdentifier("_._"));
  382. EXPECT_FALSE(isValidIdentifier("_\n_"));
  383. EXPECT_FALSE(isValidIdentifier("_ _"));
  384. EXPECT_FALSE(isValidIdentifier("_\x80_"));
  385. EXPECT_FALSE(isValidIdentifier("_\xc2_"));
  386. EXPECT_FALSE(isValidIdentifier("_\xff_"));
  387. EXPECT_FALSE(isValidIdentifier("_$_"));
  388. EXPECT_TRUE(isValidIdentifier("_1_"));
  389. EXPECT_TRUE(isValidIdentifier("___"));
  390. EXPECT_TRUE(isValidIdentifier("_a_"));
  391. EXPECT_TRUE(isValidIdentifier("_z_"));
  392. EXPECT_TRUE(isValidIdentifier("_A_"));
  393. EXPECT_TRUE(isValidIdentifier("_Z_"));
  394. EXPECT_TRUE(isValidIdentifier("_$_", /*AllowDollar=*/true));
  395. }