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