blob: 8b5d0c8cf015ddf836f7efd9dc2f416a537f2d19 [file] [log] [blame]
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001//===- unittests/AST/CommentLexer.cpp ------ Comment lexer 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/SourceManager.h"
11#include "clang/Basic/FileManager.h"
12#include "clang/Basic/Diagnostic.h"
13#include "clang/AST/CommentLexer.h"
14#include "llvm/ADT/STLExtras.h"
15#include <vector>
16
17#include "gtest/gtest.h"
18
19using namespace llvm;
20using namespace clang;
21
22namespace clang {
23namespace comments {
24
25namespace {
26class CommentLexerTest : public ::testing::Test {
27protected:
28 CommentLexerTest()
29 : FileMgr(FileMgrOpts),
30 DiagID(new DiagnosticIDs()),
31 Diags(DiagID, new IgnoringDiagConsumer()),
32 SourceMgr(Diags, FileMgr) {
33 }
34
35 FileSystemOptions FileMgrOpts;
36 FileManager FileMgr;
37 IntrusiveRefCntPtr<DiagnosticIDs> DiagID;
38 DiagnosticsEngine Diags;
39 SourceManager SourceMgr;
Dmitri Gribenko477a9f52012-07-27 20:37:06 +000040 llvm::BumpPtrAllocator Allocator;
Dmitri Gribenko2d44d772012-06-26 20:39:18 +000041
42 void lexString(const char *Source, std::vector<Token> &Toks);
43};
44
45void CommentLexerTest::lexString(const char *Source,
46 std::vector<Token> &Toks) {
47 MemoryBuffer *Buf = MemoryBuffer::getMemBuffer(Source);
48 FileID File = SourceMgr.createFileIDForMemBuffer(Buf);
49 SourceLocation Begin = SourceMgr.getLocForStartOfFile(File);
50
Dmitri Gribenko477a9f52012-07-27 20:37:06 +000051 comments::Lexer L(Allocator, Begin, CommentOptions(),
Dmitri Gribenko2d44d772012-06-26 20:39:18 +000052 Source, Source + strlen(Source));
53
54 while (1) {
55 Token Tok;
56 L.lex(Tok);
57 if (Tok.is(tok::eof))
58 break;
59 Toks.push_back(Tok);
60 }
61}
62
63} // unnamed namespace
64
65// Empty source range should be handled.
66TEST_F(CommentLexerTest, Basic1) {
67 const char *Source = "";
68 std::vector<Token> Toks;
69
70 lexString(Source, Toks);
71
72 ASSERT_EQ(0U, Toks.size());
73}
74
75// Empty comments should be handled.
76TEST_F(CommentLexerTest, Basic2) {
77 const char *Sources[] = {
78 "//", "///", "//!", "///<", "//!<"
79 };
80 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
81 std::vector<Token> Toks;
82
83 lexString(Sources[i], Toks);
84
85 ASSERT_EQ(1U, Toks.size());
86
87 ASSERT_EQ(tok::newline, Toks[0].getKind());
88 }
89}
90
91// Empty comments should be handled.
92TEST_F(CommentLexerTest, Basic3) {
93 const char *Sources[] = {
94 "/**/", "/***/", "/*!*/", "/**<*/", "/*!<*/"
95 };
96 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
97 std::vector<Token> Toks;
98
99 lexString(Sources[i], Toks);
100
101 ASSERT_EQ(2U, Toks.size());
102
103 ASSERT_EQ(tok::newline, Toks[0].getKind());
104 ASSERT_EQ(tok::newline, Toks[1].getKind());
105 }
106}
107
108// Single comment with plain text.
109TEST_F(CommentLexerTest, Basic4) {
110 const char *Sources[] = {
111 "// Meow", "/// Meow", "//! Meow",
112 "// Meow\n", "// Meow\r\n", "//! Meow\r",
113 };
114
115 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
116 std::vector<Token> Toks;
117
118 lexString(Sources[i], Toks);
119
120 ASSERT_EQ(2U, Toks.size());
121
122 ASSERT_EQ(tok::text, Toks[0].getKind());
123 ASSERT_EQ(StringRef(" Meow"), Toks[0].getText());
124
125 ASSERT_EQ(tok::newline, Toks[1].getKind());
126 }
127}
128
129// Single comment with plain text.
130TEST_F(CommentLexerTest, Basic5) {
131 const char *Sources[] = {
132 "/* Meow*/", "/** Meow*/", "/*! Meow*/"
133 };
134
135 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
136 std::vector<Token> Toks;
137
138 lexString(Sources[i], Toks);
139
140 ASSERT_EQ(3U, Toks.size());
141
142 ASSERT_EQ(tok::text, Toks[0].getKind());
143 ASSERT_EQ(StringRef(" Meow"), Toks[0].getText());
144
145 ASSERT_EQ(tok::newline, Toks[1].getKind());
146 ASSERT_EQ(tok::newline, Toks[2].getKind());
147 }
148}
149
150// Test newline escaping.
151TEST_F(CommentLexerTest, Basic6) {
152 const char *Sources[] = {
153 "// Aaa\\\n" " Bbb\\ \n" " Ccc?" "?/\n",
154 "// Aaa\\\r\n" " Bbb\\ \r\n" " Ccc?" "?/\r\n",
155 "// Aaa\\\r" " Bbb\\ \r" " Ccc?" "?/\r"
156 };
157
158 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
159 std::vector<Token> Toks;
160
161 lexString(Sources[i], Toks);
162
163 ASSERT_EQ(10U, Toks.size());
164
165 ASSERT_EQ(tok::text, Toks[0].getKind());
166 ASSERT_EQ(StringRef(" Aaa"), Toks[0].getText());
167 ASSERT_EQ(tok::text, Toks[1].getKind());
168 ASSERT_EQ(StringRef("\\"), Toks[1].getText());
169 ASSERT_EQ(tok::newline, Toks[2].getKind());
170
171 ASSERT_EQ(tok::text, Toks[3].getKind());
172 ASSERT_EQ(StringRef(" Bbb"), Toks[3].getText());
173 ASSERT_EQ(tok::text, Toks[4].getKind());
174 ASSERT_EQ(StringRef("\\"), Toks[4].getText());
175 ASSERT_EQ(tok::text, Toks[5].getKind());
176 ASSERT_EQ(StringRef(" "), Toks[5].getText());
177 ASSERT_EQ(tok::newline, Toks[6].getKind());
178
179 ASSERT_EQ(tok::text, Toks[7].getKind());
180 ASSERT_EQ(StringRef(" Ccc?" "?/"), Toks[7].getText());
181 ASSERT_EQ(tok::newline, Toks[8].getKind());
182
183 ASSERT_EQ(tok::newline, Toks[9].getKind());
184 }
185}
186
187// Check that we skip C-style aligned stars correctly.
188TEST_F(CommentLexerTest, Basic7) {
189 const char *Source =
190 "/* Aaa\n"
191 " * Bbb\r\n"
192 "\t* Ccc\n"
193 " ! Ddd\n"
194 " * Eee\n"
195 " ** Fff\n"
196 " */";
197 std::vector<Token> Toks;
198
199 lexString(Source, Toks);
200
201 ASSERT_EQ(15U, Toks.size());
202
203 ASSERT_EQ(tok::text, Toks[0].getKind());
204 ASSERT_EQ(StringRef(" Aaa"), Toks[0].getText());
205 ASSERT_EQ(tok::newline, Toks[1].getKind());
206
207 ASSERT_EQ(tok::text, Toks[2].getKind());
208 ASSERT_EQ(StringRef(" Bbb"), Toks[2].getText());
209 ASSERT_EQ(tok::newline, Toks[3].getKind());
210
211 ASSERT_EQ(tok::text, Toks[4].getKind());
212 ASSERT_EQ(StringRef(" Ccc"), Toks[4].getText());
213 ASSERT_EQ(tok::newline, Toks[5].getKind());
214
215 ASSERT_EQ(tok::text, Toks[6].getKind());
216 ASSERT_EQ(StringRef(" ! Ddd"), Toks[6].getText());
217 ASSERT_EQ(tok::newline, Toks[7].getKind());
218
219 ASSERT_EQ(tok::text, Toks[8].getKind());
220 ASSERT_EQ(StringRef(" Eee"), Toks[8].getText());
221 ASSERT_EQ(tok::newline, Toks[9].getKind());
222
223 ASSERT_EQ(tok::text, Toks[10].getKind());
224 ASSERT_EQ(StringRef("* Fff"), Toks[10].getText());
225 ASSERT_EQ(tok::newline, Toks[11].getKind());
226
227 ASSERT_EQ(tok::text, Toks[12].getKind());
228 ASSERT_EQ(StringRef(" "), Toks[12].getText());
229
230 ASSERT_EQ(tok::newline, Toks[13].getKind());
231 ASSERT_EQ(tok::newline, Toks[14].getKind());
232}
233
234// A command marker followed by comment end.
235TEST_F(CommentLexerTest, DoxygenCommand1) {
236 const char *Sources[] = { "//@", "///@", "//!@" };
237 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
238 std::vector<Token> Toks;
239
240 lexString(Sources[i], Toks);
241
242 ASSERT_EQ(2U, Toks.size());
243
244 ASSERT_EQ(tok::text, Toks[0].getKind());
245 ASSERT_EQ(StringRef("@"), Toks[0].getText());
246
247 ASSERT_EQ(tok::newline, Toks[1].getKind());
248 }
249}
250
251// A command marker followed by comment end.
252TEST_F(CommentLexerTest, DoxygenCommand2) {
253 const char *Sources[] = { "/*@*/", "/**@*/", "/*!@*/"};
254 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
255 std::vector<Token> Toks;
256
257 lexString(Sources[i], Toks);
258
259 ASSERT_EQ(3U, Toks.size());
260
261 ASSERT_EQ(tok::text, Toks[0].getKind());
262 ASSERT_EQ(StringRef("@"), Toks[0].getText());
263
264 ASSERT_EQ(tok::newline, Toks[1].getKind());
265 ASSERT_EQ(tok::newline, Toks[2].getKind());
266 }
267}
268
269// A command marker followed by comment end.
270TEST_F(CommentLexerTest, DoxygenCommand3) {
271 const char *Sources[] = { "/*\\*/", "/**\\*/" };
272 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
273 std::vector<Token> Toks;
274
275 lexString(Sources[i], Toks);
276
277 ASSERT_EQ(3U, Toks.size());
278
279 ASSERT_EQ(tok::text, Toks[0].getKind());
280 ASSERT_EQ(StringRef("\\"), Toks[0].getText());
281
282 ASSERT_EQ(tok::newline, Toks[1].getKind());
283 ASSERT_EQ(tok::newline, Toks[2].getKind());
284 }
285}
286
287// Doxygen escape sequences.
288TEST_F(CommentLexerTest, DoxygenCommand4) {
289 const char *Source =
290 "/// \\\\ \\@ \\& \\$ \\# \\< \\> \\% \\\" \\. \\::";
291 const char *Text[] = {
292 " ",
293 "\\", " ", "@", " ", "&", " ", "$", " ", "#", " ",
294 "<", " ", ">", " ", "%", " ", "\"", " ", ".", " ",
295 "::", ""
296 };
297
298 std::vector<Token> Toks;
299
300 lexString(Source, Toks);
301
302 ASSERT_EQ(array_lengthof(Text), Toks.size());
303
304 for (size_t i = 0, e = Toks.size(); i != e; i++) {
305 if(Toks[i].is(tok::text))
306 ASSERT_EQ(StringRef(Text[i]), Toks[i].getText())
307 << "index " << i;
308 }
309}
310
311TEST_F(CommentLexerTest, DoxygenCommand5) {
312 const char *Source = "/// \\brief Aaa.";
313 std::vector<Token> Toks;
314
315 lexString(Source, Toks);
316
317 ASSERT_EQ(4U, Toks.size());
318
319 ASSERT_EQ(tok::text, Toks[0].getKind());
320 ASSERT_EQ(StringRef(" "), Toks[0].getText());
321
322 ASSERT_EQ(tok::command, Toks[1].getKind());
323 ASSERT_EQ(StringRef("brief"), Toks[1].getCommandName());
324
325 ASSERT_EQ(tok::text, Toks[2].getKind());
326 ASSERT_EQ(StringRef(" Aaa."), Toks[2].getText());
327
328 ASSERT_EQ(tok::newline, Toks[3].getKind());
329}
330
331TEST_F(CommentLexerTest, DoxygenCommand6) {
332 const char *Source = "/// \\aaa\\bbb \\ccc\t\\ddd\n";
333 std::vector<Token> Toks;
334
335 lexString(Source, Toks);
336
337 ASSERT_EQ(8U, Toks.size());
338
339 ASSERT_EQ(tok::text, Toks[0].getKind());
340 ASSERT_EQ(StringRef(" "), Toks[0].getText());
341
342 ASSERT_EQ(tok::command, Toks[1].getKind());
343 ASSERT_EQ(StringRef("aaa"), Toks[1].getCommandName());
344
345 ASSERT_EQ(tok::command, Toks[2].getKind());
346 ASSERT_EQ(StringRef("bbb"), Toks[2].getCommandName());
347
348 ASSERT_EQ(tok::text, Toks[3].getKind());
349 ASSERT_EQ(StringRef(" "), Toks[3].getText());
350
351 ASSERT_EQ(tok::command, Toks[4].getKind());
352 ASSERT_EQ(StringRef("ccc"), Toks[4].getCommandName());
353
354 ASSERT_EQ(tok::text, Toks[5].getKind());
355 ASSERT_EQ(StringRef("\t"), Toks[5].getText());
356
357 ASSERT_EQ(tok::command, Toks[6].getKind());
358 ASSERT_EQ(StringRef("ddd"), Toks[6].getCommandName());
359
360 ASSERT_EQ(tok::newline, Toks[7].getKind());
361}
362
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000363TEST_F(CommentLexerTest, DoxygenCommand7) {
364 const char *Source = "// \\c\n";
365 std::vector<Token> Toks;
366
367 lexString(Source, Toks);
368
369 ASSERT_EQ(3U, Toks.size());
370
371 ASSERT_EQ(tok::text, Toks[0].getKind());
372 ASSERT_EQ(StringRef(" "), Toks[0].getText());
373
374 ASSERT_EQ(tok::command, Toks[1].getKind());
375 ASSERT_EQ(StringRef("c"), Toks[1].getCommandName());
376
377 ASSERT_EQ(tok::newline, Toks[2].getKind());
378}
379
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000380// Empty verbatim block.
381TEST_F(CommentLexerTest, VerbatimBlock1) {
382 const char *Sources[] = {
383 "/// \\verbatim\\endverbatim\n//",
384 "/** \\verbatim\\endverbatim*/"
385 };
386
387 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
388 std::vector<Token> Toks;
389
390 lexString(Sources[i], Toks);
391
392 ASSERT_EQ(5U, Toks.size());
393
394 ASSERT_EQ(tok::text, Toks[0].getKind());
395 ASSERT_EQ(StringRef(" "), Toks[0].getText());
396
397 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
398 ASSERT_EQ(StringRef("verbatim"), Toks[1].getVerbatimBlockName());
399
400 ASSERT_EQ(tok::verbatim_block_end, Toks[2].getKind());
401 ASSERT_EQ(StringRef("endverbatim"), Toks[2].getVerbatimBlockName());
402
403 ASSERT_EQ(tok::newline, Toks[3].getKind());
404 ASSERT_EQ(tok::newline, Toks[4].getKind());
405 }
406}
407
408// Empty verbatim block without an end command.
409TEST_F(CommentLexerTest, VerbatimBlock2) {
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000410 const char *Source = "/// \\verbatim";
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000411
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000412 std::vector<Token> Toks;
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000413
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000414 lexString(Source, Toks);
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000415
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000416 ASSERT_EQ(3U, Toks.size());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000417
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000418 ASSERT_EQ(tok::text, Toks[0].getKind());
419 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000420
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000421 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
422 ASSERT_EQ(StringRef("verbatim"), Toks[1].getVerbatimBlockName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000423
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000424 ASSERT_EQ(tok::newline, Toks[2].getKind());
425}
426
427// Empty verbatim block without an end command.
428TEST_F(CommentLexerTest, VerbatimBlock3) {
429 const char *Source = "/** \\verbatim*/";
430
431 std::vector<Token> Toks;
432
433 lexString(Source, Toks);
434
435 ASSERT_EQ(4U, Toks.size());
436
437 ASSERT_EQ(tok::text, Toks[0].getKind());
438 ASSERT_EQ(StringRef(" "), Toks[0].getText());
439
440 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
441 ASSERT_EQ(StringRef("verbatim"), Toks[1].getVerbatimBlockName());
442
443 ASSERT_EQ(tok::newline, Toks[2].getKind());
444 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000445}
446
447// Single-line verbatim block.
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000448TEST_F(CommentLexerTest, VerbatimBlock4) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000449 const char *Sources[] = {
450 "/// Meow \\verbatim aaa \\endverbatim\n//",
451 "/** Meow \\verbatim aaa \\endverbatim*/"
452 };
453
454 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
455 std::vector<Token> Toks;
456
457 lexString(Sources[i], Toks);
458
459 ASSERT_EQ(6U, Toks.size());
460
461 ASSERT_EQ(tok::text, Toks[0].getKind());
462 ASSERT_EQ(StringRef(" Meow "), Toks[0].getText());
463
464 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
465 ASSERT_EQ(StringRef("verbatim"), Toks[1].getVerbatimBlockName());
466
467 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
468 ASSERT_EQ(StringRef(" aaa "), Toks[2].getVerbatimBlockText());
469
470 ASSERT_EQ(tok::verbatim_block_end, Toks[3].getKind());
471 ASSERT_EQ(StringRef("endverbatim"), Toks[3].getVerbatimBlockName());
472
473 ASSERT_EQ(tok::newline, Toks[4].getKind());
474 ASSERT_EQ(tok::newline, Toks[5].getKind());
475 }
476}
477
478// Single-line verbatim block without an end command.
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000479TEST_F(CommentLexerTest, VerbatimBlock5) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000480 const char *Sources[] = {
481 "/// Meow \\verbatim aaa \n//",
482 "/** Meow \\verbatim aaa */"
483 };
484
485 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
486 std::vector<Token> Toks;
487
488 lexString(Sources[i], Toks);
489
490 ASSERT_EQ(5U, Toks.size());
491
492 ASSERT_EQ(tok::text, Toks[0].getKind());
493 ASSERT_EQ(StringRef(" Meow "), Toks[0].getText());
494
495 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
496 ASSERT_EQ(StringRef("verbatim"), Toks[1].getVerbatimBlockName());
497
498 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
499 ASSERT_EQ(StringRef(" aaa "), Toks[2].getVerbatimBlockText());
500
501 ASSERT_EQ(tok::newline, Toks[3].getKind());
502 ASSERT_EQ(tok::newline, Toks[4].getKind());
503 }
504}
505
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000506TEST_F(CommentLexerTest, VerbatimBlock6) {
507 const char *Source =
508 "// \\verbatim\n"
509 "// Aaa\n"
510 "//\n"
511 "// Bbb\n"
512 "// \\endverbatim\n";
513
514 std::vector<Token> Toks;
515
516 lexString(Source, Toks);
517
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000518 ASSERT_EQ(10U, Toks.size());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000519
520 ASSERT_EQ(tok::text, Toks[0].getKind());
521 ASSERT_EQ(StringRef(" "), Toks[0].getText());
522
523 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
524 ASSERT_EQ(StringRef("verbatim"), Toks[1].getVerbatimBlockName());
525
526 ASSERT_EQ(tok::newline, Toks[2].getKind());
527
528 ASSERT_EQ(tok::verbatim_block_line, Toks[3].getKind());
529 ASSERT_EQ(StringRef(" Aaa"), Toks[3].getVerbatimBlockText());
530
531 ASSERT_EQ(tok::newline, Toks[4].getKind());
532
533 ASSERT_EQ(tok::newline, Toks[5].getKind());
534
535 ASSERT_EQ(tok::verbatim_block_line, Toks[6].getKind());
536 ASSERT_EQ(StringRef(" Bbb"), Toks[6].getVerbatimBlockText());
537
538 ASSERT_EQ(tok::newline, Toks[7].getKind());
539
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000540 ASSERT_EQ(tok::verbatim_block_end, Toks[8].getKind());
541 ASSERT_EQ(StringRef("endverbatim"), Toks[8].getVerbatimBlockName());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000542
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000543 ASSERT_EQ(tok::newline, Toks[9].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000544}
545
546TEST_F(CommentLexerTest, VerbatimBlock7) {
547 const char *Source =
548 "/* \\verbatim\n"
549 " * Aaa\n"
550 " *\n"
551 " * Bbb\n"
552 " * \\endverbatim\n"
553 " */";
554
555 std::vector<Token> Toks;
556
557 lexString(Source, Toks);
558
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000559 ASSERT_EQ(10U, Toks.size());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000560
561 ASSERT_EQ(tok::text, Toks[0].getKind());
562 ASSERT_EQ(StringRef(" "), Toks[0].getText());
563
564 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
565 ASSERT_EQ(StringRef("verbatim"), Toks[1].getVerbatimBlockName());
566
567 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
568 ASSERT_EQ(StringRef(" Aaa"), Toks[2].getVerbatimBlockText());
569
570 ASSERT_EQ(tok::verbatim_block_line, Toks[3].getKind());
571 ASSERT_EQ(StringRef(""), Toks[3].getVerbatimBlockText());
572
573 ASSERT_EQ(tok::verbatim_block_line, Toks[4].getKind());
574 ASSERT_EQ(StringRef(" Bbb"), Toks[4].getVerbatimBlockText());
575
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000576 ASSERT_EQ(tok::verbatim_block_end, Toks[5].getKind());
577 ASSERT_EQ(StringRef("endverbatim"), Toks[5].getVerbatimBlockName());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000578
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000579 ASSERT_EQ(tok::newline, Toks[6].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000580
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000581 ASSERT_EQ(tok::text, Toks[7].getKind());
582 ASSERT_EQ(StringRef(" "), Toks[7].getText());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000583
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000584 ASSERT_EQ(tok::newline, Toks[8].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000585 ASSERT_EQ(tok::newline, Toks[9].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000586}
587
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000588// Complex test for verbatim blocks.
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000589TEST_F(CommentLexerTest, VerbatimBlock8) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000590 const char *Source =
591 "/* Meow \\verbatim aaa\\$\\@\n"
592 "bbb \\endverbati\r"
593 "ccc\r\n"
594 "ddd \\endverbatim Blah \\verbatim eee\n"
595 "\\endverbatim BlahBlah*/";
596 std::vector<Token> Toks;
597
598 lexString(Source, Toks);
599
600 ASSERT_EQ(14U, Toks.size());
601
602 ASSERT_EQ(tok::text, Toks[0].getKind());
603 ASSERT_EQ(StringRef(" Meow "), Toks[0].getText());
604
605 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
606 ASSERT_EQ(StringRef("verbatim"), Toks[1].getVerbatimBlockName());
607
608 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000609 ASSERT_EQ(StringRef(" aaa\\$\\@"), Toks[2].getVerbatimBlockText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000610
611 ASSERT_EQ(tok::verbatim_block_line, Toks[3].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000612 ASSERT_EQ(StringRef("bbb \\endverbati"), Toks[3].getVerbatimBlockText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000613
614 ASSERT_EQ(tok::verbatim_block_line, Toks[4].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000615 ASSERT_EQ(StringRef("ccc"), Toks[4].getVerbatimBlockText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000616
617 ASSERT_EQ(tok::verbatim_block_line, Toks[5].getKind());
618 ASSERT_EQ(StringRef("ddd "), Toks[5].getVerbatimBlockText());
619
620 ASSERT_EQ(tok::verbatim_block_end, Toks[6].getKind());
621 ASSERT_EQ(StringRef("endverbatim"), Toks[6].getVerbatimBlockName());
622
623 ASSERT_EQ(tok::text, Toks[7].getKind());
624 ASSERT_EQ(StringRef(" Blah "), Toks[7].getText());
625
626 ASSERT_EQ(tok::verbatim_block_begin, Toks[8].getKind());
627 ASSERT_EQ(StringRef("verbatim"), Toks[8].getVerbatimBlockName());
628
629 ASSERT_EQ(tok::verbatim_block_line, Toks[9].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000630 ASSERT_EQ(StringRef(" eee"), Toks[9].getVerbatimBlockText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000631
632 ASSERT_EQ(tok::verbatim_block_end, Toks[10].getKind());
633 ASSERT_EQ(StringRef("endverbatim"), Toks[10].getVerbatimBlockName());
634
635 ASSERT_EQ(tok::text, Toks[11].getKind());
636 ASSERT_EQ(StringRef(" BlahBlah"), Toks[11].getText());
637
638 ASSERT_EQ(tok::newline, Toks[12].getKind());
639 ASSERT_EQ(tok::newline, Toks[13].getKind());
640}
641
642// LaTeX verbatim blocks.
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000643TEST_F(CommentLexerTest, VerbatimBlock9) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000644 const char *Source =
645 "/// \\f$ Aaa \\f$ \\f[ Bbb \\f] \\f{ Ccc \\f}";
646 std::vector<Token> Toks;
647
648 lexString(Source, Toks);
649
650 ASSERT_EQ(13U, Toks.size());
651
652 ASSERT_EQ(tok::text, Toks[0].getKind());
653 ASSERT_EQ(StringRef(" "), Toks[0].getText());
654
655 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
656 ASSERT_EQ(StringRef("f$"), Toks[1].getVerbatimBlockName());
657
658 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
659 ASSERT_EQ(StringRef(" Aaa "), Toks[2].getVerbatimBlockText());
660
661 ASSERT_EQ(tok::verbatim_block_end, Toks[3].getKind());
662 ASSERT_EQ(StringRef("f$"), Toks[3].getVerbatimBlockName());
663
664 ASSERT_EQ(tok::text, Toks[4].getKind());
665 ASSERT_EQ(StringRef(" "), Toks[4].getText());
666
667 ASSERT_EQ(tok::verbatim_block_begin, Toks[5].getKind());
668 ASSERT_EQ(StringRef("f["), Toks[5].getVerbatimBlockName());
669
670 ASSERT_EQ(tok::verbatim_block_line, Toks[6].getKind());
671 ASSERT_EQ(StringRef(" Bbb "), Toks[6].getVerbatimBlockText());
672
673 ASSERT_EQ(tok::verbatim_block_end, Toks[7].getKind());
674 ASSERT_EQ(StringRef("f]"), Toks[7].getVerbatimBlockName());
675
676 ASSERT_EQ(tok::text, Toks[8].getKind());
677 ASSERT_EQ(StringRef(" "), Toks[8].getText());
678
679 ASSERT_EQ(tok::verbatim_block_begin, Toks[9].getKind());
680 ASSERT_EQ(StringRef("f{"), Toks[9].getVerbatimBlockName());
681
682 ASSERT_EQ(tok::verbatim_block_line, Toks[10].getKind());
683 ASSERT_EQ(StringRef(" Ccc "), Toks[10].getVerbatimBlockText());
684
685 ASSERT_EQ(tok::verbatim_block_end, Toks[11].getKind());
686 ASSERT_EQ(StringRef("f}"), Toks[11].getVerbatimBlockName());
687
688 ASSERT_EQ(tok::newline, Toks[12].getKind());
689}
690
691// Empty verbatim line.
692TEST_F(CommentLexerTest, VerbatimLine1) {
693 const char *Sources[] = {
694 "/// \\fn\n//",
695 "/** \\fn*/"
696 };
697
698 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
699 std::vector<Token> Toks;
700
701 lexString(Sources[i], Toks);
702
703 ASSERT_EQ(4U, Toks.size());
704
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000705 ASSERT_EQ(tok::text, Toks[0].getKind());
706 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000707
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000708 ASSERT_EQ(tok::verbatim_line_name, Toks[1].getKind());
709 ASSERT_EQ(StringRef("fn"), Toks[1].getVerbatimLineName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000710
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000711 ASSERT_EQ(tok::newline, Toks[2].getKind());
712 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000713 }
714}
715
716// Verbatim line with Doxygen escape sequences, which should not be expanded.
717TEST_F(CommentLexerTest, VerbatimLine2) {
718 const char *Sources[] = {
719 "/// \\fn void *foo(const char *zzz = \"\\$\");\n//",
720 "/** \\fn void *foo(const char *zzz = \"\\$\");*/"
721 };
722
723 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
724 std::vector<Token> Toks;
725
726 lexString(Sources[i], Toks);
727
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000728 ASSERT_EQ(5U, Toks.size());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000729
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000730 ASSERT_EQ(tok::text, Toks[0].getKind());
731 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000732
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000733 ASSERT_EQ(tok::verbatim_line_name, Toks[1].getKind());
734 ASSERT_EQ(StringRef("fn"), Toks[1].getVerbatimLineName());
735
736 ASSERT_EQ(tok::verbatim_line_text, Toks[2].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000737 ASSERT_EQ(StringRef(" void *foo(const char *zzz = \"\\$\");"),
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000738 Toks[2].getVerbatimLineText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000739
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000740 ASSERT_EQ(tok::newline, Toks[3].getKind());
741 ASSERT_EQ(tok::newline, Toks[4].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000742 }
743}
744
745// Verbatim line should not eat anything from next source line.
746TEST_F(CommentLexerTest, VerbatimLine3) {
747 const char *Source =
748 "/** \\fn void *foo(const char *zzz = \"\\$\");\n"
749 " * Meow\n"
750 " */";
751
752 std::vector<Token> Toks;
753
754 lexString(Source, Toks);
755
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000756 ASSERT_EQ(9U, Toks.size());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000757
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000758 ASSERT_EQ(tok::text, Toks[0].getKind());
759 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000760
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000761 ASSERT_EQ(tok::verbatim_line_name, Toks[1].getKind());
762 ASSERT_EQ(StringRef("fn"), Toks[1].getVerbatimLineName());
763
764 ASSERT_EQ(tok::verbatim_line_text, Toks[2].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000765 ASSERT_EQ(StringRef(" void *foo(const char *zzz = \"\\$\");"),
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000766 Toks[2].getVerbatimLineText());
767 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000768
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000769 ASSERT_EQ(tok::text, Toks[4].getKind());
770 ASSERT_EQ(StringRef(" Meow"), Toks[4].getText());
771 ASSERT_EQ(tok::newline, Toks[5].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000772
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000773 ASSERT_EQ(tok::text, Toks[6].getKind());
774 ASSERT_EQ(StringRef(" "), Toks[6].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000775
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000776 ASSERT_EQ(tok::newline, Toks[7].getKind());
777 ASSERT_EQ(tok::newline, Toks[8].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000778}
779
780TEST_F(CommentLexerTest, HTML1) {
781 const char *Source =
782 "// <";
783
784 std::vector<Token> Toks;
785
786 lexString(Source, Toks);
787
788 ASSERT_EQ(3U, Toks.size());
789
790 ASSERT_EQ(tok::text, Toks[0].getKind());
791 ASSERT_EQ(StringRef(" "), Toks[0].getText());
792
793 ASSERT_EQ(tok::text, Toks[1].getKind());
794 ASSERT_EQ(StringRef("<"), Toks[1].getText());
795
796 ASSERT_EQ(tok::newline, Toks[2].getKind());
797}
798
799TEST_F(CommentLexerTest, HTML2) {
Dmitri Gribenko5676d322012-06-27 23:28:29 +0000800 const char *Source =
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000801 "// a<2";
802
803 std::vector<Token> Toks;
804
805 lexString(Source, Toks);
806
807 ASSERT_EQ(4U, Toks.size());
808
809 ASSERT_EQ(tok::text, Toks[0].getKind());
810 ASSERT_EQ(StringRef(" a"), Toks[0].getText());
811
812 ASSERT_EQ(tok::text, Toks[1].getKind());
813 ASSERT_EQ(StringRef("<"), Toks[1].getText());
814
815 ASSERT_EQ(tok::text, Toks[2].getKind());
816 ASSERT_EQ(StringRef("2"), Toks[2].getText());
817
818 ASSERT_EQ(tok::newline, Toks[3].getKind());
819}
820
821TEST_F(CommentLexerTest, HTML3) {
822 const char *Source =
Dmitri Gribenko5676d322012-06-27 23:28:29 +0000823 "// < tag";
824
825 std::vector<Token> Toks;
826
827 lexString(Source, Toks);
828
829 ASSERT_EQ(4U, Toks.size());
830
831 ASSERT_EQ(tok::text, Toks[0].getKind());
832 ASSERT_EQ(StringRef(" "), Toks[0].getText());
833
834 ASSERT_EQ(tok::text, Toks[1].getKind());
835 ASSERT_EQ(StringRef("<"), Toks[1].getText());
836
837 ASSERT_EQ(tok::text, Toks[2].getKind());
838 ASSERT_EQ(StringRef(" tag"), Toks[2].getText());
839
840 ASSERT_EQ(tok::newline, Toks[3].getKind());
841}
842
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000843TEST_F(CommentLexerTest, HTML4) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000844 const char *Sources[] = {
845 "// <tag",
846 "// <tag "
847 };
848
849 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
850 std::vector<Token> Toks;
851
852 lexString(Sources[i], Toks);
853
854 ASSERT_EQ(3U, Toks.size());
855
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000856 ASSERT_EQ(tok::text, Toks[0].getKind());
857 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000858
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000859 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
860 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000861
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000862 ASSERT_EQ(tok::newline, Toks[2].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000863 }
864}
865
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000866TEST_F(CommentLexerTest, HTML5) {
867 const char *Source =
868 "// <tag 42";
869
870 std::vector<Token> Toks;
871
872 lexString(Source, Toks);
873
874 ASSERT_EQ(4U, Toks.size());
875
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000876 ASSERT_EQ(tok::text, Toks[0].getKind());
877 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000878
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000879 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
880 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagStartName());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000881
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000882 ASSERT_EQ(tok::text, Toks[2].getKind());
883 ASSERT_EQ(StringRef("42"), Toks[2].getText());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000884
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000885 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000886}
887
888TEST_F(CommentLexerTest, HTML6) {
889 const char *Source = "// <tag> Meow";
890
891 std::vector<Token> Toks;
892
893 lexString(Source, Toks);
894
895 ASSERT_EQ(5U, Toks.size());
896
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000897 ASSERT_EQ(tok::text, Toks[0].getKind());
898 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000899
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000900 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
901 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagStartName());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000902
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000903 ASSERT_EQ(tok::html_greater, Toks[2].getKind());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000904
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000905 ASSERT_EQ(tok::text, Toks[3].getKind());
906 ASSERT_EQ(StringRef(" Meow"), Toks[3].getText());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000907
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000908 ASSERT_EQ(tok::newline, Toks[4].getKind());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000909}
910
911TEST_F(CommentLexerTest, HTML7) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000912 const char *Source = "// <tag=";
913
914 std::vector<Token> Toks;
915
916 lexString(Source, Toks);
917
918 ASSERT_EQ(4U, Toks.size());
919
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000920 ASSERT_EQ(tok::text, Toks[0].getKind());
921 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000922
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000923 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
924 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000925
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000926 ASSERT_EQ(tok::text, Toks[2].getKind());
927 ASSERT_EQ(StringRef("="), Toks[2].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000928
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000929 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000930}
931
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000932TEST_F(CommentLexerTest, HTML8) {
933 const char *Source = "// <tag attr=> Meow";
934
935 std::vector<Token> Toks;
936
937 lexString(Source, Toks);
938
939 ASSERT_EQ(7U, Toks.size());
940
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000941 ASSERT_EQ(tok::text, Toks[0].getKind());
942 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000943
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000944 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
945 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagStartName());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000946
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000947 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
948 ASSERT_EQ(StringRef("attr"), Toks[2].getHTMLIdent());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000949
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000950 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000951
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000952 ASSERT_EQ(tok::html_greater, Toks[4].getKind());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000953
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000954 ASSERT_EQ(tok::text, Toks[5].getKind());
955 ASSERT_EQ(StringRef(" Meow"), Toks[5].getText());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000956
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000957 ASSERT_EQ(tok::newline, Toks[6].getKind());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000958}
959
960TEST_F(CommentLexerTest, HTML9) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000961 const char *Sources[] = {
962 "// <tag attr",
963 "// <tag attr "
964 };
965
966 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
967 std::vector<Token> Toks;
968
969 lexString(Sources[i], Toks);
970
971 ASSERT_EQ(4U, Toks.size());
972
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000973 ASSERT_EQ(tok::text, Toks[0].getKind());
974 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000975
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000976 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
977 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000978
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000979 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
980 ASSERT_EQ(StringRef("attr"), Toks[2].getHTMLIdent());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000981
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000982 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000983 }
984}
985
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000986TEST_F(CommentLexerTest, HTML10) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000987 const char *Sources[] = {
988 "// <tag attr=",
989 "// <tag attr ="
990 };
991
992 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
993 std::vector<Token> Toks;
994
995 lexString(Sources[i], Toks);
996
997 ASSERT_EQ(5U, Toks.size());
998
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000999 ASSERT_EQ(tok::text, Toks[0].getKind());
1000 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001001
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001002 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1003 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001004
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001005 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
1006 ASSERT_EQ(StringRef("attr"), Toks[2].getHTMLIdent());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001007
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001008 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001009
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001010 ASSERT_EQ(tok::newline, Toks[4].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001011 }
1012}
1013
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001014TEST_F(CommentLexerTest, HTML11) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001015 const char *Sources[] = {
1016 "// <tag attr=\"",
1017 "// <tag attr = \"",
1018 "// <tag attr=\'",
1019 "// <tag attr = \'"
1020 };
1021
1022 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1023 std::vector<Token> Toks;
1024
1025 lexString(Sources[i], Toks);
1026
1027 ASSERT_EQ(6U, Toks.size());
1028
1029 ASSERT_EQ(tok::text, Toks[0].getKind());
1030 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1031
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001032 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1033 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001034
1035 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
1036 ASSERT_EQ(StringRef("attr"), Toks[2].getHTMLIdent());
1037
1038 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
1039
1040 ASSERT_EQ(tok::html_quoted_string, Toks[4].getKind());
1041 ASSERT_EQ(StringRef(""), Toks[4].getHTMLQuotedString());
1042
1043 ASSERT_EQ(tok::newline, Toks[5].getKind());
1044 }
1045}
1046
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001047TEST_F(CommentLexerTest, HTML12) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001048 const char *Source = "// <tag attr=@";
1049
1050 std::vector<Token> Toks;
1051
1052 lexString(Source, Toks);
1053
1054 ASSERT_EQ(6U, Toks.size());
1055
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001056 ASSERT_EQ(tok::text, Toks[0].getKind());
1057 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001058
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001059 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1060 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001061
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001062 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
1063 ASSERT_EQ(StringRef("attr"), Toks[2].getHTMLIdent());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001064
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001065 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001066
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001067 ASSERT_EQ(tok::text, Toks[4].getKind());
1068 ASSERT_EQ(StringRef("@"), Toks[4].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001069
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001070 ASSERT_EQ(tok::newline, Toks[5].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001071}
1072
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001073TEST_F(CommentLexerTest, HTML13) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001074 const char *Sources[] = {
1075 "// <tag attr=\"val\\\"\\'val",
1076 "// <tag attr=\"val\\\"\\'val\"",
1077 "// <tag attr=\'val\\\"\\'val",
1078 "// <tag attr=\'val\\\"\\'val\'"
1079 };
1080
1081 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1082 std::vector<Token> Toks;
1083
1084 lexString(Sources[i], Toks);
1085
1086 ASSERT_EQ(6U, Toks.size());
1087
1088 ASSERT_EQ(tok::text, Toks[0].getKind());
1089 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1090
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001091 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1092 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001093
1094 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
1095 ASSERT_EQ(StringRef("attr"), Toks[2].getHTMLIdent());
1096
1097 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
1098
1099 ASSERT_EQ(tok::html_quoted_string, Toks[4].getKind());
1100 ASSERT_EQ(StringRef("val\\\"\\'val"), Toks[4].getHTMLQuotedString());
1101
1102 ASSERT_EQ(tok::newline, Toks[5].getKind());
1103 }
1104}
1105
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001106TEST_F(CommentLexerTest, HTML14) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001107 const char *Sources[] = {
1108 "// <tag attr=\"val\\\"\\'val\">",
1109 "// <tag attr=\'val\\\"\\'val\'>"
1110 };
1111
1112 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1113 std::vector<Token> Toks;
1114
1115 lexString(Sources[i], Toks);
1116
1117 ASSERT_EQ(7U, Toks.size());
1118
1119 ASSERT_EQ(tok::text, Toks[0].getKind());
1120 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1121
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001122 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1123 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001124
1125 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
1126 ASSERT_EQ(StringRef("attr"), Toks[2].getHTMLIdent());
1127
1128 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
1129
1130 ASSERT_EQ(tok::html_quoted_string, Toks[4].getKind());
1131 ASSERT_EQ(StringRef("val\\\"\\'val"), Toks[4].getHTMLQuotedString());
1132
1133 ASSERT_EQ(tok::html_greater, Toks[5].getKind());
1134
1135 ASSERT_EQ(tok::newline, Toks[6].getKind());
1136 }
1137}
1138
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001139TEST_F(CommentLexerTest, HTML15) {
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001140 const char *Sources[] = {
1141 "// <tag/>",
1142 "// <tag />"
1143 };
1144
1145 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1146 std::vector<Token> Toks;
1147
1148 lexString(Sources[i], Toks);
1149
1150 ASSERT_EQ(4U, Toks.size());
1151
1152 ASSERT_EQ(tok::text, Toks[0].getKind());
1153 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1154
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001155 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1156 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagStartName());
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001157
1158 ASSERT_EQ(tok::html_slash_greater, Toks[2].getKind());
1159
1160 ASSERT_EQ(tok::newline, Toks[3].getKind());
1161 }
1162}
1163
1164TEST_F(CommentLexerTest, HTML16) {
1165 const char *Sources[] = {
1166 "// <tag/ Aaa",
1167 "// <tag / Aaa"
1168 };
1169
1170 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1171 std::vector<Token> Toks;
1172
1173 lexString(Sources[i], Toks);
1174
1175 ASSERT_EQ(5U, Toks.size());
1176
1177 ASSERT_EQ(tok::text, Toks[0].getKind());
1178 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1179
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001180 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1181 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagStartName());
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001182
1183 ASSERT_EQ(tok::text, Toks[2].getKind());
1184 ASSERT_EQ(StringRef("/"), Toks[2].getText());
1185
1186 ASSERT_EQ(tok::text, Toks[3].getKind());
1187 ASSERT_EQ(StringRef(" Aaa"), Toks[3].getText());
1188
1189 ASSERT_EQ(tok::newline, Toks[4].getKind());
1190 }
1191}
1192
1193TEST_F(CommentLexerTest, HTML17) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001194 const char *Source = "// </";
1195
1196 std::vector<Token> Toks;
1197
1198 lexString(Source, Toks);
1199
1200 ASSERT_EQ(3U, Toks.size());
1201
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001202 ASSERT_EQ(tok::text, Toks[0].getKind());
1203 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001204
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001205 ASSERT_EQ(tok::html_end_tag, Toks[1].getKind());
1206 ASSERT_EQ(StringRef(""), Toks[1].getHTMLTagEndName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001207
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001208 ASSERT_EQ(tok::newline, Toks[2].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001209}
1210
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001211TEST_F(CommentLexerTest, HTML18) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001212 const char *Source = "// </@";
1213
1214 std::vector<Token> Toks;
1215
1216 lexString(Source, Toks);
1217
1218 ASSERT_EQ(4U, Toks.size());
1219
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001220 ASSERT_EQ(tok::text, Toks[0].getKind());
1221 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001222
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001223 ASSERT_EQ(tok::html_end_tag, Toks[1].getKind());
1224 ASSERT_EQ(StringRef(""), Toks[1].getHTMLTagEndName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001225
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001226 ASSERT_EQ(tok::text, Toks[2].getKind());
1227 ASSERT_EQ(StringRef("@"), Toks[2].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001228
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001229 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001230}
1231
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001232TEST_F(CommentLexerTest, HTML19) {
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +00001233 const char *Source = "// </tag";
1234
1235 std::vector<Token> Toks;
1236
1237 lexString(Source, Toks);
1238
1239 ASSERT_EQ(3U, Toks.size());
1240
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001241 ASSERT_EQ(tok::text, Toks[0].getKind());
1242 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +00001243
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001244 ASSERT_EQ(tok::html_end_tag, Toks[1].getKind());
1245 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagEndName());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +00001246
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001247 ASSERT_EQ(tok::newline, Toks[2].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +00001248}
1249
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001250TEST_F(CommentLexerTest, HTML20) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001251 const char *Sources[] = {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001252 "// </tag>",
1253 "// </ tag>",
1254 "// </ tag >"
1255 };
1256
1257 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1258 std::vector<Token> Toks;
1259
1260 lexString(Sources[i], Toks);
1261
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +00001262 ASSERT_EQ(4U, Toks.size());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001263
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001264 ASSERT_EQ(tok::text, Toks[0].getKind());
1265 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001266
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001267 ASSERT_EQ(tok::html_end_tag, Toks[1].getKind());
1268 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagEndName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001269
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001270 ASSERT_EQ(tok::html_greater, Toks[2].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +00001271
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001272 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001273 }
1274}
1275
Dmitri Gribenko477a9f52012-07-27 20:37:06 +00001276TEST_F(CommentLexerTest, HTMLCharacterReferences1) {
1277 const char *Source = "// &";
1278
1279 std::vector<Token> Toks;
1280
1281 lexString(Source, Toks);
1282
1283 ASSERT_EQ(3U, Toks.size());
1284
1285 ASSERT_EQ(tok::text, Toks[0].getKind());
1286 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1287
1288 ASSERT_EQ(tok::text, Toks[1].getKind());
1289 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1290
1291 ASSERT_EQ(tok::newline, Toks[2].getKind());
1292}
1293
1294TEST_F(CommentLexerTest, HTMLCharacterReferences2) {
1295 const char *Source = "// &!";
1296
1297 std::vector<Token> Toks;
1298
1299 lexString(Source, Toks);
1300
1301 ASSERT_EQ(4U, Toks.size());
1302
1303 ASSERT_EQ(tok::text, Toks[0].getKind());
1304 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1305
1306 ASSERT_EQ(tok::text, Toks[1].getKind());
1307 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1308
1309 ASSERT_EQ(tok::text, Toks[2].getKind());
1310 ASSERT_EQ(StringRef("!"), Toks[2].getText());
1311
1312 ASSERT_EQ(tok::newline, Toks[3].getKind());
1313}
1314
1315TEST_F(CommentLexerTest, HTMLCharacterReferences3) {
1316 const char *Source = "// &amp";
1317
1318 std::vector<Token> Toks;
1319
1320 lexString(Source, Toks);
1321
1322 ASSERT_EQ(3U, Toks.size());
1323
1324 ASSERT_EQ(tok::text, Toks[0].getKind());
1325 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1326
1327 ASSERT_EQ(tok::text, Toks[1].getKind());
1328 ASSERT_EQ(StringRef("&amp"), Toks[1].getText());
1329
1330 ASSERT_EQ(tok::newline, Toks[2].getKind());
1331}
1332
1333TEST_F(CommentLexerTest, HTMLCharacterReferences4) {
1334 const char *Source = "// &amp!";
1335
1336 std::vector<Token> Toks;
1337
1338 lexString(Source, Toks);
1339
1340 ASSERT_EQ(4U, Toks.size());
1341
1342 ASSERT_EQ(tok::text, Toks[0].getKind());
1343 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1344
1345 ASSERT_EQ(tok::text, Toks[1].getKind());
1346 ASSERT_EQ(StringRef("&amp"), Toks[1].getText());
1347
1348 ASSERT_EQ(tok::text, Toks[2].getKind());
1349 ASSERT_EQ(StringRef("!"), Toks[2].getText());
1350
1351 ASSERT_EQ(tok::newline, Toks[3].getKind());
1352}
1353
1354TEST_F(CommentLexerTest, HTMLCharacterReferences5) {
1355 const char *Source = "// &#";
1356
1357 std::vector<Token> Toks;
1358
1359 lexString(Source, Toks);
1360
1361 ASSERT_EQ(3U, Toks.size());
1362
1363 ASSERT_EQ(tok::text, Toks[0].getKind());
1364 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1365
1366 ASSERT_EQ(tok::text, Toks[1].getKind());
1367 ASSERT_EQ(StringRef("&#"), Toks[1].getText());
1368
1369 ASSERT_EQ(tok::newline, Toks[2].getKind());
1370}
1371
1372TEST_F(CommentLexerTest, HTMLCharacterReferences6) {
1373 const char *Source = "// &#a";
1374
1375 std::vector<Token> Toks;
1376
1377 lexString(Source, Toks);
1378
1379 ASSERT_EQ(4U, Toks.size());
1380
1381 ASSERT_EQ(tok::text, Toks[0].getKind());
1382 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1383
1384 ASSERT_EQ(tok::text, Toks[1].getKind());
1385 ASSERT_EQ(StringRef("&#"), Toks[1].getText());
1386
1387 ASSERT_EQ(tok::text, Toks[2].getKind());
1388 ASSERT_EQ(StringRef("a"), Toks[2].getText());
1389
1390 ASSERT_EQ(tok::newline, Toks[3].getKind());
1391}
1392
1393TEST_F(CommentLexerTest, HTMLCharacterReferences7) {
1394 const char *Source = "// &#42";
1395
1396 std::vector<Token> Toks;
1397
1398 lexString(Source, Toks);
1399
1400 ASSERT_EQ(3U, Toks.size());
1401
1402 ASSERT_EQ(tok::text, Toks[0].getKind());
1403 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1404
1405 ASSERT_EQ(tok::text, Toks[1].getKind());
1406 ASSERT_EQ(StringRef("&#42"), Toks[1].getText());
1407
1408 ASSERT_EQ(tok::newline, Toks[2].getKind());
1409}
1410
1411TEST_F(CommentLexerTest, HTMLCharacterReferences8) {
1412 const char *Source = "// &#42a";
1413
1414 std::vector<Token> Toks;
1415
1416 lexString(Source, Toks);
1417
1418 ASSERT_EQ(4U, Toks.size());
1419
1420 ASSERT_EQ(tok::text, Toks[0].getKind());
1421 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1422
1423 ASSERT_EQ(tok::text, Toks[1].getKind());
1424 ASSERT_EQ(StringRef("&#42"), Toks[1].getText());
1425
1426 ASSERT_EQ(tok::text, Toks[2].getKind());
1427 ASSERT_EQ(StringRef("a"), Toks[2].getText());
1428
1429 ASSERT_EQ(tok::newline, Toks[3].getKind());
1430}
1431
1432TEST_F(CommentLexerTest, HTMLCharacterReferences9) {
1433 const char *Source = "// &#x";
1434
1435 std::vector<Token> Toks;
1436
1437 lexString(Source, Toks);
1438
1439 ASSERT_EQ(3U, Toks.size());
1440
1441 ASSERT_EQ(tok::text, Toks[0].getKind());
1442 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1443
1444 ASSERT_EQ(tok::text, Toks[1].getKind());
1445 ASSERT_EQ(StringRef("&#x"), Toks[1].getText());
1446
1447 ASSERT_EQ(tok::newline, Toks[2].getKind());
1448}
1449
1450TEST_F(CommentLexerTest, HTMLCharacterReferences10) {
1451 const char *Source = "// &#xz";
1452
1453 std::vector<Token> Toks;
1454
1455 lexString(Source, Toks);
1456
1457 ASSERT_EQ(4U, Toks.size());
1458
1459 ASSERT_EQ(tok::text, Toks[0].getKind());
1460 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1461
1462 ASSERT_EQ(tok::text, Toks[1].getKind());
1463 ASSERT_EQ(StringRef("&#x"), Toks[1].getText());
1464
1465 ASSERT_EQ(tok::text, Toks[2].getKind());
1466 ASSERT_EQ(StringRef("z"), Toks[2].getText());
1467
1468 ASSERT_EQ(tok::newline, Toks[3].getKind());
1469}
1470
1471TEST_F(CommentLexerTest, HTMLCharacterReferences11) {
1472 const char *Source = "// &#xab";
1473
1474 std::vector<Token> Toks;
1475
1476 lexString(Source, Toks);
1477
1478 ASSERT_EQ(3U, Toks.size());
1479
1480 ASSERT_EQ(tok::text, Toks[0].getKind());
1481 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1482
1483 ASSERT_EQ(tok::text, Toks[1].getKind());
1484 ASSERT_EQ(StringRef("&#xab"), Toks[1].getText());
1485
1486 ASSERT_EQ(tok::newline, Toks[2].getKind());
1487}
1488
1489TEST_F(CommentLexerTest, HTMLCharacterReferences12) {
1490 const char *Source = "// &#xaBz";
1491
1492 std::vector<Token> Toks;
1493
1494 lexString(Source, Toks);
1495
1496 ASSERT_EQ(4U, Toks.size());
1497
1498 ASSERT_EQ(tok::text, Toks[0].getKind());
1499 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1500
1501 ASSERT_EQ(tok::text, Toks[1].getKind());
1502 ASSERT_EQ(StringRef("&#xaB"), Toks[1].getText());
1503
1504 ASSERT_EQ(tok::text, Toks[2].getKind());
1505 ASSERT_EQ(StringRef("z"), Toks[2].getText());
1506
1507 ASSERT_EQ(tok::newline, Toks[3].getKind());
1508}
1509
1510TEST_F(CommentLexerTest, HTMLCharacterReferences13) {
1511 const char *Source = "// &amp;";
1512
1513 std::vector<Token> Toks;
1514
1515 lexString(Source, Toks);
1516
1517 ASSERT_EQ(3U, Toks.size());
1518
1519 ASSERT_EQ(tok::text, Toks[0].getKind());
1520 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1521
1522 ASSERT_EQ(tok::text, Toks[1].getKind());
1523 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1524
1525 ASSERT_EQ(tok::newline, Toks[2].getKind());
1526}
1527
1528TEST_F(CommentLexerTest, HTMLCharacterReferences14) {
1529 const char *Source = "// &amp;&lt;";
1530
1531 std::vector<Token> Toks;
1532
1533 lexString(Source, Toks);
1534
1535 ASSERT_EQ(4U, Toks.size());
1536
1537 ASSERT_EQ(tok::text, Toks[0].getKind());
1538 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1539
1540 ASSERT_EQ(tok::text, Toks[1].getKind());
1541 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1542
1543 ASSERT_EQ(tok::text, Toks[2].getKind());
1544 ASSERT_EQ(StringRef("<"), Toks[2].getText());
1545
1546 ASSERT_EQ(tok::newline, Toks[3].getKind());
1547}
1548
1549TEST_F(CommentLexerTest, HTMLCharacterReferences15) {
1550 const char *Source = "// &amp; meow";
1551
1552 std::vector<Token> Toks;
1553
1554 lexString(Source, Toks);
1555
1556 ASSERT_EQ(4U, Toks.size());
1557
1558 ASSERT_EQ(tok::text, Toks[0].getKind());
1559 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1560
1561 ASSERT_EQ(tok::text, Toks[1].getKind());
1562 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1563
1564 ASSERT_EQ(tok::text, Toks[2].getKind());
1565 ASSERT_EQ(StringRef(" meow"), Toks[2].getText());
1566
1567 ASSERT_EQ(tok::newline, Toks[3].getKind());
1568}
1569
1570TEST_F(CommentLexerTest, HTMLCharacterReferences16) {
1571 const char *Sources[] = {
1572 "// &#61;",
1573 "// &#x3d;",
1574 "// &#X3d;"
1575 };
1576
1577 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1578 std::vector<Token> Toks;
1579
1580 lexString(Sources[i], Toks);
1581
1582 ASSERT_EQ(3U, Toks.size());
1583
1584 ASSERT_EQ(tok::text, Toks[0].getKind());
1585 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1586
1587 ASSERT_EQ(tok::text, Toks[1].getKind());
1588 ASSERT_EQ(StringRef("="), Toks[1].getText());
1589
1590 ASSERT_EQ(tok::newline, Toks[2].getKind());
1591 }
1592}
1593
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001594TEST_F(CommentLexerTest, MultipleComments) {
1595 const char *Source =
1596 "// Aaa\n"
1597 "/// Bbb\n"
1598 "/* Ccc\n"
1599 " * Ddd*/\n"
1600 "/** Eee*/";
1601
1602 std::vector<Token> Toks;
1603
1604 lexString(Source, Toks);
1605
1606 ASSERT_EQ(12U, Toks.size());
1607
1608 ASSERT_EQ(tok::text, Toks[0].getKind());
1609 ASSERT_EQ(StringRef(" Aaa"), Toks[0].getText());
1610 ASSERT_EQ(tok::newline, Toks[1].getKind());
1611
1612 ASSERT_EQ(tok::text, Toks[2].getKind());
1613 ASSERT_EQ(StringRef(" Bbb"), Toks[2].getText());
1614 ASSERT_EQ(tok::newline, Toks[3].getKind());
1615
1616 ASSERT_EQ(tok::text, Toks[4].getKind());
1617 ASSERT_EQ(StringRef(" Ccc"), Toks[4].getText());
1618 ASSERT_EQ(tok::newline, Toks[5].getKind());
1619
1620 ASSERT_EQ(tok::text, Toks[6].getKind());
1621 ASSERT_EQ(StringRef(" Ddd"), Toks[6].getText());
1622 ASSERT_EQ(tok::newline, Toks[7].getKind());
1623 ASSERT_EQ(tok::newline, Toks[8].getKind());
1624
1625 ASSERT_EQ(tok::text, Toks[9].getKind());
1626 ASSERT_EQ(StringRef(" Eee"), Toks[9].getText());
1627
1628 ASSERT_EQ(tok::newline, Toks[10].getKind());
1629 ASSERT_EQ(tok::newline, Toks[11].getKind());
1630}
1631
1632} // end namespace comments
1633} // end namespace clang
1634