blob: cab0fdddbc2fb7f605ff9f23b8dd4887cf6d5db3 [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 Gribenko5676d322012-06-27 23:28:29 +0000825 "// < tag";
826
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());
840 ASSERT_EQ(StringRef(" tag"), Toks[2].getText());
841
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[] = {
847 "// <tag",
848 "// <tag "
849 };
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());
862 ASSERT_EQ(StringRef("tag"), 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 =
870 "// <tag 42";
871
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());
882 ASSERT_EQ(StringRef("tag"), 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) {
891 const char *Source = "// <tag> Meow";
892
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());
903 ASSERT_EQ(StringRef("tag"), 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 Gribenko2d44d772012-06-26 20:39:18 +0000914 const char *Source = "// <tag=";
915
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());
926 ASSERT_EQ(StringRef("tag"), 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) {
935 const char *Source = "// <tag attr=> Meow";
936
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());
947 ASSERT_EQ(StringRef("tag"), 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());
950 ASSERT_EQ(StringRef("attr"), 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[] = {
964 "// <tag attr",
965 "// <tag attr "
966 };
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());
979 ASSERT_EQ(StringRef("tag"), 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());
982 ASSERT_EQ(StringRef("attr"), 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[] = {
990 "// <tag attr=",
991 "// <tag attr ="
992 };
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());
1005 ASSERT_EQ(StringRef("tag"), 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());
1008 ASSERT_EQ(StringRef("attr"), 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[] = {
1018 "// <tag attr=\"",
1019 "// <tag attr = \"",
1020 "// <tag attr=\'",
1021 "// <tag attr = \'"
1022 };
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());
1035 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001036
1037 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
1038 ASSERT_EQ(StringRef("attr"), Toks[2].getHTMLIdent());
1039
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 Gribenko2d44d772012-06-26 20:39:18 +00001050 const char *Source = "// <tag attr=@";
1051
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());
1062 ASSERT_EQ(StringRef("tag"), 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());
1065 ASSERT_EQ(StringRef("attr"), 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[] = {
1077 "// <tag attr=\"val\\\"\\'val",
1078 "// <tag attr=\"val\\\"\\'val\"",
1079 "// <tag attr=\'val\\\"\\'val",
1080 "// <tag attr=\'val\\\"\\'val\'"
1081 };
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());
1094 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001095
1096 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
1097 ASSERT_EQ(StringRef("attr"), Toks[2].getHTMLIdent());
1098
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[] = {
1110 "// <tag attr=\"val\\\"\\'val\">",
1111 "// <tag attr=\'val\\\"\\'val\'>"
1112 };
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());
1125 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001126
1127 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
1128 ASSERT_EQ(StringRef("attr"), Toks[2].getHTMLIdent());
1129
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[] = {
1143 "// <tag/>",
1144 "// <tag />"
1145 };
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());
1158 ASSERT_EQ(StringRef("tag"), 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[] = {
1168 "// <tag/ Aaa",
1169 "// <tag / Aaa"
1170 };
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());
1183 ASSERT_EQ(StringRef("tag"), 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 Gribenko3f38bf22012-07-13 00:44:24 +00001204 ASSERT_EQ(tok::text, Toks[0].getKind());
1205 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001206
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001207 ASSERT_EQ(tok::html_end_tag, Toks[1].getKind());
1208 ASSERT_EQ(StringRef(""), Toks[1].getHTMLTagEndName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001209
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +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 Gribenko3f38bf22012-07-13 00:44:24 +00001222 ASSERT_EQ(tok::text, Toks[0].getKind());
1223 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001224
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001225 ASSERT_EQ(tok::html_end_tag, Toks[1].getKind());
1226 ASSERT_EQ(StringRef(""), Toks[1].getHTMLTagEndName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001227
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001228 ASSERT_EQ(tok::text, Toks[2].getKind());
1229 ASSERT_EQ(StringRef("@"), Toks[2].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001230
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +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 Gribenko8d3ba232012-07-06 00:28:32 +00001235 const char *Source = "// </tag";
1236
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());
1247 ASSERT_EQ(StringRef("tag"), 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 Gribenkoa5ef44f2012-07-11 21:38:39 +00001252TEST_F(CommentLexerTest, HTML20) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001253 const char *Sources[] = {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001254 "// </tag>",
1255 "// </ tag>",
1256 "// </ tag >"
1257 };
1258
1259 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1260 std::vector<Token> Toks;
1261
1262 lexString(Sources[i], Toks);
1263
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +00001264 ASSERT_EQ(4U, Toks.size());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001265
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001266 ASSERT_EQ(tok::text, Toks[0].getKind());
1267 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001268
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001269 ASSERT_EQ(tok::html_end_tag, Toks[1].getKind());
1270 ASSERT_EQ(StringRef("tag"), Toks[1].getHTMLTagEndName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001271
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001272 ASSERT_EQ(tok::html_greater, Toks[2].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +00001273
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001274 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001275 }
1276}
1277
Dmitri Gribenko477a9f52012-07-27 20:37:06 +00001278TEST_F(CommentLexerTest, HTMLCharacterReferences1) {
1279 const char *Source = "// &";
1280
1281 std::vector<Token> Toks;
1282
1283 lexString(Source, Toks);
1284
1285 ASSERT_EQ(3U, Toks.size());
1286
1287 ASSERT_EQ(tok::text, Toks[0].getKind());
1288 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1289
1290 ASSERT_EQ(tok::text, Toks[1].getKind());
1291 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1292
1293 ASSERT_EQ(tok::newline, Toks[2].getKind());
1294}
1295
1296TEST_F(CommentLexerTest, HTMLCharacterReferences2) {
1297 const char *Source = "// &!";
1298
1299 std::vector<Token> Toks;
1300
1301 lexString(Source, Toks);
1302
1303 ASSERT_EQ(4U, Toks.size());
1304
1305 ASSERT_EQ(tok::text, Toks[0].getKind());
1306 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1307
1308 ASSERT_EQ(tok::text, Toks[1].getKind());
1309 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1310
1311 ASSERT_EQ(tok::text, Toks[2].getKind());
1312 ASSERT_EQ(StringRef("!"), Toks[2].getText());
1313
1314 ASSERT_EQ(tok::newline, Toks[3].getKind());
1315}
1316
1317TEST_F(CommentLexerTest, HTMLCharacterReferences3) {
1318 const char *Source = "// &amp";
1319
1320 std::vector<Token> Toks;
1321
1322 lexString(Source, Toks);
1323
1324 ASSERT_EQ(3U, Toks.size());
1325
1326 ASSERT_EQ(tok::text, Toks[0].getKind());
1327 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1328
1329 ASSERT_EQ(tok::text, Toks[1].getKind());
1330 ASSERT_EQ(StringRef("&amp"), Toks[1].getText());
1331
1332 ASSERT_EQ(tok::newline, Toks[2].getKind());
1333}
1334
1335TEST_F(CommentLexerTest, HTMLCharacterReferences4) {
1336 const char *Source = "// &amp!";
1337
1338 std::vector<Token> Toks;
1339
1340 lexString(Source, Toks);
1341
1342 ASSERT_EQ(4U, Toks.size());
1343
1344 ASSERT_EQ(tok::text, Toks[0].getKind());
1345 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1346
1347 ASSERT_EQ(tok::text, Toks[1].getKind());
1348 ASSERT_EQ(StringRef("&amp"), Toks[1].getText());
1349
1350 ASSERT_EQ(tok::text, Toks[2].getKind());
1351 ASSERT_EQ(StringRef("!"), Toks[2].getText());
1352
1353 ASSERT_EQ(tok::newline, Toks[3].getKind());
1354}
1355
1356TEST_F(CommentLexerTest, HTMLCharacterReferences5) {
1357 const char *Source = "// &#";
1358
1359 std::vector<Token> Toks;
1360
1361 lexString(Source, Toks);
1362
1363 ASSERT_EQ(3U, Toks.size());
1364
1365 ASSERT_EQ(tok::text, Toks[0].getKind());
1366 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1367
1368 ASSERT_EQ(tok::text, Toks[1].getKind());
1369 ASSERT_EQ(StringRef("&#"), Toks[1].getText());
1370
1371 ASSERT_EQ(tok::newline, Toks[2].getKind());
1372}
1373
1374TEST_F(CommentLexerTest, HTMLCharacterReferences6) {
1375 const char *Source = "// &#a";
1376
1377 std::vector<Token> Toks;
1378
1379 lexString(Source, Toks);
1380
1381 ASSERT_EQ(4U, Toks.size());
1382
1383 ASSERT_EQ(tok::text, Toks[0].getKind());
1384 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1385
1386 ASSERT_EQ(tok::text, Toks[1].getKind());
1387 ASSERT_EQ(StringRef("&#"), Toks[1].getText());
1388
1389 ASSERT_EQ(tok::text, Toks[2].getKind());
1390 ASSERT_EQ(StringRef("a"), Toks[2].getText());
1391
1392 ASSERT_EQ(tok::newline, Toks[3].getKind());
1393}
1394
1395TEST_F(CommentLexerTest, HTMLCharacterReferences7) {
1396 const char *Source = "// &#42";
1397
1398 std::vector<Token> Toks;
1399
1400 lexString(Source, Toks);
1401
1402 ASSERT_EQ(3U, Toks.size());
1403
1404 ASSERT_EQ(tok::text, Toks[0].getKind());
1405 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1406
1407 ASSERT_EQ(tok::text, Toks[1].getKind());
1408 ASSERT_EQ(StringRef("&#42"), Toks[1].getText());
1409
1410 ASSERT_EQ(tok::newline, Toks[2].getKind());
1411}
1412
1413TEST_F(CommentLexerTest, HTMLCharacterReferences8) {
1414 const char *Source = "// &#42a";
1415
1416 std::vector<Token> Toks;
1417
1418 lexString(Source, Toks);
1419
1420 ASSERT_EQ(4U, Toks.size());
1421
1422 ASSERT_EQ(tok::text, Toks[0].getKind());
1423 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1424
1425 ASSERT_EQ(tok::text, Toks[1].getKind());
1426 ASSERT_EQ(StringRef("&#42"), Toks[1].getText());
1427
1428 ASSERT_EQ(tok::text, Toks[2].getKind());
1429 ASSERT_EQ(StringRef("a"), Toks[2].getText());
1430
1431 ASSERT_EQ(tok::newline, Toks[3].getKind());
1432}
1433
1434TEST_F(CommentLexerTest, HTMLCharacterReferences9) {
1435 const char *Source = "// &#x";
1436
1437 std::vector<Token> Toks;
1438
1439 lexString(Source, Toks);
1440
1441 ASSERT_EQ(3U, Toks.size());
1442
1443 ASSERT_EQ(tok::text, Toks[0].getKind());
1444 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1445
1446 ASSERT_EQ(tok::text, Toks[1].getKind());
1447 ASSERT_EQ(StringRef("&#x"), Toks[1].getText());
1448
1449 ASSERT_EQ(tok::newline, Toks[2].getKind());
1450}
1451
1452TEST_F(CommentLexerTest, HTMLCharacterReferences10) {
1453 const char *Source = "// &#xz";
1454
1455 std::vector<Token> Toks;
1456
1457 lexString(Source, Toks);
1458
1459 ASSERT_EQ(4U, Toks.size());
1460
1461 ASSERT_EQ(tok::text, Toks[0].getKind());
1462 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1463
1464 ASSERT_EQ(tok::text, Toks[1].getKind());
1465 ASSERT_EQ(StringRef("&#x"), Toks[1].getText());
1466
1467 ASSERT_EQ(tok::text, Toks[2].getKind());
1468 ASSERT_EQ(StringRef("z"), Toks[2].getText());
1469
1470 ASSERT_EQ(tok::newline, Toks[3].getKind());
1471}
1472
1473TEST_F(CommentLexerTest, HTMLCharacterReferences11) {
1474 const char *Source = "// &#xab";
1475
1476 std::vector<Token> Toks;
1477
1478 lexString(Source, Toks);
1479
1480 ASSERT_EQ(3U, Toks.size());
1481
1482 ASSERT_EQ(tok::text, Toks[0].getKind());
1483 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1484
1485 ASSERT_EQ(tok::text, Toks[1].getKind());
1486 ASSERT_EQ(StringRef("&#xab"), Toks[1].getText());
1487
1488 ASSERT_EQ(tok::newline, Toks[2].getKind());
1489}
1490
1491TEST_F(CommentLexerTest, HTMLCharacterReferences12) {
1492 const char *Source = "// &#xaBz";
1493
1494 std::vector<Token> Toks;
1495
1496 lexString(Source, Toks);
1497
1498 ASSERT_EQ(4U, Toks.size());
1499
1500 ASSERT_EQ(tok::text, Toks[0].getKind());
1501 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1502
1503 ASSERT_EQ(tok::text, Toks[1].getKind());
1504 ASSERT_EQ(StringRef("&#xaB"), Toks[1].getText());
1505
1506 ASSERT_EQ(tok::text, Toks[2].getKind());
1507 ASSERT_EQ(StringRef("z"), Toks[2].getText());
1508
1509 ASSERT_EQ(tok::newline, Toks[3].getKind());
1510}
1511
1512TEST_F(CommentLexerTest, HTMLCharacterReferences13) {
1513 const char *Source = "// &amp;";
1514
1515 std::vector<Token> Toks;
1516
1517 lexString(Source, Toks);
1518
1519 ASSERT_EQ(3U, Toks.size());
1520
1521 ASSERT_EQ(tok::text, Toks[0].getKind());
1522 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1523
1524 ASSERT_EQ(tok::text, Toks[1].getKind());
1525 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1526
1527 ASSERT_EQ(tok::newline, Toks[2].getKind());
1528}
1529
1530TEST_F(CommentLexerTest, HTMLCharacterReferences14) {
1531 const char *Source = "// &amp;&lt;";
1532
1533 std::vector<Token> Toks;
1534
1535 lexString(Source, Toks);
1536
1537 ASSERT_EQ(4U, Toks.size());
1538
1539 ASSERT_EQ(tok::text, Toks[0].getKind());
1540 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1541
1542 ASSERT_EQ(tok::text, Toks[1].getKind());
1543 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1544
1545 ASSERT_EQ(tok::text, Toks[2].getKind());
1546 ASSERT_EQ(StringRef("<"), Toks[2].getText());
1547
1548 ASSERT_EQ(tok::newline, Toks[3].getKind());
1549}
1550
1551TEST_F(CommentLexerTest, HTMLCharacterReferences15) {
1552 const char *Source = "// &amp; meow";
1553
1554 std::vector<Token> Toks;
1555
1556 lexString(Source, Toks);
1557
1558 ASSERT_EQ(4U, Toks.size());
1559
1560 ASSERT_EQ(tok::text, Toks[0].getKind());
1561 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1562
1563 ASSERT_EQ(tok::text, Toks[1].getKind());
1564 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1565
1566 ASSERT_EQ(tok::text, Toks[2].getKind());
1567 ASSERT_EQ(StringRef(" meow"), Toks[2].getText());
1568
1569 ASSERT_EQ(tok::newline, Toks[3].getKind());
1570}
1571
1572TEST_F(CommentLexerTest, HTMLCharacterReferences16) {
1573 const char *Sources[] = {
1574 "// &#61;",
1575 "// &#x3d;",
1576 "// &#X3d;"
1577 };
1578
1579 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1580 std::vector<Token> Toks;
1581
1582 lexString(Sources[i], Toks);
1583
1584 ASSERT_EQ(3U, Toks.size());
1585
1586 ASSERT_EQ(tok::text, Toks[0].getKind());
1587 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1588
1589 ASSERT_EQ(tok::text, Toks[1].getKind());
1590 ASSERT_EQ(StringRef("="), Toks[1].getText());
1591
1592 ASSERT_EQ(tok::newline, Toks[2].getKind());
1593 }
1594}
1595
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001596TEST_F(CommentLexerTest, MultipleComments) {
1597 const char *Source =
1598 "// Aaa\n"
1599 "/// Bbb\n"
1600 "/* Ccc\n"
1601 " * Ddd*/\n"
1602 "/** Eee*/";
1603
1604 std::vector<Token> Toks;
1605
1606 lexString(Source, Toks);
1607
1608 ASSERT_EQ(12U, Toks.size());
1609
1610 ASSERT_EQ(tok::text, Toks[0].getKind());
1611 ASSERT_EQ(StringRef(" Aaa"), Toks[0].getText());
1612 ASSERT_EQ(tok::newline, Toks[1].getKind());
1613
1614 ASSERT_EQ(tok::text, Toks[2].getKind());
1615 ASSERT_EQ(StringRef(" Bbb"), Toks[2].getText());
1616 ASSERT_EQ(tok::newline, Toks[3].getKind());
1617
1618 ASSERT_EQ(tok::text, Toks[4].getKind());
1619 ASSERT_EQ(StringRef(" Ccc"), Toks[4].getText());
1620 ASSERT_EQ(tok::newline, Toks[5].getKind());
1621
1622 ASSERT_EQ(tok::text, Toks[6].getKind());
1623 ASSERT_EQ(StringRef(" Ddd"), Toks[6].getText());
1624 ASSERT_EQ(tok::newline, Toks[7].getKind());
1625 ASSERT_EQ(tok::newline, Toks[8].getKind());
1626
1627 ASSERT_EQ(tok::text, Toks[9].getKind());
1628 ASSERT_EQ(StringRef(" Eee"), Toks[9].getText());
1629
1630 ASSERT_EQ(tok::newline, Toks[10].getKind());
1631 ASSERT_EQ(tok::newline, Toks[11].getKind());
1632}
1633
1634} // end namespace comments
1635} // end namespace clang
1636