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.
TEST(CharInfoTest,validateInfoTable)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.
TEST(CharInfoTest,isASCII)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 
TEST(CharInfoTest,isIdentifierHead)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 
TEST(CharInfoTest,isIdentifierBody)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 
TEST(CharInfoTest,isHorizontalWhitespace)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 
TEST(CharInfoTest,isVerticalWhitespace)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 
TEST(CharInfoTest,isWhitespace)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 
TEST(CharInfoTest,isDigit)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 
TEST(CharInfoTest,isHexDigit)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 
TEST(CharInfoTest,isLetter)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 
TEST(CharInfoTest,isLowercase)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 
TEST(CharInfoTest,isUppercase)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 
TEST(CharInfoTest,isAlphanumeric)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 
TEST(CharInfoTest,isPunctuation)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 
TEST(CharInfoTest,isPrintable)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 
TEST(CharInfoTest,isPreprocessingNumberBody)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 
TEST(CharInfoTest,isRawStringDelimBody)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 
TEST(CharInfoTest,toLowercase)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 
TEST(CharInfoTest,toUppercase)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 
TEST(CharInfoTest,isValidIdentifier)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   EXPECT_TRUE(isValidIdentifier("$", /*AllowDollar=*/true));
436 
437   // 2 characters, '_' suffix
438   EXPECT_FALSE(isValidIdentifier("._"));
439   EXPECT_FALSE(isValidIdentifier("\n_"));
440   EXPECT_FALSE(isValidIdentifier(" _"));
441   EXPECT_FALSE(isValidIdentifier("\x80_"));
442   EXPECT_FALSE(isValidIdentifier("\xc2_"));
443   EXPECT_FALSE(isValidIdentifier("\xff_"));
444   EXPECT_FALSE(isValidIdentifier("$_"));
445   EXPECT_FALSE(isValidIdentifier("1_"));
446 
447   EXPECT_TRUE(isValidIdentifier("__"));
448   EXPECT_TRUE(isValidIdentifier("a_"));
449   EXPECT_TRUE(isValidIdentifier("z_"));
450   EXPECT_TRUE(isValidIdentifier("A_"));
451   EXPECT_TRUE(isValidIdentifier("Z_"));
452   EXPECT_TRUE(isValidIdentifier("$_", /*AllowDollar=*/true));
453 
454   // 2 characters, '_' prefix
455   EXPECT_FALSE(isValidIdentifier("_."));
456   EXPECT_FALSE(isValidIdentifier("_\n"));
457   EXPECT_FALSE(isValidIdentifier("_ "));
458   EXPECT_FALSE(isValidIdentifier("_\x80"));
459   EXPECT_FALSE(isValidIdentifier("_\xc2"));
460   EXPECT_FALSE(isValidIdentifier("_\xff"));
461   EXPECT_FALSE(isValidIdentifier("_$"));
462   EXPECT_TRUE(isValidIdentifier("_1"));
463 
464   EXPECT_TRUE(isValidIdentifier("__"));
465   EXPECT_TRUE(isValidIdentifier("_a"));
466   EXPECT_TRUE(isValidIdentifier("_z"));
467   EXPECT_TRUE(isValidIdentifier("_A"));
468   EXPECT_TRUE(isValidIdentifier("_Z"));
469   EXPECT_TRUE(isValidIdentifier("_$", /*AllowDollar=*/true));
470 
471   // 3 characters, '__' prefix
472   EXPECT_FALSE(isValidIdentifier("__."));
473   EXPECT_FALSE(isValidIdentifier("__\n"));
474   EXPECT_FALSE(isValidIdentifier("__ "));
475   EXPECT_FALSE(isValidIdentifier("__\x80"));
476   EXPECT_FALSE(isValidIdentifier("__\xc2"));
477   EXPECT_FALSE(isValidIdentifier("__\xff"));
478   EXPECT_FALSE(isValidIdentifier("__$"));
479   EXPECT_TRUE(isValidIdentifier("__1"));
480 
481   EXPECT_TRUE(isValidIdentifier("___"));
482   EXPECT_TRUE(isValidIdentifier("__a"));
483   EXPECT_TRUE(isValidIdentifier("__z"));
484   EXPECT_TRUE(isValidIdentifier("__A"));
485   EXPECT_TRUE(isValidIdentifier("__Z"));
486   EXPECT_TRUE(isValidIdentifier("__$", /*AllowDollar=*/true));
487 
488   // 3 characters, '_' prefix and suffix
489   EXPECT_FALSE(isValidIdentifier("_._"));
490   EXPECT_FALSE(isValidIdentifier("_\n_"));
491   EXPECT_FALSE(isValidIdentifier("_ _"));
492   EXPECT_FALSE(isValidIdentifier("_\x80_"));
493   EXPECT_FALSE(isValidIdentifier("_\xc2_"));
494   EXPECT_FALSE(isValidIdentifier("_\xff_"));
495   EXPECT_FALSE(isValidIdentifier("_$_"));
496   EXPECT_TRUE(isValidIdentifier("_1_"));
497 
498   EXPECT_TRUE(isValidIdentifier("___"));
499   EXPECT_TRUE(isValidIdentifier("_a_"));
500   EXPECT_TRUE(isValidIdentifier("_z_"));
501   EXPECT_TRUE(isValidIdentifier("_A_"));
502   EXPECT_TRUE(isValidIdentifier("_Z_"));
503   EXPECT_TRUE(isValidIdentifier("_$_", /*AllowDollar=*/true));
504 }
505