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