xref: /aosp_15_r20/external/clang/unittests/AST/CommentLexer.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===- unittests/AST/CommentLexer.cpp ------ Comment lexer tests ----------===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li 
10*67e74705SXin Li #include "clang/AST/CommentLexer.h"
11*67e74705SXin Li #include "clang/AST/CommentCommandTraits.h"
12*67e74705SXin Li #include "clang/Basic/CommentOptions.h"
13*67e74705SXin Li #include "clang/Basic/Diagnostic.h"
14*67e74705SXin Li #include "clang/Basic/DiagnosticOptions.h"
15*67e74705SXin Li #include "clang/Basic/FileManager.h"
16*67e74705SXin Li #include "clang/Basic/SourceManager.h"
17*67e74705SXin Li #include "llvm/ADT/STLExtras.h"
18*67e74705SXin Li #include "gtest/gtest.h"
19*67e74705SXin Li #include <vector>
20*67e74705SXin Li 
21*67e74705SXin Li using namespace llvm;
22*67e74705SXin Li using namespace clang;
23*67e74705SXin Li 
24*67e74705SXin Li namespace clang {
25*67e74705SXin Li namespace comments {
26*67e74705SXin Li 
27*67e74705SXin Li namespace {
28*67e74705SXin Li class CommentLexerTest : public ::testing::Test {
29*67e74705SXin Li protected:
CommentLexerTest()30*67e74705SXin Li   CommentLexerTest()
31*67e74705SXin Li     : FileMgr(FileMgrOpts),
32*67e74705SXin Li       DiagID(new DiagnosticIDs()),
33*67e74705SXin Li       Diags(DiagID, new DiagnosticOptions, new IgnoringDiagConsumer()),
34*67e74705SXin Li       SourceMgr(Diags, FileMgr),
35*67e74705SXin Li       Traits(Allocator, CommentOptions()) {
36*67e74705SXin Li   }
37*67e74705SXin Li 
38*67e74705SXin Li   FileSystemOptions FileMgrOpts;
39*67e74705SXin Li   FileManager FileMgr;
40*67e74705SXin Li   IntrusiveRefCntPtr<DiagnosticIDs> DiagID;
41*67e74705SXin Li   DiagnosticsEngine Diags;
42*67e74705SXin Li   SourceManager SourceMgr;
43*67e74705SXin Li   llvm::BumpPtrAllocator Allocator;
44*67e74705SXin Li   CommandTraits Traits;
45*67e74705SXin Li 
46*67e74705SXin Li   void lexString(const char *Source, std::vector<Token> &Toks);
47*67e74705SXin Li 
getCommandName(const Token & Tok)48*67e74705SXin Li   StringRef getCommandName(const Token &Tok) {
49*67e74705SXin Li     return Traits.getCommandInfo(Tok.getCommandID())->Name;
50*67e74705SXin Li   }
51*67e74705SXin Li 
getVerbatimBlockName(const Token & Tok)52*67e74705SXin Li   StringRef getVerbatimBlockName(const Token &Tok) {
53*67e74705SXin Li     return Traits.getCommandInfo(Tok.getVerbatimBlockID())->Name;
54*67e74705SXin Li   }
55*67e74705SXin Li 
getVerbatimLineName(const Token & Tok)56*67e74705SXin Li   StringRef getVerbatimLineName(const Token &Tok) {
57*67e74705SXin Li     return Traits.getCommandInfo(Tok.getVerbatimLineID())->Name;
58*67e74705SXin Li   }
59*67e74705SXin Li };
60*67e74705SXin Li 
lexString(const char * Source,std::vector<Token> & Toks)61*67e74705SXin Li void CommentLexerTest::lexString(const char *Source,
62*67e74705SXin Li                                  std::vector<Token> &Toks) {
63*67e74705SXin Li   std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(Source);
64*67e74705SXin Li   FileID File = SourceMgr.createFileID(std::move(Buf));
65*67e74705SXin Li   SourceLocation Begin = SourceMgr.getLocForStartOfFile(File);
66*67e74705SXin Li 
67*67e74705SXin Li   Lexer L(Allocator, Diags, Traits, Begin, Source, Source + strlen(Source));
68*67e74705SXin Li 
69*67e74705SXin Li   while (1) {
70*67e74705SXin Li     Token Tok;
71*67e74705SXin Li     L.lex(Tok);
72*67e74705SXin Li     if (Tok.is(tok::eof))
73*67e74705SXin Li       break;
74*67e74705SXin Li     Toks.push_back(Tok);
75*67e74705SXin Li   }
76*67e74705SXin Li }
77*67e74705SXin Li 
78*67e74705SXin Li } // unnamed namespace
79*67e74705SXin Li 
80*67e74705SXin Li // Empty source range should be handled.
TEST_F(CommentLexerTest,Basic1)81*67e74705SXin Li TEST_F(CommentLexerTest, Basic1) {
82*67e74705SXin Li   const char *Source = "";
83*67e74705SXin Li   std::vector<Token> Toks;
84*67e74705SXin Li 
85*67e74705SXin Li   lexString(Source, Toks);
86*67e74705SXin Li 
87*67e74705SXin Li   ASSERT_EQ(0U, Toks.size());
88*67e74705SXin Li }
89*67e74705SXin Li 
90*67e74705SXin Li // Empty comments should be handled.
TEST_F(CommentLexerTest,Basic2)91*67e74705SXin Li TEST_F(CommentLexerTest, Basic2) {
92*67e74705SXin Li   const char *Sources[] = {
93*67e74705SXin Li     "//", "///", "//!", "///<", "//!<"
94*67e74705SXin Li   };
95*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
96*67e74705SXin Li     std::vector<Token> Toks;
97*67e74705SXin Li 
98*67e74705SXin Li     lexString(Sources[i], Toks);
99*67e74705SXin Li 
100*67e74705SXin Li     ASSERT_EQ(1U, Toks.size());
101*67e74705SXin Li 
102*67e74705SXin Li     ASSERT_EQ(tok::newline, Toks[0].getKind());
103*67e74705SXin Li   }
104*67e74705SXin Li }
105*67e74705SXin Li 
106*67e74705SXin Li // Empty comments should be handled.
TEST_F(CommentLexerTest,Basic3)107*67e74705SXin Li TEST_F(CommentLexerTest, Basic3) {
108*67e74705SXin Li   const char *Sources[] = {
109*67e74705SXin Li     "/**/", "/***/", "/*!*/", "/**<*/", "/*!<*/"
110*67e74705SXin Li   };
111*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
112*67e74705SXin Li     std::vector<Token> Toks;
113*67e74705SXin Li 
114*67e74705SXin Li     lexString(Sources[i], Toks);
115*67e74705SXin Li 
116*67e74705SXin Li     ASSERT_EQ(2U, Toks.size());
117*67e74705SXin Li 
118*67e74705SXin Li     ASSERT_EQ(tok::newline, Toks[0].getKind());
119*67e74705SXin Li     ASSERT_EQ(tok::newline, Toks[1].getKind());
120*67e74705SXin Li   }
121*67e74705SXin Li }
122*67e74705SXin Li 
123*67e74705SXin Li // Single comment with plain text.
TEST_F(CommentLexerTest,Basic4)124*67e74705SXin Li TEST_F(CommentLexerTest, Basic4) {
125*67e74705SXin Li   const char *Sources[] = {
126*67e74705SXin Li     "// Meow",   "/// Meow",    "//! Meow",
127*67e74705SXin Li     "// Meow\n", "// Meow\r\n", "//! Meow\r",
128*67e74705SXin Li   };
129*67e74705SXin Li 
130*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
131*67e74705SXin Li     std::vector<Token> Toks;
132*67e74705SXin Li 
133*67e74705SXin Li     lexString(Sources[i], Toks);
134*67e74705SXin Li 
135*67e74705SXin Li     ASSERT_EQ(2U, Toks.size());
136*67e74705SXin Li 
137*67e74705SXin Li     ASSERT_EQ(tok::text,          Toks[0].getKind());
138*67e74705SXin Li     ASSERT_EQ(StringRef(" Meow"), Toks[0].getText());
139*67e74705SXin Li 
140*67e74705SXin Li     ASSERT_EQ(tok::newline,       Toks[1].getKind());
141*67e74705SXin Li   }
142*67e74705SXin Li }
143*67e74705SXin Li 
144*67e74705SXin Li // Single comment with plain text.
TEST_F(CommentLexerTest,Basic5)145*67e74705SXin Li TEST_F(CommentLexerTest, Basic5) {
146*67e74705SXin Li   const char *Sources[] = {
147*67e74705SXin Li     "/* Meow*/", "/** Meow*/",  "/*! Meow*/"
148*67e74705SXin Li   };
149*67e74705SXin Li 
150*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
151*67e74705SXin Li     std::vector<Token> Toks;
152*67e74705SXin Li 
153*67e74705SXin Li     lexString(Sources[i], Toks);
154*67e74705SXin Li 
155*67e74705SXin Li     ASSERT_EQ(3U, Toks.size());
156*67e74705SXin Li 
157*67e74705SXin Li     ASSERT_EQ(tok::text,          Toks[0].getKind());
158*67e74705SXin Li     ASSERT_EQ(StringRef(" Meow"), Toks[0].getText());
159*67e74705SXin Li 
160*67e74705SXin Li     ASSERT_EQ(tok::newline,       Toks[1].getKind());
161*67e74705SXin Li     ASSERT_EQ(tok::newline,       Toks[2].getKind());
162*67e74705SXin Li   }
163*67e74705SXin Li }
164*67e74705SXin Li 
165*67e74705SXin Li // Test newline escaping.
TEST_F(CommentLexerTest,Basic6)166*67e74705SXin Li TEST_F(CommentLexerTest, Basic6) {
167*67e74705SXin Li   const char *Sources[] = {
168*67e74705SXin Li     "// Aaa\\\n"   " Bbb\\ \n"   " Ccc?" "?/\n",
169*67e74705SXin Li     "// Aaa\\\r\n" " Bbb\\ \r\n" " Ccc?" "?/\r\n",
170*67e74705SXin Li     "// Aaa\\\r"   " Bbb\\ \r"   " Ccc?" "?/\r"
171*67e74705SXin Li   };
172*67e74705SXin Li 
173*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
174*67e74705SXin Li     std::vector<Token> Toks;
175*67e74705SXin Li 
176*67e74705SXin Li     lexString(Sources[i], Toks);
177*67e74705SXin Li 
178*67e74705SXin Li     ASSERT_EQ(10U, Toks.size());
179*67e74705SXin Li 
180*67e74705SXin Li     ASSERT_EQ(tok::text,         Toks[0].getKind());
181*67e74705SXin Li     ASSERT_EQ(StringRef(" Aaa"), Toks[0].getText());
182*67e74705SXin Li     ASSERT_EQ(tok::text,         Toks[1].getKind());
183*67e74705SXin Li     ASSERT_EQ(StringRef("\\"),   Toks[1].getText());
184*67e74705SXin Li     ASSERT_EQ(tok::newline,      Toks[2].getKind());
185*67e74705SXin Li 
186*67e74705SXin Li     ASSERT_EQ(tok::text,         Toks[3].getKind());
187*67e74705SXin Li     ASSERT_EQ(StringRef(" Bbb"), Toks[3].getText());
188*67e74705SXin Li     ASSERT_EQ(tok::text,         Toks[4].getKind());
189*67e74705SXin Li     ASSERT_EQ(StringRef("\\"),   Toks[4].getText());
190*67e74705SXin Li     ASSERT_EQ(tok::text,         Toks[5].getKind());
191*67e74705SXin Li     ASSERT_EQ(StringRef(" "),    Toks[5].getText());
192*67e74705SXin Li     ASSERT_EQ(tok::newline,      Toks[6].getKind());
193*67e74705SXin Li 
194*67e74705SXin Li     ASSERT_EQ(tok::text,         Toks[7].getKind());
195*67e74705SXin Li     ASSERT_EQ(StringRef(" Ccc?" "?/"), Toks[7].getText());
196*67e74705SXin Li     ASSERT_EQ(tok::newline,      Toks[8].getKind());
197*67e74705SXin Li 
198*67e74705SXin Li     ASSERT_EQ(tok::newline,      Toks[9].getKind());
199*67e74705SXin Li   }
200*67e74705SXin Li }
201*67e74705SXin Li 
202*67e74705SXin Li // Check that we skip C-style aligned stars correctly.
TEST_F(CommentLexerTest,Basic7)203*67e74705SXin Li TEST_F(CommentLexerTest, Basic7) {
204*67e74705SXin Li   const char *Source =
205*67e74705SXin Li     "/* Aaa\n"
206*67e74705SXin Li     " * Bbb\r\n"
207*67e74705SXin Li     "\t* Ccc\n"
208*67e74705SXin Li     "  ! Ddd\n"
209*67e74705SXin Li     "  * Eee\n"
210*67e74705SXin Li     "  ** Fff\n"
211*67e74705SXin Li     " */";
212*67e74705SXin Li   std::vector<Token> Toks;
213*67e74705SXin Li 
214*67e74705SXin Li   lexString(Source, Toks);
215*67e74705SXin Li 
216*67e74705SXin Li   ASSERT_EQ(15U, Toks.size());
217*67e74705SXin Li 
218*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[0].getKind());
219*67e74705SXin Li   ASSERT_EQ(StringRef(" Aaa"), Toks[0].getText());
220*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[1].getKind());
221*67e74705SXin Li 
222*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[2].getKind());
223*67e74705SXin Li   ASSERT_EQ(StringRef(" Bbb"), Toks[2].getText());
224*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[3].getKind());
225*67e74705SXin Li 
226*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[4].getKind());
227*67e74705SXin Li   ASSERT_EQ(StringRef(" Ccc"), Toks[4].getText());
228*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[5].getKind());
229*67e74705SXin Li 
230*67e74705SXin Li   ASSERT_EQ(tok::text,            Toks[6].getKind());
231*67e74705SXin Li   ASSERT_EQ(StringRef("  ! Ddd"), Toks[6].getText());
232*67e74705SXin Li   ASSERT_EQ(tok::newline,         Toks[7].getKind());
233*67e74705SXin Li 
234*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[8].getKind());
235*67e74705SXin Li   ASSERT_EQ(StringRef(" Eee"), Toks[8].getText());
236*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[9].getKind());
237*67e74705SXin Li 
238*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[10].getKind());
239*67e74705SXin Li   ASSERT_EQ(StringRef("* Fff"), Toks[10].getText());
240*67e74705SXin Li   ASSERT_EQ(tok::newline,       Toks[11].getKind());
241*67e74705SXin Li 
242*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[12].getKind());
243*67e74705SXin Li   ASSERT_EQ(StringRef(" "),    Toks[12].getText());
244*67e74705SXin Li 
245*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[13].getKind());
246*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[14].getKind());
247*67e74705SXin Li }
248*67e74705SXin Li 
249*67e74705SXin Li // A command marker followed by comment end.
TEST_F(CommentLexerTest,DoxygenCommand1)250*67e74705SXin Li TEST_F(CommentLexerTest, DoxygenCommand1) {
251*67e74705SXin Li   const char *Sources[] = { "//@", "///@", "//!@" };
252*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
253*67e74705SXin Li     std::vector<Token> Toks;
254*67e74705SXin Li 
255*67e74705SXin Li     lexString(Sources[i], Toks);
256*67e74705SXin Li 
257*67e74705SXin Li     ASSERT_EQ(2U, Toks.size());
258*67e74705SXin Li 
259*67e74705SXin Li     ASSERT_EQ(tok::text,          Toks[0].getKind());
260*67e74705SXin Li     ASSERT_EQ(StringRef("@"),     Toks[0].getText());
261*67e74705SXin Li 
262*67e74705SXin Li     ASSERT_EQ(tok::newline,       Toks[1].getKind());
263*67e74705SXin Li   }
264*67e74705SXin Li }
265*67e74705SXin Li 
266*67e74705SXin Li // A command marker followed by comment end.
TEST_F(CommentLexerTest,DoxygenCommand2)267*67e74705SXin Li TEST_F(CommentLexerTest, DoxygenCommand2) {
268*67e74705SXin Li   const char *Sources[] = { "/*@*/", "/**@*/", "/*!@*/"};
269*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
270*67e74705SXin Li     std::vector<Token> Toks;
271*67e74705SXin Li 
272*67e74705SXin Li     lexString(Sources[i], Toks);
273*67e74705SXin Li 
274*67e74705SXin Li     ASSERT_EQ(3U, Toks.size());
275*67e74705SXin Li 
276*67e74705SXin Li     ASSERT_EQ(tok::text,          Toks[0].getKind());
277*67e74705SXin Li     ASSERT_EQ(StringRef("@"),     Toks[0].getText());
278*67e74705SXin Li 
279*67e74705SXin Li     ASSERT_EQ(tok::newline,       Toks[1].getKind());
280*67e74705SXin Li     ASSERT_EQ(tok::newline,       Toks[2].getKind());
281*67e74705SXin Li   }
282*67e74705SXin Li }
283*67e74705SXin Li 
284*67e74705SXin Li // A command marker followed by comment end.
TEST_F(CommentLexerTest,DoxygenCommand3)285*67e74705SXin Li TEST_F(CommentLexerTest, DoxygenCommand3) {
286*67e74705SXin Li   const char *Sources[] = { "/*\\*/", "/**\\*/" };
287*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
288*67e74705SXin Li     std::vector<Token> Toks;
289*67e74705SXin Li 
290*67e74705SXin Li     lexString(Sources[i], Toks);
291*67e74705SXin Li 
292*67e74705SXin Li     ASSERT_EQ(3U, Toks.size());
293*67e74705SXin Li 
294*67e74705SXin Li     ASSERT_EQ(tok::text,           Toks[0].getKind());
295*67e74705SXin Li     ASSERT_EQ(StringRef("\\"),     Toks[0].getText());
296*67e74705SXin Li 
297*67e74705SXin Li     ASSERT_EQ(tok::newline,        Toks[1].getKind());
298*67e74705SXin Li     ASSERT_EQ(tok::newline,        Toks[2].getKind());
299*67e74705SXin Li   }
300*67e74705SXin Li }
301*67e74705SXin Li 
302*67e74705SXin Li // Doxygen escape sequences.
TEST_F(CommentLexerTest,DoxygenCommand4)303*67e74705SXin Li TEST_F(CommentLexerTest, DoxygenCommand4) {
304*67e74705SXin Li   const char *Sources[] = {
305*67e74705SXin Li     "/// \\\\ \\@ \\& \\$ \\# \\< \\> \\% \\\" \\. \\::",
306*67e74705SXin Li     "/// @\\ @@ @& @$ @# @< @> @% @\" @. @::"
307*67e74705SXin Li   };
308*67e74705SXin Li   const char *Text[] = {
309*67e74705SXin Li     " ",
310*67e74705SXin Li     "\\", " ", "@", " ", "&", " ", "$",  " ", "#", " ",
311*67e74705SXin Li     "<",  " ", ">", " ", "%", " ", "\"", " ", ".", " ",
312*67e74705SXin Li     "::", ""
313*67e74705SXin Li   };
314*67e74705SXin Li 
315*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
316*67e74705SXin Li     std::vector<Token> Toks;
317*67e74705SXin Li 
318*67e74705SXin Li     lexString(Sources[i], Toks);
319*67e74705SXin Li 
320*67e74705SXin Li     ASSERT_EQ(array_lengthof(Text), Toks.size());
321*67e74705SXin Li 
322*67e74705SXin Li     for (size_t j = 0, e = Toks.size(); j != e; j++) {
323*67e74705SXin Li       if(Toks[j].is(tok::text))
324*67e74705SXin Li         ASSERT_EQ(StringRef(Text[j]), Toks[j].getText())
325*67e74705SXin Li           << "index " << i;
326*67e74705SXin Li     }
327*67e74705SXin Li   }
328*67e74705SXin Li }
329*67e74705SXin Li 
330*67e74705SXin Li // A command marker followed by a non-letter that is not a part of an escape
331*67e74705SXin Li // sequence.
TEST_F(CommentLexerTest,DoxygenCommand5)332*67e74705SXin Li TEST_F(CommentLexerTest, DoxygenCommand5) {
333*67e74705SXin Li   const char *Source = "/// \\^ \\0";
334*67e74705SXin Li   std::vector<Token> Toks;
335*67e74705SXin Li 
336*67e74705SXin Li   lexString(Source, Toks);
337*67e74705SXin Li 
338*67e74705SXin Li   ASSERT_EQ(6U, Toks.size());
339*67e74705SXin Li 
340*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[0].getKind());
341*67e74705SXin Li   ASSERT_EQ(StringRef(" "),  Toks[0].getText());
342*67e74705SXin Li 
343*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[1].getKind());
344*67e74705SXin Li   ASSERT_EQ(StringRef("\\"), Toks[1].getText());
345*67e74705SXin Li 
346*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[2].getKind());
347*67e74705SXin Li   ASSERT_EQ(StringRef("^ "), Toks[2].getText());
348*67e74705SXin Li 
349*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[3].getKind());
350*67e74705SXin Li   ASSERT_EQ(StringRef("\\"), Toks[3].getText());
351*67e74705SXin Li 
352*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[4].getKind());
353*67e74705SXin Li   ASSERT_EQ(StringRef("0"),  Toks[4].getText());
354*67e74705SXin Li 
355*67e74705SXin Li   ASSERT_EQ(tok::newline,    Toks[5].getKind());
356*67e74705SXin Li }
357*67e74705SXin Li 
TEST_F(CommentLexerTest,DoxygenCommand6)358*67e74705SXin Li TEST_F(CommentLexerTest, DoxygenCommand6) {
359*67e74705SXin Li   const char *Source = "/// \\brief Aaa.";
360*67e74705SXin Li   std::vector<Token> Toks;
361*67e74705SXin Li 
362*67e74705SXin Li   lexString(Source, Toks);
363*67e74705SXin Li 
364*67e74705SXin Li   ASSERT_EQ(4U, Toks.size());
365*67e74705SXin Li 
366*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[0].getKind());
367*67e74705SXin Li   ASSERT_EQ(StringRef(" "),     Toks[0].getText());
368*67e74705SXin Li 
369*67e74705SXin Li   ASSERT_EQ(tok::backslash_command, Toks[1].getKind());
370*67e74705SXin Li   ASSERT_EQ(StringRef("brief"), getCommandName(Toks[1]));
371*67e74705SXin Li 
372*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[2].getKind());
373*67e74705SXin Li   ASSERT_EQ(StringRef(" Aaa."), Toks[2].getText());
374*67e74705SXin Li 
375*67e74705SXin Li   ASSERT_EQ(tok::newline,       Toks[3].getKind());
376*67e74705SXin Li }
377*67e74705SXin Li 
TEST_F(CommentLexerTest,DoxygenCommand7)378*67e74705SXin Li TEST_F(CommentLexerTest, DoxygenCommand7) {
379*67e74705SXin Li   const char *Source = "/// \\em\\em \\em\t\\em\n";
380*67e74705SXin Li   std::vector<Token> Toks;
381*67e74705SXin Li 
382*67e74705SXin Li   lexString(Source, Toks);
383*67e74705SXin Li 
384*67e74705SXin Li   ASSERT_EQ(8U, Toks.size());
385*67e74705SXin Li 
386*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[0].getKind());
387*67e74705SXin Li   ASSERT_EQ(StringRef(" "),  Toks[0].getText());
388*67e74705SXin Li 
389*67e74705SXin Li   ASSERT_EQ(tok::backslash_command, Toks[1].getKind());
390*67e74705SXin Li   ASSERT_EQ(StringRef("em"), getCommandName(Toks[1]));
391*67e74705SXin Li 
392*67e74705SXin Li   ASSERT_EQ(tok::backslash_command, Toks[2].getKind());
393*67e74705SXin Li   ASSERT_EQ(StringRef("em"), getCommandName(Toks[2]));
394*67e74705SXin Li 
395*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[3].getKind());
396*67e74705SXin Li   ASSERT_EQ(StringRef(" "),  Toks[3].getText());
397*67e74705SXin Li 
398*67e74705SXin Li   ASSERT_EQ(tok::backslash_command, Toks[4].getKind());
399*67e74705SXin Li   ASSERT_EQ(StringRef("em"), getCommandName(Toks[4]));
400*67e74705SXin Li 
401*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[5].getKind());
402*67e74705SXin Li   ASSERT_EQ(StringRef("\t"), Toks[5].getText());
403*67e74705SXin Li 
404*67e74705SXin Li   ASSERT_EQ(tok::backslash_command, Toks[6].getKind());
405*67e74705SXin Li   ASSERT_EQ(StringRef("em"), getCommandName(Toks[6]));
406*67e74705SXin Li 
407*67e74705SXin Li   ASSERT_EQ(tok::newline,    Toks[7].getKind());
408*67e74705SXin Li }
409*67e74705SXin Li 
TEST_F(CommentLexerTest,DoxygenCommand8)410*67e74705SXin Li TEST_F(CommentLexerTest, DoxygenCommand8) {
411*67e74705SXin Li   const char *Source = "/// @em@em @em\t@em\n";
412*67e74705SXin Li   std::vector<Token> Toks;
413*67e74705SXin Li 
414*67e74705SXin Li   lexString(Source, Toks);
415*67e74705SXin Li 
416*67e74705SXin Li   ASSERT_EQ(8U, Toks.size());
417*67e74705SXin Li 
418*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[0].getKind());
419*67e74705SXin Li   ASSERT_EQ(StringRef(" "),  Toks[0].getText());
420*67e74705SXin Li 
421*67e74705SXin Li   ASSERT_EQ(tok::at_command, Toks[1].getKind());
422*67e74705SXin Li   ASSERT_EQ(StringRef("em"), getCommandName(Toks[1]));
423*67e74705SXin Li 
424*67e74705SXin Li   ASSERT_EQ(tok::at_command, Toks[2].getKind());
425*67e74705SXin Li   ASSERT_EQ(StringRef("em"), getCommandName(Toks[2]));
426*67e74705SXin Li 
427*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[3].getKind());
428*67e74705SXin Li   ASSERT_EQ(StringRef(" "),  Toks[3].getText());
429*67e74705SXin Li 
430*67e74705SXin Li   ASSERT_EQ(tok::at_command, Toks[4].getKind());
431*67e74705SXin Li   ASSERT_EQ(StringRef("em"), getCommandName(Toks[4]));
432*67e74705SXin Li 
433*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[5].getKind());
434*67e74705SXin Li   ASSERT_EQ(StringRef("\t"), Toks[5].getText());
435*67e74705SXin Li 
436*67e74705SXin Li   ASSERT_EQ(tok::at_command, Toks[6].getKind());
437*67e74705SXin Li   ASSERT_EQ(StringRef("em"), getCommandName(Toks[6]));
438*67e74705SXin Li 
439*67e74705SXin Li   ASSERT_EQ(tok::newline,    Toks[7].getKind());
440*67e74705SXin Li }
441*67e74705SXin Li 
TEST_F(CommentLexerTest,DoxygenCommand9)442*67e74705SXin Li TEST_F(CommentLexerTest, DoxygenCommand9) {
443*67e74705SXin Li   const char *Source = "/// \\aaa\\bbb \\ccc\t\\ddd\n";
444*67e74705SXin Li   std::vector<Token> Toks;
445*67e74705SXin Li 
446*67e74705SXin Li   lexString(Source, Toks);
447*67e74705SXin Li 
448*67e74705SXin Li   ASSERT_EQ(8U, Toks.size());
449*67e74705SXin Li 
450*67e74705SXin Li   ASSERT_EQ(tok::text,        Toks[0].getKind());
451*67e74705SXin Li   ASSERT_EQ(StringRef(" "),   Toks[0].getText());
452*67e74705SXin Li 
453*67e74705SXin Li   ASSERT_EQ(tok::unknown_command, Toks[1].getKind());
454*67e74705SXin Li   ASSERT_EQ(StringRef("aaa"), Toks[1].getUnknownCommandName());
455*67e74705SXin Li 
456*67e74705SXin Li   ASSERT_EQ(tok::unknown_command, Toks[2].getKind());
457*67e74705SXin Li   ASSERT_EQ(StringRef("bbb"), Toks[2].getUnknownCommandName());
458*67e74705SXin Li 
459*67e74705SXin Li   ASSERT_EQ(tok::text,        Toks[3].getKind());
460*67e74705SXin Li   ASSERT_EQ(StringRef(" "),   Toks[3].getText());
461*67e74705SXin Li 
462*67e74705SXin Li   ASSERT_EQ(tok::unknown_command, Toks[4].getKind());
463*67e74705SXin Li   ASSERT_EQ(StringRef("ccc"), Toks[4].getUnknownCommandName());
464*67e74705SXin Li 
465*67e74705SXin Li   ASSERT_EQ(tok::text,        Toks[5].getKind());
466*67e74705SXin Li   ASSERT_EQ(StringRef("\t"),  Toks[5].getText());
467*67e74705SXin Li 
468*67e74705SXin Li   ASSERT_EQ(tok::unknown_command, Toks[6].getKind());
469*67e74705SXin Li   ASSERT_EQ(StringRef("ddd"), Toks[6].getUnknownCommandName());
470*67e74705SXin Li 
471*67e74705SXin Li   ASSERT_EQ(tok::newline,     Toks[7].getKind());
472*67e74705SXin Li }
473*67e74705SXin Li 
TEST_F(CommentLexerTest,DoxygenCommand10)474*67e74705SXin Li TEST_F(CommentLexerTest, DoxygenCommand10) {
475*67e74705SXin Li   const char *Source = "// \\c\n";
476*67e74705SXin Li   std::vector<Token> Toks;
477*67e74705SXin Li 
478*67e74705SXin Li   lexString(Source, Toks);
479*67e74705SXin Li 
480*67e74705SXin Li   ASSERT_EQ(3U, Toks.size());
481*67e74705SXin Li 
482*67e74705SXin Li   ASSERT_EQ(tok::text,      Toks[0].getKind());
483*67e74705SXin Li   ASSERT_EQ(StringRef(" "), Toks[0].getText());
484*67e74705SXin Li 
485*67e74705SXin Li   ASSERT_EQ(tok::backslash_command, Toks[1].getKind());
486*67e74705SXin Li   ASSERT_EQ(StringRef("c"), getCommandName(Toks[1]));
487*67e74705SXin Li 
488*67e74705SXin Li   ASSERT_EQ(tok::newline,   Toks[2].getKind());
489*67e74705SXin Li }
490*67e74705SXin Li 
TEST_F(CommentLexerTest,RegisterCustomBlockCommand)491*67e74705SXin Li TEST_F(CommentLexerTest, RegisterCustomBlockCommand) {
492*67e74705SXin Li   const char *Source =
493*67e74705SXin Li     "/// \\NewBlockCommand Aaa.\n"
494*67e74705SXin Li     "/// @NewBlockCommand Aaa.\n";
495*67e74705SXin Li 
496*67e74705SXin Li   Traits.registerBlockCommand(StringRef("NewBlockCommand"));
497*67e74705SXin Li 
498*67e74705SXin Li   std::vector<Token> Toks;
499*67e74705SXin Li 
500*67e74705SXin Li   lexString(Source, Toks);
501*67e74705SXin Li 
502*67e74705SXin Li   ASSERT_EQ(8U, Toks.size());
503*67e74705SXin Li 
504*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[0].getKind());
505*67e74705SXin Li   ASSERT_EQ(StringRef(" "),     Toks[0].getText());
506*67e74705SXin Li 
507*67e74705SXin Li   ASSERT_EQ(tok::backslash_command, Toks[1].getKind());
508*67e74705SXin Li   ASSERT_EQ(StringRef("NewBlockCommand"), getCommandName(Toks[1]));
509*67e74705SXin Li 
510*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[2].getKind());
511*67e74705SXin Li   ASSERT_EQ(StringRef(" Aaa."), Toks[2].getText());
512*67e74705SXin Li 
513*67e74705SXin Li   ASSERT_EQ(tok::newline,       Toks[3].getKind());
514*67e74705SXin Li 
515*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[4].getKind());
516*67e74705SXin Li   ASSERT_EQ(StringRef(" "),     Toks[4].getText());
517*67e74705SXin Li 
518*67e74705SXin Li   ASSERT_EQ(tok::at_command,    Toks[5].getKind());
519*67e74705SXin Li   ASSERT_EQ(StringRef("NewBlockCommand"), getCommandName(Toks[5]));
520*67e74705SXin Li 
521*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[6].getKind());
522*67e74705SXin Li   ASSERT_EQ(StringRef(" Aaa."), Toks[6].getText());
523*67e74705SXin Li 
524*67e74705SXin Li   ASSERT_EQ(tok::newline,       Toks[7].getKind());
525*67e74705SXin Li }
526*67e74705SXin Li 
TEST_F(CommentLexerTest,RegisterMultipleBlockCommands)527*67e74705SXin Li TEST_F(CommentLexerTest, RegisterMultipleBlockCommands) {
528*67e74705SXin Li   const char *Source =
529*67e74705SXin Li     "/// \\Foo\n"
530*67e74705SXin Li     "/// \\Bar Baz\n"
531*67e74705SXin Li     "/// \\Blech quux=corge\n";
532*67e74705SXin Li 
533*67e74705SXin Li   Traits.registerBlockCommand(StringRef("Foo"));
534*67e74705SXin Li   Traits.registerBlockCommand(StringRef("Bar"));
535*67e74705SXin Li   Traits.registerBlockCommand(StringRef("Blech"));
536*67e74705SXin Li 
537*67e74705SXin Li   std::vector<Token> Toks;
538*67e74705SXin Li 
539*67e74705SXin Li   lexString(Source, Toks);
540*67e74705SXin Li 
541*67e74705SXin Li   ASSERT_EQ(11U, Toks.size());
542*67e74705SXin Li 
543*67e74705SXin Li   ASSERT_EQ(tok::text,      Toks[0].getKind());
544*67e74705SXin Li   ASSERT_EQ(StringRef(" "), Toks[0].getText());
545*67e74705SXin Li 
546*67e74705SXin Li   ASSERT_EQ(tok::backslash_command, Toks[1].getKind());
547*67e74705SXin Li   ASSERT_EQ(StringRef("Foo"), getCommandName(Toks[1]));
548*67e74705SXin Li 
549*67e74705SXin Li   ASSERT_EQ(tok::newline,     Toks[2].getKind());
550*67e74705SXin Li 
551*67e74705SXin Li   ASSERT_EQ(tok::text,      Toks[3].getKind());
552*67e74705SXin Li   ASSERT_EQ(StringRef(" "), Toks[3].getText());
553*67e74705SXin Li 
554*67e74705SXin Li   ASSERT_EQ(tok::backslash_command, Toks[4].getKind());
555*67e74705SXin Li   ASSERT_EQ(StringRef("Bar"), getCommandName(Toks[4]));
556*67e74705SXin Li 
557*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[5].getKind());
558*67e74705SXin Li   ASSERT_EQ(StringRef(" Baz"), Toks[5].getText());
559*67e74705SXin Li 
560*67e74705SXin Li   ASSERT_EQ(tok::newline,     Toks[6].getKind());
561*67e74705SXin Li 
562*67e74705SXin Li   ASSERT_EQ(tok::text,      Toks[7].getKind());
563*67e74705SXin Li   ASSERT_EQ(StringRef(" "), Toks[7].getText());
564*67e74705SXin Li 
565*67e74705SXin Li   ASSERT_EQ(tok::backslash_command, Toks[8].getKind());
566*67e74705SXin Li   ASSERT_EQ(StringRef("Blech"), getCommandName(Toks[8]));
567*67e74705SXin Li 
568*67e74705SXin Li   ASSERT_EQ(tok::text,                Toks[9].getKind());
569*67e74705SXin Li   ASSERT_EQ(StringRef(" quux=corge"), Toks[9].getText());
570*67e74705SXin Li 
571*67e74705SXin Li   ASSERT_EQ(tok::newline,     Toks[10].getKind());
572*67e74705SXin Li }
573*67e74705SXin Li 
574*67e74705SXin Li // Empty verbatim block.
TEST_F(CommentLexerTest,VerbatimBlock1)575*67e74705SXin Li TEST_F(CommentLexerTest, VerbatimBlock1) {
576*67e74705SXin Li   const char *Sources[] = {
577*67e74705SXin Li     "/// \\verbatim\\endverbatim\n//",
578*67e74705SXin Li     "/** \\verbatim\\endverbatim*/"
579*67e74705SXin Li   };
580*67e74705SXin Li 
581*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
582*67e74705SXin Li     std::vector<Token> Toks;
583*67e74705SXin Li 
584*67e74705SXin Li     lexString(Sources[i], Toks);
585*67e74705SXin Li 
586*67e74705SXin Li     ASSERT_EQ(5U, Toks.size());
587*67e74705SXin Li 
588*67e74705SXin Li     ASSERT_EQ(tok::text,                 Toks[0].getKind());
589*67e74705SXin Li     ASSERT_EQ(StringRef(" "),            Toks[0].getText());
590*67e74705SXin Li 
591*67e74705SXin Li     ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
592*67e74705SXin Li     ASSERT_EQ(StringRef("verbatim"),     getVerbatimBlockName(Toks[1]));
593*67e74705SXin Li 
594*67e74705SXin Li     ASSERT_EQ(tok::verbatim_block_end,   Toks[2].getKind());
595*67e74705SXin Li     ASSERT_EQ(StringRef("endverbatim"),  getVerbatimBlockName(Toks[2]));
596*67e74705SXin Li 
597*67e74705SXin Li     ASSERT_EQ(tok::newline,              Toks[3].getKind());
598*67e74705SXin Li     ASSERT_EQ(tok::newline,              Toks[4].getKind());
599*67e74705SXin Li   }
600*67e74705SXin Li }
601*67e74705SXin Li 
602*67e74705SXin Li // Empty verbatim block without an end command.
TEST_F(CommentLexerTest,VerbatimBlock2)603*67e74705SXin Li TEST_F(CommentLexerTest, VerbatimBlock2) {
604*67e74705SXin Li   const char *Source = "/// \\verbatim";
605*67e74705SXin Li 
606*67e74705SXin Li   std::vector<Token> Toks;
607*67e74705SXin Li 
608*67e74705SXin Li   lexString(Source, Toks);
609*67e74705SXin Li 
610*67e74705SXin Li   ASSERT_EQ(3U, Toks.size());
611*67e74705SXin Li 
612*67e74705SXin Li   ASSERT_EQ(tok::text,                 Toks[0].getKind());
613*67e74705SXin Li   ASSERT_EQ(StringRef(" "),            Toks[0].getText());
614*67e74705SXin Li 
615*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
616*67e74705SXin Li   ASSERT_EQ(StringRef("verbatim"),     getVerbatimBlockName(Toks[1]));
617*67e74705SXin Li 
618*67e74705SXin Li   ASSERT_EQ(tok::newline,              Toks[2].getKind());
619*67e74705SXin Li }
620*67e74705SXin Li 
621*67e74705SXin Li // Empty verbatim block without an end command.
TEST_F(CommentLexerTest,VerbatimBlock3)622*67e74705SXin Li TEST_F(CommentLexerTest, VerbatimBlock3) {
623*67e74705SXin Li   const char *Source = "/** \\verbatim*/";
624*67e74705SXin Li 
625*67e74705SXin Li   std::vector<Token> Toks;
626*67e74705SXin Li 
627*67e74705SXin Li   lexString(Source, Toks);
628*67e74705SXin Li 
629*67e74705SXin Li   ASSERT_EQ(4U, Toks.size());
630*67e74705SXin Li 
631*67e74705SXin Li   ASSERT_EQ(tok::text,                 Toks[0].getKind());
632*67e74705SXin Li   ASSERT_EQ(StringRef(" "),            Toks[0].getText());
633*67e74705SXin Li 
634*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
635*67e74705SXin Li   ASSERT_EQ(StringRef("verbatim"),     getVerbatimBlockName(Toks[1]));
636*67e74705SXin Li 
637*67e74705SXin Li   ASSERT_EQ(tok::newline,              Toks[2].getKind());
638*67e74705SXin Li   ASSERT_EQ(tok::newline,              Toks[3].getKind());
639*67e74705SXin Li }
640*67e74705SXin Li 
641*67e74705SXin Li // Single-line verbatim block.
TEST_F(CommentLexerTest,VerbatimBlock4)642*67e74705SXin Li TEST_F(CommentLexerTest, VerbatimBlock4) {
643*67e74705SXin Li   const char *Sources[] = {
644*67e74705SXin Li     "/// Meow \\verbatim aaa \\endverbatim\n//",
645*67e74705SXin Li     "/** Meow \\verbatim aaa \\endverbatim*/"
646*67e74705SXin Li   };
647*67e74705SXin Li 
648*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
649*67e74705SXin Li     std::vector<Token> Toks;
650*67e74705SXin Li 
651*67e74705SXin Li     lexString(Sources[i], Toks);
652*67e74705SXin Li 
653*67e74705SXin Li     ASSERT_EQ(6U, Toks.size());
654*67e74705SXin Li 
655*67e74705SXin Li     ASSERT_EQ(tok::text,                 Toks[0].getKind());
656*67e74705SXin Li     ASSERT_EQ(StringRef(" Meow "),       Toks[0].getText());
657*67e74705SXin Li 
658*67e74705SXin Li     ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
659*67e74705SXin Li     ASSERT_EQ(StringRef("verbatim"),     getVerbatimBlockName(Toks[1]));
660*67e74705SXin Li 
661*67e74705SXin Li     ASSERT_EQ(tok::verbatim_block_line,  Toks[2].getKind());
662*67e74705SXin Li     ASSERT_EQ(StringRef(" aaa "),        Toks[2].getVerbatimBlockText());
663*67e74705SXin Li 
664*67e74705SXin Li     ASSERT_EQ(tok::verbatim_block_end,   Toks[3].getKind());
665*67e74705SXin Li     ASSERT_EQ(StringRef("endverbatim"),  getVerbatimBlockName(Toks[3]));
666*67e74705SXin Li 
667*67e74705SXin Li     ASSERT_EQ(tok::newline,              Toks[4].getKind());
668*67e74705SXin Li     ASSERT_EQ(tok::newline,              Toks[5].getKind());
669*67e74705SXin Li   }
670*67e74705SXin Li }
671*67e74705SXin Li 
672*67e74705SXin Li // Single-line verbatim block without an end command.
TEST_F(CommentLexerTest,VerbatimBlock5)673*67e74705SXin Li TEST_F(CommentLexerTest, VerbatimBlock5) {
674*67e74705SXin Li   const char *Sources[] = {
675*67e74705SXin Li     "/// Meow \\verbatim aaa \n//",
676*67e74705SXin Li     "/** Meow \\verbatim aaa */"
677*67e74705SXin Li   };
678*67e74705SXin Li 
679*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
680*67e74705SXin Li     std::vector<Token> Toks;
681*67e74705SXin Li 
682*67e74705SXin Li     lexString(Sources[i], Toks);
683*67e74705SXin Li 
684*67e74705SXin Li     ASSERT_EQ(5U, Toks.size());
685*67e74705SXin Li 
686*67e74705SXin Li     ASSERT_EQ(tok::text,                 Toks[0].getKind());
687*67e74705SXin Li     ASSERT_EQ(StringRef(" Meow "),       Toks[0].getText());
688*67e74705SXin Li 
689*67e74705SXin Li     ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
690*67e74705SXin Li     ASSERT_EQ(StringRef("verbatim"),     getVerbatimBlockName(Toks[1]));
691*67e74705SXin Li 
692*67e74705SXin Li     ASSERT_EQ(tok::verbatim_block_line,  Toks[2].getKind());
693*67e74705SXin Li     ASSERT_EQ(StringRef(" aaa "),        Toks[2].getVerbatimBlockText());
694*67e74705SXin Li 
695*67e74705SXin Li     ASSERT_EQ(tok::newline,              Toks[3].getKind());
696*67e74705SXin Li     ASSERT_EQ(tok::newline,              Toks[4].getKind());
697*67e74705SXin Li   }
698*67e74705SXin Li }
699*67e74705SXin Li 
TEST_F(CommentLexerTest,VerbatimBlock6)700*67e74705SXin Li TEST_F(CommentLexerTest, VerbatimBlock6) {
701*67e74705SXin Li   const char *Source =
702*67e74705SXin Li     "// \\verbatim\n"
703*67e74705SXin Li     "// Aaa\n"
704*67e74705SXin Li     "//\n"
705*67e74705SXin Li     "// Bbb\n"
706*67e74705SXin Li     "// \\endverbatim\n";
707*67e74705SXin Li 
708*67e74705SXin Li   std::vector<Token> Toks;
709*67e74705SXin Li 
710*67e74705SXin Li   lexString(Source, Toks);
711*67e74705SXin Li 
712*67e74705SXin Li   ASSERT_EQ(10U, Toks.size());
713*67e74705SXin Li 
714*67e74705SXin Li   ASSERT_EQ(tok::text,                 Toks[0].getKind());
715*67e74705SXin Li   ASSERT_EQ(StringRef(" "),            Toks[0].getText());
716*67e74705SXin Li 
717*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
718*67e74705SXin Li   ASSERT_EQ(StringRef("verbatim"),     getVerbatimBlockName(Toks[1]));
719*67e74705SXin Li 
720*67e74705SXin Li   ASSERT_EQ(tok::newline,              Toks[2].getKind());
721*67e74705SXin Li 
722*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_line,  Toks[3].getKind());
723*67e74705SXin Li   ASSERT_EQ(StringRef(" Aaa"),         Toks[3].getVerbatimBlockText());
724*67e74705SXin Li 
725*67e74705SXin Li   ASSERT_EQ(tok::newline,              Toks[4].getKind());
726*67e74705SXin Li 
727*67e74705SXin Li   ASSERT_EQ(tok::newline,              Toks[5].getKind());
728*67e74705SXin Li 
729*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_line,  Toks[6].getKind());
730*67e74705SXin Li   ASSERT_EQ(StringRef(" Bbb"),         Toks[6].getVerbatimBlockText());
731*67e74705SXin Li 
732*67e74705SXin Li   ASSERT_EQ(tok::newline,              Toks[7].getKind());
733*67e74705SXin Li 
734*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_end,   Toks[8].getKind());
735*67e74705SXin Li   ASSERT_EQ(StringRef("endverbatim"),  getVerbatimBlockName(Toks[8]));
736*67e74705SXin Li 
737*67e74705SXin Li   ASSERT_EQ(tok::newline,              Toks[9].getKind());
738*67e74705SXin Li }
739*67e74705SXin Li 
TEST_F(CommentLexerTest,VerbatimBlock7)740*67e74705SXin Li TEST_F(CommentLexerTest, VerbatimBlock7) {
741*67e74705SXin Li   const char *Source =
742*67e74705SXin Li     "/* \\verbatim\n"
743*67e74705SXin Li     " * Aaa\n"
744*67e74705SXin Li     " *\n"
745*67e74705SXin Li     " * Bbb\n"
746*67e74705SXin Li     " * \\endverbatim\n"
747*67e74705SXin Li     " */";
748*67e74705SXin Li 
749*67e74705SXin Li   std::vector<Token> Toks;
750*67e74705SXin Li 
751*67e74705SXin Li   lexString(Source, Toks);
752*67e74705SXin Li 
753*67e74705SXin Li   ASSERT_EQ(10U, Toks.size());
754*67e74705SXin Li 
755*67e74705SXin Li   ASSERT_EQ(tok::text,                 Toks[0].getKind());
756*67e74705SXin Li   ASSERT_EQ(StringRef(" "),            Toks[0].getText());
757*67e74705SXin Li 
758*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
759*67e74705SXin Li   ASSERT_EQ(StringRef("verbatim"),     getVerbatimBlockName(Toks[1]));
760*67e74705SXin Li 
761*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_line,  Toks[2].getKind());
762*67e74705SXin Li   ASSERT_EQ(StringRef(" Aaa"),         Toks[2].getVerbatimBlockText());
763*67e74705SXin Li 
764*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_line,  Toks[3].getKind());
765*67e74705SXin Li   ASSERT_EQ(StringRef(""),             Toks[3].getVerbatimBlockText());
766*67e74705SXin Li 
767*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_line,  Toks[4].getKind());
768*67e74705SXin Li   ASSERT_EQ(StringRef(" Bbb"),         Toks[4].getVerbatimBlockText());
769*67e74705SXin Li 
770*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_end,   Toks[5].getKind());
771*67e74705SXin Li   ASSERT_EQ(StringRef("endverbatim"),  getVerbatimBlockName(Toks[5]));
772*67e74705SXin Li 
773*67e74705SXin Li   ASSERT_EQ(tok::newline,              Toks[6].getKind());
774*67e74705SXin Li 
775*67e74705SXin Li   ASSERT_EQ(tok::text,                 Toks[7].getKind());
776*67e74705SXin Li   ASSERT_EQ(StringRef(" "),            Toks[7].getText());
777*67e74705SXin Li 
778*67e74705SXin Li   ASSERT_EQ(tok::newline,              Toks[8].getKind());
779*67e74705SXin Li   ASSERT_EQ(tok::newline,              Toks[9].getKind());
780*67e74705SXin Li }
781*67e74705SXin Li 
782*67e74705SXin Li // Complex test for verbatim blocks.
TEST_F(CommentLexerTest,VerbatimBlock8)783*67e74705SXin Li TEST_F(CommentLexerTest, VerbatimBlock8) {
784*67e74705SXin Li   const char *Source =
785*67e74705SXin Li     "/* Meow \\verbatim aaa\\$\\@\n"
786*67e74705SXin Li     "bbb \\endverbati\r"
787*67e74705SXin Li     "ccc\r\n"
788*67e74705SXin Li     "ddd \\endverbatim Blah \\verbatim eee\n"
789*67e74705SXin Li     "\\endverbatim BlahBlah*/";
790*67e74705SXin Li   std::vector<Token> Toks;
791*67e74705SXin Li 
792*67e74705SXin Li   lexString(Source, Toks);
793*67e74705SXin Li 
794*67e74705SXin Li   ASSERT_EQ(14U, Toks.size());
795*67e74705SXin Li 
796*67e74705SXin Li   ASSERT_EQ(tok::text,                 Toks[0].getKind());
797*67e74705SXin Li   ASSERT_EQ(StringRef(" Meow "),       Toks[0].getText());
798*67e74705SXin Li 
799*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
800*67e74705SXin Li   ASSERT_EQ(StringRef("verbatim"),     getVerbatimBlockName(Toks[1]));
801*67e74705SXin Li 
802*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_line,  Toks[2].getKind());
803*67e74705SXin Li   ASSERT_EQ(StringRef(" aaa\\$\\@"),   Toks[2].getVerbatimBlockText());
804*67e74705SXin Li 
805*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_line,  Toks[3].getKind());
806*67e74705SXin Li   ASSERT_EQ(StringRef("bbb \\endverbati"), Toks[3].getVerbatimBlockText());
807*67e74705SXin Li 
808*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_line,  Toks[4].getKind());
809*67e74705SXin Li   ASSERT_EQ(StringRef("ccc"),          Toks[4].getVerbatimBlockText());
810*67e74705SXin Li 
811*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_line,  Toks[5].getKind());
812*67e74705SXin Li   ASSERT_EQ(StringRef("ddd "),         Toks[5].getVerbatimBlockText());
813*67e74705SXin Li 
814*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_end,   Toks[6].getKind());
815*67e74705SXin Li   ASSERT_EQ(StringRef("endverbatim"),  getVerbatimBlockName(Toks[6]));
816*67e74705SXin Li 
817*67e74705SXin Li   ASSERT_EQ(tok::text,                 Toks[7].getKind());
818*67e74705SXin Li   ASSERT_EQ(StringRef(" Blah "),       Toks[7].getText());
819*67e74705SXin Li 
820*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_begin, Toks[8].getKind());
821*67e74705SXin Li   ASSERT_EQ(StringRef("verbatim"),     getVerbatimBlockName(Toks[8]));
822*67e74705SXin Li 
823*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_line,  Toks[9].getKind());
824*67e74705SXin Li   ASSERT_EQ(StringRef(" eee"),         Toks[9].getVerbatimBlockText());
825*67e74705SXin Li 
826*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_end,   Toks[10].getKind());
827*67e74705SXin Li   ASSERT_EQ(StringRef("endverbatim"),  getVerbatimBlockName(Toks[10]));
828*67e74705SXin Li 
829*67e74705SXin Li   ASSERT_EQ(tok::text,                 Toks[11].getKind());
830*67e74705SXin Li   ASSERT_EQ(StringRef(" BlahBlah"),    Toks[11].getText());
831*67e74705SXin Li 
832*67e74705SXin Li   ASSERT_EQ(tok::newline,              Toks[12].getKind());
833*67e74705SXin Li   ASSERT_EQ(tok::newline,              Toks[13].getKind());
834*67e74705SXin Li }
835*67e74705SXin Li 
836*67e74705SXin Li // LaTeX verbatim blocks.
TEST_F(CommentLexerTest,VerbatimBlock9)837*67e74705SXin Li TEST_F(CommentLexerTest, VerbatimBlock9) {
838*67e74705SXin Li   const char *Source =
839*67e74705SXin Li     "/// \\f$ Aaa \\f$ \\f[ Bbb \\f] \\f{ Ccc \\f}";
840*67e74705SXin Li   std::vector<Token> Toks;
841*67e74705SXin Li 
842*67e74705SXin Li   lexString(Source, Toks);
843*67e74705SXin Li 
844*67e74705SXin Li   ASSERT_EQ(13U, Toks.size());
845*67e74705SXin Li 
846*67e74705SXin Li   ASSERT_EQ(tok::text,                 Toks[0].getKind());
847*67e74705SXin Li   ASSERT_EQ(StringRef(" "),            Toks[0].getText());
848*67e74705SXin Li 
849*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
850*67e74705SXin Li   ASSERT_EQ(StringRef("f$"),           getVerbatimBlockName(Toks[1]));
851*67e74705SXin Li 
852*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_line,  Toks[2].getKind());
853*67e74705SXin Li   ASSERT_EQ(StringRef(" Aaa "),        Toks[2].getVerbatimBlockText());
854*67e74705SXin Li 
855*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_end,   Toks[3].getKind());
856*67e74705SXin Li   ASSERT_EQ(StringRef("f$"),           getVerbatimBlockName(Toks[3]));
857*67e74705SXin Li 
858*67e74705SXin Li   ASSERT_EQ(tok::text,                 Toks[4].getKind());
859*67e74705SXin Li   ASSERT_EQ(StringRef(" "),            Toks[4].getText());
860*67e74705SXin Li 
861*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_begin, Toks[5].getKind());
862*67e74705SXin Li   ASSERT_EQ(StringRef("f["),           getVerbatimBlockName(Toks[5]));
863*67e74705SXin Li 
864*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_line,  Toks[6].getKind());
865*67e74705SXin Li   ASSERT_EQ(StringRef(" Bbb "),        Toks[6].getVerbatimBlockText());
866*67e74705SXin Li 
867*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_end,   Toks[7].getKind());
868*67e74705SXin Li   ASSERT_EQ(StringRef("f]"),           getVerbatimBlockName(Toks[7]));
869*67e74705SXin Li 
870*67e74705SXin Li   ASSERT_EQ(tok::text,                 Toks[8].getKind());
871*67e74705SXin Li   ASSERT_EQ(StringRef(" "),            Toks[8].getText());
872*67e74705SXin Li 
873*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_begin, Toks[9].getKind());
874*67e74705SXin Li   ASSERT_EQ(StringRef("f{"),           getVerbatimBlockName(Toks[9]));
875*67e74705SXin Li 
876*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_line,  Toks[10].getKind());
877*67e74705SXin Li   ASSERT_EQ(StringRef(" Ccc "),        Toks[10].getVerbatimBlockText());
878*67e74705SXin Li 
879*67e74705SXin Li   ASSERT_EQ(tok::verbatim_block_end,   Toks[11].getKind());
880*67e74705SXin Li   ASSERT_EQ(StringRef("f}"),           getVerbatimBlockName(Toks[11]));
881*67e74705SXin Li 
882*67e74705SXin Li   ASSERT_EQ(tok::newline,              Toks[12].getKind());
883*67e74705SXin Li }
884*67e74705SXin Li 
885*67e74705SXin Li // Empty verbatim line.
TEST_F(CommentLexerTest,VerbatimLine1)886*67e74705SXin Li TEST_F(CommentLexerTest, VerbatimLine1) {
887*67e74705SXin Li   const char *Sources[] = {
888*67e74705SXin Li     "/// \\fn\n//",
889*67e74705SXin Li     "/** \\fn*/"
890*67e74705SXin Li   };
891*67e74705SXin Li 
892*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
893*67e74705SXin Li     std::vector<Token> Toks;
894*67e74705SXin Li 
895*67e74705SXin Li     lexString(Sources[i], Toks);
896*67e74705SXin Li 
897*67e74705SXin Li     ASSERT_EQ(4U, Toks.size());
898*67e74705SXin Li 
899*67e74705SXin Li     ASSERT_EQ(tok::text,               Toks[0].getKind());
900*67e74705SXin Li     ASSERT_EQ(StringRef(" "),          Toks[0].getText());
901*67e74705SXin Li 
902*67e74705SXin Li     ASSERT_EQ(tok::verbatim_line_name, Toks[1].getKind());
903*67e74705SXin Li     ASSERT_EQ(StringRef("fn"),         getVerbatimLineName(Toks[1]));
904*67e74705SXin Li 
905*67e74705SXin Li     ASSERT_EQ(tok::newline,            Toks[2].getKind());
906*67e74705SXin Li     ASSERT_EQ(tok::newline,            Toks[3].getKind());
907*67e74705SXin Li   }
908*67e74705SXin Li }
909*67e74705SXin Li 
910*67e74705SXin Li // Verbatim line with Doxygen escape sequences, which should not be expanded.
TEST_F(CommentLexerTest,VerbatimLine2)911*67e74705SXin Li TEST_F(CommentLexerTest, VerbatimLine2) {
912*67e74705SXin Li   const char *Sources[] = {
913*67e74705SXin Li     "/// \\fn void *foo(const char *zzz = \"\\$\");\n//",
914*67e74705SXin Li     "/** \\fn void *foo(const char *zzz = \"\\$\");*/"
915*67e74705SXin Li   };
916*67e74705SXin Li 
917*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
918*67e74705SXin Li     std::vector<Token> Toks;
919*67e74705SXin Li 
920*67e74705SXin Li     lexString(Sources[i], Toks);
921*67e74705SXin Li 
922*67e74705SXin Li     ASSERT_EQ(5U, Toks.size());
923*67e74705SXin Li 
924*67e74705SXin Li     ASSERT_EQ(tok::text,               Toks[0].getKind());
925*67e74705SXin Li     ASSERT_EQ(StringRef(" "),          Toks[0].getText());
926*67e74705SXin Li 
927*67e74705SXin Li     ASSERT_EQ(tok::verbatim_line_name, Toks[1].getKind());
928*67e74705SXin Li     ASSERT_EQ(StringRef("fn"),         getVerbatimLineName(Toks[1]));
929*67e74705SXin Li 
930*67e74705SXin Li     ASSERT_EQ(tok::verbatim_line_text, Toks[2].getKind());
931*67e74705SXin Li     ASSERT_EQ(StringRef(" void *foo(const char *zzz = \"\\$\");"),
932*67e74705SXin Li                                        Toks[2].getVerbatimLineText());
933*67e74705SXin Li 
934*67e74705SXin Li     ASSERT_EQ(tok::newline,            Toks[3].getKind());
935*67e74705SXin Li     ASSERT_EQ(tok::newline,            Toks[4].getKind());
936*67e74705SXin Li   }
937*67e74705SXin Li }
938*67e74705SXin Li 
939*67e74705SXin Li // Verbatim line should not eat anything from next source line.
TEST_F(CommentLexerTest,VerbatimLine3)940*67e74705SXin Li TEST_F(CommentLexerTest, VerbatimLine3) {
941*67e74705SXin Li   const char *Source =
942*67e74705SXin Li     "/** \\fn void *foo(const char *zzz = \"\\$\");\n"
943*67e74705SXin Li     " * Meow\n"
944*67e74705SXin Li     " */";
945*67e74705SXin Li 
946*67e74705SXin Li   std::vector<Token> Toks;
947*67e74705SXin Li 
948*67e74705SXin Li   lexString(Source, Toks);
949*67e74705SXin Li 
950*67e74705SXin Li   ASSERT_EQ(9U, Toks.size());
951*67e74705SXin Li 
952*67e74705SXin Li   ASSERT_EQ(tok::text,               Toks[0].getKind());
953*67e74705SXin Li   ASSERT_EQ(StringRef(" "),          Toks[0].getText());
954*67e74705SXin Li 
955*67e74705SXin Li   ASSERT_EQ(tok::verbatim_line_name, Toks[1].getKind());
956*67e74705SXin Li   ASSERT_EQ(StringRef("fn"),         getVerbatimLineName(Toks[1]));
957*67e74705SXin Li 
958*67e74705SXin Li   ASSERT_EQ(tok::verbatim_line_text, Toks[2].getKind());
959*67e74705SXin Li   ASSERT_EQ(StringRef(" void *foo(const char *zzz = \"\\$\");"),
960*67e74705SXin Li                                      Toks[2].getVerbatimLineText());
961*67e74705SXin Li   ASSERT_EQ(tok::newline,            Toks[3].getKind());
962*67e74705SXin Li 
963*67e74705SXin Li   ASSERT_EQ(tok::text,               Toks[4].getKind());
964*67e74705SXin Li   ASSERT_EQ(StringRef(" Meow"),      Toks[4].getText());
965*67e74705SXin Li   ASSERT_EQ(tok::newline,            Toks[5].getKind());
966*67e74705SXin Li 
967*67e74705SXin Li   ASSERT_EQ(tok::text,               Toks[6].getKind());
968*67e74705SXin Li   ASSERT_EQ(StringRef(" "),          Toks[6].getText());
969*67e74705SXin Li 
970*67e74705SXin Li   ASSERT_EQ(tok::newline,            Toks[7].getKind());
971*67e74705SXin Li   ASSERT_EQ(tok::newline,            Toks[8].getKind());
972*67e74705SXin Li }
973*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML1)974*67e74705SXin Li TEST_F(CommentLexerTest, HTML1) {
975*67e74705SXin Li   const char *Source =
976*67e74705SXin Li     "// <";
977*67e74705SXin Li 
978*67e74705SXin Li   std::vector<Token> Toks;
979*67e74705SXin Li 
980*67e74705SXin Li   lexString(Source, Toks);
981*67e74705SXin Li 
982*67e74705SXin Li   ASSERT_EQ(3U, Toks.size());
983*67e74705SXin Li 
984*67e74705SXin Li   ASSERT_EQ(tok::text,      Toks[0].getKind());
985*67e74705SXin Li   ASSERT_EQ(StringRef(" "), Toks[0].getText());
986*67e74705SXin Li 
987*67e74705SXin Li   ASSERT_EQ(tok::text,      Toks[1].getKind());
988*67e74705SXin Li   ASSERT_EQ(StringRef("<"), Toks[1].getText());
989*67e74705SXin Li 
990*67e74705SXin Li   ASSERT_EQ(tok::newline,   Toks[2].getKind());
991*67e74705SXin Li }
992*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML2)993*67e74705SXin Li TEST_F(CommentLexerTest, HTML2) {
994*67e74705SXin Li   const char *Source =
995*67e74705SXin Li     "// a<2";
996*67e74705SXin Li 
997*67e74705SXin Li   std::vector<Token> Toks;
998*67e74705SXin Li 
999*67e74705SXin Li   lexString(Source, Toks);
1000*67e74705SXin Li 
1001*67e74705SXin Li   ASSERT_EQ(4U, Toks.size());
1002*67e74705SXin Li 
1003*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[0].getKind());
1004*67e74705SXin Li   ASSERT_EQ(StringRef(" a"), Toks[0].getText());
1005*67e74705SXin Li 
1006*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[1].getKind());
1007*67e74705SXin Li   ASSERT_EQ(StringRef("<"),  Toks[1].getText());
1008*67e74705SXin Li 
1009*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[2].getKind());
1010*67e74705SXin Li   ASSERT_EQ(StringRef("2"),  Toks[2].getText());
1011*67e74705SXin Li 
1012*67e74705SXin Li   ASSERT_EQ(tok::newline,    Toks[3].getKind());
1013*67e74705SXin Li }
1014*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML3)1015*67e74705SXin Li TEST_F(CommentLexerTest, HTML3) {
1016*67e74705SXin Li   const char *Source =
1017*67e74705SXin Li     "// < img";
1018*67e74705SXin Li 
1019*67e74705SXin Li   std::vector<Token> Toks;
1020*67e74705SXin Li 
1021*67e74705SXin Li   lexString(Source, Toks);
1022*67e74705SXin Li 
1023*67e74705SXin Li   ASSERT_EQ(4U, Toks.size());
1024*67e74705SXin Li 
1025*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[0].getKind());
1026*67e74705SXin Li   ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1027*67e74705SXin Li 
1028*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[1].getKind());
1029*67e74705SXin Li   ASSERT_EQ(StringRef("<"),    Toks[1].getText());
1030*67e74705SXin Li 
1031*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[2].getKind());
1032*67e74705SXin Li   ASSERT_EQ(StringRef(" img"), Toks[2].getText());
1033*67e74705SXin Li 
1034*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[3].getKind());
1035*67e74705SXin Li }
1036*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML4)1037*67e74705SXin Li TEST_F(CommentLexerTest, HTML4) {
1038*67e74705SXin Li   const char *Sources[] = {
1039*67e74705SXin Li     "// <img",
1040*67e74705SXin Li     "// <img "
1041*67e74705SXin Li   };
1042*67e74705SXin Li 
1043*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1044*67e74705SXin Li     std::vector<Token> Toks;
1045*67e74705SXin Li 
1046*67e74705SXin Li     lexString(Sources[i], Toks);
1047*67e74705SXin Li 
1048*67e74705SXin Li     ASSERT_EQ(3U, Toks.size());
1049*67e74705SXin Li 
1050*67e74705SXin Li     ASSERT_EQ(tok::text,           Toks[0].getKind());
1051*67e74705SXin Li     ASSERT_EQ(StringRef(" "),      Toks[0].getText());
1052*67e74705SXin Li 
1053*67e74705SXin Li     ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1054*67e74705SXin Li     ASSERT_EQ(StringRef("img"),    Toks[1].getHTMLTagStartName());
1055*67e74705SXin Li 
1056*67e74705SXin Li     ASSERT_EQ(tok::newline,        Toks[2].getKind());
1057*67e74705SXin Li   }
1058*67e74705SXin Li }
1059*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML5)1060*67e74705SXin Li TEST_F(CommentLexerTest, HTML5) {
1061*67e74705SXin Li   const char *Source =
1062*67e74705SXin Li     "// <img 42";
1063*67e74705SXin Li 
1064*67e74705SXin Li   std::vector<Token> Toks;
1065*67e74705SXin Li 
1066*67e74705SXin Li   lexString(Source, Toks);
1067*67e74705SXin Li 
1068*67e74705SXin Li   ASSERT_EQ(4U, Toks.size());
1069*67e74705SXin Li 
1070*67e74705SXin Li   ASSERT_EQ(tok::text,           Toks[0].getKind());
1071*67e74705SXin Li   ASSERT_EQ(StringRef(" "),      Toks[0].getText());
1072*67e74705SXin Li 
1073*67e74705SXin Li   ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1074*67e74705SXin Li   ASSERT_EQ(StringRef("img"),    Toks[1].getHTMLTagStartName());
1075*67e74705SXin Li 
1076*67e74705SXin Li   ASSERT_EQ(tok::text,           Toks[2].getKind());
1077*67e74705SXin Li   ASSERT_EQ(StringRef("42"),     Toks[2].getText());
1078*67e74705SXin Li 
1079*67e74705SXin Li   ASSERT_EQ(tok::newline,        Toks[3].getKind());
1080*67e74705SXin Li }
1081*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML6)1082*67e74705SXin Li TEST_F(CommentLexerTest, HTML6) {
1083*67e74705SXin Li   const char *Source = "// <img> Meow";
1084*67e74705SXin Li 
1085*67e74705SXin Li   std::vector<Token> Toks;
1086*67e74705SXin Li 
1087*67e74705SXin Li   lexString(Source, Toks);
1088*67e74705SXin Li 
1089*67e74705SXin Li   ASSERT_EQ(5U, Toks.size());
1090*67e74705SXin Li 
1091*67e74705SXin Li   ASSERT_EQ(tok::text,           Toks[0].getKind());
1092*67e74705SXin Li   ASSERT_EQ(StringRef(" "),      Toks[0].getText());
1093*67e74705SXin Li 
1094*67e74705SXin Li   ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1095*67e74705SXin Li   ASSERT_EQ(StringRef("img"),    Toks[1].getHTMLTagStartName());
1096*67e74705SXin Li 
1097*67e74705SXin Li   ASSERT_EQ(tok::html_greater,   Toks[2].getKind());
1098*67e74705SXin Li 
1099*67e74705SXin Li   ASSERT_EQ(tok::text,           Toks[3].getKind());
1100*67e74705SXin Li   ASSERT_EQ(StringRef(" Meow"),  Toks[3].getText());
1101*67e74705SXin Li 
1102*67e74705SXin Li   ASSERT_EQ(tok::newline,        Toks[4].getKind());
1103*67e74705SXin Li }
1104*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML7)1105*67e74705SXin Li TEST_F(CommentLexerTest, HTML7) {
1106*67e74705SXin Li   const char *Source = "// <img=";
1107*67e74705SXin Li 
1108*67e74705SXin Li   std::vector<Token> Toks;
1109*67e74705SXin Li 
1110*67e74705SXin Li   lexString(Source, Toks);
1111*67e74705SXin Li 
1112*67e74705SXin Li   ASSERT_EQ(4U, Toks.size());
1113*67e74705SXin Li 
1114*67e74705SXin Li   ASSERT_EQ(tok::text,           Toks[0].getKind());
1115*67e74705SXin Li   ASSERT_EQ(StringRef(" "),      Toks[0].getText());
1116*67e74705SXin Li 
1117*67e74705SXin Li   ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1118*67e74705SXin Li   ASSERT_EQ(StringRef("img"),    Toks[1].getHTMLTagStartName());
1119*67e74705SXin Li 
1120*67e74705SXin Li   ASSERT_EQ(tok::text,           Toks[2].getKind());
1121*67e74705SXin Li   ASSERT_EQ(StringRef("="),      Toks[2].getText());
1122*67e74705SXin Li 
1123*67e74705SXin Li   ASSERT_EQ(tok::newline,        Toks[3].getKind());
1124*67e74705SXin Li }
1125*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML8)1126*67e74705SXin Li TEST_F(CommentLexerTest, HTML8) {
1127*67e74705SXin Li   const char *Source = "// <img src=> Meow";
1128*67e74705SXin Li 
1129*67e74705SXin Li   std::vector<Token> Toks;
1130*67e74705SXin Li 
1131*67e74705SXin Li   lexString(Source, Toks);
1132*67e74705SXin Li 
1133*67e74705SXin Li   ASSERT_EQ(7U, Toks.size());
1134*67e74705SXin Li 
1135*67e74705SXin Li   ASSERT_EQ(tok::text,           Toks[0].getKind());
1136*67e74705SXin Li   ASSERT_EQ(StringRef(" "),      Toks[0].getText());
1137*67e74705SXin Li 
1138*67e74705SXin Li   ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1139*67e74705SXin Li   ASSERT_EQ(StringRef("img"),    Toks[1].getHTMLTagStartName());
1140*67e74705SXin Li 
1141*67e74705SXin Li   ASSERT_EQ(tok::html_ident,     Toks[2].getKind());
1142*67e74705SXin Li   ASSERT_EQ(StringRef("src"),   Toks[2].getHTMLIdent());
1143*67e74705SXin Li 
1144*67e74705SXin Li   ASSERT_EQ(tok::html_equals,    Toks[3].getKind());
1145*67e74705SXin Li 
1146*67e74705SXin Li   ASSERT_EQ(tok::html_greater,   Toks[4].getKind());
1147*67e74705SXin Li 
1148*67e74705SXin Li   ASSERT_EQ(tok::text,           Toks[5].getKind());
1149*67e74705SXin Li   ASSERT_EQ(StringRef(" Meow"),  Toks[5].getText());
1150*67e74705SXin Li 
1151*67e74705SXin Li   ASSERT_EQ(tok::newline,        Toks[6].getKind());
1152*67e74705SXin Li }
1153*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML9)1154*67e74705SXin Li TEST_F(CommentLexerTest, HTML9) {
1155*67e74705SXin Li   const char *Sources[] = {
1156*67e74705SXin Li     "// <img src",
1157*67e74705SXin Li     "// <img src "
1158*67e74705SXin Li   };
1159*67e74705SXin Li 
1160*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1161*67e74705SXin Li     std::vector<Token> Toks;
1162*67e74705SXin Li 
1163*67e74705SXin Li     lexString(Sources[i], Toks);
1164*67e74705SXin Li 
1165*67e74705SXin Li     ASSERT_EQ(4U, Toks.size());
1166*67e74705SXin Li 
1167*67e74705SXin Li     ASSERT_EQ(tok::text,           Toks[0].getKind());
1168*67e74705SXin Li     ASSERT_EQ(StringRef(" "),      Toks[0].getText());
1169*67e74705SXin Li 
1170*67e74705SXin Li     ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1171*67e74705SXin Li     ASSERT_EQ(StringRef("img"),    Toks[1].getHTMLTagStartName());
1172*67e74705SXin Li 
1173*67e74705SXin Li     ASSERT_EQ(tok::html_ident,     Toks[2].getKind());
1174*67e74705SXin Li     ASSERT_EQ(StringRef("src"),    Toks[2].getHTMLIdent());
1175*67e74705SXin Li 
1176*67e74705SXin Li     ASSERT_EQ(tok::newline,        Toks[3].getKind());
1177*67e74705SXin Li   }
1178*67e74705SXin Li }
1179*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML10)1180*67e74705SXin Li TEST_F(CommentLexerTest, HTML10) {
1181*67e74705SXin Li   const char *Sources[] = {
1182*67e74705SXin Li     "// <img src=",
1183*67e74705SXin Li     "// <img src ="
1184*67e74705SXin Li   };
1185*67e74705SXin Li 
1186*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1187*67e74705SXin Li     std::vector<Token> Toks;
1188*67e74705SXin Li 
1189*67e74705SXin Li     lexString(Sources[i], Toks);
1190*67e74705SXin Li 
1191*67e74705SXin Li     ASSERT_EQ(5U, Toks.size());
1192*67e74705SXin Li 
1193*67e74705SXin Li     ASSERT_EQ(tok::text,           Toks[0].getKind());
1194*67e74705SXin Li     ASSERT_EQ(StringRef(" "),      Toks[0].getText());
1195*67e74705SXin Li 
1196*67e74705SXin Li     ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1197*67e74705SXin Li     ASSERT_EQ(StringRef("img"),    Toks[1].getHTMLTagStartName());
1198*67e74705SXin Li 
1199*67e74705SXin Li     ASSERT_EQ(tok::html_ident,     Toks[2].getKind());
1200*67e74705SXin Li     ASSERT_EQ(StringRef("src"),    Toks[2].getHTMLIdent());
1201*67e74705SXin Li 
1202*67e74705SXin Li     ASSERT_EQ(tok::html_equals,    Toks[3].getKind());
1203*67e74705SXin Li 
1204*67e74705SXin Li     ASSERT_EQ(tok::newline,        Toks[4].getKind());
1205*67e74705SXin Li   }
1206*67e74705SXin Li }
1207*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML11)1208*67e74705SXin Li TEST_F(CommentLexerTest, HTML11) {
1209*67e74705SXin Li   const char *Sources[] = {
1210*67e74705SXin Li     "// <img src=\"",
1211*67e74705SXin Li     "// <img src = \"",
1212*67e74705SXin Li     "// <img src=\'",
1213*67e74705SXin Li     "// <img src = \'"
1214*67e74705SXin Li   };
1215*67e74705SXin Li 
1216*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1217*67e74705SXin Li     std::vector<Token> Toks;
1218*67e74705SXin Li 
1219*67e74705SXin Li     lexString(Sources[i], Toks);
1220*67e74705SXin Li 
1221*67e74705SXin Li     ASSERT_EQ(6U, Toks.size());
1222*67e74705SXin Li 
1223*67e74705SXin Li     ASSERT_EQ(tok::text,               Toks[0].getKind());
1224*67e74705SXin Li     ASSERT_EQ(StringRef(" "),          Toks[0].getText());
1225*67e74705SXin Li 
1226*67e74705SXin Li     ASSERT_EQ(tok::html_start_tag,     Toks[1].getKind());
1227*67e74705SXin Li     ASSERT_EQ(StringRef("img"),        Toks[1].getHTMLTagStartName());
1228*67e74705SXin Li 
1229*67e74705SXin Li     ASSERT_EQ(tok::html_ident,         Toks[2].getKind());
1230*67e74705SXin Li     ASSERT_EQ(StringRef("src"),        Toks[2].getHTMLIdent());
1231*67e74705SXin Li 
1232*67e74705SXin Li     ASSERT_EQ(tok::html_equals,        Toks[3].getKind());
1233*67e74705SXin Li 
1234*67e74705SXin Li     ASSERT_EQ(tok::html_quoted_string, Toks[4].getKind());
1235*67e74705SXin Li     ASSERT_EQ(StringRef(""),           Toks[4].getHTMLQuotedString());
1236*67e74705SXin Li 
1237*67e74705SXin Li     ASSERT_EQ(tok::newline,            Toks[5].getKind());
1238*67e74705SXin Li   }
1239*67e74705SXin Li }
1240*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML12)1241*67e74705SXin Li TEST_F(CommentLexerTest, HTML12) {
1242*67e74705SXin Li   const char *Source = "// <img src=@";
1243*67e74705SXin Li 
1244*67e74705SXin Li   std::vector<Token> Toks;
1245*67e74705SXin Li 
1246*67e74705SXin Li   lexString(Source, Toks);
1247*67e74705SXin Li 
1248*67e74705SXin Li   ASSERT_EQ(6U, Toks.size());
1249*67e74705SXin Li 
1250*67e74705SXin Li   ASSERT_EQ(tok::text,           Toks[0].getKind());
1251*67e74705SXin Li   ASSERT_EQ(StringRef(" "),      Toks[0].getText());
1252*67e74705SXin Li 
1253*67e74705SXin Li   ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1254*67e74705SXin Li   ASSERT_EQ(StringRef("img"),    Toks[1].getHTMLTagStartName());
1255*67e74705SXin Li 
1256*67e74705SXin Li   ASSERT_EQ(tok::html_ident,     Toks[2].getKind());
1257*67e74705SXin Li   ASSERT_EQ(StringRef("src"),    Toks[2].getHTMLIdent());
1258*67e74705SXin Li 
1259*67e74705SXin Li   ASSERT_EQ(tok::html_equals,    Toks[3].getKind());
1260*67e74705SXin Li 
1261*67e74705SXin Li   ASSERT_EQ(tok::text,           Toks[4].getKind());
1262*67e74705SXin Li   ASSERT_EQ(StringRef("@"),      Toks[4].getText());
1263*67e74705SXin Li 
1264*67e74705SXin Li   ASSERT_EQ(tok::newline,        Toks[5].getKind());
1265*67e74705SXin Li }
1266*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML13)1267*67e74705SXin Li TEST_F(CommentLexerTest, HTML13) {
1268*67e74705SXin Li   const char *Sources[] = {
1269*67e74705SXin Li     "// <img src=\"val\\\"\\'val",
1270*67e74705SXin Li     "// <img src=\"val\\\"\\'val\"",
1271*67e74705SXin Li     "// <img src=\'val\\\"\\'val",
1272*67e74705SXin Li     "// <img src=\'val\\\"\\'val\'"
1273*67e74705SXin Li   };
1274*67e74705SXin Li 
1275*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1276*67e74705SXin Li     std::vector<Token> Toks;
1277*67e74705SXin Li 
1278*67e74705SXin Li     lexString(Sources[i], Toks);
1279*67e74705SXin Li 
1280*67e74705SXin Li     ASSERT_EQ(6U, Toks.size());
1281*67e74705SXin Li 
1282*67e74705SXin Li     ASSERT_EQ(tok::text,                  Toks[0].getKind());
1283*67e74705SXin Li     ASSERT_EQ(StringRef(" "),             Toks[0].getText());
1284*67e74705SXin Li 
1285*67e74705SXin Li     ASSERT_EQ(tok::html_start_tag,        Toks[1].getKind());
1286*67e74705SXin Li     ASSERT_EQ(StringRef("img"),           Toks[1].getHTMLTagStartName());
1287*67e74705SXin Li 
1288*67e74705SXin Li     ASSERT_EQ(tok::html_ident,            Toks[2].getKind());
1289*67e74705SXin Li     ASSERT_EQ(StringRef("src"),           Toks[2].getHTMLIdent());
1290*67e74705SXin Li 
1291*67e74705SXin Li     ASSERT_EQ(tok::html_equals,           Toks[3].getKind());
1292*67e74705SXin Li 
1293*67e74705SXin Li     ASSERT_EQ(tok::html_quoted_string,    Toks[4].getKind());
1294*67e74705SXin Li     ASSERT_EQ(StringRef("val\\\"\\'val"), Toks[4].getHTMLQuotedString());
1295*67e74705SXin Li 
1296*67e74705SXin Li     ASSERT_EQ(tok::newline,               Toks[5].getKind());
1297*67e74705SXin Li   }
1298*67e74705SXin Li }
1299*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML14)1300*67e74705SXin Li TEST_F(CommentLexerTest, HTML14) {
1301*67e74705SXin Li   const char *Sources[] = {
1302*67e74705SXin Li     "// <img src=\"val\\\"\\'val\">",
1303*67e74705SXin Li     "// <img src=\'val\\\"\\'val\'>"
1304*67e74705SXin Li   };
1305*67e74705SXin Li 
1306*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1307*67e74705SXin Li     std::vector<Token> Toks;
1308*67e74705SXin Li 
1309*67e74705SXin Li     lexString(Sources[i], Toks);
1310*67e74705SXin Li 
1311*67e74705SXin Li     ASSERT_EQ(7U, Toks.size());
1312*67e74705SXin Li 
1313*67e74705SXin Li     ASSERT_EQ(tok::text,                  Toks[0].getKind());
1314*67e74705SXin Li     ASSERT_EQ(StringRef(" "),             Toks[0].getText());
1315*67e74705SXin Li 
1316*67e74705SXin Li     ASSERT_EQ(tok::html_start_tag,        Toks[1].getKind());
1317*67e74705SXin Li     ASSERT_EQ(StringRef("img"),           Toks[1].getHTMLTagStartName());
1318*67e74705SXin Li 
1319*67e74705SXin Li     ASSERT_EQ(tok::html_ident,            Toks[2].getKind());
1320*67e74705SXin Li     ASSERT_EQ(StringRef("src"),           Toks[2].getHTMLIdent());
1321*67e74705SXin Li 
1322*67e74705SXin Li     ASSERT_EQ(tok::html_equals,           Toks[3].getKind());
1323*67e74705SXin Li 
1324*67e74705SXin Li     ASSERT_EQ(tok::html_quoted_string,    Toks[4].getKind());
1325*67e74705SXin Li     ASSERT_EQ(StringRef("val\\\"\\'val"), Toks[4].getHTMLQuotedString());
1326*67e74705SXin Li 
1327*67e74705SXin Li     ASSERT_EQ(tok::html_greater,          Toks[5].getKind());
1328*67e74705SXin Li 
1329*67e74705SXin Li     ASSERT_EQ(tok::newline,               Toks[6].getKind());
1330*67e74705SXin Li   }
1331*67e74705SXin Li }
1332*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML15)1333*67e74705SXin Li TEST_F(CommentLexerTest, HTML15) {
1334*67e74705SXin Li   const char *Sources[] = {
1335*67e74705SXin Li     "// <img/>",
1336*67e74705SXin Li     "// <img />"
1337*67e74705SXin Li   };
1338*67e74705SXin Li 
1339*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1340*67e74705SXin Li     std::vector<Token> Toks;
1341*67e74705SXin Li 
1342*67e74705SXin Li     lexString(Sources[i], Toks);
1343*67e74705SXin Li 
1344*67e74705SXin Li     ASSERT_EQ(4U, Toks.size());
1345*67e74705SXin Li 
1346*67e74705SXin Li     ASSERT_EQ(tok::text,               Toks[0].getKind());
1347*67e74705SXin Li     ASSERT_EQ(StringRef(" "),          Toks[0].getText());
1348*67e74705SXin Li 
1349*67e74705SXin Li     ASSERT_EQ(tok::html_start_tag,     Toks[1].getKind());
1350*67e74705SXin Li     ASSERT_EQ(StringRef("img"),        Toks[1].getHTMLTagStartName());
1351*67e74705SXin Li 
1352*67e74705SXin Li     ASSERT_EQ(tok::html_slash_greater, Toks[2].getKind());
1353*67e74705SXin Li 
1354*67e74705SXin Li     ASSERT_EQ(tok::newline,            Toks[3].getKind());
1355*67e74705SXin Li   }
1356*67e74705SXin Li }
1357*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML16)1358*67e74705SXin Li TEST_F(CommentLexerTest, HTML16) {
1359*67e74705SXin Li   const char *Sources[] = {
1360*67e74705SXin Li     "// <img/ Aaa",
1361*67e74705SXin Li     "// <img / Aaa"
1362*67e74705SXin Li   };
1363*67e74705SXin Li 
1364*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1365*67e74705SXin Li     std::vector<Token> Toks;
1366*67e74705SXin Li 
1367*67e74705SXin Li     lexString(Sources[i], Toks);
1368*67e74705SXin Li 
1369*67e74705SXin Li     ASSERT_EQ(5U, Toks.size());
1370*67e74705SXin Li 
1371*67e74705SXin Li     ASSERT_EQ(tok::text,               Toks[0].getKind());
1372*67e74705SXin Li     ASSERT_EQ(StringRef(" "),          Toks[0].getText());
1373*67e74705SXin Li 
1374*67e74705SXin Li     ASSERT_EQ(tok::html_start_tag,     Toks[1].getKind());
1375*67e74705SXin Li     ASSERT_EQ(StringRef("img"),        Toks[1].getHTMLTagStartName());
1376*67e74705SXin Li 
1377*67e74705SXin Li     ASSERT_EQ(tok::text,               Toks[2].getKind());
1378*67e74705SXin Li     ASSERT_EQ(StringRef("/"),          Toks[2].getText());
1379*67e74705SXin Li 
1380*67e74705SXin Li     ASSERT_EQ(tok::text,               Toks[3].getKind());
1381*67e74705SXin Li     ASSERT_EQ(StringRef(" Aaa"),       Toks[3].getText());
1382*67e74705SXin Li 
1383*67e74705SXin Li     ASSERT_EQ(tok::newline,            Toks[4].getKind());
1384*67e74705SXin Li   }
1385*67e74705SXin Li }
1386*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML17)1387*67e74705SXin Li TEST_F(CommentLexerTest, HTML17) {
1388*67e74705SXin Li   const char *Source = "// </";
1389*67e74705SXin Li 
1390*67e74705SXin Li   std::vector<Token> Toks;
1391*67e74705SXin Li 
1392*67e74705SXin Li   lexString(Source, Toks);
1393*67e74705SXin Li 
1394*67e74705SXin Li   ASSERT_EQ(3U, Toks.size());
1395*67e74705SXin Li 
1396*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[0].getKind());
1397*67e74705SXin Li   ASSERT_EQ(StringRef(" "),  Toks[0].getText());
1398*67e74705SXin Li 
1399*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[1].getKind());
1400*67e74705SXin Li   ASSERT_EQ(StringRef("</"), Toks[1].getText());
1401*67e74705SXin Li 
1402*67e74705SXin Li   ASSERT_EQ(tok::newline,    Toks[2].getKind());
1403*67e74705SXin Li }
1404*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML18)1405*67e74705SXin Li TEST_F(CommentLexerTest, HTML18) {
1406*67e74705SXin Li   const char *Source = "// </@";
1407*67e74705SXin Li 
1408*67e74705SXin Li   std::vector<Token> Toks;
1409*67e74705SXin Li 
1410*67e74705SXin Li   lexString(Source, Toks);
1411*67e74705SXin Li 
1412*67e74705SXin Li   ASSERT_EQ(4U, Toks.size());
1413*67e74705SXin Li 
1414*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[0].getKind());
1415*67e74705SXin Li   ASSERT_EQ(StringRef(" "),  Toks[0].getText());
1416*67e74705SXin Li 
1417*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[1].getKind());
1418*67e74705SXin Li   ASSERT_EQ(StringRef("</"), Toks[1].getText());
1419*67e74705SXin Li 
1420*67e74705SXin Li   ASSERT_EQ(tok::text,       Toks[2].getKind());
1421*67e74705SXin Li   ASSERT_EQ(StringRef("@"),  Toks[2].getText());
1422*67e74705SXin Li 
1423*67e74705SXin Li   ASSERT_EQ(tok::newline,    Toks[3].getKind());
1424*67e74705SXin Li }
1425*67e74705SXin Li 
TEST_F(CommentLexerTest,HTML19)1426*67e74705SXin Li TEST_F(CommentLexerTest, HTML19) {
1427*67e74705SXin Li   const char *Source = "// </img";
1428*67e74705SXin Li 
1429*67e74705SXin Li   std::vector<Token> Toks;
1430*67e74705SXin Li 
1431*67e74705SXin Li   lexString(Source, Toks);
1432*67e74705SXin Li 
1433*67e74705SXin Li   ASSERT_EQ(3U, Toks.size());
1434*67e74705SXin Li 
1435*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[0].getKind());
1436*67e74705SXin Li   ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1437*67e74705SXin Li 
1438*67e74705SXin Li   ASSERT_EQ(tok::html_end_tag, Toks[1].getKind());
1439*67e74705SXin Li   ASSERT_EQ(StringRef("img"),  Toks[1].getHTMLTagEndName());
1440*67e74705SXin Li 
1441*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[2].getKind());
1442*67e74705SXin Li }
1443*67e74705SXin Li 
TEST_F(CommentLexerTest,NotAKnownHTMLTag1)1444*67e74705SXin Li TEST_F(CommentLexerTest, NotAKnownHTMLTag1) {
1445*67e74705SXin Li   const char *Source = "// <tag>";
1446*67e74705SXin Li 
1447*67e74705SXin Li   std::vector<Token> Toks;
1448*67e74705SXin Li 
1449*67e74705SXin Li   lexString(Source, Toks);
1450*67e74705SXin Li 
1451*67e74705SXin Li   ASSERT_EQ(4U, Toks.size());
1452*67e74705SXin Li 
1453*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[0].getKind());
1454*67e74705SXin Li   ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1455*67e74705SXin Li 
1456*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[1].getKind());
1457*67e74705SXin Li   ASSERT_EQ(StringRef("<tag"), Toks[1].getText());
1458*67e74705SXin Li 
1459*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[2].getKind());
1460*67e74705SXin Li   ASSERT_EQ(StringRef(">"),    Toks[2].getText());
1461*67e74705SXin Li 
1462*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[3].getKind());
1463*67e74705SXin Li }
1464*67e74705SXin Li 
TEST_F(CommentLexerTest,NotAKnownHTMLTag2)1465*67e74705SXin Li TEST_F(CommentLexerTest, NotAKnownHTMLTag2) {
1466*67e74705SXin Li   const char *Source = "// </tag>";
1467*67e74705SXin Li 
1468*67e74705SXin Li   std::vector<Token> Toks;
1469*67e74705SXin Li 
1470*67e74705SXin Li   lexString(Source, Toks);
1471*67e74705SXin Li 
1472*67e74705SXin Li   ASSERT_EQ(4U, Toks.size());
1473*67e74705SXin Li 
1474*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[0].getKind());
1475*67e74705SXin Li   ASSERT_EQ(StringRef(" "),     Toks[0].getText());
1476*67e74705SXin Li 
1477*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[1].getKind());
1478*67e74705SXin Li   ASSERT_EQ(StringRef("</tag"), Toks[1].getText());
1479*67e74705SXin Li 
1480*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[2].getKind());
1481*67e74705SXin Li   ASSERT_EQ(StringRef(">"),     Toks[2].getText());
1482*67e74705SXin Li 
1483*67e74705SXin Li   ASSERT_EQ(tok::newline,       Toks[3].getKind());
1484*67e74705SXin Li }
1485*67e74705SXin Li 
TEST_F(CommentLexerTest,HTMLCharacterReferences1)1486*67e74705SXin Li TEST_F(CommentLexerTest, HTMLCharacterReferences1) {
1487*67e74705SXin Li   const char *Source = "// &";
1488*67e74705SXin Li 
1489*67e74705SXin Li   std::vector<Token> Toks;
1490*67e74705SXin Li 
1491*67e74705SXin Li   lexString(Source, Toks);
1492*67e74705SXin Li 
1493*67e74705SXin Li   ASSERT_EQ(3U, Toks.size());
1494*67e74705SXin Li 
1495*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[0].getKind());
1496*67e74705SXin Li   ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1497*67e74705SXin Li 
1498*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[1].getKind());
1499*67e74705SXin Li   ASSERT_EQ(StringRef("&"),    Toks[1].getText());
1500*67e74705SXin Li 
1501*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[2].getKind());
1502*67e74705SXin Li }
1503*67e74705SXin Li 
TEST_F(CommentLexerTest,HTMLCharacterReferences2)1504*67e74705SXin Li TEST_F(CommentLexerTest, HTMLCharacterReferences2) {
1505*67e74705SXin Li   const char *Source = "// &!";
1506*67e74705SXin Li 
1507*67e74705SXin Li   std::vector<Token> Toks;
1508*67e74705SXin Li 
1509*67e74705SXin Li   lexString(Source, Toks);
1510*67e74705SXin Li 
1511*67e74705SXin Li   ASSERT_EQ(4U, Toks.size());
1512*67e74705SXin Li 
1513*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[0].getKind());
1514*67e74705SXin Li   ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1515*67e74705SXin Li 
1516*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[1].getKind());
1517*67e74705SXin Li   ASSERT_EQ(StringRef("&"),    Toks[1].getText());
1518*67e74705SXin Li 
1519*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[2].getKind());
1520*67e74705SXin Li   ASSERT_EQ(StringRef("!"),    Toks[2].getText());
1521*67e74705SXin Li 
1522*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[3].getKind());
1523*67e74705SXin Li }
1524*67e74705SXin Li 
TEST_F(CommentLexerTest,HTMLCharacterReferences3)1525*67e74705SXin Li TEST_F(CommentLexerTest, HTMLCharacterReferences3) {
1526*67e74705SXin Li   const char *Source = "// &amp";
1527*67e74705SXin Li 
1528*67e74705SXin Li   std::vector<Token> Toks;
1529*67e74705SXin Li 
1530*67e74705SXin Li   lexString(Source, Toks);
1531*67e74705SXin Li 
1532*67e74705SXin Li   ASSERT_EQ(3U, Toks.size());
1533*67e74705SXin Li 
1534*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[0].getKind());
1535*67e74705SXin Li   ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1536*67e74705SXin Li 
1537*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[1].getKind());
1538*67e74705SXin Li   ASSERT_EQ(StringRef("&amp"), Toks[1].getText());
1539*67e74705SXin Li 
1540*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[2].getKind());
1541*67e74705SXin Li }
1542*67e74705SXin Li 
TEST_F(CommentLexerTest,HTMLCharacterReferences4)1543*67e74705SXin Li TEST_F(CommentLexerTest, HTMLCharacterReferences4) {
1544*67e74705SXin Li   const char *Source = "// &amp!";
1545*67e74705SXin Li 
1546*67e74705SXin Li   std::vector<Token> Toks;
1547*67e74705SXin Li 
1548*67e74705SXin Li   lexString(Source, Toks);
1549*67e74705SXin Li 
1550*67e74705SXin Li   ASSERT_EQ(4U, Toks.size());
1551*67e74705SXin Li 
1552*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[0].getKind());
1553*67e74705SXin Li   ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1554*67e74705SXin Li 
1555*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[1].getKind());
1556*67e74705SXin Li   ASSERT_EQ(StringRef("&amp"), Toks[1].getText());
1557*67e74705SXin Li 
1558*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[2].getKind());
1559*67e74705SXin Li   ASSERT_EQ(StringRef("!"),    Toks[2].getText());
1560*67e74705SXin Li 
1561*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[3].getKind());
1562*67e74705SXin Li }
1563*67e74705SXin Li 
TEST_F(CommentLexerTest,HTMLCharacterReferences5)1564*67e74705SXin Li TEST_F(CommentLexerTest, HTMLCharacterReferences5) {
1565*67e74705SXin Li   const char *Source = "// &#";
1566*67e74705SXin Li 
1567*67e74705SXin Li   std::vector<Token> Toks;
1568*67e74705SXin Li 
1569*67e74705SXin Li   lexString(Source, Toks);
1570*67e74705SXin Li 
1571*67e74705SXin Li   ASSERT_EQ(3U, Toks.size());
1572*67e74705SXin Li 
1573*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[0].getKind());
1574*67e74705SXin Li   ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1575*67e74705SXin Li 
1576*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[1].getKind());
1577*67e74705SXin Li   ASSERT_EQ(StringRef("&#"),   Toks[1].getText());
1578*67e74705SXin Li 
1579*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[2].getKind());
1580*67e74705SXin Li }
1581*67e74705SXin Li 
TEST_F(CommentLexerTest,HTMLCharacterReferences6)1582*67e74705SXin Li TEST_F(CommentLexerTest, HTMLCharacterReferences6) {
1583*67e74705SXin Li   const char *Source = "// &#a";
1584*67e74705SXin Li 
1585*67e74705SXin Li   std::vector<Token> Toks;
1586*67e74705SXin Li 
1587*67e74705SXin Li   lexString(Source, Toks);
1588*67e74705SXin Li 
1589*67e74705SXin Li   ASSERT_EQ(4U, Toks.size());
1590*67e74705SXin Li 
1591*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[0].getKind());
1592*67e74705SXin Li   ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1593*67e74705SXin Li 
1594*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[1].getKind());
1595*67e74705SXin Li   ASSERT_EQ(StringRef("&#"),   Toks[1].getText());
1596*67e74705SXin Li 
1597*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[2].getKind());
1598*67e74705SXin Li   ASSERT_EQ(StringRef("a"),    Toks[2].getText());
1599*67e74705SXin Li 
1600*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[3].getKind());
1601*67e74705SXin Li }
1602*67e74705SXin Li 
TEST_F(CommentLexerTest,HTMLCharacterReferences7)1603*67e74705SXin Li TEST_F(CommentLexerTest, HTMLCharacterReferences7) {
1604*67e74705SXin Li   const char *Source = "// &#42";
1605*67e74705SXin Li 
1606*67e74705SXin Li   std::vector<Token> Toks;
1607*67e74705SXin Li 
1608*67e74705SXin Li   lexString(Source, Toks);
1609*67e74705SXin Li 
1610*67e74705SXin Li   ASSERT_EQ(3U, Toks.size());
1611*67e74705SXin Li 
1612*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[0].getKind());
1613*67e74705SXin Li   ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1614*67e74705SXin Li 
1615*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[1].getKind());
1616*67e74705SXin Li   ASSERT_EQ(StringRef("&#42"), Toks[1].getText());
1617*67e74705SXin Li 
1618*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[2].getKind());
1619*67e74705SXin Li }
1620*67e74705SXin Li 
TEST_F(CommentLexerTest,HTMLCharacterReferences8)1621*67e74705SXin Li TEST_F(CommentLexerTest, HTMLCharacterReferences8) {
1622*67e74705SXin Li   const char *Source = "// &#42a";
1623*67e74705SXin Li 
1624*67e74705SXin Li   std::vector<Token> Toks;
1625*67e74705SXin Li 
1626*67e74705SXin Li   lexString(Source, Toks);
1627*67e74705SXin Li 
1628*67e74705SXin Li   ASSERT_EQ(4U, Toks.size());
1629*67e74705SXin Li 
1630*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[0].getKind());
1631*67e74705SXin Li   ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1632*67e74705SXin Li 
1633*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[1].getKind());
1634*67e74705SXin Li   ASSERT_EQ(StringRef("&#42"), Toks[1].getText());
1635*67e74705SXin Li 
1636*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[2].getKind());
1637*67e74705SXin Li   ASSERT_EQ(StringRef("a"),    Toks[2].getText());
1638*67e74705SXin Li 
1639*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[3].getKind());
1640*67e74705SXin Li }
1641*67e74705SXin Li 
TEST_F(CommentLexerTest,HTMLCharacterReferences9)1642*67e74705SXin Li TEST_F(CommentLexerTest, HTMLCharacterReferences9) {
1643*67e74705SXin Li   const char *Source = "// &#x";
1644*67e74705SXin Li 
1645*67e74705SXin Li   std::vector<Token> Toks;
1646*67e74705SXin Li 
1647*67e74705SXin Li   lexString(Source, Toks);
1648*67e74705SXin Li 
1649*67e74705SXin Li   ASSERT_EQ(3U, Toks.size());
1650*67e74705SXin Li 
1651*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[0].getKind());
1652*67e74705SXin Li   ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1653*67e74705SXin Li 
1654*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[1].getKind());
1655*67e74705SXin Li   ASSERT_EQ(StringRef("&#x"),  Toks[1].getText());
1656*67e74705SXin Li 
1657*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[2].getKind());
1658*67e74705SXin Li }
1659*67e74705SXin Li 
TEST_F(CommentLexerTest,HTMLCharacterReferences10)1660*67e74705SXin Li TEST_F(CommentLexerTest, HTMLCharacterReferences10) {
1661*67e74705SXin Li   const char *Source = "// &#xz";
1662*67e74705SXin Li 
1663*67e74705SXin Li   std::vector<Token> Toks;
1664*67e74705SXin Li 
1665*67e74705SXin Li   lexString(Source, Toks);
1666*67e74705SXin Li 
1667*67e74705SXin Li   ASSERT_EQ(4U, Toks.size());
1668*67e74705SXin Li 
1669*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[0].getKind());
1670*67e74705SXin Li   ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1671*67e74705SXin Li 
1672*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[1].getKind());
1673*67e74705SXin Li   ASSERT_EQ(StringRef("&#x"),  Toks[1].getText());
1674*67e74705SXin Li 
1675*67e74705SXin Li   ASSERT_EQ(tok::text,         Toks[2].getKind());
1676*67e74705SXin Li   ASSERT_EQ(StringRef("z"),    Toks[2].getText());
1677*67e74705SXin Li 
1678*67e74705SXin Li   ASSERT_EQ(tok::newline,      Toks[3].getKind());
1679*67e74705SXin Li }
1680*67e74705SXin Li 
TEST_F(CommentLexerTest,HTMLCharacterReferences11)1681*67e74705SXin Li TEST_F(CommentLexerTest, HTMLCharacterReferences11) {
1682*67e74705SXin Li   const char *Source = "// &#xab";
1683*67e74705SXin Li 
1684*67e74705SXin Li   std::vector<Token> Toks;
1685*67e74705SXin Li 
1686*67e74705SXin Li   lexString(Source, Toks);
1687*67e74705SXin Li 
1688*67e74705SXin Li   ASSERT_EQ(3U, Toks.size());
1689*67e74705SXin Li 
1690*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[0].getKind());
1691*67e74705SXin Li   ASSERT_EQ(StringRef(" "),     Toks[0].getText());
1692*67e74705SXin Li 
1693*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[1].getKind());
1694*67e74705SXin Li   ASSERT_EQ(StringRef("&#xab"), Toks[1].getText());
1695*67e74705SXin Li 
1696*67e74705SXin Li   ASSERT_EQ(tok::newline,       Toks[2].getKind());
1697*67e74705SXin Li }
1698*67e74705SXin Li 
TEST_F(CommentLexerTest,HTMLCharacterReferences12)1699*67e74705SXin Li TEST_F(CommentLexerTest, HTMLCharacterReferences12) {
1700*67e74705SXin Li   const char *Source = "// &#xaBz";
1701*67e74705SXin Li 
1702*67e74705SXin Li   std::vector<Token> Toks;
1703*67e74705SXin Li 
1704*67e74705SXin Li   lexString(Source, Toks);
1705*67e74705SXin Li 
1706*67e74705SXin Li   ASSERT_EQ(4U, Toks.size());
1707*67e74705SXin Li 
1708*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[0].getKind());
1709*67e74705SXin Li   ASSERT_EQ(StringRef(" "),     Toks[0].getText());
1710*67e74705SXin Li 
1711*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[1].getKind());
1712*67e74705SXin Li   ASSERT_EQ(StringRef("&#xaB"), Toks[1].getText());
1713*67e74705SXin Li 
1714*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[2].getKind());
1715*67e74705SXin Li   ASSERT_EQ(StringRef("z"),     Toks[2].getText());
1716*67e74705SXin Li 
1717*67e74705SXin Li   ASSERT_EQ(tok::newline,       Toks[3].getKind());
1718*67e74705SXin Li }
1719*67e74705SXin Li 
TEST_F(CommentLexerTest,HTMLCharacterReferences13)1720*67e74705SXin Li TEST_F(CommentLexerTest, HTMLCharacterReferences13) {
1721*67e74705SXin Li   const char *Source = "// &amp;";
1722*67e74705SXin Li 
1723*67e74705SXin Li   std::vector<Token> Toks;
1724*67e74705SXin Li 
1725*67e74705SXin Li   lexString(Source, Toks);
1726*67e74705SXin Li 
1727*67e74705SXin Li   ASSERT_EQ(3U, Toks.size());
1728*67e74705SXin Li 
1729*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[0].getKind());
1730*67e74705SXin Li   ASSERT_EQ(StringRef(" "),     Toks[0].getText());
1731*67e74705SXin Li 
1732*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[1].getKind());
1733*67e74705SXin Li   ASSERT_EQ(StringRef("&"),     Toks[1].getText());
1734*67e74705SXin Li 
1735*67e74705SXin Li   ASSERT_EQ(tok::newline,       Toks[2].getKind());
1736*67e74705SXin Li }
1737*67e74705SXin Li 
TEST_F(CommentLexerTest,HTMLCharacterReferences14)1738*67e74705SXin Li TEST_F(CommentLexerTest, HTMLCharacterReferences14) {
1739*67e74705SXin Li   const char *Source = "// &amp;&lt;";
1740*67e74705SXin Li 
1741*67e74705SXin Li   std::vector<Token> Toks;
1742*67e74705SXin Li 
1743*67e74705SXin Li   lexString(Source, Toks);
1744*67e74705SXin Li 
1745*67e74705SXin Li   ASSERT_EQ(4U, Toks.size());
1746*67e74705SXin Li 
1747*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[0].getKind());
1748*67e74705SXin Li   ASSERT_EQ(StringRef(" "),     Toks[0].getText());
1749*67e74705SXin Li 
1750*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[1].getKind());
1751*67e74705SXin Li   ASSERT_EQ(StringRef("&"),     Toks[1].getText());
1752*67e74705SXin Li 
1753*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[2].getKind());
1754*67e74705SXin Li   ASSERT_EQ(StringRef("<"),     Toks[2].getText());
1755*67e74705SXin Li 
1756*67e74705SXin Li   ASSERT_EQ(tok::newline,       Toks[3].getKind());
1757*67e74705SXin Li }
1758*67e74705SXin Li 
TEST_F(CommentLexerTest,HTMLCharacterReferences15)1759*67e74705SXin Li TEST_F(CommentLexerTest, HTMLCharacterReferences15) {
1760*67e74705SXin Li   const char *Source = "// &amp; meow";
1761*67e74705SXin Li 
1762*67e74705SXin Li   std::vector<Token> Toks;
1763*67e74705SXin Li 
1764*67e74705SXin Li   lexString(Source, Toks);
1765*67e74705SXin Li 
1766*67e74705SXin Li   ASSERT_EQ(4U, Toks.size());
1767*67e74705SXin Li 
1768*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[0].getKind());
1769*67e74705SXin Li   ASSERT_EQ(StringRef(" "),     Toks[0].getText());
1770*67e74705SXin Li 
1771*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[1].getKind());
1772*67e74705SXin Li   ASSERT_EQ(StringRef("&"),     Toks[1].getText());
1773*67e74705SXin Li 
1774*67e74705SXin Li   ASSERT_EQ(tok::text,          Toks[2].getKind());
1775*67e74705SXin Li   ASSERT_EQ(StringRef(" meow"), Toks[2].getText());
1776*67e74705SXin Li 
1777*67e74705SXin Li   ASSERT_EQ(tok::newline,       Toks[3].getKind());
1778*67e74705SXin Li }
1779*67e74705SXin Li 
TEST_F(CommentLexerTest,HTMLCharacterReferences16)1780*67e74705SXin Li TEST_F(CommentLexerTest, HTMLCharacterReferences16) {
1781*67e74705SXin Li   const char *Sources[] = {
1782*67e74705SXin Li     "// &#61;",
1783*67e74705SXin Li     "// &#x3d;",
1784*67e74705SXin Li     "// &#X3d;",
1785*67e74705SXin Li     "// &#X3D;"
1786*67e74705SXin Li   };
1787*67e74705SXin Li 
1788*67e74705SXin Li   for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1789*67e74705SXin Li     std::vector<Token> Toks;
1790*67e74705SXin Li 
1791*67e74705SXin Li     lexString(Sources[i], Toks);
1792*67e74705SXin Li 
1793*67e74705SXin Li     ASSERT_EQ(3U, Toks.size());
1794*67e74705SXin Li 
1795*67e74705SXin Li     ASSERT_EQ(tok::text,          Toks[0].getKind());
1796*67e74705SXin Li     ASSERT_EQ(StringRef(" "),     Toks[0].getText());
1797*67e74705SXin Li 
1798*67e74705SXin Li     ASSERT_EQ(tok::text,          Toks[1].getKind());
1799*67e74705SXin Li     ASSERT_EQ(StringRef("="),     Toks[1].getText());
1800*67e74705SXin Li 
1801*67e74705SXin Li     ASSERT_EQ(tok::newline,       Toks[2].getKind());
1802*67e74705SXin Li   }
1803*67e74705SXin Li }
1804*67e74705SXin Li 
TEST_F(CommentLexerTest,MultipleComments)1805*67e74705SXin Li TEST_F(CommentLexerTest, MultipleComments) {
1806*67e74705SXin Li   const char *Source =
1807*67e74705SXin Li     "// Aaa\n"
1808*67e74705SXin Li     "/// Bbb\n"
1809*67e74705SXin Li     "/* Ccc\n"
1810*67e74705SXin Li     " * Ddd*/\n"
1811*67e74705SXin Li     "/** Eee*/";
1812*67e74705SXin Li 
1813*67e74705SXin Li   std::vector<Token> Toks;
1814*67e74705SXin Li 
1815*67e74705SXin Li   lexString(Source, Toks);
1816*67e74705SXin Li 
1817*67e74705SXin Li   ASSERT_EQ(12U, Toks.size());
1818*67e74705SXin Li 
1819*67e74705SXin Li   ASSERT_EQ(tok::text,           Toks[0].getKind());
1820*67e74705SXin Li   ASSERT_EQ(StringRef(" Aaa"),   Toks[0].getText());
1821*67e74705SXin Li   ASSERT_EQ(tok::newline,        Toks[1].getKind());
1822*67e74705SXin Li 
1823*67e74705SXin Li   ASSERT_EQ(tok::text,           Toks[2].getKind());
1824*67e74705SXin Li   ASSERT_EQ(StringRef(" Bbb"),   Toks[2].getText());
1825*67e74705SXin Li   ASSERT_EQ(tok::newline,        Toks[3].getKind());
1826*67e74705SXin Li 
1827*67e74705SXin Li   ASSERT_EQ(tok::text,           Toks[4].getKind());
1828*67e74705SXin Li   ASSERT_EQ(StringRef(" Ccc"),   Toks[4].getText());
1829*67e74705SXin Li   ASSERT_EQ(tok::newline,        Toks[5].getKind());
1830*67e74705SXin Li 
1831*67e74705SXin Li   ASSERT_EQ(tok::text,           Toks[6].getKind());
1832*67e74705SXin Li   ASSERT_EQ(StringRef(" Ddd"),   Toks[6].getText());
1833*67e74705SXin Li   ASSERT_EQ(tok::newline,        Toks[7].getKind());
1834*67e74705SXin Li   ASSERT_EQ(tok::newline,        Toks[8].getKind());
1835*67e74705SXin Li 
1836*67e74705SXin Li   ASSERT_EQ(tok::text,           Toks[9].getKind());
1837*67e74705SXin Li   ASSERT_EQ(StringRef(" Eee"),   Toks[9].getText());
1838*67e74705SXin Li 
1839*67e74705SXin Li   ASSERT_EQ(tok::newline,        Toks[10].getKind());
1840*67e74705SXin Li   ASSERT_EQ(tok::newline,        Toks[11].getKind());
1841*67e74705SXin Li }
1842*67e74705SXin Li 
1843*67e74705SXin Li } // end namespace comments
1844*67e74705SXin Li } // end namespace clang
1845*67e74705SXin Li 
1846