blob: 1168d1d143b8b03b4de16e480dfb55b932f96476 [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"
Dmitri Gribenkoaa580812012-08-09 00:03:17 +000014#include "clang/AST/CommentCommandTraits.h"
Dmitri Gribenko2d44d772012-06-26 20:39:18 +000015#include "llvm/ADT/STLExtras.h"
16#include <vector>
17
18#include "gtest/gtest.h"
19
20using namespace llvm;
21using namespace clang;
22
23namespace clang {
24namespace comments {
25
26namespace {
27class CommentLexerTest : public ::testing::Test {
28protected:
29 CommentLexerTest()
30 : FileMgr(FileMgrOpts),
31 DiagID(new DiagnosticIDs()),
32 Diags(DiagID, new IgnoringDiagConsumer()),
33 SourceMgr(Diags, FileMgr) {
34 }
35
36 FileSystemOptions FileMgrOpts;
37 FileManager FileMgr;
38 IntrusiveRefCntPtr<DiagnosticIDs> DiagID;
39 DiagnosticsEngine Diags;
40 SourceManager SourceMgr;
Dmitri Gribenko477a9f52012-07-27 20:37:06 +000041 llvm::BumpPtrAllocator Allocator;
Dmitri Gribenko2d44d772012-06-26 20:39:18 +000042
43 void lexString(const char *Source, std::vector<Token> &Toks);
44};
45
46void CommentLexerTest::lexString(const char *Source,
47 std::vector<Token> &Toks) {
48 MemoryBuffer *Buf = MemoryBuffer::getMemBuffer(Source);
49 FileID File = SourceMgr.createFileIDForMemBuffer(Buf);
50 SourceLocation Begin = SourceMgr.getLocForStartOfFile(File);
51
Dmitri Gribenkoaa580812012-08-09 00:03:17 +000052 comments::CommandTraits Traits;
53 comments::Lexer L(Allocator, Traits, Begin, CommentOptions(),
Dmitri Gribenko2d44d772012-06-26 20:39:18 +000054 Source, Source + strlen(Source));
55
56 while (1) {
57 Token Tok;
58 L.lex(Tok);
59 if (Tok.is(tok::eof))
60 break;
61 Toks.push_back(Tok);
62 }
63}
64
65} // unnamed namespace
66
67// Empty source range should be handled.
68TEST_F(CommentLexerTest, Basic1) {
69 const char *Source = "";
70 std::vector<Token> Toks;
71
72 lexString(Source, Toks);
73
74 ASSERT_EQ(0U, Toks.size());
75}
76
77// Empty comments should be handled.
78TEST_F(CommentLexerTest, Basic2) {
79 const char *Sources[] = {
80 "//", "///", "//!", "///<", "//!<"
81 };
82 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
83 std::vector<Token> Toks;
84
85 lexString(Sources[i], Toks);
86
87 ASSERT_EQ(1U, Toks.size());
88
89 ASSERT_EQ(tok::newline, Toks[0].getKind());
90 }
91}
92
93// Empty comments should be handled.
94TEST_F(CommentLexerTest, Basic3) {
95 const char *Sources[] = {
96 "/**/", "/***/", "/*!*/", "/**<*/", "/*!<*/"
97 };
98 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
99 std::vector<Token> Toks;
100
101 lexString(Sources[i], Toks);
102
103 ASSERT_EQ(2U, Toks.size());
104
105 ASSERT_EQ(tok::newline, Toks[0].getKind());
106 ASSERT_EQ(tok::newline, Toks[1].getKind());
107 }
108}
109
110// Single comment with plain text.
111TEST_F(CommentLexerTest, Basic4) {
112 const char *Sources[] = {
113 "// Meow", "/// Meow", "//! Meow",
114 "// Meow\n", "// Meow\r\n", "//! Meow\r",
115 };
116
117 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
118 std::vector<Token> Toks;
119
120 lexString(Sources[i], Toks);
121
122 ASSERT_EQ(2U, Toks.size());
123
124 ASSERT_EQ(tok::text, Toks[0].getKind());
125 ASSERT_EQ(StringRef(" Meow"), Toks[0].getText());
126
127 ASSERT_EQ(tok::newline, Toks[1].getKind());
128 }
129}
130
131// Single comment with plain text.
132TEST_F(CommentLexerTest, Basic5) {
133 const char *Sources[] = {
134 "/* Meow*/", "/** Meow*/", "/*! Meow*/"
135 };
136
137 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
138 std::vector<Token> Toks;
139
140 lexString(Sources[i], Toks);
141
142 ASSERT_EQ(3U, Toks.size());
143
144 ASSERT_EQ(tok::text, Toks[0].getKind());
145 ASSERT_EQ(StringRef(" Meow"), Toks[0].getText());
146
147 ASSERT_EQ(tok::newline, Toks[1].getKind());
148 ASSERT_EQ(tok::newline, Toks[2].getKind());
149 }
150}
151
152// Test newline escaping.
153TEST_F(CommentLexerTest, Basic6) {
154 const char *Sources[] = {
155 "// Aaa\\\n" " Bbb\\ \n" " Ccc?" "?/\n",
156 "// Aaa\\\r\n" " Bbb\\ \r\n" " Ccc?" "?/\r\n",
157 "// Aaa\\\r" " Bbb\\ \r" " Ccc?" "?/\r"
158 };
159
160 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
161 std::vector<Token> Toks;
162
163 lexString(Sources[i], Toks);
164
165 ASSERT_EQ(10U, Toks.size());
166
167 ASSERT_EQ(tok::text, Toks[0].getKind());
168 ASSERT_EQ(StringRef(" Aaa"), Toks[0].getText());
169 ASSERT_EQ(tok::text, Toks[1].getKind());
170 ASSERT_EQ(StringRef("\\"), Toks[1].getText());
171 ASSERT_EQ(tok::newline, Toks[2].getKind());
172
173 ASSERT_EQ(tok::text, Toks[3].getKind());
174 ASSERT_EQ(StringRef(" Bbb"), Toks[3].getText());
175 ASSERT_EQ(tok::text, Toks[4].getKind());
176 ASSERT_EQ(StringRef("\\"), Toks[4].getText());
177 ASSERT_EQ(tok::text, Toks[5].getKind());
178 ASSERT_EQ(StringRef(" "), Toks[5].getText());
179 ASSERT_EQ(tok::newline, Toks[6].getKind());
180
181 ASSERT_EQ(tok::text, Toks[7].getKind());
182 ASSERT_EQ(StringRef(" Ccc?" "?/"), Toks[7].getText());
183 ASSERT_EQ(tok::newline, Toks[8].getKind());
184
185 ASSERT_EQ(tok::newline, Toks[9].getKind());
186 }
187}
188
189// Check that we skip C-style aligned stars correctly.
190TEST_F(CommentLexerTest, Basic7) {
191 const char *Source =
192 "/* Aaa\n"
193 " * Bbb\r\n"
194 "\t* Ccc\n"
195 " ! Ddd\n"
196 " * Eee\n"
197 " ** Fff\n"
198 " */";
199 std::vector<Token> Toks;
200
201 lexString(Source, Toks);
202
203 ASSERT_EQ(15U, Toks.size());
204
205 ASSERT_EQ(tok::text, Toks[0].getKind());
206 ASSERT_EQ(StringRef(" Aaa"), Toks[0].getText());
207 ASSERT_EQ(tok::newline, Toks[1].getKind());
208
209 ASSERT_EQ(tok::text, Toks[2].getKind());
210 ASSERT_EQ(StringRef(" Bbb"), Toks[2].getText());
211 ASSERT_EQ(tok::newline, Toks[3].getKind());
212
213 ASSERT_EQ(tok::text, Toks[4].getKind());
214 ASSERT_EQ(StringRef(" Ccc"), Toks[4].getText());
215 ASSERT_EQ(tok::newline, Toks[5].getKind());
216
217 ASSERT_EQ(tok::text, Toks[6].getKind());
218 ASSERT_EQ(StringRef(" ! Ddd"), Toks[6].getText());
219 ASSERT_EQ(tok::newline, Toks[7].getKind());
220
221 ASSERT_EQ(tok::text, Toks[8].getKind());
222 ASSERT_EQ(StringRef(" Eee"), Toks[8].getText());
223 ASSERT_EQ(tok::newline, Toks[9].getKind());
224
225 ASSERT_EQ(tok::text, Toks[10].getKind());
226 ASSERT_EQ(StringRef("* Fff"), Toks[10].getText());
227 ASSERT_EQ(tok::newline, Toks[11].getKind());
228
229 ASSERT_EQ(tok::text, Toks[12].getKind());
230 ASSERT_EQ(StringRef(" "), Toks[12].getText());
231
232 ASSERT_EQ(tok::newline, Toks[13].getKind());
233 ASSERT_EQ(tok::newline, Toks[14].getKind());
234}
235
236// A command marker followed by comment end.
237TEST_F(CommentLexerTest, DoxygenCommand1) {
238 const char *Sources[] = { "//@", "///@", "//!@" };
239 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
240 std::vector<Token> Toks;
241
242 lexString(Sources[i], Toks);
243
244 ASSERT_EQ(2U, Toks.size());
245
246 ASSERT_EQ(tok::text, Toks[0].getKind());
247 ASSERT_EQ(StringRef("@"), Toks[0].getText());
248
249 ASSERT_EQ(tok::newline, Toks[1].getKind());
250 }
251}
252
253// A command marker followed by comment end.
254TEST_F(CommentLexerTest, DoxygenCommand2) {
255 const char *Sources[] = { "/*@*/", "/**@*/", "/*!@*/"};
256 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
257 std::vector<Token> Toks;
258
259 lexString(Sources[i], Toks);
260
261 ASSERT_EQ(3U, Toks.size());
262
263 ASSERT_EQ(tok::text, Toks[0].getKind());
264 ASSERT_EQ(StringRef("@"), Toks[0].getText());
265
266 ASSERT_EQ(tok::newline, Toks[1].getKind());
267 ASSERT_EQ(tok::newline, Toks[2].getKind());
268 }
269}
270
271// A command marker followed by comment end.
272TEST_F(CommentLexerTest, DoxygenCommand3) {
273 const char *Sources[] = { "/*\\*/", "/**\\*/" };
274 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
275 std::vector<Token> Toks;
276
277 lexString(Sources[i], Toks);
278
279 ASSERT_EQ(3U, Toks.size());
280
281 ASSERT_EQ(tok::text, Toks[0].getKind());
282 ASSERT_EQ(StringRef("\\"), Toks[0].getText());
283
284 ASSERT_EQ(tok::newline, Toks[1].getKind());
285 ASSERT_EQ(tok::newline, Toks[2].getKind());
286 }
287}
288
289// Doxygen escape sequences.
290TEST_F(CommentLexerTest, DoxygenCommand4) {
291 const char *Source =
292 "/// \\\\ \\@ \\& \\$ \\# \\< \\> \\% \\\" \\. \\::";
293 const char *Text[] = {
294 " ",
295 "\\", " ", "@", " ", "&", " ", "$", " ", "#", " ",
296 "<", " ", ">", " ", "%", " ", "\"", " ", ".", " ",
297 "::", ""
298 };
299
300 std::vector<Token> Toks;
301
302 lexString(Source, Toks);
303
304 ASSERT_EQ(array_lengthof(Text), Toks.size());
305
306 for (size_t i = 0, e = Toks.size(); i != e; i++) {
307 if(Toks[i].is(tok::text))
308 ASSERT_EQ(StringRef(Text[i]), Toks[i].getText())
309 << "index " << i;
310 }
311}
312
313TEST_F(CommentLexerTest, DoxygenCommand5) {
314 const char *Source = "/// \\brief Aaa.";
315 std::vector<Token> Toks;
316
317 lexString(Source, Toks);
318
319 ASSERT_EQ(4U, Toks.size());
320
321 ASSERT_EQ(tok::text, Toks[0].getKind());
322 ASSERT_EQ(StringRef(" "), Toks[0].getText());
323
324 ASSERT_EQ(tok::command, Toks[1].getKind());
325 ASSERT_EQ(StringRef("brief"), Toks[1].getCommandName());
326
327 ASSERT_EQ(tok::text, Toks[2].getKind());
328 ASSERT_EQ(StringRef(" Aaa."), Toks[2].getText());
329
330 ASSERT_EQ(tok::newline, Toks[3].getKind());
331}
332
333TEST_F(CommentLexerTest, DoxygenCommand6) {
334 const char *Source = "/// \\aaa\\bbb \\ccc\t\\ddd\n";
335 std::vector<Token> Toks;
336
337 lexString(Source, Toks);
338
339 ASSERT_EQ(8U, Toks.size());
340
341 ASSERT_EQ(tok::text, Toks[0].getKind());
342 ASSERT_EQ(StringRef(" "), Toks[0].getText());
343
344 ASSERT_EQ(tok::command, Toks[1].getKind());
345 ASSERT_EQ(StringRef("aaa"), Toks[1].getCommandName());
346
347 ASSERT_EQ(tok::command, Toks[2].getKind());
348 ASSERT_EQ(StringRef("bbb"), Toks[2].getCommandName());
349
350 ASSERT_EQ(tok::text, Toks[3].getKind());
351 ASSERT_EQ(StringRef(" "), Toks[3].getText());
352
353 ASSERT_EQ(tok::command, Toks[4].getKind());
354 ASSERT_EQ(StringRef("ccc"), Toks[4].getCommandName());
355
356 ASSERT_EQ(tok::text, Toks[5].getKind());
357 ASSERT_EQ(StringRef("\t"), Toks[5].getText());
358
359 ASSERT_EQ(tok::command, Toks[6].getKind());
360 ASSERT_EQ(StringRef("ddd"), Toks[6].getCommandName());
361
362 ASSERT_EQ(tok::newline, Toks[7].getKind());
363}
364
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000365TEST_F(CommentLexerTest, DoxygenCommand7) {
366 const char *Source = "// \\c\n";
367 std::vector<Token> Toks;
368
369 lexString(Source, Toks);
370
371 ASSERT_EQ(3U, Toks.size());
372
373 ASSERT_EQ(tok::text, Toks[0].getKind());
374 ASSERT_EQ(StringRef(" "), Toks[0].getText());
375
376 ASSERT_EQ(tok::command, Toks[1].getKind());
377 ASSERT_EQ(StringRef("c"), Toks[1].getCommandName());
378
379 ASSERT_EQ(tok::newline, Toks[2].getKind());
380}
381
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000382// Empty verbatim block.
383TEST_F(CommentLexerTest, VerbatimBlock1) {
384 const char *Sources[] = {
385 "/// \\verbatim\\endverbatim\n//",
386 "/** \\verbatim\\endverbatim*/"
387 };
388
389 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
390 std::vector<Token> Toks;
391
392 lexString(Sources[i], Toks);
393
394 ASSERT_EQ(5U, Toks.size());
395
396 ASSERT_EQ(tok::text, Toks[0].getKind());
397 ASSERT_EQ(StringRef(" "), Toks[0].getText());
398
399 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
400 ASSERT_EQ(StringRef("verbatim"), Toks[1].getVerbatimBlockName());
401
402 ASSERT_EQ(tok::verbatim_block_end, Toks[2].getKind());
403 ASSERT_EQ(StringRef("endverbatim"), Toks[2].getVerbatimBlockName());
404
405 ASSERT_EQ(tok::newline, Toks[3].getKind());
406 ASSERT_EQ(tok::newline, Toks[4].getKind());
407 }
408}
409
410// Empty verbatim block without an end command.
411TEST_F(CommentLexerTest, VerbatimBlock2) {
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000412 const char *Source = "/// \\verbatim";
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000413
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000414 std::vector<Token> Toks;
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000415
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000416 lexString(Source, Toks);
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000417
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000418 ASSERT_EQ(3U, Toks.size());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000419
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000420 ASSERT_EQ(tok::text, Toks[0].getKind());
421 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000422
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000423 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
424 ASSERT_EQ(StringRef("verbatim"), Toks[1].getVerbatimBlockName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000425
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000426 ASSERT_EQ(tok::newline, Toks[2].getKind());
427}
428
429// Empty verbatim block without an end command.
430TEST_F(CommentLexerTest, VerbatimBlock3) {
431 const char *Source = "/** \\verbatim*/";
432
433 std::vector<Token> Toks;
434
435 lexString(Source, Toks);
436
437 ASSERT_EQ(4U, Toks.size());
438
439 ASSERT_EQ(tok::text, Toks[0].getKind());
440 ASSERT_EQ(StringRef(" "), Toks[0].getText());
441
442 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
443 ASSERT_EQ(StringRef("verbatim"), Toks[1].getVerbatimBlockName());
444
445 ASSERT_EQ(tok::newline, Toks[2].getKind());
446 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000447}
448
449// Single-line verbatim block.
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000450TEST_F(CommentLexerTest, VerbatimBlock4) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000451 const char *Sources[] = {
452 "/// Meow \\verbatim aaa \\endverbatim\n//",
453 "/** Meow \\verbatim aaa \\endverbatim*/"
454 };
455
456 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
457 std::vector<Token> Toks;
458
459 lexString(Sources[i], Toks);
460
461 ASSERT_EQ(6U, Toks.size());
462
463 ASSERT_EQ(tok::text, Toks[0].getKind());
464 ASSERT_EQ(StringRef(" Meow "), Toks[0].getText());
465
466 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
467 ASSERT_EQ(StringRef("verbatim"), Toks[1].getVerbatimBlockName());
468
469 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
470 ASSERT_EQ(StringRef(" aaa "), Toks[2].getVerbatimBlockText());
471
472 ASSERT_EQ(tok::verbatim_block_end, Toks[3].getKind());
473 ASSERT_EQ(StringRef("endverbatim"), Toks[3].getVerbatimBlockName());
474
475 ASSERT_EQ(tok::newline, Toks[4].getKind());
476 ASSERT_EQ(tok::newline, Toks[5].getKind());
477 }
478}
479
480// Single-line verbatim block without an end command.
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000481TEST_F(CommentLexerTest, VerbatimBlock5) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000482 const char *Sources[] = {
483 "/// Meow \\verbatim aaa \n//",
484 "/** Meow \\verbatim aaa */"
485 };
486
487 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
488 std::vector<Token> Toks;
489
490 lexString(Sources[i], Toks);
491
492 ASSERT_EQ(5U, Toks.size());
493
494 ASSERT_EQ(tok::text, Toks[0].getKind());
495 ASSERT_EQ(StringRef(" Meow "), Toks[0].getText());
496
497 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
498 ASSERT_EQ(StringRef("verbatim"), Toks[1].getVerbatimBlockName());
499
500 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
501 ASSERT_EQ(StringRef(" aaa "), Toks[2].getVerbatimBlockText());
502
503 ASSERT_EQ(tok::newline, Toks[3].getKind());
504 ASSERT_EQ(tok::newline, Toks[4].getKind());
505 }
506}
507
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000508TEST_F(CommentLexerTest, VerbatimBlock6) {
509 const char *Source =
510 "// \\verbatim\n"
511 "// Aaa\n"
512 "//\n"
513 "// Bbb\n"
514 "// \\endverbatim\n";
515
516 std::vector<Token> Toks;
517
518 lexString(Source, Toks);
519
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000520 ASSERT_EQ(10U, Toks.size());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000521
522 ASSERT_EQ(tok::text, Toks[0].getKind());
523 ASSERT_EQ(StringRef(" "), Toks[0].getText());
524
525 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
526 ASSERT_EQ(StringRef("verbatim"), Toks[1].getVerbatimBlockName());
527
528 ASSERT_EQ(tok::newline, Toks[2].getKind());
529
530 ASSERT_EQ(tok::verbatim_block_line, Toks[3].getKind());
531 ASSERT_EQ(StringRef(" Aaa"), Toks[3].getVerbatimBlockText());
532
533 ASSERT_EQ(tok::newline, Toks[4].getKind());
534
535 ASSERT_EQ(tok::newline, Toks[5].getKind());
536
537 ASSERT_EQ(tok::verbatim_block_line, Toks[6].getKind());
538 ASSERT_EQ(StringRef(" Bbb"), Toks[6].getVerbatimBlockText());
539
540 ASSERT_EQ(tok::newline, Toks[7].getKind());
541
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000542 ASSERT_EQ(tok::verbatim_block_end, Toks[8].getKind());
543 ASSERT_EQ(StringRef("endverbatim"), Toks[8].getVerbatimBlockName());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000544
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000545 ASSERT_EQ(tok::newline, Toks[9].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000546}
547
548TEST_F(CommentLexerTest, VerbatimBlock7) {
549 const char *Source =
550 "/* \\verbatim\n"
551 " * Aaa\n"
552 " *\n"
553 " * Bbb\n"
554 " * \\endverbatim\n"
555 " */";
556
557 std::vector<Token> Toks;
558
559 lexString(Source, Toks);
560
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000561 ASSERT_EQ(10U, Toks.size());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000562
563 ASSERT_EQ(tok::text, Toks[0].getKind());
564 ASSERT_EQ(StringRef(" "), Toks[0].getText());
565
566 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
567 ASSERT_EQ(StringRef("verbatim"), Toks[1].getVerbatimBlockName());
568
569 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
570 ASSERT_EQ(StringRef(" Aaa"), Toks[2].getVerbatimBlockText());
571
572 ASSERT_EQ(tok::verbatim_block_line, Toks[3].getKind());
573 ASSERT_EQ(StringRef(""), Toks[3].getVerbatimBlockText());
574
575 ASSERT_EQ(tok::verbatim_block_line, Toks[4].getKind());
576 ASSERT_EQ(StringRef(" Bbb"), Toks[4].getVerbatimBlockText());
577
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000578 ASSERT_EQ(tok::verbatim_block_end, Toks[5].getKind());
579 ASSERT_EQ(StringRef("endverbatim"), Toks[5].getVerbatimBlockName());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000580
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000581 ASSERT_EQ(tok::newline, Toks[6].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000582
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000583 ASSERT_EQ(tok::text, Toks[7].getKind());
584 ASSERT_EQ(StringRef(" "), Toks[7].getText());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000585
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000586 ASSERT_EQ(tok::newline, Toks[8].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000587 ASSERT_EQ(tok::newline, Toks[9].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000588}
589
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000590// Complex test for verbatim blocks.
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000591TEST_F(CommentLexerTest, VerbatimBlock8) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000592 const char *Source =
593 "/* Meow \\verbatim aaa\\$\\@\n"
594 "bbb \\endverbati\r"
595 "ccc\r\n"
596 "ddd \\endverbatim Blah \\verbatim eee\n"
597 "\\endverbatim BlahBlah*/";
598 std::vector<Token> Toks;
599
600 lexString(Source, Toks);
601
602 ASSERT_EQ(14U, Toks.size());
603
604 ASSERT_EQ(tok::text, Toks[0].getKind());
605 ASSERT_EQ(StringRef(" Meow "), Toks[0].getText());
606
607 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
608 ASSERT_EQ(StringRef("verbatim"), Toks[1].getVerbatimBlockName());
609
610 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000611 ASSERT_EQ(StringRef(" aaa\\$\\@"), Toks[2].getVerbatimBlockText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000612
613 ASSERT_EQ(tok::verbatim_block_line, Toks[3].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000614 ASSERT_EQ(StringRef("bbb \\endverbati"), Toks[3].getVerbatimBlockText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000615
616 ASSERT_EQ(tok::verbatim_block_line, Toks[4].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000617 ASSERT_EQ(StringRef("ccc"), Toks[4].getVerbatimBlockText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000618
619 ASSERT_EQ(tok::verbatim_block_line, Toks[5].getKind());
620 ASSERT_EQ(StringRef("ddd "), Toks[5].getVerbatimBlockText());
621
622 ASSERT_EQ(tok::verbatim_block_end, Toks[6].getKind());
623 ASSERT_EQ(StringRef("endverbatim"), Toks[6].getVerbatimBlockName());
624
625 ASSERT_EQ(tok::text, Toks[7].getKind());
626 ASSERT_EQ(StringRef(" Blah "), Toks[7].getText());
627
628 ASSERT_EQ(tok::verbatim_block_begin, Toks[8].getKind());
629 ASSERT_EQ(StringRef("verbatim"), Toks[8].getVerbatimBlockName());
630
631 ASSERT_EQ(tok::verbatim_block_line, Toks[9].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000632 ASSERT_EQ(StringRef(" eee"), Toks[9].getVerbatimBlockText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000633
634 ASSERT_EQ(tok::verbatim_block_end, Toks[10].getKind());
635 ASSERT_EQ(StringRef("endverbatim"), Toks[10].getVerbatimBlockName());
636
637 ASSERT_EQ(tok::text, Toks[11].getKind());
638 ASSERT_EQ(StringRef(" BlahBlah"), Toks[11].getText());
639
640 ASSERT_EQ(tok::newline, Toks[12].getKind());
641 ASSERT_EQ(tok::newline, Toks[13].getKind());
642}
643
644// LaTeX verbatim blocks.
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000645TEST_F(CommentLexerTest, VerbatimBlock9) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000646 const char *Source =
647 "/// \\f$ Aaa \\f$ \\f[ Bbb \\f] \\f{ Ccc \\f}";
648 std::vector<Token> Toks;
649
650 lexString(Source, Toks);
651
652 ASSERT_EQ(13U, Toks.size());
653
654 ASSERT_EQ(tok::text, Toks[0].getKind());
655 ASSERT_EQ(StringRef(" "), Toks[0].getText());
656
657 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
658 ASSERT_EQ(StringRef("f$"), Toks[1].getVerbatimBlockName());
659
660 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
661 ASSERT_EQ(StringRef(" Aaa "), Toks[2].getVerbatimBlockText());
662
663 ASSERT_EQ(tok::verbatim_block_end, Toks[3].getKind());
664 ASSERT_EQ(StringRef("f$"), Toks[3].getVerbatimBlockName());
665
666 ASSERT_EQ(tok::text, Toks[4].getKind());
667 ASSERT_EQ(StringRef(" "), Toks[4].getText());
668
669 ASSERT_EQ(tok::verbatim_block_begin, Toks[5].getKind());
670 ASSERT_EQ(StringRef("f["), Toks[5].getVerbatimBlockName());
671
672 ASSERT_EQ(tok::verbatim_block_line, Toks[6].getKind());
673 ASSERT_EQ(StringRef(" Bbb "), Toks[6].getVerbatimBlockText());
674
675 ASSERT_EQ(tok::verbatim_block_end, Toks[7].getKind());
676 ASSERT_EQ(StringRef("f]"), Toks[7].getVerbatimBlockName());
677
678 ASSERT_EQ(tok::text, Toks[8].getKind());
679 ASSERT_EQ(StringRef(" "), Toks[8].getText());
680
681 ASSERT_EQ(tok::verbatim_block_begin, Toks[9].getKind());
682 ASSERT_EQ(StringRef("f{"), Toks[9].getVerbatimBlockName());
683
684 ASSERT_EQ(tok::verbatim_block_line, Toks[10].getKind());
685 ASSERT_EQ(StringRef(" Ccc "), Toks[10].getVerbatimBlockText());
686
687 ASSERT_EQ(tok::verbatim_block_end, Toks[11].getKind());
688 ASSERT_EQ(StringRef("f}"), Toks[11].getVerbatimBlockName());
689
690 ASSERT_EQ(tok::newline, Toks[12].getKind());
691}
692
693// Empty verbatim line.
694TEST_F(CommentLexerTest, VerbatimLine1) {
695 const char *Sources[] = {
696 "/// \\fn\n//",
697 "/** \\fn*/"
698 };
699
700 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
701 std::vector<Token> Toks;
702
703 lexString(Sources[i], Toks);
704
705 ASSERT_EQ(4U, Toks.size());
706
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000707 ASSERT_EQ(tok::text, Toks[0].getKind());
708 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000709
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000710 ASSERT_EQ(tok::verbatim_line_name, Toks[1].getKind());
711 ASSERT_EQ(StringRef("fn"), Toks[1].getVerbatimLineName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000712
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000713 ASSERT_EQ(tok::newline, Toks[2].getKind());
714 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000715 }
716}
717
718// Verbatim line with Doxygen escape sequences, which should not be expanded.
719TEST_F(CommentLexerTest, VerbatimLine2) {
720 const char *Sources[] = {
721 "/// \\fn void *foo(const char *zzz = \"\\$\");\n//",
722 "/** \\fn void *foo(const char *zzz = \"\\$\");*/"
723 };
724
725 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
726 std::vector<Token> Toks;
727
728 lexString(Sources[i], Toks);
729
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000730 ASSERT_EQ(5U, Toks.size());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000731
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000732 ASSERT_EQ(tok::text, Toks[0].getKind());
733 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000734
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000735 ASSERT_EQ(tok::verbatim_line_name, Toks[1].getKind());
736 ASSERT_EQ(StringRef("fn"), Toks[1].getVerbatimLineName());
737
738 ASSERT_EQ(tok::verbatim_line_text, Toks[2].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000739 ASSERT_EQ(StringRef(" void *foo(const char *zzz = \"\\$\");"),
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000740 Toks[2].getVerbatimLineText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000741
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000742 ASSERT_EQ(tok::newline, Toks[3].getKind());
743 ASSERT_EQ(tok::newline, Toks[4].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000744 }
745}
746
747// Verbatim line should not eat anything from next source line.
748TEST_F(CommentLexerTest, VerbatimLine3) {
749 const char *Source =
750 "/** \\fn void *foo(const char *zzz = \"\\$\");\n"
751 " * Meow\n"
752 " */";
753
754 std::vector<Token> Toks;
755
756 lexString(Source, Toks);
757
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000758 ASSERT_EQ(9U, Toks.size());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000759
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000760 ASSERT_EQ(tok::text, Toks[0].getKind());
761 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000762
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000763 ASSERT_EQ(tok::verbatim_line_name, Toks[1].getKind());
764 ASSERT_EQ(StringRef("fn"), Toks[1].getVerbatimLineName());
765
766 ASSERT_EQ(tok::verbatim_line_text, Toks[2].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000767 ASSERT_EQ(StringRef(" void *foo(const char *zzz = \"\\$\");"),
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000768 Toks[2].getVerbatimLineText());
769 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000770
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000771 ASSERT_EQ(tok::text, Toks[4].getKind());
772 ASSERT_EQ(StringRef(" Meow"), Toks[4].getText());
773 ASSERT_EQ(tok::newline, Toks[5].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000774
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000775 ASSERT_EQ(tok::text, Toks[6].getKind());
776 ASSERT_EQ(StringRef(" "), Toks[6].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000777
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000778 ASSERT_EQ(tok::newline, Toks[7].getKind());
779 ASSERT_EQ(tok::newline, Toks[8].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000780}
781
782TEST_F(CommentLexerTest, HTML1) {
783 const char *Source =
784 "// <";
785
786 std::vector<Token> Toks;
787
788 lexString(Source, Toks);
789
790 ASSERT_EQ(3U, Toks.size());
791
792 ASSERT_EQ(tok::text, Toks[0].getKind());
793 ASSERT_EQ(StringRef(" "), Toks[0].getText());
794
795 ASSERT_EQ(tok::text, Toks[1].getKind());
796 ASSERT_EQ(StringRef("<"), Toks[1].getText());
797
798 ASSERT_EQ(tok::newline, Toks[2].getKind());
799}
800
801TEST_F(CommentLexerTest, HTML2) {
Dmitri Gribenko5676d322012-06-27 23:28:29 +0000802 const char *Source =
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000803 "// a<2";
804
805 std::vector<Token> Toks;
806
807 lexString(Source, Toks);
808
809 ASSERT_EQ(4U, Toks.size());
810
811 ASSERT_EQ(tok::text, Toks[0].getKind());
812 ASSERT_EQ(StringRef(" a"), Toks[0].getText());
813
814 ASSERT_EQ(tok::text, Toks[1].getKind());
815 ASSERT_EQ(StringRef("<"), Toks[1].getText());
816
817 ASSERT_EQ(tok::text, Toks[2].getKind());
818 ASSERT_EQ(StringRef("2"), Toks[2].getText());
819
820 ASSERT_EQ(tok::newline, Toks[3].getKind());
821}
822
823TEST_F(CommentLexerTest, HTML3) {
824 const char *Source =
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000825 "// < img";
Dmitri Gribenko5676d322012-06-27 23:28:29 +0000826
827 std::vector<Token> Toks;
828
829 lexString(Source, Toks);
830
831 ASSERT_EQ(4U, Toks.size());
832
833 ASSERT_EQ(tok::text, Toks[0].getKind());
834 ASSERT_EQ(StringRef(" "), Toks[0].getText());
835
836 ASSERT_EQ(tok::text, Toks[1].getKind());
837 ASSERT_EQ(StringRef("<"), Toks[1].getText());
838
839 ASSERT_EQ(tok::text, Toks[2].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000840 ASSERT_EQ(StringRef(" img"), Toks[2].getText());
Dmitri Gribenko5676d322012-06-27 23:28:29 +0000841
842 ASSERT_EQ(tok::newline, Toks[3].getKind());
843}
844
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000845TEST_F(CommentLexerTest, HTML4) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000846 const char *Sources[] = {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000847 "// <img",
848 "// <img "
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000849 };
850
851 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
852 std::vector<Token> Toks;
853
854 lexString(Sources[i], Toks);
855
856 ASSERT_EQ(3U, Toks.size());
857
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000858 ASSERT_EQ(tok::text, Toks[0].getKind());
859 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000860
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000861 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000862 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000863
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000864 ASSERT_EQ(tok::newline, Toks[2].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000865 }
866}
867
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000868TEST_F(CommentLexerTest, HTML5) {
869 const char *Source =
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000870 "// <img 42";
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000871
872 std::vector<Token> Toks;
873
874 lexString(Source, Toks);
875
876 ASSERT_EQ(4U, Toks.size());
877
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000878 ASSERT_EQ(tok::text, Toks[0].getKind());
879 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000880
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000881 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000882 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000883
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000884 ASSERT_EQ(tok::text, Toks[2].getKind());
885 ASSERT_EQ(StringRef("42"), Toks[2].getText());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000886
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000887 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000888}
889
890TEST_F(CommentLexerTest, HTML6) {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000891 const char *Source = "// <img> Meow";
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000892
893 std::vector<Token> Toks;
894
895 lexString(Source, Toks);
896
897 ASSERT_EQ(5U, Toks.size());
898
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000899 ASSERT_EQ(tok::text, Toks[0].getKind());
900 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000901
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000902 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000903 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000904
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000905 ASSERT_EQ(tok::html_greater, Toks[2].getKind());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000906
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000907 ASSERT_EQ(tok::text, Toks[3].getKind());
908 ASSERT_EQ(StringRef(" Meow"), Toks[3].getText());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000909
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000910 ASSERT_EQ(tok::newline, Toks[4].getKind());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000911}
912
913TEST_F(CommentLexerTest, HTML7) {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000914 const char *Source = "// <img=";
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000915
916 std::vector<Token> Toks;
917
918 lexString(Source, Toks);
919
920 ASSERT_EQ(4U, Toks.size());
921
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000922 ASSERT_EQ(tok::text, Toks[0].getKind());
923 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000924
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000925 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000926 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000927
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000928 ASSERT_EQ(tok::text, Toks[2].getKind());
929 ASSERT_EQ(StringRef("="), Toks[2].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000930
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000931 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000932}
933
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000934TEST_F(CommentLexerTest, HTML8) {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000935 const char *Source = "// <img src=> Meow";
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000936
937 std::vector<Token> Toks;
938
939 lexString(Source, Toks);
940
941 ASSERT_EQ(7U, Toks.size());
942
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000943 ASSERT_EQ(tok::text, Toks[0].getKind());
944 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000945
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000946 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000947 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000948
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000949 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000950 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000951
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000952 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000953
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000954 ASSERT_EQ(tok::html_greater, Toks[4].getKind());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000955
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000956 ASSERT_EQ(tok::text, Toks[5].getKind());
957 ASSERT_EQ(StringRef(" Meow"), Toks[5].getText());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000958
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000959 ASSERT_EQ(tok::newline, Toks[6].getKind());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000960}
961
962TEST_F(CommentLexerTest, HTML9) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000963 const char *Sources[] = {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000964 "// <img src",
965 "// <img src "
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000966 };
967
968 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
969 std::vector<Token> Toks;
970
971 lexString(Sources[i], Toks);
972
973 ASSERT_EQ(4U, Toks.size());
974
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000975 ASSERT_EQ(tok::text, Toks[0].getKind());
976 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000977
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000978 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000979 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000980
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000981 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000982 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000983
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000984 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000985 }
986}
987
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000988TEST_F(CommentLexerTest, HTML10) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000989 const char *Sources[] = {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000990 "// <img src=",
991 "// <img src ="
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000992 };
993
994 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
995 std::vector<Token> Toks;
996
997 lexString(Sources[i], Toks);
998
999 ASSERT_EQ(5U, Toks.size());
1000
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001001 ASSERT_EQ(tok::text, Toks[0].getKind());
1002 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001003
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001004 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001005 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001006
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001007 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001008 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001009
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001010 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001011
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001012 ASSERT_EQ(tok::newline, Toks[4].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001013 }
1014}
1015
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001016TEST_F(CommentLexerTest, HTML11) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001017 const char *Sources[] = {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001018 "// <img src=\"",
1019 "// <img src = \"",
1020 "// <img src=\'",
1021 "// <img src = \'"
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001022 };
1023
1024 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1025 std::vector<Token> Toks;
1026
1027 lexString(Sources[i], Toks);
1028
1029 ASSERT_EQ(6U, Toks.size());
1030
1031 ASSERT_EQ(tok::text, Toks[0].getKind());
1032 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1033
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001034 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001035 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001036
1037 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001038 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001039
1040 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
1041
1042 ASSERT_EQ(tok::html_quoted_string, Toks[4].getKind());
1043 ASSERT_EQ(StringRef(""), Toks[4].getHTMLQuotedString());
1044
1045 ASSERT_EQ(tok::newline, Toks[5].getKind());
1046 }
1047}
1048
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001049TEST_F(CommentLexerTest, HTML12) {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001050 const char *Source = "// <img src=@";
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001051
1052 std::vector<Token> Toks;
1053
1054 lexString(Source, Toks);
1055
1056 ASSERT_EQ(6U, Toks.size());
1057
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001058 ASSERT_EQ(tok::text, Toks[0].getKind());
1059 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001060
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001061 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001062 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001063
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001064 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001065 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001066
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001067 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001068
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001069 ASSERT_EQ(tok::text, Toks[4].getKind());
1070 ASSERT_EQ(StringRef("@"), Toks[4].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001071
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001072 ASSERT_EQ(tok::newline, Toks[5].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001073}
1074
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001075TEST_F(CommentLexerTest, HTML13) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001076 const char *Sources[] = {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001077 "// <img src=\"val\\\"\\'val",
1078 "// <img src=\"val\\\"\\'val\"",
1079 "// <img src=\'val\\\"\\'val",
1080 "// <img src=\'val\\\"\\'val\'"
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001081 };
1082
1083 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1084 std::vector<Token> Toks;
1085
1086 lexString(Sources[i], Toks);
1087
1088 ASSERT_EQ(6U, Toks.size());
1089
1090 ASSERT_EQ(tok::text, Toks[0].getKind());
1091 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1092
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001093 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001094 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001095
1096 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001097 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001098
1099 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
1100
1101 ASSERT_EQ(tok::html_quoted_string, Toks[4].getKind());
1102 ASSERT_EQ(StringRef("val\\\"\\'val"), Toks[4].getHTMLQuotedString());
1103
1104 ASSERT_EQ(tok::newline, Toks[5].getKind());
1105 }
1106}
1107
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001108TEST_F(CommentLexerTest, HTML14) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001109 const char *Sources[] = {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001110 "// <img src=\"val\\\"\\'val\">",
1111 "// <img src=\'val\\\"\\'val\'>"
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001112 };
1113
1114 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1115 std::vector<Token> Toks;
1116
1117 lexString(Sources[i], Toks);
1118
1119 ASSERT_EQ(7U, Toks.size());
1120
1121 ASSERT_EQ(tok::text, Toks[0].getKind());
1122 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1123
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001124 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001125 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001126
1127 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001128 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001129
1130 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
1131
1132 ASSERT_EQ(tok::html_quoted_string, Toks[4].getKind());
1133 ASSERT_EQ(StringRef("val\\\"\\'val"), Toks[4].getHTMLQuotedString());
1134
1135 ASSERT_EQ(tok::html_greater, Toks[5].getKind());
1136
1137 ASSERT_EQ(tok::newline, Toks[6].getKind());
1138 }
1139}
1140
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001141TEST_F(CommentLexerTest, HTML15) {
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001142 const char *Sources[] = {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001143 "// <img/>",
1144 "// <img />"
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001145 };
1146
1147 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1148 std::vector<Token> Toks;
1149
1150 lexString(Sources[i], Toks);
1151
1152 ASSERT_EQ(4U, Toks.size());
1153
1154 ASSERT_EQ(tok::text, Toks[0].getKind());
1155 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1156
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001157 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001158 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001159
1160 ASSERT_EQ(tok::html_slash_greater, Toks[2].getKind());
1161
1162 ASSERT_EQ(tok::newline, Toks[3].getKind());
1163 }
1164}
1165
1166TEST_F(CommentLexerTest, HTML16) {
1167 const char *Sources[] = {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001168 "// <img/ Aaa",
1169 "// <img / Aaa"
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001170 };
1171
1172 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1173 std::vector<Token> Toks;
1174
1175 lexString(Sources[i], Toks);
1176
1177 ASSERT_EQ(5U, Toks.size());
1178
1179 ASSERT_EQ(tok::text, Toks[0].getKind());
1180 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1181
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001182 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001183 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001184
1185 ASSERT_EQ(tok::text, Toks[2].getKind());
1186 ASSERT_EQ(StringRef("/"), Toks[2].getText());
1187
1188 ASSERT_EQ(tok::text, Toks[3].getKind());
1189 ASSERT_EQ(StringRef(" Aaa"), Toks[3].getText());
1190
1191 ASSERT_EQ(tok::newline, Toks[4].getKind());
1192 }
1193}
1194
1195TEST_F(CommentLexerTest, HTML17) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001196 const char *Source = "// </";
1197
1198 std::vector<Token> Toks;
1199
1200 lexString(Source, Toks);
1201
1202 ASSERT_EQ(3U, Toks.size());
1203
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001204 ASSERT_EQ(tok::text, Toks[0].getKind());
1205 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001206
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001207 ASSERT_EQ(tok::text, Toks[1].getKind());
1208 ASSERT_EQ(StringRef("</"), Toks[1].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001209
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001210 ASSERT_EQ(tok::newline, Toks[2].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001211}
1212
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001213TEST_F(CommentLexerTest, HTML18) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001214 const char *Source = "// </@";
1215
1216 std::vector<Token> Toks;
1217
1218 lexString(Source, Toks);
1219
1220 ASSERT_EQ(4U, Toks.size());
1221
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001222 ASSERT_EQ(tok::text, Toks[0].getKind());
1223 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001224
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001225 ASSERT_EQ(tok::text, Toks[1].getKind());
1226 ASSERT_EQ(StringRef("</"), Toks[1].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001227
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001228 ASSERT_EQ(tok::text, Toks[2].getKind());
1229 ASSERT_EQ(StringRef("@"), Toks[2].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001230
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001231 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001232}
1233
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001234TEST_F(CommentLexerTest, HTML19) {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001235 const char *Source = "// </img";
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +00001236
1237 std::vector<Token> Toks;
1238
1239 lexString(Source, Toks);
1240
1241 ASSERT_EQ(3U, Toks.size());
1242
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001243 ASSERT_EQ(tok::text, Toks[0].getKind());
1244 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +00001245
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001246 ASSERT_EQ(tok::html_end_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001247 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagEndName());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +00001248
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001249 ASSERT_EQ(tok::newline, Toks[2].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +00001250}
1251
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001252TEST_F(CommentLexerTest, NotAKnownHTMLTag1) {
1253 const char *Source = "// <tag>";
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001254
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001255 std::vector<Token> Toks;
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001256
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001257 lexString(Source, Toks);
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001258
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001259 ASSERT_EQ(4U, Toks.size());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001260
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001261 ASSERT_EQ(tok::text, Toks[0].getKind());
1262 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001263
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001264 ASSERT_EQ(tok::text, Toks[1].getKind());
1265 ASSERT_EQ(StringRef("<tag"), Toks[1].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001266
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001267 ASSERT_EQ(tok::text, Toks[2].getKind());
1268 ASSERT_EQ(StringRef(">"), Toks[2].getText());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +00001269
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001270 ASSERT_EQ(tok::newline, Toks[3].getKind());
1271}
1272
1273TEST_F(CommentLexerTest, NotAKnownHTMLTag2) {
1274 const char *Source = "// </tag>";
1275
1276 std::vector<Token> Toks;
1277
1278 lexString(Source, Toks);
1279
1280 ASSERT_EQ(4U, Toks.size());
1281
1282 ASSERT_EQ(tok::text, Toks[0].getKind());
1283 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1284
1285 ASSERT_EQ(tok::text, Toks[1].getKind());
1286 ASSERT_EQ(StringRef("</tag"), Toks[1].getText());
1287
1288 ASSERT_EQ(tok::text, Toks[2].getKind());
1289 ASSERT_EQ(StringRef(">"), Toks[2].getText());
1290
1291 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001292}
1293
Dmitri Gribenko477a9f52012-07-27 20:37:06 +00001294TEST_F(CommentLexerTest, HTMLCharacterReferences1) {
1295 const char *Source = "// &";
1296
1297 std::vector<Token> Toks;
1298
1299 lexString(Source, Toks);
1300
1301 ASSERT_EQ(3U, 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::newline, Toks[2].getKind());
1310}
1311
1312TEST_F(CommentLexerTest, HTMLCharacterReferences2) {
1313 const char *Source = "// &!";
1314
1315 std::vector<Token> Toks;
1316
1317 lexString(Source, Toks);
1318
1319 ASSERT_EQ(4U, Toks.size());
1320
1321 ASSERT_EQ(tok::text, Toks[0].getKind());
1322 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1323
1324 ASSERT_EQ(tok::text, Toks[1].getKind());
1325 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1326
1327 ASSERT_EQ(tok::text, Toks[2].getKind());
1328 ASSERT_EQ(StringRef("!"), Toks[2].getText());
1329
1330 ASSERT_EQ(tok::newline, Toks[3].getKind());
1331}
1332
1333TEST_F(CommentLexerTest, HTMLCharacterReferences3) {
1334 const char *Source = "// &amp";
1335
1336 std::vector<Token> Toks;
1337
1338 lexString(Source, Toks);
1339
1340 ASSERT_EQ(3U, 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::newline, Toks[2].getKind());
1349}
1350
1351TEST_F(CommentLexerTest, HTMLCharacterReferences4) {
1352 const char *Source = "// &amp!";
1353
1354 std::vector<Token> Toks;
1355
1356 lexString(Source, Toks);
1357
1358 ASSERT_EQ(4U, Toks.size());
1359
1360 ASSERT_EQ(tok::text, Toks[0].getKind());
1361 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1362
1363 ASSERT_EQ(tok::text, Toks[1].getKind());
1364 ASSERT_EQ(StringRef("&amp"), Toks[1].getText());
1365
1366 ASSERT_EQ(tok::text, Toks[2].getKind());
1367 ASSERT_EQ(StringRef("!"), Toks[2].getText());
1368
1369 ASSERT_EQ(tok::newline, Toks[3].getKind());
1370}
1371
1372TEST_F(CommentLexerTest, HTMLCharacterReferences5) {
1373 const char *Source = "// &#";
1374
1375 std::vector<Token> Toks;
1376
1377 lexString(Source, Toks);
1378
1379 ASSERT_EQ(3U, 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::newline, Toks[2].getKind());
1388}
1389
1390TEST_F(CommentLexerTest, HTMLCharacterReferences6) {
1391 const char *Source = "// &#a";
1392
1393 std::vector<Token> Toks;
1394
1395 lexString(Source, Toks);
1396
1397 ASSERT_EQ(4U, Toks.size());
1398
1399 ASSERT_EQ(tok::text, Toks[0].getKind());
1400 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1401
1402 ASSERT_EQ(tok::text, Toks[1].getKind());
1403 ASSERT_EQ(StringRef("&#"), Toks[1].getText());
1404
1405 ASSERT_EQ(tok::text, Toks[2].getKind());
1406 ASSERT_EQ(StringRef("a"), Toks[2].getText());
1407
1408 ASSERT_EQ(tok::newline, Toks[3].getKind());
1409}
1410
1411TEST_F(CommentLexerTest, HTMLCharacterReferences7) {
1412 const char *Source = "// &#42";
1413
1414 std::vector<Token> Toks;
1415
1416 lexString(Source, Toks);
1417
1418 ASSERT_EQ(3U, 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::newline, Toks[2].getKind());
1427}
1428
1429TEST_F(CommentLexerTest, HTMLCharacterReferences8) {
1430 const char *Source = "// &#42a";
1431
1432 std::vector<Token> Toks;
1433
1434 lexString(Source, Toks);
1435
1436 ASSERT_EQ(4U, Toks.size());
1437
1438 ASSERT_EQ(tok::text, Toks[0].getKind());
1439 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1440
1441 ASSERT_EQ(tok::text, Toks[1].getKind());
1442 ASSERT_EQ(StringRef("&#42"), Toks[1].getText());
1443
1444 ASSERT_EQ(tok::text, Toks[2].getKind());
1445 ASSERT_EQ(StringRef("a"), Toks[2].getText());
1446
1447 ASSERT_EQ(tok::newline, Toks[3].getKind());
1448}
1449
1450TEST_F(CommentLexerTest, HTMLCharacterReferences9) {
1451 const char *Source = "// &#x";
1452
1453 std::vector<Token> Toks;
1454
1455 lexString(Source, Toks);
1456
1457 ASSERT_EQ(3U, 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::newline, Toks[2].getKind());
1466}
1467
1468TEST_F(CommentLexerTest, HTMLCharacterReferences10) {
1469 const char *Source = "// &#xz";
1470
1471 std::vector<Token> Toks;
1472
1473 lexString(Source, Toks);
1474
1475 ASSERT_EQ(4U, Toks.size());
1476
1477 ASSERT_EQ(tok::text, Toks[0].getKind());
1478 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1479
1480 ASSERT_EQ(tok::text, Toks[1].getKind());
1481 ASSERT_EQ(StringRef("&#x"), Toks[1].getText());
1482
1483 ASSERT_EQ(tok::text, Toks[2].getKind());
1484 ASSERT_EQ(StringRef("z"), Toks[2].getText());
1485
1486 ASSERT_EQ(tok::newline, Toks[3].getKind());
1487}
1488
1489TEST_F(CommentLexerTest, HTMLCharacterReferences11) {
1490 const char *Source = "// &#xab";
1491
1492 std::vector<Token> Toks;
1493
1494 lexString(Source, Toks);
1495
1496 ASSERT_EQ(3U, 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::newline, Toks[2].getKind());
1505}
1506
1507TEST_F(CommentLexerTest, HTMLCharacterReferences12) {
1508 const char *Source = "// &#xaBz";
1509
1510 std::vector<Token> Toks;
1511
1512 lexString(Source, Toks);
1513
1514 ASSERT_EQ(4U, Toks.size());
1515
1516 ASSERT_EQ(tok::text, Toks[0].getKind());
1517 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1518
1519 ASSERT_EQ(tok::text, Toks[1].getKind());
1520 ASSERT_EQ(StringRef("&#xaB"), Toks[1].getText());
1521
1522 ASSERT_EQ(tok::text, Toks[2].getKind());
1523 ASSERT_EQ(StringRef("z"), Toks[2].getText());
1524
1525 ASSERT_EQ(tok::newline, Toks[3].getKind());
1526}
1527
1528TEST_F(CommentLexerTest, HTMLCharacterReferences13) {
1529 const char *Source = "// &amp;";
1530
1531 std::vector<Token> Toks;
1532
1533 lexString(Source, Toks);
1534
1535 ASSERT_EQ(3U, 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::newline, Toks[2].getKind());
1544}
1545
1546TEST_F(CommentLexerTest, HTMLCharacterReferences14) {
1547 const char *Source = "// &amp;&lt;";
1548
1549 std::vector<Token> Toks;
1550
1551 lexString(Source, Toks);
1552
1553 ASSERT_EQ(4U, Toks.size());
1554
1555 ASSERT_EQ(tok::text, Toks[0].getKind());
1556 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1557
1558 ASSERT_EQ(tok::text, Toks[1].getKind());
1559 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1560
1561 ASSERT_EQ(tok::text, Toks[2].getKind());
1562 ASSERT_EQ(StringRef("<"), Toks[2].getText());
1563
1564 ASSERT_EQ(tok::newline, Toks[3].getKind());
1565}
1566
1567TEST_F(CommentLexerTest, HTMLCharacterReferences15) {
1568 const char *Source = "// &amp; meow";
1569
1570 std::vector<Token> Toks;
1571
1572 lexString(Source, Toks);
1573
1574 ASSERT_EQ(4U, Toks.size());
1575
1576 ASSERT_EQ(tok::text, Toks[0].getKind());
1577 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1578
1579 ASSERT_EQ(tok::text, Toks[1].getKind());
1580 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1581
1582 ASSERT_EQ(tok::text, Toks[2].getKind());
1583 ASSERT_EQ(StringRef(" meow"), Toks[2].getText());
1584
1585 ASSERT_EQ(tok::newline, Toks[3].getKind());
1586}
1587
1588TEST_F(CommentLexerTest, HTMLCharacterReferences16) {
1589 const char *Sources[] = {
1590 "// &#61;",
1591 "// &#x3d;",
1592 "// &#X3d;"
1593 };
1594
1595 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1596 std::vector<Token> Toks;
1597
1598 lexString(Sources[i], Toks);
1599
1600 ASSERT_EQ(3U, Toks.size());
1601
1602 ASSERT_EQ(tok::text, Toks[0].getKind());
1603 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1604
1605 ASSERT_EQ(tok::text, Toks[1].getKind());
1606 ASSERT_EQ(StringRef("="), Toks[1].getText());
1607
1608 ASSERT_EQ(tok::newline, Toks[2].getKind());
1609 }
1610}
1611
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001612TEST_F(CommentLexerTest, MultipleComments) {
1613 const char *Source =
1614 "// Aaa\n"
1615 "/// Bbb\n"
1616 "/* Ccc\n"
1617 " * Ddd*/\n"
1618 "/** Eee*/";
1619
1620 std::vector<Token> Toks;
1621
1622 lexString(Source, Toks);
1623
1624 ASSERT_EQ(12U, Toks.size());
1625
1626 ASSERT_EQ(tok::text, Toks[0].getKind());
1627 ASSERT_EQ(StringRef(" Aaa"), Toks[0].getText());
1628 ASSERT_EQ(tok::newline, Toks[1].getKind());
1629
1630 ASSERT_EQ(tok::text, Toks[2].getKind());
1631 ASSERT_EQ(StringRef(" Bbb"), Toks[2].getText());
1632 ASSERT_EQ(tok::newline, Toks[3].getKind());
1633
1634 ASSERT_EQ(tok::text, Toks[4].getKind());
1635 ASSERT_EQ(StringRef(" Ccc"), Toks[4].getText());
1636 ASSERT_EQ(tok::newline, Toks[5].getKind());
1637
1638 ASSERT_EQ(tok::text, Toks[6].getKind());
1639 ASSERT_EQ(StringRef(" Ddd"), Toks[6].getText());
1640 ASSERT_EQ(tok::newline, Toks[7].getKind());
1641 ASSERT_EQ(tok::newline, Toks[8].getKind());
1642
1643 ASSERT_EQ(tok::text, Toks[9].getKind());
1644 ASSERT_EQ(StringRef(" Eee"), Toks[9].getText());
1645
1646 ASSERT_EQ(tok::newline, Toks[10].getKind());
1647 ASSERT_EQ(tok::newline, Toks[11].getKind());
1648}
1649
1650} // end namespace comments
1651} // end namespace clang
1652