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