blob: 2723a611e10647ca11670e534b3c33e661dc86f1 [file] [log] [blame]
Dmitri Gribenko5188c4b2012-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"
Douglas Gregoredf8e382012-10-23 22:38:58 +000013#include "clang/Basic/DiagnosticOptions.h"
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +000014#include "clang/AST/CommentLexer.h"
Dmitri Gribenkoca7f80a2012-08-09 00:03:17 +000015#include "clang/AST/CommentCommandTraits.h"
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +000016#include "llvm/ADT/STLExtras.h"
17#include <vector>
18
19#include "gtest/gtest.h"
20
21using namespace llvm;
22using namespace clang;
23
24namespace clang {
25namespace comments {
26
27namespace {
28class CommentLexerTest : public ::testing::Test {
29protected:
30 CommentLexerTest()
31 : FileMgr(FileMgrOpts),
32 DiagID(new DiagnosticIDs()),
Douglas Gregord8cfd392012-10-23 22:31:51 +000033 Diags(DiagID, new DiagnosticOptions, new IgnoringDiagConsumer()),
Dmitri Gribenko7acbf002012-09-10 20:32:42 +000034 SourceMgr(Diags, FileMgr),
35 Traits(Allocator) {
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +000036 }
37
38 FileSystemOptions FileMgrOpts;
39 FileManager FileMgr;
40 IntrusiveRefCntPtr<DiagnosticIDs> DiagID;
41 DiagnosticsEngine Diags;
42 SourceManager SourceMgr;
Dmitri Gribenko4586df72012-07-27 20:37:06 +000043 llvm::BumpPtrAllocator Allocator;
Dmitri Gribenko7acbf002012-09-10 20:32:42 +000044 CommandTraits Traits;
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +000045
46 void lexString(const char *Source, std::vector<Token> &Toks);
Dmitri Gribenko7acbf002012-09-10 20:32:42 +000047
48 StringRef getCommandName(const Token &Tok) {
49 return Traits.getCommandInfo(Tok.getCommandID())->Name;
50 }
51
52 StringRef getVerbatimBlockName(const Token &Tok) {
53 return Traits.getCommandInfo(Tok.getVerbatimBlockID())->Name;
54 }
55
56 StringRef getVerbatimLineName(const Token &Tok) {
57 return Traits.getCommandInfo(Tok.getVerbatimLineID())->Name;
58 }
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +000059};
60
61void CommentLexerTest::lexString(const char *Source,
62 std::vector<Token> &Toks) {
63 MemoryBuffer *Buf = MemoryBuffer::getMemBuffer(Source);
64 FileID File = SourceMgr.createFileIDForMemBuffer(Buf);
65 SourceLocation Begin = SourceMgr.getLocForStartOfFile(File);
66
Dmitri Gribenko7acbf002012-09-10 20:32:42 +000067 Lexer L(Allocator, Traits, Begin, Source, Source + strlen(Source));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +000068
69 while (1) {
70 Token Tok;
71 L.lex(Tok);
72 if (Tok.is(tok::eof))
73 break;
74 Toks.push_back(Tok);
75 }
76}
77
78} // unnamed namespace
79
80// Empty source range should be handled.
81TEST_F(CommentLexerTest, Basic1) {
82 const char *Source = "";
83 std::vector<Token> Toks;
84
85 lexString(Source, Toks);
86
87 ASSERT_EQ(0U, Toks.size());
88}
89
90// Empty comments should be handled.
91TEST_F(CommentLexerTest, Basic2) {
92 const char *Sources[] = {
93 "//", "///", "//!", "///<", "//!<"
94 };
95 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
96 std::vector<Token> Toks;
97
98 lexString(Sources[i], Toks);
99
100 ASSERT_EQ(1U, Toks.size());
101
102 ASSERT_EQ(tok::newline, Toks[0].getKind());
103 }
104}
105
106// Empty comments should be handled.
107TEST_F(CommentLexerTest, Basic3) {
108 const char *Sources[] = {
109 "/**/", "/***/", "/*!*/", "/**<*/", "/*!<*/"
110 };
111 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
112 std::vector<Token> Toks;
113
114 lexString(Sources[i], Toks);
115
116 ASSERT_EQ(2U, Toks.size());
117
118 ASSERT_EQ(tok::newline, Toks[0].getKind());
119 ASSERT_EQ(tok::newline, Toks[1].getKind());
120 }
121}
122
123// Single comment with plain text.
124TEST_F(CommentLexerTest, Basic4) {
125 const char *Sources[] = {
126 "// Meow", "/// Meow", "//! Meow",
127 "// Meow\n", "// Meow\r\n", "//! Meow\r",
128 };
129
130 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
131 std::vector<Token> Toks;
132
133 lexString(Sources[i], Toks);
134
135 ASSERT_EQ(2U, Toks.size());
136
137 ASSERT_EQ(tok::text, Toks[0].getKind());
138 ASSERT_EQ(StringRef(" Meow"), Toks[0].getText());
139
140 ASSERT_EQ(tok::newline, Toks[1].getKind());
141 }
142}
143
144// Single comment with plain text.
145TEST_F(CommentLexerTest, Basic5) {
146 const char *Sources[] = {
147 "/* Meow*/", "/** Meow*/", "/*! Meow*/"
148 };
149
150 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
151 std::vector<Token> Toks;
152
153 lexString(Sources[i], Toks);
154
155 ASSERT_EQ(3U, Toks.size());
156
157 ASSERT_EQ(tok::text, Toks[0].getKind());
158 ASSERT_EQ(StringRef(" Meow"), Toks[0].getText());
159
160 ASSERT_EQ(tok::newline, Toks[1].getKind());
161 ASSERT_EQ(tok::newline, Toks[2].getKind());
162 }
163}
164
165// Test newline escaping.
166TEST_F(CommentLexerTest, Basic6) {
167 const char *Sources[] = {
168 "// Aaa\\\n" " Bbb\\ \n" " Ccc?" "?/\n",
169 "// Aaa\\\r\n" " Bbb\\ \r\n" " Ccc?" "?/\r\n",
170 "// Aaa\\\r" " Bbb\\ \r" " Ccc?" "?/\r"
171 };
172
173 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
174 std::vector<Token> Toks;
175
176 lexString(Sources[i], Toks);
177
178 ASSERT_EQ(10U, Toks.size());
179
180 ASSERT_EQ(tok::text, Toks[0].getKind());
181 ASSERT_EQ(StringRef(" Aaa"), Toks[0].getText());
182 ASSERT_EQ(tok::text, Toks[1].getKind());
183 ASSERT_EQ(StringRef("\\"), Toks[1].getText());
184 ASSERT_EQ(tok::newline, Toks[2].getKind());
185
186 ASSERT_EQ(tok::text, Toks[3].getKind());
187 ASSERT_EQ(StringRef(" Bbb"), Toks[3].getText());
188 ASSERT_EQ(tok::text, Toks[4].getKind());
189 ASSERT_EQ(StringRef("\\"), Toks[4].getText());
190 ASSERT_EQ(tok::text, Toks[5].getKind());
191 ASSERT_EQ(StringRef(" "), Toks[5].getText());
192 ASSERT_EQ(tok::newline, Toks[6].getKind());
193
194 ASSERT_EQ(tok::text, Toks[7].getKind());
195 ASSERT_EQ(StringRef(" Ccc?" "?/"), Toks[7].getText());
196 ASSERT_EQ(tok::newline, Toks[8].getKind());
197
198 ASSERT_EQ(tok::newline, Toks[9].getKind());
199 }
200}
201
202// Check that we skip C-style aligned stars correctly.
203TEST_F(CommentLexerTest, Basic7) {
204 const char *Source =
205 "/* Aaa\n"
206 " * Bbb\r\n"
207 "\t* Ccc\n"
208 " ! Ddd\n"
209 " * Eee\n"
210 " ** Fff\n"
211 " */";
212 std::vector<Token> Toks;
213
214 lexString(Source, Toks);
215
216 ASSERT_EQ(15U, Toks.size());
217
218 ASSERT_EQ(tok::text, Toks[0].getKind());
219 ASSERT_EQ(StringRef(" Aaa"), Toks[0].getText());
220 ASSERT_EQ(tok::newline, Toks[1].getKind());
221
222 ASSERT_EQ(tok::text, Toks[2].getKind());
223 ASSERT_EQ(StringRef(" Bbb"), Toks[2].getText());
224 ASSERT_EQ(tok::newline, Toks[3].getKind());
225
226 ASSERT_EQ(tok::text, Toks[4].getKind());
227 ASSERT_EQ(StringRef(" Ccc"), Toks[4].getText());
228 ASSERT_EQ(tok::newline, Toks[5].getKind());
229
230 ASSERT_EQ(tok::text, Toks[6].getKind());
231 ASSERT_EQ(StringRef(" ! Ddd"), Toks[6].getText());
232 ASSERT_EQ(tok::newline, Toks[7].getKind());
233
234 ASSERT_EQ(tok::text, Toks[8].getKind());
235 ASSERT_EQ(StringRef(" Eee"), Toks[8].getText());
236 ASSERT_EQ(tok::newline, Toks[9].getKind());
237
238 ASSERT_EQ(tok::text, Toks[10].getKind());
239 ASSERT_EQ(StringRef("* Fff"), Toks[10].getText());
240 ASSERT_EQ(tok::newline, Toks[11].getKind());
241
242 ASSERT_EQ(tok::text, Toks[12].getKind());
243 ASSERT_EQ(StringRef(" "), Toks[12].getText());
244
245 ASSERT_EQ(tok::newline, Toks[13].getKind());
246 ASSERT_EQ(tok::newline, Toks[14].getKind());
247}
248
249// A command marker followed by comment end.
250TEST_F(CommentLexerTest, DoxygenCommand1) {
251 const char *Sources[] = { "//@", "///@", "//!@" };
252 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
253 std::vector<Token> Toks;
254
255 lexString(Sources[i], Toks);
256
257 ASSERT_EQ(2U, Toks.size());
258
259 ASSERT_EQ(tok::text, Toks[0].getKind());
260 ASSERT_EQ(StringRef("@"), Toks[0].getText());
261
262 ASSERT_EQ(tok::newline, Toks[1].getKind());
263 }
264}
265
266// A command marker followed by comment end.
267TEST_F(CommentLexerTest, DoxygenCommand2) {
268 const char *Sources[] = { "/*@*/", "/**@*/", "/*!@*/"};
269 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
270 std::vector<Token> Toks;
271
272 lexString(Sources[i], Toks);
273
274 ASSERT_EQ(3U, Toks.size());
275
276 ASSERT_EQ(tok::text, Toks[0].getKind());
277 ASSERT_EQ(StringRef("@"), Toks[0].getText());
278
279 ASSERT_EQ(tok::newline, Toks[1].getKind());
280 ASSERT_EQ(tok::newline, Toks[2].getKind());
281 }
282}
283
284// A command marker followed by comment end.
285TEST_F(CommentLexerTest, DoxygenCommand3) {
286 const char *Sources[] = { "/*\\*/", "/**\\*/" };
287 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
288 std::vector<Token> Toks;
289
290 lexString(Sources[i], Toks);
291
292 ASSERT_EQ(3U, Toks.size());
293
294 ASSERT_EQ(tok::text, Toks[0].getKind());
295 ASSERT_EQ(StringRef("\\"), Toks[0].getText());
296
297 ASSERT_EQ(tok::newline, Toks[1].getKind());
298 ASSERT_EQ(tok::newline, Toks[2].getKind());
299 }
300}
301
302// Doxygen escape sequences.
303TEST_F(CommentLexerTest, DoxygenCommand4) {
304 const char *Source =
305 "/// \\\\ \\@ \\& \\$ \\# \\< \\> \\% \\\" \\. \\::";
306 const char *Text[] = {
307 " ",
308 "\\", " ", "@", " ", "&", " ", "$", " ", "#", " ",
309 "<", " ", ">", " ", "%", " ", "\"", " ", ".", " ",
310 "::", ""
311 };
312
313 std::vector<Token> Toks;
314
315 lexString(Source, Toks);
316
317 ASSERT_EQ(array_lengthof(Text), Toks.size());
318
319 for (size_t i = 0, e = Toks.size(); i != e; i++) {
320 if(Toks[i].is(tok::text))
321 ASSERT_EQ(StringRef(Text[i]), Toks[i].getText())
322 << "index " << i;
323 }
324}
325
Dmitri Gribenkoad45ad62012-09-14 16:35:35 +0000326// A command marker followed by a non-letter that is not a part of an escape
327// sequence.
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000328TEST_F(CommentLexerTest, DoxygenCommand5) {
Dmitri Gribenkoad45ad62012-09-14 16:35:35 +0000329 const char *Source = "/// \\^ \\0";
330 std::vector<Token> Toks;
331
332 lexString(Source, Toks);
333
334 ASSERT_EQ(6U, Toks.size());
335
336 ASSERT_EQ(tok::text, Toks[0].getKind());
337 ASSERT_EQ(StringRef(" "), Toks[0].getText());
338
339 ASSERT_EQ(tok::text, Toks[1].getKind());
340 ASSERT_EQ(StringRef("\\"), Toks[1].getText());
341
342 ASSERT_EQ(tok::text, Toks[2].getKind());
343 ASSERT_EQ(StringRef("^ "), Toks[2].getText());
344
345 ASSERT_EQ(tok::text, Toks[3].getKind());
346 ASSERT_EQ(StringRef("\\"), Toks[3].getText());
347
348 ASSERT_EQ(tok::text, Toks[4].getKind());
349 ASSERT_EQ(StringRef("0"), Toks[4].getText());
350
351 ASSERT_EQ(tok::newline, Toks[5].getKind());
352}
353
354TEST_F(CommentLexerTest, DoxygenCommand6) {
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000355 const char *Source = "/// \\brief Aaa.";
356 std::vector<Token> Toks;
357
358 lexString(Source, Toks);
359
360 ASSERT_EQ(4U, Toks.size());
361
362 ASSERT_EQ(tok::text, Toks[0].getKind());
363 ASSERT_EQ(StringRef(" "), Toks[0].getText());
364
365 ASSERT_EQ(tok::command, Toks[1].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000366 ASSERT_EQ(StringRef("brief"), getCommandName(Toks[1]));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000367
368 ASSERT_EQ(tok::text, Toks[2].getKind());
369 ASSERT_EQ(StringRef(" Aaa."), Toks[2].getText());
370
371 ASSERT_EQ(tok::newline, Toks[3].getKind());
372}
373
Dmitri Gribenkoad45ad62012-09-14 16:35:35 +0000374TEST_F(CommentLexerTest, DoxygenCommand7) {
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000375 const char *Source = "/// \\em\\em \\em\t\\em\n";
376 std::vector<Token> Toks;
377
378 lexString(Source, Toks);
379
380 ASSERT_EQ(8U, Toks.size());
381
382 ASSERT_EQ(tok::text, Toks[0].getKind());
383 ASSERT_EQ(StringRef(" "), Toks[0].getText());
384
385 ASSERT_EQ(tok::command, Toks[1].getKind());
386 ASSERT_EQ(StringRef("em"), getCommandName(Toks[1]));
387
388 ASSERT_EQ(tok::command, Toks[2].getKind());
389 ASSERT_EQ(StringRef("em"), getCommandName(Toks[2]));
390
391 ASSERT_EQ(tok::text, Toks[3].getKind());
392 ASSERT_EQ(StringRef(" "), Toks[3].getText());
393
394 ASSERT_EQ(tok::command, Toks[4].getKind());
395 ASSERT_EQ(StringRef("em"), getCommandName(Toks[4]));
396
397 ASSERT_EQ(tok::text, Toks[5].getKind());
398 ASSERT_EQ(StringRef("\t"), Toks[5].getText());
399
400 ASSERT_EQ(tok::command, Toks[6].getKind());
401 ASSERT_EQ(StringRef("em"), getCommandName(Toks[6]));
402
403 ASSERT_EQ(tok::newline, Toks[7].getKind());
404}
405
Dmitri Gribenkoad45ad62012-09-14 16:35:35 +0000406TEST_F(CommentLexerTest, DoxygenCommand8) {
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000407 const char *Source = "/// \\aaa\\bbb \\ccc\t\\ddd\n";
408 std::vector<Token> Toks;
409
410 lexString(Source, Toks);
411
412 ASSERT_EQ(8U, Toks.size());
413
414 ASSERT_EQ(tok::text, Toks[0].getKind());
415 ASSERT_EQ(StringRef(" "), Toks[0].getText());
416
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000417 ASSERT_EQ(tok::unknown_command, Toks[1].getKind());
418 ASSERT_EQ(StringRef("aaa"), Toks[1].getUnknownCommandName());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000419
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000420 ASSERT_EQ(tok::unknown_command, Toks[2].getKind());
421 ASSERT_EQ(StringRef("bbb"), Toks[2].getUnknownCommandName());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000422
423 ASSERT_EQ(tok::text, Toks[3].getKind());
424 ASSERT_EQ(StringRef(" "), Toks[3].getText());
425
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000426 ASSERT_EQ(tok::unknown_command, Toks[4].getKind());
427 ASSERT_EQ(StringRef("ccc"), Toks[4].getUnknownCommandName());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000428
429 ASSERT_EQ(tok::text, Toks[5].getKind());
430 ASSERT_EQ(StringRef("\t"), Toks[5].getText());
431
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000432 ASSERT_EQ(tok::unknown_command, Toks[6].getKind());
433 ASSERT_EQ(StringRef("ddd"), Toks[6].getUnknownCommandName());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000434
435 ASSERT_EQ(tok::newline, Toks[7].getKind());
436}
437
Dmitri Gribenkoad45ad62012-09-14 16:35:35 +0000438TEST_F(CommentLexerTest, DoxygenCommand9) {
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000439 const char *Source = "// \\c\n";
440 std::vector<Token> Toks;
441
442 lexString(Source, Toks);
443
444 ASSERT_EQ(3U, Toks.size());
445
446 ASSERT_EQ(tok::text, Toks[0].getKind());
447 ASSERT_EQ(StringRef(" "), Toks[0].getText());
448
449 ASSERT_EQ(tok::command, Toks[1].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000450 ASSERT_EQ(StringRef("c"), getCommandName(Toks[1]));
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000451
452 ASSERT_EQ(tok::newline, Toks[2].getKind());
453}
454
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000455// Empty verbatim block.
456TEST_F(CommentLexerTest, VerbatimBlock1) {
457 const char *Sources[] = {
458 "/// \\verbatim\\endverbatim\n//",
459 "/** \\verbatim\\endverbatim*/"
460 };
461
462 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
463 std::vector<Token> Toks;
464
465 lexString(Sources[i], Toks);
466
467 ASSERT_EQ(5U, Toks.size());
468
469 ASSERT_EQ(tok::text, Toks[0].getKind());
470 ASSERT_EQ(StringRef(" "), Toks[0].getText());
471
472 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000473 ASSERT_EQ(StringRef("verbatim"), getVerbatimBlockName(Toks[1]));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000474
475 ASSERT_EQ(tok::verbatim_block_end, Toks[2].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000476 ASSERT_EQ(StringRef("endverbatim"), getVerbatimBlockName(Toks[2]));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000477
478 ASSERT_EQ(tok::newline, Toks[3].getKind());
479 ASSERT_EQ(tok::newline, Toks[4].getKind());
480 }
481}
482
483// Empty verbatim block without an end command.
484TEST_F(CommentLexerTest, VerbatimBlock2) {
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000485 const char *Source = "/// \\verbatim";
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000486
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000487 std::vector<Token> Toks;
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000488
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000489 lexString(Source, Toks);
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000490
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000491 ASSERT_EQ(3U, Toks.size());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000492
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000493 ASSERT_EQ(tok::text, Toks[0].getKind());
494 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000495
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000496 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000497 ASSERT_EQ(StringRef("verbatim"), getVerbatimBlockName(Toks[1]));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000498
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000499 ASSERT_EQ(tok::newline, Toks[2].getKind());
500}
501
502// Empty verbatim block without an end command.
503TEST_F(CommentLexerTest, VerbatimBlock3) {
504 const char *Source = "/** \\verbatim*/";
505
506 std::vector<Token> Toks;
507
508 lexString(Source, Toks);
509
510 ASSERT_EQ(4U, Toks.size());
511
512 ASSERT_EQ(tok::text, Toks[0].getKind());
513 ASSERT_EQ(StringRef(" "), Toks[0].getText());
514
515 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000516 ASSERT_EQ(StringRef("verbatim"), getVerbatimBlockName(Toks[1]));
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000517
518 ASSERT_EQ(tok::newline, Toks[2].getKind());
519 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000520}
521
522// Single-line verbatim block.
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000523TEST_F(CommentLexerTest, VerbatimBlock4) {
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000524 const char *Sources[] = {
525 "/// Meow \\verbatim aaa \\endverbatim\n//",
526 "/** Meow \\verbatim aaa \\endverbatim*/"
527 };
528
529 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
530 std::vector<Token> Toks;
531
532 lexString(Sources[i], Toks);
533
534 ASSERT_EQ(6U, Toks.size());
535
536 ASSERT_EQ(tok::text, Toks[0].getKind());
537 ASSERT_EQ(StringRef(" Meow "), Toks[0].getText());
538
539 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000540 ASSERT_EQ(StringRef("verbatim"), getVerbatimBlockName(Toks[1]));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000541
542 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
543 ASSERT_EQ(StringRef(" aaa "), Toks[2].getVerbatimBlockText());
544
545 ASSERT_EQ(tok::verbatim_block_end, Toks[3].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000546 ASSERT_EQ(StringRef("endverbatim"), getVerbatimBlockName(Toks[3]));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000547
548 ASSERT_EQ(tok::newline, Toks[4].getKind());
549 ASSERT_EQ(tok::newline, Toks[5].getKind());
550 }
551}
552
553// Single-line verbatim block without an end command.
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000554TEST_F(CommentLexerTest, VerbatimBlock5) {
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000555 const char *Sources[] = {
556 "/// Meow \\verbatim aaa \n//",
557 "/** Meow \\verbatim aaa */"
558 };
559
560 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
561 std::vector<Token> Toks;
562
563 lexString(Sources[i], Toks);
564
565 ASSERT_EQ(5U, Toks.size());
566
567 ASSERT_EQ(tok::text, Toks[0].getKind());
568 ASSERT_EQ(StringRef(" Meow "), Toks[0].getText());
569
570 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000571 ASSERT_EQ(StringRef("verbatim"), getVerbatimBlockName(Toks[1]));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000572
573 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
574 ASSERT_EQ(StringRef(" aaa "), Toks[2].getVerbatimBlockText());
575
576 ASSERT_EQ(tok::newline, Toks[3].getKind());
577 ASSERT_EQ(tok::newline, Toks[4].getKind());
578 }
579}
580
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000581TEST_F(CommentLexerTest, VerbatimBlock6) {
582 const char *Source =
583 "// \\verbatim\n"
584 "// Aaa\n"
585 "//\n"
586 "// Bbb\n"
587 "// \\endverbatim\n";
588
589 std::vector<Token> Toks;
590
591 lexString(Source, Toks);
592
Dmitri Gribenkoe4a39972012-07-18 23:01:58 +0000593 ASSERT_EQ(10U, Toks.size());
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000594
595 ASSERT_EQ(tok::text, Toks[0].getKind());
596 ASSERT_EQ(StringRef(" "), Toks[0].getText());
597
598 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000599 ASSERT_EQ(StringRef("verbatim"), getVerbatimBlockName(Toks[1]));
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000600
601 ASSERT_EQ(tok::newline, Toks[2].getKind());
602
603 ASSERT_EQ(tok::verbatim_block_line, Toks[3].getKind());
604 ASSERT_EQ(StringRef(" Aaa"), Toks[3].getVerbatimBlockText());
605
606 ASSERT_EQ(tok::newline, Toks[4].getKind());
607
608 ASSERT_EQ(tok::newline, Toks[5].getKind());
609
610 ASSERT_EQ(tok::verbatim_block_line, Toks[6].getKind());
611 ASSERT_EQ(StringRef(" Bbb"), Toks[6].getVerbatimBlockText());
612
613 ASSERT_EQ(tok::newline, Toks[7].getKind());
614
Dmitri Gribenkoe4a39972012-07-18 23:01:58 +0000615 ASSERT_EQ(tok::verbatim_block_end, Toks[8].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000616 ASSERT_EQ(StringRef("endverbatim"), getVerbatimBlockName(Toks[8]));
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000617
Dmitri Gribenkoe4a39972012-07-18 23:01:58 +0000618 ASSERT_EQ(tok::newline, Toks[9].getKind());
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000619}
620
621TEST_F(CommentLexerTest, VerbatimBlock7) {
622 const char *Source =
623 "/* \\verbatim\n"
624 " * Aaa\n"
625 " *\n"
626 " * Bbb\n"
627 " * \\endverbatim\n"
628 " */";
629
630 std::vector<Token> Toks;
631
632 lexString(Source, Toks);
633
Dmitri Gribenkoe4a39972012-07-18 23:01:58 +0000634 ASSERT_EQ(10U, Toks.size());
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000635
636 ASSERT_EQ(tok::text, Toks[0].getKind());
637 ASSERT_EQ(StringRef(" "), Toks[0].getText());
638
639 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000640 ASSERT_EQ(StringRef("verbatim"), getVerbatimBlockName(Toks[1]));
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000641
642 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
643 ASSERT_EQ(StringRef(" Aaa"), Toks[2].getVerbatimBlockText());
644
645 ASSERT_EQ(tok::verbatim_block_line, Toks[3].getKind());
646 ASSERT_EQ(StringRef(""), Toks[3].getVerbatimBlockText());
647
648 ASSERT_EQ(tok::verbatim_block_line, Toks[4].getKind());
649 ASSERT_EQ(StringRef(" Bbb"), Toks[4].getVerbatimBlockText());
650
Dmitri Gribenkoe4a39972012-07-18 23:01:58 +0000651 ASSERT_EQ(tok::verbatim_block_end, Toks[5].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000652 ASSERT_EQ(StringRef("endverbatim"), getVerbatimBlockName(Toks[5]));
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000653
Dmitri Gribenkoe4a39972012-07-18 23:01:58 +0000654 ASSERT_EQ(tok::newline, Toks[6].getKind());
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000655
Dmitri Gribenkoe4a39972012-07-18 23:01:58 +0000656 ASSERT_EQ(tok::text, Toks[7].getKind());
657 ASSERT_EQ(StringRef(" "), Toks[7].getText());
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000658
Dmitri Gribenkoe4a39972012-07-18 23:01:58 +0000659 ASSERT_EQ(tok::newline, Toks[8].getKind());
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000660 ASSERT_EQ(tok::newline, Toks[9].getKind());
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000661}
662
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000663// Complex test for verbatim blocks.
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000664TEST_F(CommentLexerTest, VerbatimBlock8) {
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000665 const char *Source =
666 "/* Meow \\verbatim aaa\\$\\@\n"
667 "bbb \\endverbati\r"
668 "ccc\r\n"
669 "ddd \\endverbatim Blah \\verbatim eee\n"
670 "\\endverbatim BlahBlah*/";
671 std::vector<Token> Toks;
672
673 lexString(Source, Toks);
674
675 ASSERT_EQ(14U, Toks.size());
676
677 ASSERT_EQ(tok::text, Toks[0].getKind());
678 ASSERT_EQ(StringRef(" Meow "), Toks[0].getText());
679
680 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000681 ASSERT_EQ(StringRef("verbatim"), getVerbatimBlockName(Toks[1]));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000682
683 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000684 ASSERT_EQ(StringRef(" aaa\\$\\@"), Toks[2].getVerbatimBlockText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000685
686 ASSERT_EQ(tok::verbatim_block_line, Toks[3].getKind());
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000687 ASSERT_EQ(StringRef("bbb \\endverbati"), Toks[3].getVerbatimBlockText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000688
689 ASSERT_EQ(tok::verbatim_block_line, Toks[4].getKind());
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000690 ASSERT_EQ(StringRef("ccc"), Toks[4].getVerbatimBlockText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000691
692 ASSERT_EQ(tok::verbatim_block_line, Toks[5].getKind());
693 ASSERT_EQ(StringRef("ddd "), Toks[5].getVerbatimBlockText());
694
695 ASSERT_EQ(tok::verbatim_block_end, Toks[6].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000696 ASSERT_EQ(StringRef("endverbatim"), getVerbatimBlockName(Toks[6]));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000697
698 ASSERT_EQ(tok::text, Toks[7].getKind());
699 ASSERT_EQ(StringRef(" Blah "), Toks[7].getText());
700
701 ASSERT_EQ(tok::verbatim_block_begin, Toks[8].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000702 ASSERT_EQ(StringRef("verbatim"), getVerbatimBlockName(Toks[8]));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000703
704 ASSERT_EQ(tok::verbatim_block_line, Toks[9].getKind());
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000705 ASSERT_EQ(StringRef(" eee"), Toks[9].getVerbatimBlockText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000706
707 ASSERT_EQ(tok::verbatim_block_end, Toks[10].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000708 ASSERT_EQ(StringRef("endverbatim"), getVerbatimBlockName(Toks[10]));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000709
710 ASSERT_EQ(tok::text, Toks[11].getKind());
711 ASSERT_EQ(StringRef(" BlahBlah"), Toks[11].getText());
712
713 ASSERT_EQ(tok::newline, Toks[12].getKind());
714 ASSERT_EQ(tok::newline, Toks[13].getKind());
715}
716
717// LaTeX verbatim blocks.
Dmitri Gribenkoec925312012-07-06 00:28:32 +0000718TEST_F(CommentLexerTest, VerbatimBlock9) {
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000719 const char *Source =
720 "/// \\f$ Aaa \\f$ \\f[ Bbb \\f] \\f{ Ccc \\f}";
721 std::vector<Token> Toks;
722
723 lexString(Source, Toks);
724
725 ASSERT_EQ(13U, Toks.size());
726
727 ASSERT_EQ(tok::text, Toks[0].getKind());
728 ASSERT_EQ(StringRef(" "), Toks[0].getText());
729
730 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000731 ASSERT_EQ(StringRef("f$"), getVerbatimBlockName(Toks[1]));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000732
733 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
734 ASSERT_EQ(StringRef(" Aaa "), Toks[2].getVerbatimBlockText());
735
736 ASSERT_EQ(tok::verbatim_block_end, Toks[3].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000737 ASSERT_EQ(StringRef("f$"), getVerbatimBlockName(Toks[3]));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000738
739 ASSERT_EQ(tok::text, Toks[4].getKind());
740 ASSERT_EQ(StringRef(" "), Toks[4].getText());
741
742 ASSERT_EQ(tok::verbatim_block_begin, Toks[5].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000743 ASSERT_EQ(StringRef("f["), getVerbatimBlockName(Toks[5]));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000744
745 ASSERT_EQ(tok::verbatim_block_line, Toks[6].getKind());
746 ASSERT_EQ(StringRef(" Bbb "), Toks[6].getVerbatimBlockText());
747
748 ASSERT_EQ(tok::verbatim_block_end, Toks[7].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000749 ASSERT_EQ(StringRef("f]"), getVerbatimBlockName(Toks[7]));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000750
751 ASSERT_EQ(tok::text, Toks[8].getKind());
752 ASSERT_EQ(StringRef(" "), Toks[8].getText());
753
754 ASSERT_EQ(tok::verbatim_block_begin, Toks[9].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000755 ASSERT_EQ(StringRef("f{"), getVerbatimBlockName(Toks[9]));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000756
757 ASSERT_EQ(tok::verbatim_block_line, Toks[10].getKind());
758 ASSERT_EQ(StringRef(" Ccc "), Toks[10].getVerbatimBlockText());
759
760 ASSERT_EQ(tok::verbatim_block_end, Toks[11].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000761 ASSERT_EQ(StringRef("f}"), getVerbatimBlockName(Toks[11]));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000762
763 ASSERT_EQ(tok::newline, Toks[12].getKind());
764}
765
766// Empty verbatim line.
767TEST_F(CommentLexerTest, VerbatimLine1) {
768 const char *Sources[] = {
769 "/// \\fn\n//",
770 "/** \\fn*/"
771 };
772
773 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
774 std::vector<Token> Toks;
775
776 lexString(Sources[i], Toks);
777
778 ASSERT_EQ(4U, Toks.size());
779
Dmitri Gribenko1669f702012-06-27 16:53:58 +0000780 ASSERT_EQ(tok::text, Toks[0].getKind());
781 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000782
Dmitri Gribenko1669f702012-06-27 16:53:58 +0000783 ASSERT_EQ(tok::verbatim_line_name, Toks[1].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000784 ASSERT_EQ(StringRef("fn"), getVerbatimLineName(Toks[1]));
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000785
Dmitri Gribenko1669f702012-06-27 16:53:58 +0000786 ASSERT_EQ(tok::newline, Toks[2].getKind());
787 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000788 }
789}
790
791// Verbatim line with Doxygen escape sequences, which should not be expanded.
792TEST_F(CommentLexerTest, VerbatimLine2) {
793 const char *Sources[] = {
794 "/// \\fn void *foo(const char *zzz = \"\\$\");\n//",
795 "/** \\fn void *foo(const char *zzz = \"\\$\");*/"
796 };
797
798 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
799 std::vector<Token> Toks;
800
801 lexString(Sources[i], Toks);
802
Dmitri Gribenko1669f702012-06-27 16:53:58 +0000803 ASSERT_EQ(5U, Toks.size());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000804
Dmitri Gribenko1669f702012-06-27 16:53:58 +0000805 ASSERT_EQ(tok::text, Toks[0].getKind());
806 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000807
Dmitri Gribenko1669f702012-06-27 16:53:58 +0000808 ASSERT_EQ(tok::verbatim_line_name, Toks[1].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000809 ASSERT_EQ(StringRef("fn"), getVerbatimLineName(Toks[1]));
Dmitri Gribenko1669f702012-06-27 16:53:58 +0000810
811 ASSERT_EQ(tok::verbatim_line_text, Toks[2].getKind());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000812 ASSERT_EQ(StringRef(" void *foo(const char *zzz = \"\\$\");"),
Dmitri Gribenko1669f702012-06-27 16:53:58 +0000813 Toks[2].getVerbatimLineText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000814
Dmitri Gribenko1669f702012-06-27 16:53:58 +0000815 ASSERT_EQ(tok::newline, Toks[3].getKind());
816 ASSERT_EQ(tok::newline, Toks[4].getKind());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000817 }
818}
819
820// Verbatim line should not eat anything from next source line.
821TEST_F(CommentLexerTest, VerbatimLine3) {
822 const char *Source =
823 "/** \\fn void *foo(const char *zzz = \"\\$\");\n"
824 " * Meow\n"
825 " */";
826
827 std::vector<Token> Toks;
828
829 lexString(Source, Toks);
830
Dmitri Gribenko1669f702012-06-27 16:53:58 +0000831 ASSERT_EQ(9U, Toks.size());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000832
Dmitri Gribenko1669f702012-06-27 16:53:58 +0000833 ASSERT_EQ(tok::text, Toks[0].getKind());
834 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000835
Dmitri Gribenko1669f702012-06-27 16:53:58 +0000836 ASSERT_EQ(tok::verbatim_line_name, Toks[1].getKind());
Dmitri Gribenko7acbf002012-09-10 20:32:42 +0000837 ASSERT_EQ(StringRef("fn"), getVerbatimLineName(Toks[1]));
Dmitri Gribenko1669f702012-06-27 16:53:58 +0000838
839 ASSERT_EQ(tok::verbatim_line_text, Toks[2].getKind());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000840 ASSERT_EQ(StringRef(" void *foo(const char *zzz = \"\\$\");"),
Dmitri Gribenko1669f702012-06-27 16:53:58 +0000841 Toks[2].getVerbatimLineText());
842 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000843
Dmitri Gribenko1669f702012-06-27 16:53:58 +0000844 ASSERT_EQ(tok::text, Toks[4].getKind());
845 ASSERT_EQ(StringRef(" Meow"), Toks[4].getText());
846 ASSERT_EQ(tok::newline, Toks[5].getKind());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000847
Dmitri Gribenko1669f702012-06-27 16:53:58 +0000848 ASSERT_EQ(tok::text, Toks[6].getKind());
849 ASSERT_EQ(StringRef(" "), Toks[6].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000850
Dmitri Gribenko1669f702012-06-27 16:53:58 +0000851 ASSERT_EQ(tok::newline, Toks[7].getKind());
852 ASSERT_EQ(tok::newline, Toks[8].getKind());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000853}
854
855TEST_F(CommentLexerTest, HTML1) {
856 const char *Source =
857 "// <";
858
859 std::vector<Token> Toks;
860
861 lexString(Source, Toks);
862
863 ASSERT_EQ(3U, Toks.size());
864
865 ASSERT_EQ(tok::text, Toks[0].getKind());
866 ASSERT_EQ(StringRef(" "), Toks[0].getText());
867
868 ASSERT_EQ(tok::text, Toks[1].getKind());
869 ASSERT_EQ(StringRef("<"), Toks[1].getText());
870
871 ASSERT_EQ(tok::newline, Toks[2].getKind());
872}
873
874TEST_F(CommentLexerTest, HTML2) {
Dmitri Gribenko632d58a2012-06-27 23:28:29 +0000875 const char *Source =
Dmitri Gribenko17709ae2012-07-09 21:32:40 +0000876 "// a<2";
877
878 std::vector<Token> Toks;
879
880 lexString(Source, Toks);
881
882 ASSERT_EQ(4U, Toks.size());
883
884 ASSERT_EQ(tok::text, Toks[0].getKind());
885 ASSERT_EQ(StringRef(" a"), Toks[0].getText());
886
887 ASSERT_EQ(tok::text, Toks[1].getKind());
888 ASSERT_EQ(StringRef("<"), Toks[1].getText());
889
890 ASSERT_EQ(tok::text, Toks[2].getKind());
891 ASSERT_EQ(StringRef("2"), Toks[2].getText());
892
893 ASSERT_EQ(tok::newline, Toks[3].getKind());
894}
895
896TEST_F(CommentLexerTest, HTML3) {
897 const char *Source =
Dmitri Gribenko107618a2012-08-22 22:56:08 +0000898 "// < img";
Dmitri Gribenko632d58a2012-06-27 23:28:29 +0000899
900 std::vector<Token> Toks;
901
902 lexString(Source, Toks);
903
904 ASSERT_EQ(4U, Toks.size());
905
906 ASSERT_EQ(tok::text, Toks[0].getKind());
907 ASSERT_EQ(StringRef(" "), Toks[0].getText());
908
909 ASSERT_EQ(tok::text, Toks[1].getKind());
910 ASSERT_EQ(StringRef("<"), Toks[1].getText());
911
912 ASSERT_EQ(tok::text, Toks[2].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +0000913 ASSERT_EQ(StringRef(" img"), Toks[2].getText());
Dmitri Gribenko632d58a2012-06-27 23:28:29 +0000914
915 ASSERT_EQ(tok::newline, Toks[3].getKind());
916}
917
Dmitri Gribenko17709ae2012-07-09 21:32:40 +0000918TEST_F(CommentLexerTest, HTML4) {
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000919 const char *Sources[] = {
Dmitri Gribenko107618a2012-08-22 22:56:08 +0000920 "// <img",
921 "// <img "
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000922 };
923
924 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
925 std::vector<Token> Toks;
926
927 lexString(Sources[i], Toks);
928
929 ASSERT_EQ(3U, Toks.size());
930
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +0000931 ASSERT_EQ(tok::text, Toks[0].getKind());
932 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000933
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +0000934 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +0000935 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000936
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +0000937 ASSERT_EQ(tok::newline, Toks[2].getKind());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000938 }
939}
940
Dmitri Gribenko17709ae2012-07-09 21:32:40 +0000941TEST_F(CommentLexerTest, HTML5) {
942 const char *Source =
Dmitri Gribenko107618a2012-08-22 22:56:08 +0000943 "// <img 42";
Dmitri Gribenko17709ae2012-07-09 21:32:40 +0000944
945 std::vector<Token> Toks;
946
947 lexString(Source, Toks);
948
949 ASSERT_EQ(4U, Toks.size());
950
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +0000951 ASSERT_EQ(tok::text, Toks[0].getKind());
952 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko17709ae2012-07-09 21:32:40 +0000953
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +0000954 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +0000955 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko17709ae2012-07-09 21:32:40 +0000956
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +0000957 ASSERT_EQ(tok::text, Toks[2].getKind());
958 ASSERT_EQ(StringRef("42"), Toks[2].getText());
Dmitri Gribenko17709ae2012-07-09 21:32:40 +0000959
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +0000960 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko17709ae2012-07-09 21:32:40 +0000961}
962
963TEST_F(CommentLexerTest, HTML6) {
Dmitri Gribenko107618a2012-08-22 22:56:08 +0000964 const char *Source = "// <img> Meow";
Dmitri Gribenko17709ae2012-07-09 21:32:40 +0000965
966 std::vector<Token> Toks;
967
968 lexString(Source, Toks);
969
970 ASSERT_EQ(5U, Toks.size());
971
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +0000972 ASSERT_EQ(tok::text, Toks[0].getKind());
973 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko17709ae2012-07-09 21:32:40 +0000974
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +0000975 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +0000976 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko17709ae2012-07-09 21:32:40 +0000977
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +0000978 ASSERT_EQ(tok::html_greater, Toks[2].getKind());
Dmitri Gribenko17709ae2012-07-09 21:32:40 +0000979
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +0000980 ASSERT_EQ(tok::text, Toks[3].getKind());
981 ASSERT_EQ(StringRef(" Meow"), Toks[3].getText());
Dmitri Gribenko17709ae2012-07-09 21:32:40 +0000982
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +0000983 ASSERT_EQ(tok::newline, Toks[4].getKind());
Dmitri Gribenko17709ae2012-07-09 21:32:40 +0000984}
985
986TEST_F(CommentLexerTest, HTML7) {
Dmitri Gribenko107618a2012-08-22 22:56:08 +0000987 const char *Source = "// <img=";
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000988
989 std::vector<Token> Toks;
990
991 lexString(Source, Toks);
992
993 ASSERT_EQ(4U, Toks.size());
994
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +0000995 ASSERT_EQ(tok::text, Toks[0].getKind());
996 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +0000997
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +0000998 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +0000999 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001000
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001001 ASSERT_EQ(tok::text, Toks[2].getKind());
1002 ASSERT_EQ(StringRef("="), Toks[2].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001003
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001004 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001005}
1006
Dmitri Gribenko17709ae2012-07-09 21:32:40 +00001007TEST_F(CommentLexerTest, HTML8) {
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001008 const char *Source = "// <img src=> Meow";
Dmitri Gribenko17709ae2012-07-09 21:32:40 +00001009
1010 std::vector<Token> Toks;
1011
1012 lexString(Source, Toks);
1013
1014 ASSERT_EQ(7U, Toks.size());
1015
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001016 ASSERT_EQ(tok::text, Toks[0].getKind());
1017 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko17709ae2012-07-09 21:32:40 +00001018
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001019 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001020 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko17709ae2012-07-09 21:32:40 +00001021
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001022 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001023 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko17709ae2012-07-09 21:32:40 +00001024
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001025 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
Dmitri Gribenko17709ae2012-07-09 21:32:40 +00001026
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001027 ASSERT_EQ(tok::html_greater, Toks[4].getKind());
Dmitri Gribenko17709ae2012-07-09 21:32:40 +00001028
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001029 ASSERT_EQ(tok::text, Toks[5].getKind());
1030 ASSERT_EQ(StringRef(" Meow"), Toks[5].getText());
Dmitri Gribenko17709ae2012-07-09 21:32:40 +00001031
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001032 ASSERT_EQ(tok::newline, Toks[6].getKind());
Dmitri Gribenko17709ae2012-07-09 21:32:40 +00001033}
1034
1035TEST_F(CommentLexerTest, HTML9) {
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001036 const char *Sources[] = {
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001037 "// <img src",
1038 "// <img src "
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001039 };
1040
1041 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1042 std::vector<Token> Toks;
1043
1044 lexString(Sources[i], Toks);
1045
1046 ASSERT_EQ(4U, Toks.size());
1047
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001048 ASSERT_EQ(tok::text, Toks[0].getKind());
1049 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001050
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001051 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001052 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001053
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001054 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001055 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001056
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001057 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001058 }
1059}
1060
Dmitri Gribenko17709ae2012-07-09 21:32:40 +00001061TEST_F(CommentLexerTest, HTML10) {
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001062 const char *Sources[] = {
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001063 "// <img src=",
1064 "// <img src ="
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001065 };
1066
1067 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1068 std::vector<Token> Toks;
1069
1070 lexString(Sources[i], Toks);
1071
1072 ASSERT_EQ(5U, Toks.size());
1073
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001074 ASSERT_EQ(tok::text, Toks[0].getKind());
1075 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001076
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001077 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001078 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001079
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001080 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001081 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001082
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001083 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001084
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001085 ASSERT_EQ(tok::newline, Toks[4].getKind());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001086 }
1087}
1088
Dmitri Gribenko17709ae2012-07-09 21:32:40 +00001089TEST_F(CommentLexerTest, HTML11) {
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001090 const char *Sources[] = {
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001091 "// <img src=\"",
1092 "// <img src = \"",
1093 "// <img src=\'",
1094 "// <img src = \'"
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001095 };
1096
1097 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1098 std::vector<Token> Toks;
1099
1100 lexString(Sources[i], Toks);
1101
1102 ASSERT_EQ(6U, Toks.size());
1103
1104 ASSERT_EQ(tok::text, Toks[0].getKind());
1105 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1106
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001107 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001108 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001109
1110 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001111 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001112
1113 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
1114
1115 ASSERT_EQ(tok::html_quoted_string, Toks[4].getKind());
1116 ASSERT_EQ(StringRef(""), Toks[4].getHTMLQuotedString());
1117
1118 ASSERT_EQ(tok::newline, Toks[5].getKind());
1119 }
1120}
1121
Dmitri Gribenko17709ae2012-07-09 21:32:40 +00001122TEST_F(CommentLexerTest, HTML12) {
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001123 const char *Source = "// <img src=@";
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001124
1125 std::vector<Token> Toks;
1126
1127 lexString(Source, Toks);
1128
1129 ASSERT_EQ(6U, Toks.size());
1130
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001131 ASSERT_EQ(tok::text, Toks[0].getKind());
1132 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001133
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001134 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001135 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001136
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001137 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001138 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001139
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001140 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001141
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001142 ASSERT_EQ(tok::text, Toks[4].getKind());
1143 ASSERT_EQ(StringRef("@"), Toks[4].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001144
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001145 ASSERT_EQ(tok::newline, Toks[5].getKind());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001146}
1147
Dmitri Gribenko17709ae2012-07-09 21:32:40 +00001148TEST_F(CommentLexerTest, HTML13) {
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001149 const char *Sources[] = {
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001150 "// <img src=\"val\\\"\\'val",
1151 "// <img src=\"val\\\"\\'val\"",
1152 "// <img src=\'val\\\"\\'val",
1153 "// <img src=\'val\\\"\\'val\'"
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001154 };
1155
1156 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1157 std::vector<Token> Toks;
1158
1159 lexString(Sources[i], Toks);
1160
1161 ASSERT_EQ(6U, Toks.size());
1162
1163 ASSERT_EQ(tok::text, Toks[0].getKind());
1164 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1165
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001166 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001167 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001168
1169 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001170 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001171
1172 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
1173
1174 ASSERT_EQ(tok::html_quoted_string, Toks[4].getKind());
1175 ASSERT_EQ(StringRef("val\\\"\\'val"), Toks[4].getHTMLQuotedString());
1176
1177 ASSERT_EQ(tok::newline, Toks[5].getKind());
1178 }
1179}
1180
Dmitri Gribenko17709ae2012-07-09 21:32:40 +00001181TEST_F(CommentLexerTest, HTML14) {
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001182 const char *Sources[] = {
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001183 "// <img src=\"val\\\"\\'val\">",
1184 "// <img src=\'val\\\"\\'val\'>"
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001185 };
1186
1187 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1188 std::vector<Token> Toks;
1189
1190 lexString(Sources[i], Toks);
1191
1192 ASSERT_EQ(7U, Toks.size());
1193
1194 ASSERT_EQ(tok::text, Toks[0].getKind());
1195 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1196
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001197 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001198 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001199
1200 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001201 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001202
1203 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
1204
1205 ASSERT_EQ(tok::html_quoted_string, Toks[4].getKind());
1206 ASSERT_EQ(StringRef("val\\\"\\'val"), Toks[4].getHTMLQuotedString());
1207
1208 ASSERT_EQ(tok::html_greater, Toks[5].getKind());
1209
1210 ASSERT_EQ(tok::newline, Toks[6].getKind());
1211 }
1212}
1213
Dmitri Gribenko17709ae2012-07-09 21:32:40 +00001214TEST_F(CommentLexerTest, HTML15) {
Dmitri Gribenkof26054f2012-07-11 21:38:39 +00001215 const char *Sources[] = {
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001216 "// <img/>",
1217 "// <img />"
Dmitri Gribenkof26054f2012-07-11 21:38:39 +00001218 };
1219
1220 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1221 std::vector<Token> Toks;
1222
1223 lexString(Sources[i], Toks);
1224
1225 ASSERT_EQ(4U, Toks.size());
1226
1227 ASSERT_EQ(tok::text, Toks[0].getKind());
1228 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1229
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001230 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001231 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenkof26054f2012-07-11 21:38:39 +00001232
1233 ASSERT_EQ(tok::html_slash_greater, Toks[2].getKind());
1234
1235 ASSERT_EQ(tok::newline, Toks[3].getKind());
1236 }
1237}
1238
1239TEST_F(CommentLexerTest, HTML16) {
1240 const char *Sources[] = {
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001241 "// <img/ Aaa",
1242 "// <img / Aaa"
Dmitri Gribenkof26054f2012-07-11 21:38:39 +00001243 };
1244
1245 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1246 std::vector<Token> Toks;
1247
1248 lexString(Sources[i], Toks);
1249
1250 ASSERT_EQ(5U, Toks.size());
1251
1252 ASSERT_EQ(tok::text, Toks[0].getKind());
1253 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1254
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001255 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001256 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenkof26054f2012-07-11 21:38:39 +00001257
1258 ASSERT_EQ(tok::text, Toks[2].getKind());
1259 ASSERT_EQ(StringRef("/"), Toks[2].getText());
1260
1261 ASSERT_EQ(tok::text, Toks[3].getKind());
1262 ASSERT_EQ(StringRef(" Aaa"), Toks[3].getText());
1263
1264 ASSERT_EQ(tok::newline, Toks[4].getKind());
1265 }
1266}
1267
1268TEST_F(CommentLexerTest, HTML17) {
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001269 const char *Source = "// </";
1270
1271 std::vector<Token> Toks;
1272
1273 lexString(Source, Toks);
1274
1275 ASSERT_EQ(3U, Toks.size());
1276
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001277 ASSERT_EQ(tok::text, Toks[0].getKind());
1278 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001279
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001280 ASSERT_EQ(tok::text, Toks[1].getKind());
1281 ASSERT_EQ(StringRef("</"), Toks[1].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001282
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001283 ASSERT_EQ(tok::newline, Toks[2].getKind());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001284}
1285
Dmitri Gribenkof26054f2012-07-11 21:38:39 +00001286TEST_F(CommentLexerTest, HTML18) {
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001287 const char *Source = "// </@";
1288
1289 std::vector<Token> Toks;
1290
1291 lexString(Source, Toks);
1292
1293 ASSERT_EQ(4U, Toks.size());
1294
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001295 ASSERT_EQ(tok::text, Toks[0].getKind());
1296 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001297
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001298 ASSERT_EQ(tok::text, Toks[1].getKind());
1299 ASSERT_EQ(StringRef("</"), Toks[1].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001300
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001301 ASSERT_EQ(tok::text, Toks[2].getKind());
1302 ASSERT_EQ(StringRef("@"), Toks[2].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001303
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001304 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001305}
1306
Dmitri Gribenkof26054f2012-07-11 21:38:39 +00001307TEST_F(CommentLexerTest, HTML19) {
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001308 const char *Source = "// </img";
Dmitri Gribenkoec925312012-07-06 00:28:32 +00001309
1310 std::vector<Token> Toks;
1311
1312 lexString(Source, Toks);
1313
1314 ASSERT_EQ(3U, Toks.size());
1315
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001316 ASSERT_EQ(tok::text, Toks[0].getKind());
1317 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenkoec925312012-07-06 00:28:32 +00001318
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001319 ASSERT_EQ(tok::html_end_tag, Toks[1].getKind());
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001320 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagEndName());
Dmitri Gribenkoec925312012-07-06 00:28:32 +00001321
Dmitri Gribenkoe00ffc72012-07-13 00:44:24 +00001322 ASSERT_EQ(tok::newline, Toks[2].getKind());
Dmitri Gribenkoec925312012-07-06 00:28:32 +00001323}
1324
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001325TEST_F(CommentLexerTest, NotAKnownHTMLTag1) {
1326 const char *Source = "// <tag>";
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001327
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001328 std::vector<Token> Toks;
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001329
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001330 lexString(Source, Toks);
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001331
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001332 ASSERT_EQ(4U, Toks.size());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001333
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001334 ASSERT_EQ(tok::text, Toks[0].getKind());
1335 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001336
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001337 ASSERT_EQ(tok::text, Toks[1].getKind());
1338 ASSERT_EQ(StringRef("<tag"), Toks[1].getText());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001339
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001340 ASSERT_EQ(tok::text, Toks[2].getKind());
1341 ASSERT_EQ(StringRef(">"), Toks[2].getText());
Dmitri Gribenkoec925312012-07-06 00:28:32 +00001342
Dmitri Gribenko107618a2012-08-22 22:56:08 +00001343 ASSERT_EQ(tok::newline, Toks[3].getKind());
1344}
1345
1346TEST_F(CommentLexerTest, NotAKnownHTMLTag2) {
1347 const char *Source = "// </tag>";
1348
1349 std::vector<Token> Toks;
1350
1351 lexString(Source, Toks);
1352
1353 ASSERT_EQ(4U, Toks.size());
1354
1355 ASSERT_EQ(tok::text, Toks[0].getKind());
1356 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1357
1358 ASSERT_EQ(tok::text, Toks[1].getKind());
1359 ASSERT_EQ(StringRef("</tag"), Toks[1].getText());
1360
1361 ASSERT_EQ(tok::text, Toks[2].getKind());
1362 ASSERT_EQ(StringRef(">"), Toks[2].getText());
1363
1364 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001365}
1366
Dmitri Gribenko4586df72012-07-27 20:37:06 +00001367TEST_F(CommentLexerTest, HTMLCharacterReferences1) {
1368 const char *Source = "// &";
1369
1370 std::vector<Token> Toks;
1371
1372 lexString(Source, Toks);
1373
1374 ASSERT_EQ(3U, Toks.size());
1375
1376 ASSERT_EQ(tok::text, Toks[0].getKind());
1377 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1378
1379 ASSERT_EQ(tok::text, Toks[1].getKind());
1380 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1381
1382 ASSERT_EQ(tok::newline, Toks[2].getKind());
1383}
1384
1385TEST_F(CommentLexerTest, HTMLCharacterReferences2) {
1386 const char *Source = "// &!";
1387
1388 std::vector<Token> Toks;
1389
1390 lexString(Source, Toks);
1391
1392 ASSERT_EQ(4U, Toks.size());
1393
1394 ASSERT_EQ(tok::text, Toks[0].getKind());
1395 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1396
1397 ASSERT_EQ(tok::text, Toks[1].getKind());
1398 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1399
1400 ASSERT_EQ(tok::text, Toks[2].getKind());
1401 ASSERT_EQ(StringRef("!"), Toks[2].getText());
1402
1403 ASSERT_EQ(tok::newline, Toks[3].getKind());
1404}
1405
1406TEST_F(CommentLexerTest, HTMLCharacterReferences3) {
1407 const char *Source = "// &amp";
1408
1409 std::vector<Token> Toks;
1410
1411 lexString(Source, Toks);
1412
1413 ASSERT_EQ(3U, Toks.size());
1414
1415 ASSERT_EQ(tok::text, Toks[0].getKind());
1416 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1417
1418 ASSERT_EQ(tok::text, Toks[1].getKind());
1419 ASSERT_EQ(StringRef("&amp"), Toks[1].getText());
1420
1421 ASSERT_EQ(tok::newline, Toks[2].getKind());
1422}
1423
1424TEST_F(CommentLexerTest, HTMLCharacterReferences4) {
1425 const char *Source = "// &amp!";
1426
1427 std::vector<Token> Toks;
1428
1429 lexString(Source, Toks);
1430
1431 ASSERT_EQ(4U, Toks.size());
1432
1433 ASSERT_EQ(tok::text, Toks[0].getKind());
1434 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1435
1436 ASSERT_EQ(tok::text, Toks[1].getKind());
1437 ASSERT_EQ(StringRef("&amp"), Toks[1].getText());
1438
1439 ASSERT_EQ(tok::text, Toks[2].getKind());
1440 ASSERT_EQ(StringRef("!"), Toks[2].getText());
1441
1442 ASSERT_EQ(tok::newline, Toks[3].getKind());
1443}
1444
1445TEST_F(CommentLexerTest, HTMLCharacterReferences5) {
1446 const char *Source = "// &#";
1447
1448 std::vector<Token> Toks;
1449
1450 lexString(Source, Toks);
1451
1452 ASSERT_EQ(3U, Toks.size());
1453
1454 ASSERT_EQ(tok::text, Toks[0].getKind());
1455 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1456
1457 ASSERT_EQ(tok::text, Toks[1].getKind());
1458 ASSERT_EQ(StringRef("&#"), Toks[1].getText());
1459
1460 ASSERT_EQ(tok::newline, Toks[2].getKind());
1461}
1462
1463TEST_F(CommentLexerTest, HTMLCharacterReferences6) {
1464 const char *Source = "// &#a";
1465
1466 std::vector<Token> Toks;
1467
1468 lexString(Source, Toks);
1469
1470 ASSERT_EQ(4U, Toks.size());
1471
1472 ASSERT_EQ(tok::text, Toks[0].getKind());
1473 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1474
1475 ASSERT_EQ(tok::text, Toks[1].getKind());
1476 ASSERT_EQ(StringRef("&#"), Toks[1].getText());
1477
1478 ASSERT_EQ(tok::text, Toks[2].getKind());
1479 ASSERT_EQ(StringRef("a"), Toks[2].getText());
1480
1481 ASSERT_EQ(tok::newline, Toks[3].getKind());
1482}
1483
1484TEST_F(CommentLexerTest, HTMLCharacterReferences7) {
1485 const char *Source = "// &#42";
1486
1487 std::vector<Token> Toks;
1488
1489 lexString(Source, Toks);
1490
1491 ASSERT_EQ(3U, Toks.size());
1492
1493 ASSERT_EQ(tok::text, Toks[0].getKind());
1494 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1495
1496 ASSERT_EQ(tok::text, Toks[1].getKind());
1497 ASSERT_EQ(StringRef("&#42"), Toks[1].getText());
1498
1499 ASSERT_EQ(tok::newline, Toks[2].getKind());
1500}
1501
1502TEST_F(CommentLexerTest, HTMLCharacterReferences8) {
1503 const char *Source = "// &#42a";
1504
1505 std::vector<Token> Toks;
1506
1507 lexString(Source, Toks);
1508
1509 ASSERT_EQ(4U, Toks.size());
1510
1511 ASSERT_EQ(tok::text, Toks[0].getKind());
1512 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1513
1514 ASSERT_EQ(tok::text, Toks[1].getKind());
1515 ASSERT_EQ(StringRef("&#42"), Toks[1].getText());
1516
1517 ASSERT_EQ(tok::text, Toks[2].getKind());
1518 ASSERT_EQ(StringRef("a"), Toks[2].getText());
1519
1520 ASSERT_EQ(tok::newline, Toks[3].getKind());
1521}
1522
1523TEST_F(CommentLexerTest, HTMLCharacterReferences9) {
1524 const char *Source = "// &#x";
1525
1526 std::vector<Token> Toks;
1527
1528 lexString(Source, Toks);
1529
1530 ASSERT_EQ(3U, Toks.size());
1531
1532 ASSERT_EQ(tok::text, Toks[0].getKind());
1533 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1534
1535 ASSERT_EQ(tok::text, Toks[1].getKind());
1536 ASSERT_EQ(StringRef("&#x"), Toks[1].getText());
1537
1538 ASSERT_EQ(tok::newline, Toks[2].getKind());
1539}
1540
1541TEST_F(CommentLexerTest, HTMLCharacterReferences10) {
1542 const char *Source = "// &#xz";
1543
1544 std::vector<Token> Toks;
1545
1546 lexString(Source, Toks);
1547
1548 ASSERT_EQ(4U, Toks.size());
1549
1550 ASSERT_EQ(tok::text, Toks[0].getKind());
1551 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1552
1553 ASSERT_EQ(tok::text, Toks[1].getKind());
1554 ASSERT_EQ(StringRef("&#x"), Toks[1].getText());
1555
1556 ASSERT_EQ(tok::text, Toks[2].getKind());
1557 ASSERT_EQ(StringRef("z"), Toks[2].getText());
1558
1559 ASSERT_EQ(tok::newline, Toks[3].getKind());
1560}
1561
1562TEST_F(CommentLexerTest, HTMLCharacterReferences11) {
1563 const char *Source = "// &#xab";
1564
1565 std::vector<Token> Toks;
1566
1567 lexString(Source, Toks);
1568
1569 ASSERT_EQ(3U, Toks.size());
1570
1571 ASSERT_EQ(tok::text, Toks[0].getKind());
1572 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1573
1574 ASSERT_EQ(tok::text, Toks[1].getKind());
1575 ASSERT_EQ(StringRef("&#xab"), Toks[1].getText());
1576
1577 ASSERT_EQ(tok::newline, Toks[2].getKind());
1578}
1579
1580TEST_F(CommentLexerTest, HTMLCharacterReferences12) {
1581 const char *Source = "// &#xaBz";
1582
1583 std::vector<Token> Toks;
1584
1585 lexString(Source, Toks);
1586
1587 ASSERT_EQ(4U, Toks.size());
1588
1589 ASSERT_EQ(tok::text, Toks[0].getKind());
1590 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1591
1592 ASSERT_EQ(tok::text, Toks[1].getKind());
1593 ASSERT_EQ(StringRef("&#xaB"), Toks[1].getText());
1594
1595 ASSERT_EQ(tok::text, Toks[2].getKind());
1596 ASSERT_EQ(StringRef("z"), Toks[2].getText());
1597
1598 ASSERT_EQ(tok::newline, Toks[3].getKind());
1599}
1600
1601TEST_F(CommentLexerTest, HTMLCharacterReferences13) {
1602 const char *Source = "// &amp;";
1603
1604 std::vector<Token> Toks;
1605
1606 lexString(Source, Toks);
1607
1608 ASSERT_EQ(3U, Toks.size());
1609
1610 ASSERT_EQ(tok::text, Toks[0].getKind());
1611 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1612
1613 ASSERT_EQ(tok::text, Toks[1].getKind());
1614 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1615
1616 ASSERT_EQ(tok::newline, Toks[2].getKind());
1617}
1618
1619TEST_F(CommentLexerTest, HTMLCharacterReferences14) {
1620 const char *Source = "// &amp;&lt;";
1621
1622 std::vector<Token> Toks;
1623
1624 lexString(Source, Toks);
1625
1626 ASSERT_EQ(4U, Toks.size());
1627
1628 ASSERT_EQ(tok::text, Toks[0].getKind());
1629 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1630
1631 ASSERT_EQ(tok::text, Toks[1].getKind());
1632 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1633
1634 ASSERT_EQ(tok::text, Toks[2].getKind());
1635 ASSERT_EQ(StringRef("<"), Toks[2].getText());
1636
1637 ASSERT_EQ(tok::newline, Toks[3].getKind());
1638}
1639
1640TEST_F(CommentLexerTest, HTMLCharacterReferences15) {
1641 const char *Source = "// &amp; meow";
1642
1643 std::vector<Token> Toks;
1644
1645 lexString(Source, Toks);
1646
1647 ASSERT_EQ(4U, Toks.size());
1648
1649 ASSERT_EQ(tok::text, Toks[0].getKind());
1650 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1651
1652 ASSERT_EQ(tok::text, Toks[1].getKind());
1653 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1654
1655 ASSERT_EQ(tok::text, Toks[2].getKind());
1656 ASSERT_EQ(StringRef(" meow"), Toks[2].getText());
1657
1658 ASSERT_EQ(tok::newline, Toks[3].getKind());
1659}
1660
1661TEST_F(CommentLexerTest, HTMLCharacterReferences16) {
1662 const char *Sources[] = {
1663 "// &#61;",
1664 "// &#x3d;",
1665 "// &#X3d;"
1666 };
1667
1668 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1669 std::vector<Token> Toks;
1670
1671 lexString(Sources[i], Toks);
1672
1673 ASSERT_EQ(3U, Toks.size());
1674
1675 ASSERT_EQ(tok::text, Toks[0].getKind());
1676 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1677
1678 ASSERT_EQ(tok::text, Toks[1].getKind());
1679 ASSERT_EQ(StringRef("="), Toks[1].getText());
1680
1681 ASSERT_EQ(tok::newline, Toks[2].getKind());
1682 }
1683}
1684
Dmitri Gribenko5188c4b2012-06-26 20:39:18 +00001685TEST_F(CommentLexerTest, MultipleComments) {
1686 const char *Source =
1687 "// Aaa\n"
1688 "/// Bbb\n"
1689 "/* Ccc\n"
1690 " * Ddd*/\n"
1691 "/** Eee*/";
1692
1693 std::vector<Token> Toks;
1694
1695 lexString(Source, Toks);
1696
1697 ASSERT_EQ(12U, Toks.size());
1698
1699 ASSERT_EQ(tok::text, Toks[0].getKind());
1700 ASSERT_EQ(StringRef(" Aaa"), Toks[0].getText());
1701 ASSERT_EQ(tok::newline, Toks[1].getKind());
1702
1703 ASSERT_EQ(tok::text, Toks[2].getKind());
1704 ASSERT_EQ(StringRef(" Bbb"), Toks[2].getText());
1705 ASSERT_EQ(tok::newline, Toks[3].getKind());
1706
1707 ASSERT_EQ(tok::text, Toks[4].getKind());
1708 ASSERT_EQ(StringRef(" Ccc"), Toks[4].getText());
1709 ASSERT_EQ(tok::newline, Toks[5].getKind());
1710
1711 ASSERT_EQ(tok::text, Toks[6].getKind());
1712 ASSERT_EQ(StringRef(" Ddd"), Toks[6].getText());
1713 ASSERT_EQ(tok::newline, Toks[7].getKind());
1714 ASSERT_EQ(tok::newline, Toks[8].getKind());
1715
1716 ASSERT_EQ(tok::text, Toks[9].getKind());
1717 ASSERT_EQ(StringRef(" Eee"), Toks[9].getText());
1718
1719 ASSERT_EQ(tok::newline, Toks[10].getKind());
1720 ASSERT_EQ(tok::newline, Toks[11].getKind());
1721}
1722
1723} // end namespace comments
1724} // end namespace clang
1725