blob: c496176a36a3829ce73750b87f08a1cf82b7d46f [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
Chandler Carruth1050e8b2012-12-04 09:45:34 +000010#include "clang/AST/CommentLexer.h"
Chandler Carruth1050e8b2012-12-04 09:45:34 +000011#include "clang/AST/CommentCommandTraits.h"
Dmitri Gribenko2d44d772012-06-26 20:39:18 +000012#include "clang/Basic/Diagnostic.h"
Douglas Gregor3aeb34f2012-10-23 22:38:58 +000013#include "clang/Basic/DiagnosticOptions.h"
Chandler Carruth1050e8b2012-12-04 09:45:34 +000014#include "clang/Basic/FileManager.h"
Chandler Carruth7cc315c2012-12-04 09:53:37 +000015#include "clang/Basic/SourceManager.h"
Dmitri Gribenko2d44d772012-06-26 20:39:18 +000016#include "llvm/ADT/STLExtras.h"
Dmitri Gribenko2d44d772012-06-26 20:39:18 +000017#include "gtest/gtest.h"
Chandler Carruth1050e8b2012-12-04 09:45:34 +000018#include <vector>
Dmitri Gribenko2d44d772012-06-26 20:39:18 +000019
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()),
Douglas Gregor8e023612012-10-23 22:31:51 +000032 Diags(DiagID, new DiagnosticOptions, new IgnoringDiagConsumer()),
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +000033 SourceMgr(Diags, FileMgr),
34 Traits(Allocator) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +000035 }
36
37 FileSystemOptions FileMgrOpts;
38 FileManager FileMgr;
39 IntrusiveRefCntPtr<DiagnosticIDs> DiagID;
40 DiagnosticsEngine Diags;
41 SourceManager SourceMgr;
Dmitri Gribenko477a9f52012-07-27 20:37:06 +000042 llvm::BumpPtrAllocator Allocator;
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +000043 CommandTraits Traits;
Dmitri Gribenko2d44d772012-06-26 20:39:18 +000044
45 void lexString(const char *Source, std::vector<Token> &Toks);
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +000046
47 StringRef getCommandName(const Token &Tok) {
48 return Traits.getCommandInfo(Tok.getCommandID())->Name;
49 }
50
51 StringRef getVerbatimBlockName(const Token &Tok) {
52 return Traits.getCommandInfo(Tok.getVerbatimBlockID())->Name;
53 }
54
55 StringRef getVerbatimLineName(const Token &Tok) {
56 return Traits.getCommandInfo(Tok.getVerbatimLineID())->Name;
57 }
Dmitri Gribenko2d44d772012-06-26 20:39:18 +000058};
59
60void CommentLexerTest::lexString(const char *Source,
61 std::vector<Token> &Toks) {
62 MemoryBuffer *Buf = MemoryBuffer::getMemBuffer(Source);
63 FileID File = SourceMgr.createFileIDForMemBuffer(Buf);
64 SourceLocation Begin = SourceMgr.getLocForStartOfFile(File);
65
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +000066 Lexer L(Allocator, Traits, Begin, Source, Source + strlen(Source));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +000067
68 while (1) {
69 Token Tok;
70 L.lex(Tok);
71 if (Tok.is(tok::eof))
72 break;
73 Toks.push_back(Tok);
74 }
75}
76
77} // unnamed namespace
78
79// Empty source range should be handled.
80TEST_F(CommentLexerTest, Basic1) {
81 const char *Source = "";
82 std::vector<Token> Toks;
83
84 lexString(Source, Toks);
85
86 ASSERT_EQ(0U, Toks.size());
87}
88
89// Empty comments should be handled.
90TEST_F(CommentLexerTest, Basic2) {
91 const char *Sources[] = {
92 "//", "///", "//!", "///<", "//!<"
93 };
94 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
95 std::vector<Token> Toks;
96
97 lexString(Sources[i], Toks);
98
99 ASSERT_EQ(1U, Toks.size());
100
101 ASSERT_EQ(tok::newline, Toks[0].getKind());
102 }
103}
104
105// Empty comments should be handled.
106TEST_F(CommentLexerTest, Basic3) {
107 const char *Sources[] = {
108 "/**/", "/***/", "/*!*/", "/**<*/", "/*!<*/"
109 };
110 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
111 std::vector<Token> Toks;
112
113 lexString(Sources[i], Toks);
114
115 ASSERT_EQ(2U, Toks.size());
116
117 ASSERT_EQ(tok::newline, Toks[0].getKind());
118 ASSERT_EQ(tok::newline, Toks[1].getKind());
119 }
120}
121
122// Single comment with plain text.
123TEST_F(CommentLexerTest, Basic4) {
124 const char *Sources[] = {
125 "// Meow", "/// Meow", "//! Meow",
126 "// Meow\n", "// Meow\r\n", "//! Meow\r",
127 };
128
129 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
130 std::vector<Token> Toks;
131
132 lexString(Sources[i], Toks);
133
134 ASSERT_EQ(2U, Toks.size());
135
136 ASSERT_EQ(tok::text, Toks[0].getKind());
137 ASSERT_EQ(StringRef(" Meow"), Toks[0].getText());
138
139 ASSERT_EQ(tok::newline, Toks[1].getKind());
140 }
141}
142
143// Single comment with plain text.
144TEST_F(CommentLexerTest, Basic5) {
145 const char *Sources[] = {
146 "/* Meow*/", "/** Meow*/", "/*! Meow*/"
147 };
148
149 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
150 std::vector<Token> Toks;
151
152 lexString(Sources[i], Toks);
153
154 ASSERT_EQ(3U, Toks.size());
155
156 ASSERT_EQ(tok::text, Toks[0].getKind());
157 ASSERT_EQ(StringRef(" Meow"), Toks[0].getText());
158
159 ASSERT_EQ(tok::newline, Toks[1].getKind());
160 ASSERT_EQ(tok::newline, Toks[2].getKind());
161 }
162}
163
164// Test newline escaping.
165TEST_F(CommentLexerTest, Basic6) {
166 const char *Sources[] = {
167 "// Aaa\\\n" " Bbb\\ \n" " Ccc?" "?/\n",
168 "// Aaa\\\r\n" " Bbb\\ \r\n" " Ccc?" "?/\r\n",
169 "// Aaa\\\r" " Bbb\\ \r" " Ccc?" "?/\r"
170 };
171
172 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
173 std::vector<Token> Toks;
174
175 lexString(Sources[i], Toks);
176
177 ASSERT_EQ(10U, Toks.size());
178
179 ASSERT_EQ(tok::text, Toks[0].getKind());
180 ASSERT_EQ(StringRef(" Aaa"), Toks[0].getText());
181 ASSERT_EQ(tok::text, Toks[1].getKind());
182 ASSERT_EQ(StringRef("\\"), Toks[1].getText());
183 ASSERT_EQ(tok::newline, Toks[2].getKind());
184
185 ASSERT_EQ(tok::text, Toks[3].getKind());
186 ASSERT_EQ(StringRef(" Bbb"), Toks[3].getText());
187 ASSERT_EQ(tok::text, Toks[4].getKind());
188 ASSERT_EQ(StringRef("\\"), Toks[4].getText());
189 ASSERT_EQ(tok::text, Toks[5].getKind());
190 ASSERT_EQ(StringRef(" "), Toks[5].getText());
191 ASSERT_EQ(tok::newline, Toks[6].getKind());
192
193 ASSERT_EQ(tok::text, Toks[7].getKind());
194 ASSERT_EQ(StringRef(" Ccc?" "?/"), Toks[7].getText());
195 ASSERT_EQ(tok::newline, Toks[8].getKind());
196
197 ASSERT_EQ(tok::newline, Toks[9].getKind());
198 }
199}
200
201// Check that we skip C-style aligned stars correctly.
202TEST_F(CommentLexerTest, Basic7) {
203 const char *Source =
204 "/* Aaa\n"
205 " * Bbb\r\n"
206 "\t* Ccc\n"
207 " ! Ddd\n"
208 " * Eee\n"
209 " ** Fff\n"
210 " */";
211 std::vector<Token> Toks;
212
213 lexString(Source, Toks);
214
215 ASSERT_EQ(15U, Toks.size());
216
217 ASSERT_EQ(tok::text, Toks[0].getKind());
218 ASSERT_EQ(StringRef(" Aaa"), Toks[0].getText());
219 ASSERT_EQ(tok::newline, Toks[1].getKind());
220
221 ASSERT_EQ(tok::text, Toks[2].getKind());
222 ASSERT_EQ(StringRef(" Bbb"), Toks[2].getText());
223 ASSERT_EQ(tok::newline, Toks[3].getKind());
224
225 ASSERT_EQ(tok::text, Toks[4].getKind());
226 ASSERT_EQ(StringRef(" Ccc"), Toks[4].getText());
227 ASSERT_EQ(tok::newline, Toks[5].getKind());
228
229 ASSERT_EQ(tok::text, Toks[6].getKind());
230 ASSERT_EQ(StringRef(" ! Ddd"), Toks[6].getText());
231 ASSERT_EQ(tok::newline, Toks[7].getKind());
232
233 ASSERT_EQ(tok::text, Toks[8].getKind());
234 ASSERT_EQ(StringRef(" Eee"), Toks[8].getText());
235 ASSERT_EQ(tok::newline, Toks[9].getKind());
236
237 ASSERT_EQ(tok::text, Toks[10].getKind());
238 ASSERT_EQ(StringRef("* Fff"), Toks[10].getText());
239 ASSERT_EQ(tok::newline, Toks[11].getKind());
240
241 ASSERT_EQ(tok::text, Toks[12].getKind());
242 ASSERT_EQ(StringRef(" "), Toks[12].getText());
243
244 ASSERT_EQ(tok::newline, Toks[13].getKind());
245 ASSERT_EQ(tok::newline, Toks[14].getKind());
246}
247
248// A command marker followed by comment end.
249TEST_F(CommentLexerTest, DoxygenCommand1) {
250 const char *Sources[] = { "//@", "///@", "//!@" };
251 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
252 std::vector<Token> Toks;
253
254 lexString(Sources[i], Toks);
255
256 ASSERT_EQ(2U, Toks.size());
257
258 ASSERT_EQ(tok::text, Toks[0].getKind());
259 ASSERT_EQ(StringRef("@"), Toks[0].getText());
260
261 ASSERT_EQ(tok::newline, Toks[1].getKind());
262 }
263}
264
265// A command marker followed by comment end.
266TEST_F(CommentLexerTest, DoxygenCommand2) {
267 const char *Sources[] = { "/*@*/", "/**@*/", "/*!@*/"};
268 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
269 std::vector<Token> Toks;
270
271 lexString(Sources[i], Toks);
272
273 ASSERT_EQ(3U, Toks.size());
274
275 ASSERT_EQ(tok::text, Toks[0].getKind());
276 ASSERT_EQ(StringRef("@"), Toks[0].getText());
277
278 ASSERT_EQ(tok::newline, Toks[1].getKind());
279 ASSERT_EQ(tok::newline, Toks[2].getKind());
280 }
281}
282
283// A command marker followed by comment end.
284TEST_F(CommentLexerTest, DoxygenCommand3) {
285 const char *Sources[] = { "/*\\*/", "/**\\*/" };
286 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
287 std::vector<Token> Toks;
288
289 lexString(Sources[i], Toks);
290
291 ASSERT_EQ(3U, Toks.size());
292
293 ASSERT_EQ(tok::text, Toks[0].getKind());
294 ASSERT_EQ(StringRef("\\"), Toks[0].getText());
295
296 ASSERT_EQ(tok::newline, Toks[1].getKind());
297 ASSERT_EQ(tok::newline, Toks[2].getKind());
298 }
299}
300
301// Doxygen escape sequences.
302TEST_F(CommentLexerTest, DoxygenCommand4) {
303 const char *Source =
304 "/// \\\\ \\@ \\& \\$ \\# \\< \\> \\% \\\" \\. \\::";
305 const char *Text[] = {
306 " ",
307 "\\", " ", "@", " ", "&", " ", "$", " ", "#", " ",
308 "<", " ", ">", " ", "%", " ", "\"", " ", ".", " ",
309 "::", ""
310 };
311
312 std::vector<Token> Toks;
313
314 lexString(Source, Toks);
315
316 ASSERT_EQ(array_lengthof(Text), Toks.size());
317
318 for (size_t i = 0, e = Toks.size(); i != e; i++) {
319 if(Toks[i].is(tok::text))
320 ASSERT_EQ(StringRef(Text[i]), Toks[i].getText())
321 << "index " << i;
322 }
323}
324
Dmitri Gribenko8c05da32012-09-14 16:35:35 +0000325// A command marker followed by a non-letter that is not a part of an escape
326// sequence.
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000327TEST_F(CommentLexerTest, DoxygenCommand5) {
Dmitri Gribenko8c05da32012-09-14 16:35:35 +0000328 const char *Source = "/// \\^ \\0";
329 std::vector<Token> Toks;
330
331 lexString(Source, Toks);
332
333 ASSERT_EQ(6U, Toks.size());
334
335 ASSERT_EQ(tok::text, Toks[0].getKind());
336 ASSERT_EQ(StringRef(" "), Toks[0].getText());
337
338 ASSERT_EQ(tok::text, Toks[1].getKind());
339 ASSERT_EQ(StringRef("\\"), Toks[1].getText());
340
341 ASSERT_EQ(tok::text, Toks[2].getKind());
342 ASSERT_EQ(StringRef("^ "), Toks[2].getText());
343
344 ASSERT_EQ(tok::text, Toks[3].getKind());
345 ASSERT_EQ(StringRef("\\"), Toks[3].getText());
346
347 ASSERT_EQ(tok::text, Toks[4].getKind());
348 ASSERT_EQ(StringRef("0"), Toks[4].getText());
349
350 ASSERT_EQ(tok::newline, Toks[5].getKind());
351}
352
353TEST_F(CommentLexerTest, DoxygenCommand6) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000354 const char *Source = "/// \\brief Aaa.";
355 std::vector<Token> Toks;
356
357 lexString(Source, Toks);
358
359 ASSERT_EQ(4U, Toks.size());
360
361 ASSERT_EQ(tok::text, Toks[0].getKind());
362 ASSERT_EQ(StringRef(" "), Toks[0].getText());
363
364 ASSERT_EQ(tok::command, Toks[1].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000365 ASSERT_EQ(StringRef("brief"), getCommandName(Toks[1]));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000366
367 ASSERT_EQ(tok::text, Toks[2].getKind());
368 ASSERT_EQ(StringRef(" Aaa."), Toks[2].getText());
369
370 ASSERT_EQ(tok::newline, Toks[3].getKind());
371}
372
Dmitri Gribenko8c05da32012-09-14 16:35:35 +0000373TEST_F(CommentLexerTest, DoxygenCommand7) {
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000374 const char *Source = "/// \\em\\em \\em\t\\em\n";
375 std::vector<Token> Toks;
376
377 lexString(Source, Toks);
378
379 ASSERT_EQ(8U, Toks.size());
380
381 ASSERT_EQ(tok::text, Toks[0].getKind());
382 ASSERT_EQ(StringRef(" "), Toks[0].getText());
383
384 ASSERT_EQ(tok::command, Toks[1].getKind());
385 ASSERT_EQ(StringRef("em"), getCommandName(Toks[1]));
386
387 ASSERT_EQ(tok::command, Toks[2].getKind());
388 ASSERT_EQ(StringRef("em"), getCommandName(Toks[2]));
389
390 ASSERT_EQ(tok::text, Toks[3].getKind());
391 ASSERT_EQ(StringRef(" "), Toks[3].getText());
392
393 ASSERT_EQ(tok::command, Toks[4].getKind());
394 ASSERT_EQ(StringRef("em"), getCommandName(Toks[4]));
395
396 ASSERT_EQ(tok::text, Toks[5].getKind());
397 ASSERT_EQ(StringRef("\t"), Toks[5].getText());
398
399 ASSERT_EQ(tok::command, Toks[6].getKind());
400 ASSERT_EQ(StringRef("em"), getCommandName(Toks[6]));
401
402 ASSERT_EQ(tok::newline, Toks[7].getKind());
403}
404
Dmitri Gribenko8c05da32012-09-14 16:35:35 +0000405TEST_F(CommentLexerTest, DoxygenCommand8) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000406 const char *Source = "/// \\aaa\\bbb \\ccc\t\\ddd\n";
407 std::vector<Token> Toks;
408
409 lexString(Source, Toks);
410
411 ASSERT_EQ(8U, Toks.size());
412
413 ASSERT_EQ(tok::text, Toks[0].getKind());
414 ASSERT_EQ(StringRef(" "), Toks[0].getText());
415
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000416 ASSERT_EQ(tok::unknown_command, Toks[1].getKind());
417 ASSERT_EQ(StringRef("aaa"), Toks[1].getUnknownCommandName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000418
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000419 ASSERT_EQ(tok::unknown_command, Toks[2].getKind());
420 ASSERT_EQ(StringRef("bbb"), Toks[2].getUnknownCommandName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000421
422 ASSERT_EQ(tok::text, Toks[3].getKind());
423 ASSERT_EQ(StringRef(" "), Toks[3].getText());
424
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000425 ASSERT_EQ(tok::unknown_command, Toks[4].getKind());
426 ASSERT_EQ(StringRef("ccc"), Toks[4].getUnknownCommandName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000427
428 ASSERT_EQ(tok::text, Toks[5].getKind());
429 ASSERT_EQ(StringRef("\t"), Toks[5].getText());
430
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000431 ASSERT_EQ(tok::unknown_command, Toks[6].getKind());
432 ASSERT_EQ(StringRef("ddd"), Toks[6].getUnknownCommandName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000433
434 ASSERT_EQ(tok::newline, Toks[7].getKind());
435}
436
Dmitri Gribenko8c05da32012-09-14 16:35:35 +0000437TEST_F(CommentLexerTest, DoxygenCommand9) {
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000438 const char *Source = "// \\c\n";
439 std::vector<Token> Toks;
440
441 lexString(Source, Toks);
442
443 ASSERT_EQ(3U, Toks.size());
444
445 ASSERT_EQ(tok::text, Toks[0].getKind());
446 ASSERT_EQ(StringRef(" "), Toks[0].getText());
447
448 ASSERT_EQ(tok::command, Toks[1].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000449 ASSERT_EQ(StringRef("c"), getCommandName(Toks[1]));
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000450
451 ASSERT_EQ(tok::newline, Toks[2].getKind());
452}
453
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000454// Empty verbatim block.
455TEST_F(CommentLexerTest, VerbatimBlock1) {
456 const char *Sources[] = {
457 "/// \\verbatim\\endverbatim\n//",
458 "/** \\verbatim\\endverbatim*/"
459 };
460
461 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
462 std::vector<Token> Toks;
463
464 lexString(Sources[i], Toks);
465
466 ASSERT_EQ(5U, Toks.size());
467
468 ASSERT_EQ(tok::text, Toks[0].getKind());
469 ASSERT_EQ(StringRef(" "), Toks[0].getText());
470
471 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000472 ASSERT_EQ(StringRef("verbatim"), getVerbatimBlockName(Toks[1]));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000473
474 ASSERT_EQ(tok::verbatim_block_end, Toks[2].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000475 ASSERT_EQ(StringRef("endverbatim"), getVerbatimBlockName(Toks[2]));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000476
477 ASSERT_EQ(tok::newline, Toks[3].getKind());
478 ASSERT_EQ(tok::newline, Toks[4].getKind());
479 }
480}
481
482// Empty verbatim block without an end command.
483TEST_F(CommentLexerTest, VerbatimBlock2) {
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000484 const char *Source = "/// \\verbatim";
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000485
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000486 std::vector<Token> Toks;
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000487
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000488 lexString(Source, Toks);
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000489
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000490 ASSERT_EQ(3U, Toks.size());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000491
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000492 ASSERT_EQ(tok::text, Toks[0].getKind());
493 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000494
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000495 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000496 ASSERT_EQ(StringRef("verbatim"), getVerbatimBlockName(Toks[1]));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000497
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000498 ASSERT_EQ(tok::newline, Toks[2].getKind());
499}
500
501// Empty verbatim block without an end command.
502TEST_F(CommentLexerTest, VerbatimBlock3) {
503 const char *Source = "/** \\verbatim*/";
504
505 std::vector<Token> Toks;
506
507 lexString(Source, Toks);
508
509 ASSERT_EQ(4U, Toks.size());
510
511 ASSERT_EQ(tok::text, Toks[0].getKind());
512 ASSERT_EQ(StringRef(" "), Toks[0].getText());
513
514 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000515 ASSERT_EQ(StringRef("verbatim"), getVerbatimBlockName(Toks[1]));
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000516
517 ASSERT_EQ(tok::newline, Toks[2].getKind());
518 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000519}
520
521// Single-line verbatim block.
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000522TEST_F(CommentLexerTest, VerbatimBlock4) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000523 const char *Sources[] = {
524 "/// Meow \\verbatim aaa \\endverbatim\n//",
525 "/** Meow \\verbatim aaa \\endverbatim*/"
526 };
527
528 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
529 std::vector<Token> Toks;
530
531 lexString(Sources[i], Toks);
532
533 ASSERT_EQ(6U, Toks.size());
534
535 ASSERT_EQ(tok::text, Toks[0].getKind());
536 ASSERT_EQ(StringRef(" Meow "), Toks[0].getText());
537
538 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000539 ASSERT_EQ(StringRef("verbatim"), getVerbatimBlockName(Toks[1]));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000540
541 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
542 ASSERT_EQ(StringRef(" aaa "), Toks[2].getVerbatimBlockText());
543
544 ASSERT_EQ(tok::verbatim_block_end, Toks[3].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000545 ASSERT_EQ(StringRef("endverbatim"), getVerbatimBlockName(Toks[3]));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000546
547 ASSERT_EQ(tok::newline, Toks[4].getKind());
548 ASSERT_EQ(tok::newline, Toks[5].getKind());
549 }
550}
551
552// Single-line verbatim block without an end command.
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000553TEST_F(CommentLexerTest, VerbatimBlock5) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000554 const char *Sources[] = {
555 "/// Meow \\verbatim aaa \n//",
556 "/** Meow \\verbatim aaa */"
557 };
558
559 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
560 std::vector<Token> Toks;
561
562 lexString(Sources[i], Toks);
563
564 ASSERT_EQ(5U, Toks.size());
565
566 ASSERT_EQ(tok::text, Toks[0].getKind());
567 ASSERT_EQ(StringRef(" Meow "), Toks[0].getText());
568
569 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000570 ASSERT_EQ(StringRef("verbatim"), getVerbatimBlockName(Toks[1]));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000571
572 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
573 ASSERT_EQ(StringRef(" aaa "), Toks[2].getVerbatimBlockText());
574
575 ASSERT_EQ(tok::newline, Toks[3].getKind());
576 ASSERT_EQ(tok::newline, Toks[4].getKind());
577 }
578}
579
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000580TEST_F(CommentLexerTest, VerbatimBlock6) {
581 const char *Source =
582 "// \\verbatim\n"
583 "// Aaa\n"
584 "//\n"
585 "// Bbb\n"
586 "// \\endverbatim\n";
587
588 std::vector<Token> Toks;
589
590 lexString(Source, Toks);
591
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000592 ASSERT_EQ(10U, Toks.size());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000593
594 ASSERT_EQ(tok::text, Toks[0].getKind());
595 ASSERT_EQ(StringRef(" "), Toks[0].getText());
596
597 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000598 ASSERT_EQ(StringRef("verbatim"), getVerbatimBlockName(Toks[1]));
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000599
600 ASSERT_EQ(tok::newline, Toks[2].getKind());
601
602 ASSERT_EQ(tok::verbatim_block_line, Toks[3].getKind());
603 ASSERT_EQ(StringRef(" Aaa"), Toks[3].getVerbatimBlockText());
604
605 ASSERT_EQ(tok::newline, Toks[4].getKind());
606
607 ASSERT_EQ(tok::newline, Toks[5].getKind());
608
609 ASSERT_EQ(tok::verbatim_block_line, Toks[6].getKind());
610 ASSERT_EQ(StringRef(" Bbb"), Toks[6].getVerbatimBlockText());
611
612 ASSERT_EQ(tok::newline, Toks[7].getKind());
613
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000614 ASSERT_EQ(tok::verbatim_block_end, Toks[8].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000615 ASSERT_EQ(StringRef("endverbatim"), getVerbatimBlockName(Toks[8]));
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000616
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000617 ASSERT_EQ(tok::newline, Toks[9].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000618}
619
620TEST_F(CommentLexerTest, VerbatimBlock7) {
621 const char *Source =
622 "/* \\verbatim\n"
623 " * Aaa\n"
624 " *\n"
625 " * Bbb\n"
626 " * \\endverbatim\n"
627 " */";
628
629 std::vector<Token> Toks;
630
631 lexString(Source, Toks);
632
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000633 ASSERT_EQ(10U, Toks.size());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000634
635 ASSERT_EQ(tok::text, Toks[0].getKind());
636 ASSERT_EQ(StringRef(" "), Toks[0].getText());
637
638 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000639 ASSERT_EQ(StringRef("verbatim"), getVerbatimBlockName(Toks[1]));
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000640
641 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
642 ASSERT_EQ(StringRef(" Aaa"), Toks[2].getVerbatimBlockText());
643
644 ASSERT_EQ(tok::verbatim_block_line, Toks[3].getKind());
645 ASSERT_EQ(StringRef(""), Toks[3].getVerbatimBlockText());
646
647 ASSERT_EQ(tok::verbatim_block_line, Toks[4].getKind());
648 ASSERT_EQ(StringRef(" Bbb"), Toks[4].getVerbatimBlockText());
649
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000650 ASSERT_EQ(tok::verbatim_block_end, Toks[5].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000651 ASSERT_EQ(StringRef("endverbatim"), getVerbatimBlockName(Toks[5]));
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000652
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000653 ASSERT_EQ(tok::newline, Toks[6].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000654
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000655 ASSERT_EQ(tok::text, Toks[7].getKind());
656 ASSERT_EQ(StringRef(" "), Toks[7].getText());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000657
Dmitri Gribenko64da4e52012-07-18 23:01:58 +0000658 ASSERT_EQ(tok::newline, Toks[8].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000659 ASSERT_EQ(tok::newline, Toks[9].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000660}
661
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000662// Complex test for verbatim blocks.
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000663TEST_F(CommentLexerTest, VerbatimBlock8) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000664 const char *Source =
665 "/* Meow \\verbatim aaa\\$\\@\n"
666 "bbb \\endverbati\r"
667 "ccc\r\n"
668 "ddd \\endverbatim Blah \\verbatim eee\n"
669 "\\endverbatim BlahBlah*/";
670 std::vector<Token> Toks;
671
672 lexString(Source, Toks);
673
674 ASSERT_EQ(14U, Toks.size());
675
676 ASSERT_EQ(tok::text, Toks[0].getKind());
677 ASSERT_EQ(StringRef(" Meow "), Toks[0].getText());
678
679 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000680 ASSERT_EQ(StringRef("verbatim"), getVerbatimBlockName(Toks[1]));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000681
682 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000683 ASSERT_EQ(StringRef(" aaa\\$\\@"), Toks[2].getVerbatimBlockText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000684
685 ASSERT_EQ(tok::verbatim_block_line, Toks[3].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000686 ASSERT_EQ(StringRef("bbb \\endverbati"), Toks[3].getVerbatimBlockText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000687
688 ASSERT_EQ(tok::verbatim_block_line, Toks[4].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000689 ASSERT_EQ(StringRef("ccc"), Toks[4].getVerbatimBlockText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000690
691 ASSERT_EQ(tok::verbatim_block_line, Toks[5].getKind());
692 ASSERT_EQ(StringRef("ddd "), Toks[5].getVerbatimBlockText());
693
694 ASSERT_EQ(tok::verbatim_block_end, Toks[6].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000695 ASSERT_EQ(StringRef("endverbatim"), getVerbatimBlockName(Toks[6]));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000696
697 ASSERT_EQ(tok::text, Toks[7].getKind());
698 ASSERT_EQ(StringRef(" Blah "), Toks[7].getText());
699
700 ASSERT_EQ(tok::verbatim_block_begin, Toks[8].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000701 ASSERT_EQ(StringRef("verbatim"), getVerbatimBlockName(Toks[8]));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000702
703 ASSERT_EQ(tok::verbatim_block_line, Toks[9].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000704 ASSERT_EQ(StringRef(" eee"), Toks[9].getVerbatimBlockText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000705
706 ASSERT_EQ(tok::verbatim_block_end, Toks[10].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000707 ASSERT_EQ(StringRef("endverbatim"), getVerbatimBlockName(Toks[10]));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000708
709 ASSERT_EQ(tok::text, Toks[11].getKind());
710 ASSERT_EQ(StringRef(" BlahBlah"), Toks[11].getText());
711
712 ASSERT_EQ(tok::newline, Toks[12].getKind());
713 ASSERT_EQ(tok::newline, Toks[13].getKind());
714}
715
716// LaTeX verbatim blocks.
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +0000717TEST_F(CommentLexerTest, VerbatimBlock9) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000718 const char *Source =
719 "/// \\f$ Aaa \\f$ \\f[ Bbb \\f] \\f{ Ccc \\f}";
720 std::vector<Token> Toks;
721
722 lexString(Source, Toks);
723
724 ASSERT_EQ(13U, Toks.size());
725
726 ASSERT_EQ(tok::text, Toks[0].getKind());
727 ASSERT_EQ(StringRef(" "), Toks[0].getText());
728
729 ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000730 ASSERT_EQ(StringRef("f$"), getVerbatimBlockName(Toks[1]));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000731
732 ASSERT_EQ(tok::verbatim_block_line, Toks[2].getKind());
733 ASSERT_EQ(StringRef(" Aaa "), Toks[2].getVerbatimBlockText());
734
735 ASSERT_EQ(tok::verbatim_block_end, Toks[3].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000736 ASSERT_EQ(StringRef("f$"), getVerbatimBlockName(Toks[3]));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000737
738 ASSERT_EQ(tok::text, Toks[4].getKind());
739 ASSERT_EQ(StringRef(" "), Toks[4].getText());
740
741 ASSERT_EQ(tok::verbatim_block_begin, Toks[5].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000742 ASSERT_EQ(StringRef("f["), getVerbatimBlockName(Toks[5]));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000743
744 ASSERT_EQ(tok::verbatim_block_line, Toks[6].getKind());
745 ASSERT_EQ(StringRef(" Bbb "), Toks[6].getVerbatimBlockText());
746
747 ASSERT_EQ(tok::verbatim_block_end, Toks[7].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000748 ASSERT_EQ(StringRef("f]"), getVerbatimBlockName(Toks[7]));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000749
750 ASSERT_EQ(tok::text, Toks[8].getKind());
751 ASSERT_EQ(StringRef(" "), Toks[8].getText());
752
753 ASSERT_EQ(tok::verbatim_block_begin, Toks[9].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000754 ASSERT_EQ(StringRef("f{"), getVerbatimBlockName(Toks[9]));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000755
756 ASSERT_EQ(tok::verbatim_block_line, Toks[10].getKind());
757 ASSERT_EQ(StringRef(" Ccc "), Toks[10].getVerbatimBlockText());
758
759 ASSERT_EQ(tok::verbatim_block_end, Toks[11].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000760 ASSERT_EQ(StringRef("f}"), getVerbatimBlockName(Toks[11]));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000761
762 ASSERT_EQ(tok::newline, Toks[12].getKind());
763}
764
765// Empty verbatim line.
766TEST_F(CommentLexerTest, VerbatimLine1) {
767 const char *Sources[] = {
768 "/// \\fn\n//",
769 "/** \\fn*/"
770 };
771
772 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
773 std::vector<Token> Toks;
774
775 lexString(Sources[i], Toks);
776
777 ASSERT_EQ(4U, Toks.size());
778
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000779 ASSERT_EQ(tok::text, Toks[0].getKind());
780 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000781
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000782 ASSERT_EQ(tok::verbatim_line_name, Toks[1].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000783 ASSERT_EQ(StringRef("fn"), getVerbatimLineName(Toks[1]));
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000784
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000785 ASSERT_EQ(tok::newline, Toks[2].getKind());
786 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000787 }
788}
789
790// Verbatim line with Doxygen escape sequences, which should not be expanded.
791TEST_F(CommentLexerTest, VerbatimLine2) {
792 const char *Sources[] = {
793 "/// \\fn void *foo(const char *zzz = \"\\$\");\n//",
794 "/** \\fn void *foo(const char *zzz = \"\\$\");*/"
795 };
796
797 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
798 std::vector<Token> Toks;
799
800 lexString(Sources[i], Toks);
801
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000802 ASSERT_EQ(5U, Toks.size());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000803
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000804 ASSERT_EQ(tok::text, Toks[0].getKind());
805 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000806
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000807 ASSERT_EQ(tok::verbatim_line_name, Toks[1].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000808 ASSERT_EQ(StringRef("fn"), getVerbatimLineName(Toks[1]));
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000809
810 ASSERT_EQ(tok::verbatim_line_text, Toks[2].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000811 ASSERT_EQ(StringRef(" void *foo(const char *zzz = \"\\$\");"),
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000812 Toks[2].getVerbatimLineText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000813
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000814 ASSERT_EQ(tok::newline, Toks[3].getKind());
815 ASSERT_EQ(tok::newline, Toks[4].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000816 }
817}
818
819// Verbatim line should not eat anything from next source line.
820TEST_F(CommentLexerTest, VerbatimLine3) {
821 const char *Source =
822 "/** \\fn void *foo(const char *zzz = \"\\$\");\n"
823 " * Meow\n"
824 " */";
825
826 std::vector<Token> Toks;
827
828 lexString(Source, Toks);
829
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000830 ASSERT_EQ(9U, Toks.size());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000831
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000832 ASSERT_EQ(tok::text, Toks[0].getKind());
833 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000834
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000835 ASSERT_EQ(tok::verbatim_line_name, Toks[1].getKind());
Dmitri Gribenkoe4330a32012-09-10 20:32:42 +0000836 ASSERT_EQ(StringRef("fn"), getVerbatimLineName(Toks[1]));
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000837
838 ASSERT_EQ(tok::verbatim_line_text, Toks[2].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000839 ASSERT_EQ(StringRef(" void *foo(const char *zzz = \"\\$\");"),
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000840 Toks[2].getVerbatimLineText());
841 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000842
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000843 ASSERT_EQ(tok::text, Toks[4].getKind());
844 ASSERT_EQ(StringRef(" Meow"), Toks[4].getText());
845 ASSERT_EQ(tok::newline, Toks[5].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000846
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000847 ASSERT_EQ(tok::text, Toks[6].getKind());
848 ASSERT_EQ(StringRef(" "), Toks[6].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000849
Dmitri Gribenko962668d2012-06-27 16:53:58 +0000850 ASSERT_EQ(tok::newline, Toks[7].getKind());
851 ASSERT_EQ(tok::newline, Toks[8].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000852}
853
854TEST_F(CommentLexerTest, HTML1) {
855 const char *Source =
856 "// <";
857
858 std::vector<Token> Toks;
859
860 lexString(Source, Toks);
861
862 ASSERT_EQ(3U, Toks.size());
863
864 ASSERT_EQ(tok::text, Toks[0].getKind());
865 ASSERT_EQ(StringRef(" "), Toks[0].getText());
866
867 ASSERT_EQ(tok::text, Toks[1].getKind());
868 ASSERT_EQ(StringRef("<"), Toks[1].getText());
869
870 ASSERT_EQ(tok::newline, Toks[2].getKind());
871}
872
873TEST_F(CommentLexerTest, HTML2) {
Dmitri Gribenko5676d322012-06-27 23:28:29 +0000874 const char *Source =
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000875 "// a<2";
876
877 std::vector<Token> Toks;
878
879 lexString(Source, Toks);
880
881 ASSERT_EQ(4U, Toks.size());
882
883 ASSERT_EQ(tok::text, Toks[0].getKind());
884 ASSERT_EQ(StringRef(" a"), Toks[0].getText());
885
886 ASSERT_EQ(tok::text, Toks[1].getKind());
887 ASSERT_EQ(StringRef("<"), Toks[1].getText());
888
889 ASSERT_EQ(tok::text, Toks[2].getKind());
890 ASSERT_EQ(StringRef("2"), Toks[2].getText());
891
892 ASSERT_EQ(tok::newline, Toks[3].getKind());
893}
894
895TEST_F(CommentLexerTest, HTML3) {
896 const char *Source =
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000897 "// < img";
Dmitri Gribenko5676d322012-06-27 23:28:29 +0000898
899 std::vector<Token> Toks;
900
901 lexString(Source, Toks);
902
903 ASSERT_EQ(4U, Toks.size());
904
905 ASSERT_EQ(tok::text, Toks[0].getKind());
906 ASSERT_EQ(StringRef(" "), Toks[0].getText());
907
908 ASSERT_EQ(tok::text, Toks[1].getKind());
909 ASSERT_EQ(StringRef("<"), Toks[1].getText());
910
911 ASSERT_EQ(tok::text, Toks[2].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000912 ASSERT_EQ(StringRef(" img"), Toks[2].getText());
Dmitri Gribenko5676d322012-06-27 23:28:29 +0000913
914 ASSERT_EQ(tok::newline, Toks[3].getKind());
915}
916
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000917TEST_F(CommentLexerTest, HTML4) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000918 const char *Sources[] = {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000919 "// <img",
920 "// <img "
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000921 };
922
923 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
924 std::vector<Token> Toks;
925
926 lexString(Sources[i], Toks);
927
928 ASSERT_EQ(3U, Toks.size());
929
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000930 ASSERT_EQ(tok::text, Toks[0].getKind());
931 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000932
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000933 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000934 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000935
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000936 ASSERT_EQ(tok::newline, Toks[2].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000937 }
938}
939
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000940TEST_F(CommentLexerTest, HTML5) {
941 const char *Source =
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000942 "// <img 42";
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000943
944 std::vector<Token> Toks;
945
946 lexString(Source, Toks);
947
948 ASSERT_EQ(4U, Toks.size());
949
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000950 ASSERT_EQ(tok::text, Toks[0].getKind());
951 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000952
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000953 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000954 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000955
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000956 ASSERT_EQ(tok::text, Toks[2].getKind());
957 ASSERT_EQ(StringRef("42"), Toks[2].getText());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000958
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000959 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000960}
961
962TEST_F(CommentLexerTest, HTML6) {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000963 const char *Source = "// <img> Meow";
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000964
965 std::vector<Token> Toks;
966
967 lexString(Source, Toks);
968
969 ASSERT_EQ(5U, Toks.size());
970
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000971 ASSERT_EQ(tok::text, Toks[0].getKind());
972 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000973
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000974 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000975 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000976
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000977 ASSERT_EQ(tok::html_greater, Toks[2].getKind());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000978
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000979 ASSERT_EQ(tok::text, Toks[3].getKind());
980 ASSERT_EQ(StringRef(" Meow"), Toks[3].getText());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000981
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000982 ASSERT_EQ(tok::newline, Toks[4].getKind());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +0000983}
984
985TEST_F(CommentLexerTest, HTML7) {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000986 const char *Source = "// <img=";
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000987
988 std::vector<Token> Toks;
989
990 lexString(Source, Toks);
991
992 ASSERT_EQ(4U, Toks.size());
993
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000994 ASSERT_EQ(tok::text, Toks[0].getKind());
995 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000996
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +0000997 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +0000998 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +0000999
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001000 ASSERT_EQ(tok::text, Toks[2].getKind());
1001 ASSERT_EQ(StringRef("="), Toks[2].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001002
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001003 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001004}
1005
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001006TEST_F(CommentLexerTest, HTML8) {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001007 const char *Source = "// <img src=> Meow";
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001008
1009 std::vector<Token> Toks;
1010
1011 lexString(Source, Toks);
1012
1013 ASSERT_EQ(7U, Toks.size());
1014
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001015 ASSERT_EQ(tok::text, Toks[0].getKind());
1016 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001017
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001018 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001019 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001020
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001021 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001022 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001023
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001024 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001025
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001026 ASSERT_EQ(tok::html_greater, Toks[4].getKind());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001027
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001028 ASSERT_EQ(tok::text, Toks[5].getKind());
1029 ASSERT_EQ(StringRef(" Meow"), Toks[5].getText());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001030
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001031 ASSERT_EQ(tok::newline, Toks[6].getKind());
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001032}
1033
1034TEST_F(CommentLexerTest, HTML9) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001035 const char *Sources[] = {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001036 "// <img src",
1037 "// <img src "
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001038 };
1039
1040 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1041 std::vector<Token> Toks;
1042
1043 lexString(Sources[i], Toks);
1044
1045 ASSERT_EQ(4U, Toks.size());
1046
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001047 ASSERT_EQ(tok::text, Toks[0].getKind());
1048 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001049
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001050 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001051 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001052
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001053 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001054 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001055
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001056 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001057 }
1058}
1059
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001060TEST_F(CommentLexerTest, HTML10) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001061 const char *Sources[] = {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001062 "// <img src=",
1063 "// <img src ="
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001064 };
1065
1066 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1067 std::vector<Token> Toks;
1068
1069 lexString(Sources[i], Toks);
1070
1071 ASSERT_EQ(5U, Toks.size());
1072
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001073 ASSERT_EQ(tok::text, Toks[0].getKind());
1074 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001075
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001076 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001077 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001078
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001079 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001080 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001081
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001082 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001083
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001084 ASSERT_EQ(tok::newline, Toks[4].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001085 }
1086}
1087
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001088TEST_F(CommentLexerTest, HTML11) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001089 const char *Sources[] = {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001090 "// <img src=\"",
1091 "// <img src = \"",
1092 "// <img src=\'",
1093 "// <img src = \'"
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001094 };
1095
1096 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1097 std::vector<Token> Toks;
1098
1099 lexString(Sources[i], Toks);
1100
1101 ASSERT_EQ(6U, Toks.size());
1102
1103 ASSERT_EQ(tok::text, Toks[0].getKind());
1104 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1105
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001106 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001107 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001108
1109 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001110 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001111
1112 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
1113
1114 ASSERT_EQ(tok::html_quoted_string, Toks[4].getKind());
1115 ASSERT_EQ(StringRef(""), Toks[4].getHTMLQuotedString());
1116
1117 ASSERT_EQ(tok::newline, Toks[5].getKind());
1118 }
1119}
1120
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001121TEST_F(CommentLexerTest, HTML12) {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001122 const char *Source = "// <img src=@";
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001123
1124 std::vector<Token> Toks;
1125
1126 lexString(Source, Toks);
1127
1128 ASSERT_EQ(6U, Toks.size());
1129
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001130 ASSERT_EQ(tok::text, Toks[0].getKind());
1131 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001132
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001133 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001134 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001135
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001136 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001137 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001138
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001139 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001140
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001141 ASSERT_EQ(tok::text, Toks[4].getKind());
1142 ASSERT_EQ(StringRef("@"), Toks[4].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001143
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001144 ASSERT_EQ(tok::newline, Toks[5].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001145}
1146
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001147TEST_F(CommentLexerTest, HTML13) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001148 const char *Sources[] = {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001149 "// <img src=\"val\\\"\\'val",
1150 "// <img src=\"val\\\"\\'val\"",
1151 "// <img src=\'val\\\"\\'val",
1152 "// <img src=\'val\\\"\\'val\'"
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001153 };
1154
1155 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1156 std::vector<Token> Toks;
1157
1158 lexString(Sources[i], Toks);
1159
1160 ASSERT_EQ(6U, Toks.size());
1161
1162 ASSERT_EQ(tok::text, Toks[0].getKind());
1163 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1164
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001165 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001166 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001167
1168 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001169 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001170
1171 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
1172
1173 ASSERT_EQ(tok::html_quoted_string, Toks[4].getKind());
1174 ASSERT_EQ(StringRef("val\\\"\\'val"), Toks[4].getHTMLQuotedString());
1175
1176 ASSERT_EQ(tok::newline, Toks[5].getKind());
1177 }
1178}
1179
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001180TEST_F(CommentLexerTest, HTML14) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001181 const char *Sources[] = {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001182 "// <img src=\"val\\\"\\'val\">",
1183 "// <img src=\'val\\\"\\'val\'>"
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001184 };
1185
1186 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1187 std::vector<Token> Toks;
1188
1189 lexString(Sources[i], Toks);
1190
1191 ASSERT_EQ(7U, Toks.size());
1192
1193 ASSERT_EQ(tok::text, Toks[0].getKind());
1194 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1195
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001196 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001197 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001198
1199 ASSERT_EQ(tok::html_ident, Toks[2].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001200 ASSERT_EQ(StringRef("src"), Toks[2].getHTMLIdent());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001201
1202 ASSERT_EQ(tok::html_equals, Toks[3].getKind());
1203
1204 ASSERT_EQ(tok::html_quoted_string, Toks[4].getKind());
1205 ASSERT_EQ(StringRef("val\\\"\\'val"), Toks[4].getHTMLQuotedString());
1206
1207 ASSERT_EQ(tok::html_greater, Toks[5].getKind());
1208
1209 ASSERT_EQ(tok::newline, Toks[6].getKind());
1210 }
1211}
1212
Dmitri Gribenkoa99ec102012-07-09 21:32:40 +00001213TEST_F(CommentLexerTest, HTML15) {
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001214 const char *Sources[] = {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001215 "// <img/>",
1216 "// <img />"
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001217 };
1218
1219 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1220 std::vector<Token> Toks;
1221
1222 lexString(Sources[i], Toks);
1223
1224 ASSERT_EQ(4U, Toks.size());
1225
1226 ASSERT_EQ(tok::text, Toks[0].getKind());
1227 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1228
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001229 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001230 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001231
1232 ASSERT_EQ(tok::html_slash_greater, Toks[2].getKind());
1233
1234 ASSERT_EQ(tok::newline, Toks[3].getKind());
1235 }
1236}
1237
1238TEST_F(CommentLexerTest, HTML16) {
1239 const char *Sources[] = {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001240 "// <img/ Aaa",
1241 "// <img / Aaa"
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001242 };
1243
1244 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1245 std::vector<Token> Toks;
1246
1247 lexString(Sources[i], Toks);
1248
1249 ASSERT_EQ(5U, Toks.size());
1250
1251 ASSERT_EQ(tok::text, Toks[0].getKind());
1252 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1253
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001254 ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001255 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagStartName());
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001256
1257 ASSERT_EQ(tok::text, Toks[2].getKind());
1258 ASSERT_EQ(StringRef("/"), Toks[2].getText());
1259
1260 ASSERT_EQ(tok::text, Toks[3].getKind());
1261 ASSERT_EQ(StringRef(" Aaa"), Toks[3].getText());
1262
1263 ASSERT_EQ(tok::newline, Toks[4].getKind());
1264 }
1265}
1266
1267TEST_F(CommentLexerTest, HTML17) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001268 const char *Source = "// </";
1269
1270 std::vector<Token> Toks;
1271
1272 lexString(Source, Toks);
1273
1274 ASSERT_EQ(3U, Toks.size());
1275
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001276 ASSERT_EQ(tok::text, Toks[0].getKind());
1277 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001278
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001279 ASSERT_EQ(tok::text, Toks[1].getKind());
1280 ASSERT_EQ(StringRef("</"), Toks[1].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001281
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001282 ASSERT_EQ(tok::newline, Toks[2].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001283}
1284
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001285TEST_F(CommentLexerTest, HTML18) {
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001286 const char *Source = "// </@";
1287
1288 std::vector<Token> Toks;
1289
1290 lexString(Source, Toks);
1291
1292 ASSERT_EQ(4U, Toks.size());
1293
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001294 ASSERT_EQ(tok::text, Toks[0].getKind());
1295 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001296
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001297 ASSERT_EQ(tok::text, Toks[1].getKind());
1298 ASSERT_EQ(StringRef("</"), Toks[1].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001299
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001300 ASSERT_EQ(tok::text, Toks[2].getKind());
1301 ASSERT_EQ(StringRef("@"), Toks[2].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001302
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001303 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001304}
1305
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00001306TEST_F(CommentLexerTest, HTML19) {
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001307 const char *Source = "// </img";
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +00001308
1309 std::vector<Token> Toks;
1310
1311 lexString(Source, Toks);
1312
1313 ASSERT_EQ(3U, Toks.size());
1314
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001315 ASSERT_EQ(tok::text, Toks[0].getKind());
1316 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +00001317
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001318 ASSERT_EQ(tok::html_end_tag, Toks[1].getKind());
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001319 ASSERT_EQ(StringRef("img"), Toks[1].getHTMLTagEndName());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +00001320
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +00001321 ASSERT_EQ(tok::newline, Toks[2].getKind());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +00001322}
1323
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001324TEST_F(CommentLexerTest, NotAKnownHTMLTag1) {
1325 const char *Source = "// <tag>";
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001326
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001327 std::vector<Token> Toks;
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001328
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001329 lexString(Source, Toks);
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001330
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001331 ASSERT_EQ(4U, Toks.size());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001332
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001333 ASSERT_EQ(tok::text, Toks[0].getKind());
1334 ASSERT_EQ(StringRef(" "), Toks[0].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001335
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001336 ASSERT_EQ(tok::text, Toks[1].getKind());
1337 ASSERT_EQ(StringRef("<tag"), Toks[1].getText());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001338
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001339 ASSERT_EQ(tok::text, Toks[2].getKind());
1340 ASSERT_EQ(StringRef(">"), Toks[2].getText());
Dmitri Gribenko8d3ba232012-07-06 00:28:32 +00001341
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +00001342 ASSERT_EQ(tok::newline, Toks[3].getKind());
1343}
1344
1345TEST_F(CommentLexerTest, NotAKnownHTMLTag2) {
1346 const char *Source = "// </tag>";
1347
1348 std::vector<Token> Toks;
1349
1350 lexString(Source, Toks);
1351
1352 ASSERT_EQ(4U, Toks.size());
1353
1354 ASSERT_EQ(tok::text, Toks[0].getKind());
1355 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1356
1357 ASSERT_EQ(tok::text, Toks[1].getKind());
1358 ASSERT_EQ(StringRef("</tag"), Toks[1].getText());
1359
1360 ASSERT_EQ(tok::text, Toks[2].getKind());
1361 ASSERT_EQ(StringRef(">"), Toks[2].getText());
1362
1363 ASSERT_EQ(tok::newline, Toks[3].getKind());
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001364}
1365
Dmitri Gribenko477a9f52012-07-27 20:37:06 +00001366TEST_F(CommentLexerTest, HTMLCharacterReferences1) {
1367 const char *Source = "// &";
1368
1369 std::vector<Token> Toks;
1370
1371 lexString(Source, Toks);
1372
1373 ASSERT_EQ(3U, Toks.size());
1374
1375 ASSERT_EQ(tok::text, Toks[0].getKind());
1376 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1377
1378 ASSERT_EQ(tok::text, Toks[1].getKind());
1379 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1380
1381 ASSERT_EQ(tok::newline, Toks[2].getKind());
1382}
1383
1384TEST_F(CommentLexerTest, HTMLCharacterReferences2) {
1385 const char *Source = "// &!";
1386
1387 std::vector<Token> Toks;
1388
1389 lexString(Source, Toks);
1390
1391 ASSERT_EQ(4U, Toks.size());
1392
1393 ASSERT_EQ(tok::text, Toks[0].getKind());
1394 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1395
1396 ASSERT_EQ(tok::text, Toks[1].getKind());
1397 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1398
1399 ASSERT_EQ(tok::text, Toks[2].getKind());
1400 ASSERT_EQ(StringRef("!"), Toks[2].getText());
1401
1402 ASSERT_EQ(tok::newline, Toks[3].getKind());
1403}
1404
1405TEST_F(CommentLexerTest, HTMLCharacterReferences3) {
1406 const char *Source = "// &amp";
1407
1408 std::vector<Token> Toks;
1409
1410 lexString(Source, Toks);
1411
1412 ASSERT_EQ(3U, Toks.size());
1413
1414 ASSERT_EQ(tok::text, Toks[0].getKind());
1415 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1416
1417 ASSERT_EQ(tok::text, Toks[1].getKind());
1418 ASSERT_EQ(StringRef("&amp"), Toks[1].getText());
1419
1420 ASSERT_EQ(tok::newline, Toks[2].getKind());
1421}
1422
1423TEST_F(CommentLexerTest, HTMLCharacterReferences4) {
1424 const char *Source = "// &amp!";
1425
1426 std::vector<Token> Toks;
1427
1428 lexString(Source, Toks);
1429
1430 ASSERT_EQ(4U, Toks.size());
1431
1432 ASSERT_EQ(tok::text, Toks[0].getKind());
1433 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1434
1435 ASSERT_EQ(tok::text, Toks[1].getKind());
1436 ASSERT_EQ(StringRef("&amp"), Toks[1].getText());
1437
1438 ASSERT_EQ(tok::text, Toks[2].getKind());
1439 ASSERT_EQ(StringRef("!"), Toks[2].getText());
1440
1441 ASSERT_EQ(tok::newline, Toks[3].getKind());
1442}
1443
1444TEST_F(CommentLexerTest, HTMLCharacterReferences5) {
1445 const char *Source = "// &#";
1446
1447 std::vector<Token> Toks;
1448
1449 lexString(Source, Toks);
1450
1451 ASSERT_EQ(3U, Toks.size());
1452
1453 ASSERT_EQ(tok::text, Toks[0].getKind());
1454 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1455
1456 ASSERT_EQ(tok::text, Toks[1].getKind());
1457 ASSERT_EQ(StringRef("&#"), Toks[1].getText());
1458
1459 ASSERT_EQ(tok::newline, Toks[2].getKind());
1460}
1461
1462TEST_F(CommentLexerTest, HTMLCharacterReferences6) {
1463 const char *Source = "// &#a";
1464
1465 std::vector<Token> Toks;
1466
1467 lexString(Source, Toks);
1468
1469 ASSERT_EQ(4U, Toks.size());
1470
1471 ASSERT_EQ(tok::text, Toks[0].getKind());
1472 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1473
1474 ASSERT_EQ(tok::text, Toks[1].getKind());
1475 ASSERT_EQ(StringRef("&#"), Toks[1].getText());
1476
1477 ASSERT_EQ(tok::text, Toks[2].getKind());
1478 ASSERT_EQ(StringRef("a"), Toks[2].getText());
1479
1480 ASSERT_EQ(tok::newline, Toks[3].getKind());
1481}
1482
1483TEST_F(CommentLexerTest, HTMLCharacterReferences7) {
1484 const char *Source = "// &#42";
1485
1486 std::vector<Token> Toks;
1487
1488 lexString(Source, Toks);
1489
1490 ASSERT_EQ(3U, Toks.size());
1491
1492 ASSERT_EQ(tok::text, Toks[0].getKind());
1493 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1494
1495 ASSERT_EQ(tok::text, Toks[1].getKind());
1496 ASSERT_EQ(StringRef("&#42"), Toks[1].getText());
1497
1498 ASSERT_EQ(tok::newline, Toks[2].getKind());
1499}
1500
1501TEST_F(CommentLexerTest, HTMLCharacterReferences8) {
1502 const char *Source = "// &#42a";
1503
1504 std::vector<Token> Toks;
1505
1506 lexString(Source, Toks);
1507
1508 ASSERT_EQ(4U, Toks.size());
1509
1510 ASSERT_EQ(tok::text, Toks[0].getKind());
1511 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1512
1513 ASSERT_EQ(tok::text, Toks[1].getKind());
1514 ASSERT_EQ(StringRef("&#42"), Toks[1].getText());
1515
1516 ASSERT_EQ(tok::text, Toks[2].getKind());
1517 ASSERT_EQ(StringRef("a"), Toks[2].getText());
1518
1519 ASSERT_EQ(tok::newline, Toks[3].getKind());
1520}
1521
1522TEST_F(CommentLexerTest, HTMLCharacterReferences9) {
1523 const char *Source = "// &#x";
1524
1525 std::vector<Token> Toks;
1526
1527 lexString(Source, Toks);
1528
1529 ASSERT_EQ(3U, Toks.size());
1530
1531 ASSERT_EQ(tok::text, Toks[0].getKind());
1532 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1533
1534 ASSERT_EQ(tok::text, Toks[1].getKind());
1535 ASSERT_EQ(StringRef("&#x"), Toks[1].getText());
1536
1537 ASSERT_EQ(tok::newline, Toks[2].getKind());
1538}
1539
1540TEST_F(CommentLexerTest, HTMLCharacterReferences10) {
1541 const char *Source = "// &#xz";
1542
1543 std::vector<Token> Toks;
1544
1545 lexString(Source, Toks);
1546
1547 ASSERT_EQ(4U, Toks.size());
1548
1549 ASSERT_EQ(tok::text, Toks[0].getKind());
1550 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1551
1552 ASSERT_EQ(tok::text, Toks[1].getKind());
1553 ASSERT_EQ(StringRef("&#x"), Toks[1].getText());
1554
1555 ASSERT_EQ(tok::text, Toks[2].getKind());
1556 ASSERT_EQ(StringRef("z"), Toks[2].getText());
1557
1558 ASSERT_EQ(tok::newline, Toks[3].getKind());
1559}
1560
1561TEST_F(CommentLexerTest, HTMLCharacterReferences11) {
1562 const char *Source = "// &#xab";
1563
1564 std::vector<Token> Toks;
1565
1566 lexString(Source, Toks);
1567
1568 ASSERT_EQ(3U, Toks.size());
1569
1570 ASSERT_EQ(tok::text, Toks[0].getKind());
1571 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1572
1573 ASSERT_EQ(tok::text, Toks[1].getKind());
1574 ASSERT_EQ(StringRef("&#xab"), Toks[1].getText());
1575
1576 ASSERT_EQ(tok::newline, Toks[2].getKind());
1577}
1578
1579TEST_F(CommentLexerTest, HTMLCharacterReferences12) {
1580 const char *Source = "// &#xaBz";
1581
1582 std::vector<Token> Toks;
1583
1584 lexString(Source, Toks);
1585
1586 ASSERT_EQ(4U, Toks.size());
1587
1588 ASSERT_EQ(tok::text, Toks[0].getKind());
1589 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1590
1591 ASSERT_EQ(tok::text, Toks[1].getKind());
1592 ASSERT_EQ(StringRef("&#xaB"), Toks[1].getText());
1593
1594 ASSERT_EQ(tok::text, Toks[2].getKind());
1595 ASSERT_EQ(StringRef("z"), Toks[2].getText());
1596
1597 ASSERT_EQ(tok::newline, Toks[3].getKind());
1598}
1599
1600TEST_F(CommentLexerTest, HTMLCharacterReferences13) {
1601 const char *Source = "// &amp;";
1602
1603 std::vector<Token> Toks;
1604
1605 lexString(Source, Toks);
1606
1607 ASSERT_EQ(3U, Toks.size());
1608
1609 ASSERT_EQ(tok::text, Toks[0].getKind());
1610 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1611
1612 ASSERT_EQ(tok::text, Toks[1].getKind());
1613 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1614
1615 ASSERT_EQ(tok::newline, Toks[2].getKind());
1616}
1617
1618TEST_F(CommentLexerTest, HTMLCharacterReferences14) {
1619 const char *Source = "// &amp;&lt;";
1620
1621 std::vector<Token> Toks;
1622
1623 lexString(Source, Toks);
1624
1625 ASSERT_EQ(4U, Toks.size());
1626
1627 ASSERT_EQ(tok::text, Toks[0].getKind());
1628 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1629
1630 ASSERT_EQ(tok::text, Toks[1].getKind());
1631 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1632
1633 ASSERT_EQ(tok::text, Toks[2].getKind());
1634 ASSERT_EQ(StringRef("<"), Toks[2].getText());
1635
1636 ASSERT_EQ(tok::newline, Toks[3].getKind());
1637}
1638
1639TEST_F(CommentLexerTest, HTMLCharacterReferences15) {
1640 const char *Source = "// &amp; meow";
1641
1642 std::vector<Token> Toks;
1643
1644 lexString(Source, Toks);
1645
1646 ASSERT_EQ(4U, Toks.size());
1647
1648 ASSERT_EQ(tok::text, Toks[0].getKind());
1649 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1650
1651 ASSERT_EQ(tok::text, Toks[1].getKind());
1652 ASSERT_EQ(StringRef("&"), Toks[1].getText());
1653
1654 ASSERT_EQ(tok::text, Toks[2].getKind());
1655 ASSERT_EQ(StringRef(" meow"), Toks[2].getText());
1656
1657 ASSERT_EQ(tok::newline, Toks[3].getKind());
1658}
1659
1660TEST_F(CommentLexerTest, HTMLCharacterReferences16) {
1661 const char *Sources[] = {
1662 "// &#61;",
1663 "// &#x3d;",
1664 "// &#X3d;"
1665 };
1666
1667 for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1668 std::vector<Token> Toks;
1669
1670 lexString(Sources[i], Toks);
1671
1672 ASSERT_EQ(3U, Toks.size());
1673
1674 ASSERT_EQ(tok::text, Toks[0].getKind());
1675 ASSERT_EQ(StringRef(" "), Toks[0].getText());
1676
1677 ASSERT_EQ(tok::text, Toks[1].getKind());
1678 ASSERT_EQ(StringRef("="), Toks[1].getText());
1679
1680 ASSERT_EQ(tok::newline, Toks[2].getKind());
1681 }
1682}
1683
Dmitri Gribenko2d44d772012-06-26 20:39:18 +00001684TEST_F(CommentLexerTest, MultipleComments) {
1685 const char *Source =
1686 "// Aaa\n"
1687 "/// Bbb\n"
1688 "/* Ccc\n"
1689 " * Ddd*/\n"
1690 "/** Eee*/";
1691
1692 std::vector<Token> Toks;
1693
1694 lexString(Source, Toks);
1695
1696 ASSERT_EQ(12U, Toks.size());
1697
1698 ASSERT_EQ(tok::text, Toks[0].getKind());
1699 ASSERT_EQ(StringRef(" Aaa"), Toks[0].getText());
1700 ASSERT_EQ(tok::newline, Toks[1].getKind());
1701
1702 ASSERT_EQ(tok::text, Toks[2].getKind());
1703 ASSERT_EQ(StringRef(" Bbb"), Toks[2].getText());
1704 ASSERT_EQ(tok::newline, Toks[3].getKind());
1705
1706 ASSERT_EQ(tok::text, Toks[4].getKind());
1707 ASSERT_EQ(StringRef(" Ccc"), Toks[4].getText());
1708 ASSERT_EQ(tok::newline, Toks[5].getKind());
1709
1710 ASSERT_EQ(tok::text, Toks[6].getKind());
1711 ASSERT_EQ(StringRef(" Ddd"), Toks[6].getText());
1712 ASSERT_EQ(tok::newline, Toks[7].getKind());
1713 ASSERT_EQ(tok::newline, Toks[8].getKind());
1714
1715 ASSERT_EQ(tok::text, Toks[9].getKind());
1716 ASSERT_EQ(StringRef(" Eee"), Toks[9].getText());
1717
1718 ASSERT_EQ(tok::newline, Toks[10].getKind());
1719 ASSERT_EQ(tok::newline, Toks[11].getKind());
1720}
1721
1722} // end namespace comments
1723} // end namespace clang
1724