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