12d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko//===- unittests/AST/CommentLexer.cpp ------ Comment lexer tests ----------===//
22d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko//
32d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko//                     The LLVM Compiler Infrastructure
42d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko//
52d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// This file is distributed under the University of Illinois Open Source
62d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// License. See LICENSE.TXT for details.
72d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko//
82d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko//===----------------------------------------------------------------------===//
92d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
101050e8b2252d89a0004a6fd25a58dab88b5ee625Chandler Carruth#include "clang/AST/CommentLexer.h"
111050e8b2252d89a0004a6fd25a58dab88b5ee625Chandler Carruth#include "clang/AST/CommentCommandTraits.h"
126ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko#include "clang/Basic/CommentOptions.h"
132d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko#include "clang/Basic/Diagnostic.h"
143aeb34f5639ca03ba952bef7239028eaaec33281Douglas Gregor#include "clang/Basic/DiagnosticOptions.h"
151050e8b2252d89a0004a6fd25a58dab88b5ee625Chandler Carruth#include "clang/Basic/FileManager.h"
167cc315ccf80382fab7674735fbfda95990d28f8eChandler Carruth#include "clang/Basic/SourceManager.h"
172d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko#include "llvm/ADT/STLExtras.h"
182d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko#include "gtest/gtest.h"
191050e8b2252d89a0004a6fd25a58dab88b5ee625Chandler Carruth#include <vector>
202d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
212d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenkousing namespace llvm;
222d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenkousing namespace clang;
232d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
242d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenkonamespace clang {
252d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenkonamespace comments {
262d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
272d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenkonamespace {
282d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenkoclass CommentLexerTest : public ::testing::Test {
292d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenkoprotected:
302d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  CommentLexerTest()
312d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    : FileMgr(FileMgrOpts),
322d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko      DiagID(new DiagnosticIDs()),
338e023611637905629b928915cbda22a90b2432c3Douglas Gregor      Diags(DiagID, new DiagnosticOptions, new IgnoringDiagConsumer()),
34e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko      SourceMgr(Diags, FileMgr),
356ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko      Traits(Allocator, CommentOptions()) {
362d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
372d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
382d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  FileSystemOptions FileMgrOpts;
392d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  FileManager FileMgr;
402d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  IntrusiveRefCntPtr<DiagnosticIDs> DiagID;
412d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  DiagnosticsEngine Diags;
422d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  SourceManager SourceMgr;
43477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  llvm::BumpPtrAllocator Allocator;
44e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  CommandTraits Traits;
452d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
462d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  void lexString(const char *Source, std::vector<Token> &Toks);
47e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko
48e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  StringRef getCommandName(const Token &Tok) {
49e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko    return Traits.getCommandInfo(Tok.getCommandID())->Name;
50e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  }
51e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko
52e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  StringRef getVerbatimBlockName(const Token &Tok) {
53e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko    return Traits.getCommandInfo(Tok.getVerbatimBlockID())->Name;
54e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  }
55e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko
56e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  StringRef getVerbatimLineName(const Token &Tok) {
57e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko    return Traits.getCommandInfo(Tok.getVerbatimLineID())->Name;
58e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  }
592d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko};
602d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
612d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenkovoid CommentLexerTest::lexString(const char *Source,
622d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko                                 std::vector<Token> &Toks) {
632d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  MemoryBuffer *Buf = MemoryBuffer::getMemBuffer(Source);
646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  FileID File = SourceMgr.createFileID(Buf);
652d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  SourceLocation Begin = SourceMgr.getLocForStartOfFile(File);
662d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
67ad6fd9f93ce0d328397e8d57ef7117ced24fc8e2Fariborz Jahanian  Lexer L(Allocator, Diags, Traits, Begin, Source, Source + strlen(Source));
682d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
692d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  while (1) {
702d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    Token Tok;
712d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    L.lex(Tok);
722d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    if (Tok.is(tok::eof))
732d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko      break;
742d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    Toks.push_back(Tok);
752d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
762d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
772d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
782d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko} // unnamed namespace
792d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
802d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// Empty source range should be handled.
812d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, Basic1) {
822d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Source = "";
832d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  std::vector<Token> Toks;
842d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
852d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  lexString(Source, Toks);
862d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
872d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(0U, Toks.size());
882d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
892d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
902d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// Empty comments should be handled.
912d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, Basic2) {
922d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = {
932d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "//", "///", "//!", "///<", "//!<"
942d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  };
952d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
962d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
972d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
982d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
992d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1002d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(1U, Toks.size());
1012d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1022d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline, Toks[0].getKind());
1032d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
1042d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
1052d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1062d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// Empty comments should be handled.
1072d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, Basic3) {
1082d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = {
1092d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/**/", "/***/", "/*!*/", "/**<*/", "/*!<*/"
1102d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  };
1112d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1122d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
1132d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1142d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
1152d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1162d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(2U, Toks.size());
1172d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1182d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline, Toks[0].getKind());
1192d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline, Toks[1].getKind());
1202d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
1212d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
1222d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1232d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// Single comment with plain text.
1242d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, Basic4) {
1252d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = {
1262d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "// Meow",   "/// Meow",    "//! Meow",
1272d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "// Meow\n", "// Meow\r\n", "//! Meow\r",
1282d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  };
1292d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1302d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1312d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
1322d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1332d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
1342d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1352d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(2U, Toks.size());
1362d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1372d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::text,          Toks[0].getKind());
1382d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef(" Meow"), Toks[0].getText());
1392d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1402d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,       Toks[1].getKind());
1412d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
1422d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
1432d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1442d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// Single comment with plain text.
1452d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, Basic5) {
1462d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = {
1472d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/* Meow*/", "/** Meow*/",  "/*! Meow*/"
1482d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  };
1492d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1502d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1512d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
1522d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1532d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
1542d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1552d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(3U, Toks.size());
1562d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1572d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::text,          Toks[0].getKind());
1582d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef(" Meow"), Toks[0].getText());
1592d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1602d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,       Toks[1].getKind());
1612d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,       Toks[2].getKind());
1622d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
1632d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
1642d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1652d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// Test newline escaping.
1662d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, Basic6) {
1672d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = {
1682d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "// Aaa\\\n"   " Bbb\\ \n"   " Ccc?" "?/\n",
1692d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "// Aaa\\\r\n" " Bbb\\ \r\n" " Ccc?" "?/\r\n",
1702d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "// Aaa\\\r"   " Bbb\\ \r"   " Ccc?" "?/\r"
1712d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  };
1722d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1732d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1742d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
1752d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1762d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
1772d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1782d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(10U, Toks.size());
1792d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1802d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::text,         Toks[0].getKind());
1812d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef(" Aaa"), Toks[0].getText());
1822d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::text,         Toks[1].getKind());
1832d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef("\\"),   Toks[1].getText());
1842d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,      Toks[2].getKind());
1852d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1862d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::text,         Toks[3].getKind());
1872d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef(" Bbb"), Toks[3].getText());
1882d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::text,         Toks[4].getKind());
1892d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef("\\"),   Toks[4].getText());
1902d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::text,         Toks[5].getKind());
1912d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef(" "),    Toks[5].getText());
1922d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,      Toks[6].getKind());
1932d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1942d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::text,         Toks[7].getKind());
1952d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef(" Ccc?" "?/"), Toks[7].getText());
1962d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,      Toks[8].getKind());
1972d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1982d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,      Toks[9].getKind());
1992d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
2002d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
2012d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2022d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// Check that we skip C-style aligned stars correctly.
2032d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, Basic7) {
2042d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Source =
2052d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/* Aaa\n"
2062d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    " * Bbb\r\n"
2072d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "\t* Ccc\n"
2082d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "  ! Ddd\n"
2092d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "  * Eee\n"
2102d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "  ** Fff\n"
2112d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    " */";
2122d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  std::vector<Token> Toks;
2132d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2142d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  lexString(Source, Toks);
2152d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2162d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(15U, Toks.size());
2172d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2182d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,         Toks[0].getKind());
2192d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" Aaa"), Toks[0].getText());
2202d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[1].getKind());
2212d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2222d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,         Toks[2].getKind());
2232d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" Bbb"), Toks[2].getText());
2242d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[3].getKind());
2252d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2262d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,         Toks[4].getKind());
2272d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" Ccc"), Toks[4].getText());
2282d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[5].getKind());
2292d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2302d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,            Toks[6].getKind());
2312d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef("  ! Ddd"), Toks[6].getText());
2322d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,         Toks[7].getKind());
2332d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2342d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,         Toks[8].getKind());
2352d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" Eee"), Toks[8].getText());
2362d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[9].getKind());
2372d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2382d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,          Toks[10].getKind());
2392d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef("* Fff"), Toks[10].getText());
2402d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,       Toks[11].getKind());
2412d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2422d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,         Toks[12].getKind());
2432d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" "),    Toks[12].getText());
2442d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2452d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[13].getKind());
2462d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[14].getKind());
2472d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
2482d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2492d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// A command marker followed by comment end.
2502d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, DoxygenCommand1) {
2512d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = { "//@", "///@", "//!@" };
2522d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
2532d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
2542d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2552d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
2562d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2572d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(2U, Toks.size());
2582d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2592d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::text,          Toks[0].getKind());
2602d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef("@"),     Toks[0].getText());
2612d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2622d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,       Toks[1].getKind());
2632d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
2642d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
2652d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2662d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// A command marker followed by comment end.
2672d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, DoxygenCommand2) {
2682d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = { "/*@*/", "/**@*/", "/*!@*/"};
2692d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
2702d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
2712d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2722d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
2732d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2742d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(3U, Toks.size());
2752d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2762d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::text,          Toks[0].getKind());
2772d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef("@"),     Toks[0].getText());
2782d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2792d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,       Toks[1].getKind());
2802d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,       Toks[2].getKind());
2812d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
2822d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
2832d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2842d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// A command marker followed by comment end.
2852d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, DoxygenCommand3) {
2862d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = { "/*\\*/", "/**\\*/" };
2872d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
2882d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
2892d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2902d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
2912d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2922d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(3U, Toks.size());
2932d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2942d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::text,           Toks[0].getKind());
2952d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef("\\"),     Toks[0].getText());
2962d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
2972d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,        Toks[1].getKind());
2982d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,        Toks[2].getKind());
2992d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
3002d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
3012d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
3022d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// Doxygen escape sequences.
3032d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, DoxygenCommand4) {
304808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  const char *Sources[] = {
305808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko    "/// \\\\ \\@ \\& \\$ \\# \\< \\> \\% \\\" \\. \\::",
306808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko    "/// @\\ @@ @& @$ @# @< @> @% @\" @. @::"
307808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  };
3082d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Text[] = {
3092d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    " ",
3102d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "\\", " ", "@", " ", "&", " ", "$",  " ", "#", " ",
3112d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "<",  " ", ">", " ", "%", " ", "\"", " ", ".", " ",
3122d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "::", ""
3132d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  };
3142d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
315808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
316808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko    std::vector<Token> Toks;
3172d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
318808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko    lexString(Sources[i], Toks);
3192d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
320808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko    ASSERT_EQ(array_lengthof(Text), Toks.size());
3212d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
322808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko    for (size_t j = 0, e = Toks.size(); j != e; j++) {
323808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko      if(Toks[j].is(tok::text))
324808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko        ASSERT_EQ(StringRef(Text[j]), Toks[j].getText())
325808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko          << "index " << i;
326808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko    }
3272d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
3282d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
3292d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
3308c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko// A command marker followed by a non-letter that is not a part of an escape
3318c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko// sequence.
3322d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, DoxygenCommand5) {
3338c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko  const char *Source = "/// \\^ \\0";
3348c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko  std::vector<Token> Toks;
3358c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko
3368c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko  lexString(Source, Toks);
3378c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko
3388c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko  ASSERT_EQ(6U, Toks.size());
3398c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko
3408c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko  ASSERT_EQ(tok::text,       Toks[0].getKind());
3418c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko  ASSERT_EQ(StringRef(" "),  Toks[0].getText());
3428c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko
3438c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko  ASSERT_EQ(tok::text,       Toks[1].getKind());
3448c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko  ASSERT_EQ(StringRef("\\"), Toks[1].getText());
3458c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko
3468c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko  ASSERT_EQ(tok::text,       Toks[2].getKind());
3478c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko  ASSERT_EQ(StringRef("^ "), Toks[2].getText());
3488c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko
3498c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko  ASSERT_EQ(tok::text,       Toks[3].getKind());
3508c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko  ASSERT_EQ(StringRef("\\"), Toks[3].getText());
3518c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko
3528c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko  ASSERT_EQ(tok::text,       Toks[4].getKind());
3538c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko  ASSERT_EQ(StringRef("0"),  Toks[4].getText());
3548c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko
3558c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko  ASSERT_EQ(tok::newline,    Toks[5].getKind());
3568c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko}
3578c05da3fd8db98af482826ba059ab1ad6d58010fDmitri Gribenko
3588c05da3fd8db98af482826ba059ab1ad6d58010fDmitri GribenkoTEST_F(CommentLexerTest, DoxygenCommand6) {
3592d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Source = "/// \\brief Aaa.";
3602d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  std::vector<Token> Toks;
3612d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
3622d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  lexString(Source, Toks);
3632d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
3642d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(4U, Toks.size());
3652d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
3662d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,          Toks[0].getKind());
3672d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" "),     Toks[0].getText());
3682d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
3698536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian  ASSERT_EQ(tok::backslash_command, Toks[1].getKind());
370e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("brief"), getCommandName(Toks[1]));
3712d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
3722d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,          Toks[2].getKind());
3732d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" Aaa."), Toks[2].getText());
3742d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
3752d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,       Toks[3].getKind());
3762d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
3772d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
3788c05da3fd8db98af482826ba059ab1ad6d58010fDmitri GribenkoTEST_F(CommentLexerTest, DoxygenCommand7) {
379e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  const char *Source = "/// \\em\\em \\em\t\\em\n";
380e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  std::vector<Token> Toks;
381e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko
382e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  lexString(Source, Toks);
383e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko
384e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(8U, Toks.size());
385e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko
386e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(tok::text,       Toks[0].getKind());
387e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef(" "),  Toks[0].getText());
388e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko
3898536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian  ASSERT_EQ(tok::backslash_command, Toks[1].getKind());
390e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("em"), getCommandName(Toks[1]));
391e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko
3928536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian  ASSERT_EQ(tok::backslash_command, Toks[2].getKind());
393e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("em"), getCommandName(Toks[2]));
394e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko
395e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(tok::text,       Toks[3].getKind());
396e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef(" "),  Toks[3].getText());
397e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko
3988536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian  ASSERT_EQ(tok::backslash_command, Toks[4].getKind());
399e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("em"), getCommandName(Toks[4]));
400e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko
401e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(tok::text,       Toks[5].getKind());
402e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("\t"), Toks[5].getText());
403e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko
4048536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian  ASSERT_EQ(tok::backslash_command, Toks[6].getKind());
405e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("em"), getCommandName(Toks[6]));
406e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko
407e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(tok::newline,    Toks[7].getKind());
408e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko}
409e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko
4108c05da3fd8db98af482826ba059ab1ad6d58010fDmitri GribenkoTEST_F(CommentLexerTest, DoxygenCommand8) {
411808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  const char *Source = "/// @em@em @em\t@em\n";
412808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  std::vector<Token> Toks;
413808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko
414808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  lexString(Source, Toks);
415808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko
416808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(8U, Toks.size());
417808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko
418808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(tok::text,       Toks[0].getKind());
419808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(StringRef(" "),  Toks[0].getText());
420808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko
421808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(tok::at_command, Toks[1].getKind());
422808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(StringRef("em"), getCommandName(Toks[1]));
423808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko
424808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(tok::at_command, Toks[2].getKind());
425808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(StringRef("em"), getCommandName(Toks[2]));
426808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko
427808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(tok::text,       Toks[3].getKind());
428808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(StringRef(" "),  Toks[3].getText());
429808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko
430808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(tok::at_command, Toks[4].getKind());
431808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(StringRef("em"), getCommandName(Toks[4]));
432808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko
433808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(tok::text,       Toks[5].getKind());
434808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(StringRef("\t"), Toks[5].getText());
435808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko
436808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(tok::at_command, Toks[6].getKind());
437808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(StringRef("em"), getCommandName(Toks[6]));
438808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko
439808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(tok::newline,    Toks[7].getKind());
440808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko}
441808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko
442808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri GribenkoTEST_F(CommentLexerTest, DoxygenCommand9) {
4432d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Source = "/// \\aaa\\bbb \\ccc\t\\ddd\n";
4442d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  std::vector<Token> Toks;
4452d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
4462d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  lexString(Source, Toks);
4472d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
4482d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(8U, Toks.size());
4492d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
4502d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,        Toks[0].getKind());
4512d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" "),   Toks[0].getText());
4522d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
453e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(tok::unknown_command, Toks[1].getKind());
454e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("aaa"), Toks[1].getUnknownCommandName());
4552d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
456e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(tok::unknown_command, Toks[2].getKind());
457e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("bbb"), Toks[2].getUnknownCommandName());
4582d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
4592d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,        Toks[3].getKind());
4602d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" "),   Toks[3].getText());
4612d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
462e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(tok::unknown_command, Toks[4].getKind());
463e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("ccc"), Toks[4].getUnknownCommandName());
4642d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
4652d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,        Toks[5].getKind());
4662d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef("\t"),  Toks[5].getText());
4672d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
468e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(tok::unknown_command, Toks[6].getKind());
469e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("ddd"), Toks[6].getUnknownCommandName());
4702d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
4712d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,     Toks[7].getKind());
4722d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
4732d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
474808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri GribenkoTEST_F(CommentLexerTest, DoxygenCommand10) {
4758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  const char *Source = "// \\c\n";
4768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  std::vector<Token> Toks;
4778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
4788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  lexString(Source, Toks);
4798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
4808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(3U, Toks.size());
4818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
4828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::text,      Toks[0].getKind());
4838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(StringRef(" "), Toks[0].getText());
4848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
4858536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian  ASSERT_EQ(tok::backslash_command, Toks[1].getKind());
486e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("c"), getCommandName(Toks[1]));
4878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
4888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::newline,   Toks[2].getKind());
4896ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko}
4906ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
4916ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri GribenkoTEST_F(CommentLexerTest, RegisterCustomBlockCommand) {
492808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  const char *Source =
493808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko    "/// \\NewBlockCommand Aaa.\n"
494808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko    "/// @NewBlockCommand Aaa.\n";
4956ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
4966ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  Traits.registerBlockCommand(StringRef("NewBlockCommand"));
4976ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
4986ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  std::vector<Token> Toks;
4996ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5006ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  lexString(Source, Toks);
5016ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
502808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(8U, Toks.size());
5036ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
504808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(tok::text,          Toks[0].getKind());
505808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(StringRef(" "),     Toks[0].getText());
5066ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5078536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian  ASSERT_EQ(tok::backslash_command, Toks[1].getKind());
5086ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(StringRef("NewBlockCommand"), getCommandName(Toks[1]));
5096ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5106ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(tok::text,          Toks[2].getKind());
5116ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(StringRef(" Aaa."), Toks[2].getText());
5126ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
513808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(tok::newline,       Toks[3].getKind());
514808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko
515808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(tok::text,          Toks[4].getKind());
516808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(StringRef(" "),     Toks[4].getText());
517808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko
518808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(tok::at_command,    Toks[5].getKind());
519808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(StringRef("NewBlockCommand"), getCommandName(Toks[5]));
520808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko
521808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(tok::text,          Toks[6].getKind());
522808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(StringRef(" Aaa."), Toks[6].getText());
523808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko
524808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko  ASSERT_EQ(tok::newline,       Toks[7].getKind());
5256ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko}
5266ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5276ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri GribenkoTEST_F(CommentLexerTest, RegisterMultipleBlockCommands) {
5286ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  const char *Source =
5296ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko    "/// \\Foo\n"
5306ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko    "/// \\Bar Baz\n"
5316ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko    "/// \\Blech quux=corge\n";
5326ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5336ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  Traits.registerBlockCommand(StringRef("Foo"));
5346ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  Traits.registerBlockCommand(StringRef("Bar"));
5356ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  Traits.registerBlockCommand(StringRef("Blech"));
5366ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5376ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  std::vector<Token> Toks;
5386ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5396ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  lexString(Source, Toks);
5406ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5416ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(11U, Toks.size());
5426ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5436ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(tok::text,      Toks[0].getKind());
5446ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(StringRef(" "), Toks[0].getText());
5456ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5468536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian  ASSERT_EQ(tok::backslash_command, Toks[1].getKind());
5476ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(StringRef("Foo"), getCommandName(Toks[1]));
5486ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5496ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(tok::newline,     Toks[2].getKind());
5506ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5516ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(tok::text,      Toks[3].getKind());
5526ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(StringRef(" "), Toks[3].getText());
5536ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5548536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian  ASSERT_EQ(tok::backslash_command, Toks[4].getKind());
5556ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(StringRef("Bar"), getCommandName(Toks[4]));
5566ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5576ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[5].getKind());
5586ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(StringRef(" Baz"), Toks[5].getText());
5596ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5606ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(tok::newline,     Toks[6].getKind());
5616ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5626ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(tok::text,      Toks[7].getKind());
5636ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(StringRef(" "), Toks[7].getText());
5646ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5658536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian  ASSERT_EQ(tok::backslash_command, Toks[8].getKind());
5666ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(StringRef("Blech"), getCommandName(Toks[8]));
5676ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5686ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(tok::text,                Toks[9].getKind());
5696ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(StringRef(" quux=corge"), Toks[9].getText());
5706ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
5716ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  ASSERT_EQ(tok::newline,     Toks[10].getKind());
5728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}
5738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
5742d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// Empty verbatim block.
5752d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, VerbatimBlock1) {
5762d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = {
5772d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/// \\verbatim\\endverbatim\n//",
5782d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/** \\verbatim\\endverbatim*/"
5792d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  };
5802d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
5812d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
5822d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
5832d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
5842d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
5852d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
5862d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(5U, Toks.size());
5872d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
5882d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::text,                 Toks[0].getKind());
5892d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef(" "),            Toks[0].getText());
5902d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
5912d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
592e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko    ASSERT_EQ(StringRef("verbatim"),     getVerbatimBlockName(Toks[1]));
5932d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
5942d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::verbatim_block_end,   Toks[2].getKind());
595e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko    ASSERT_EQ(StringRef("endverbatim"),  getVerbatimBlockName(Toks[2]));
5962d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
5972d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,              Toks[3].getKind());
5982d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,              Toks[4].getKind());
5992d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
6002d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
6012d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6022d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// Empty verbatim block without an end command.
6032d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, VerbatimBlock2) {
6048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  const char *Source = "/// \\verbatim";
6052d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  std::vector<Token> Toks;
6072d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  lexString(Source, Toks);
6092d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(3U, Toks.size());
6112d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::text,                 Toks[0].getKind());
6138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(StringRef(" "),            Toks[0].getText());
6142d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
616e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("verbatim"),     getVerbatimBlockName(Toks[1]));
6172d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::newline,              Toks[2].getKind());
6192d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
6202d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// Empty verbatim block without an end command.
6222d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, VerbatimBlock3) {
6238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  const char *Source = "/** \\verbatim*/";
6248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
6258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  std::vector<Token> Toks;
6268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
6278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  lexString(Source, Toks);
6288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
6298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(4U, Toks.size());
6308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
6318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::text,                 Toks[0].getKind());
6328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(StringRef(" "),            Toks[0].getText());
6338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
6348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
635e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("verbatim"),     getVerbatimBlockName(Toks[1]));
6368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
6378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::newline,              Toks[2].getKind());
6388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::newline,              Toks[3].getKind());
6398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}
6408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
6418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// Single-line verbatim block.
6428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri GribenkoTEST_F(CommentLexerTest, VerbatimBlock4) {
6432d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = {
6442d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/// Meow \\verbatim aaa \\endverbatim\n//",
6452d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/** Meow \\verbatim aaa \\endverbatim*/"
6462d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  };
6472d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6482d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
6492d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
6502d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6512d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
6522d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6532d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(6U, Toks.size());
6542d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6552d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::text,                 Toks[0].getKind());
6562d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef(" Meow "),       Toks[0].getText());
6572d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6582d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
659e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko    ASSERT_EQ(StringRef("verbatim"),     getVerbatimBlockName(Toks[1]));
6602d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6612d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::verbatim_block_line,  Toks[2].getKind());
6622d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef(" aaa "),        Toks[2].getVerbatimBlockText());
6632d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6642d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::verbatim_block_end,   Toks[3].getKind());
665e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko    ASSERT_EQ(StringRef("endverbatim"),  getVerbatimBlockName(Toks[3]));
6662d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6672d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,              Toks[4].getKind());
6682d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,              Toks[5].getKind());
6692d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
6702d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
6712d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6722d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// Single-line verbatim block without an end command.
6738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri GribenkoTEST_F(CommentLexerTest, VerbatimBlock5) {
6742d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = {
6752d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/// Meow \\verbatim aaa \n//",
6762d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/** Meow \\verbatim aaa */"
6772d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  };
6782d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6792d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
6802d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
6812d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6822d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
6832d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6842d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(5U, Toks.size());
6852d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6862d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::text,                 Toks[0].getKind());
6872d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef(" Meow "),       Toks[0].getText());
6882d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6892d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
690e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko    ASSERT_EQ(StringRef("verbatim"),     getVerbatimBlockName(Toks[1]));
6912d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6922d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::verbatim_block_line,  Toks[2].getKind());
6932d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef(" aaa "),        Toks[2].getVerbatimBlockText());
6942d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
6952d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,              Toks[3].getKind());
6962d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,              Toks[4].getKind());
6972d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
6982d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
6992d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
7008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri GribenkoTEST_F(CommentLexerTest, VerbatimBlock6) {
7018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  const char *Source =
7028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    "// \\verbatim\n"
7038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    "// Aaa\n"
7048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    "//\n"
7058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    "// Bbb\n"
7068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    "// \\endverbatim\n";
7078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  std::vector<Token> Toks;
7098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  lexString(Source, Toks);
7118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
71264da4e55c111f4733135e1780216609569767351Dmitri Gribenko  ASSERT_EQ(10U, Toks.size());
7138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::text,                 Toks[0].getKind());
7158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(StringRef(" "),            Toks[0].getText());
7168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
718e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("verbatim"),     getVerbatimBlockName(Toks[1]));
7198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::newline,              Toks[2].getKind());
7218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::verbatim_block_line,  Toks[3].getKind());
7238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(StringRef(" Aaa"),         Toks[3].getVerbatimBlockText());
7248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::newline,              Toks[4].getKind());
7268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::newline,              Toks[5].getKind());
7288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::verbatim_block_line,  Toks[6].getKind());
7308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(StringRef(" Bbb"),         Toks[6].getVerbatimBlockText());
7318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::newline,              Toks[7].getKind());
7338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
73464da4e55c111f4733135e1780216609569767351Dmitri Gribenko  ASSERT_EQ(tok::verbatim_block_end,   Toks[8].getKind());
735e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("endverbatim"),  getVerbatimBlockName(Toks[8]));
7368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
73764da4e55c111f4733135e1780216609569767351Dmitri Gribenko  ASSERT_EQ(tok::newline,              Toks[9].getKind());
7388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}
7398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri GribenkoTEST_F(CommentLexerTest, VerbatimBlock7) {
7418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  const char *Source =
7428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    "/* \\verbatim\n"
7438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    " * Aaa\n"
7448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    " *\n"
7458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    " * Bbb\n"
7468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    " * \\endverbatim\n"
7478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    " */";
7488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  std::vector<Token> Toks;
7508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  lexString(Source, Toks);
7528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
75364da4e55c111f4733135e1780216609569767351Dmitri Gribenko  ASSERT_EQ(10U, Toks.size());
7548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::text,                 Toks[0].getKind());
7568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(StringRef(" "),            Toks[0].getText());
7578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
759e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("verbatim"),     getVerbatimBlockName(Toks[1]));
7608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::verbatim_block_line,  Toks[2].getKind());
7628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(StringRef(" Aaa"),         Toks[2].getVerbatimBlockText());
7638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::verbatim_block_line,  Toks[3].getKind());
7658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(StringRef(""),             Toks[3].getVerbatimBlockText());
7668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::verbatim_block_line,  Toks[4].getKind());
7688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(StringRef(" Bbb"),         Toks[4].getVerbatimBlockText());
7698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
77064da4e55c111f4733135e1780216609569767351Dmitri Gribenko  ASSERT_EQ(tok::verbatim_block_end,   Toks[5].getKind());
771e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("endverbatim"),  getVerbatimBlockName(Toks[5]));
7728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
77364da4e55c111f4733135e1780216609569767351Dmitri Gribenko  ASSERT_EQ(tok::newline,              Toks[6].getKind());
7748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
77564da4e55c111f4733135e1780216609569767351Dmitri Gribenko  ASSERT_EQ(tok::text,                 Toks[7].getKind());
77664da4e55c111f4733135e1780216609569767351Dmitri Gribenko  ASSERT_EQ(StringRef(" "),            Toks[7].getText());
7778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
77864da4e55c111f4733135e1780216609569767351Dmitri Gribenko  ASSERT_EQ(tok::newline,              Toks[8].getKind());
7798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(tok::newline,              Toks[9].getKind());
7808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}
7818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
7822d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// Complex test for verbatim blocks.
7838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri GribenkoTEST_F(CommentLexerTest, VerbatimBlock8) {
7842d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Source =
7852d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/* Meow \\verbatim aaa\\$\\@\n"
7862d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "bbb \\endverbati\r"
7872d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "ccc\r\n"
7882d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "ddd \\endverbatim Blah \\verbatim eee\n"
7892d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "\\endverbatim BlahBlah*/";
7902d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  std::vector<Token> Toks;
7912d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
7922d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  lexString(Source, Toks);
7932d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
7942d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(14U, Toks.size());
7952d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
7962d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,                 Toks[0].getKind());
7972d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" Meow "),       Toks[0].getText());
7982d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
7992d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
800e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("verbatim"),     getVerbatimBlockName(Toks[1]));
8012d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8022d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::verbatim_block_line,  Toks[2].getKind());
8038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(StringRef(" aaa\\$\\@"),   Toks[2].getVerbatimBlockText());
8042d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8052d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::verbatim_block_line,  Toks[3].getKind());
8068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(StringRef("bbb \\endverbati"), Toks[3].getVerbatimBlockText());
8072d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8082d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::verbatim_block_line,  Toks[4].getKind());
8098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(StringRef("ccc"),          Toks[4].getVerbatimBlockText());
8102d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8112d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::verbatim_block_line,  Toks[5].getKind());
8122d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef("ddd "),         Toks[5].getVerbatimBlockText());
8132d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8142d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::verbatim_block_end,   Toks[6].getKind());
815e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("endverbatim"),  getVerbatimBlockName(Toks[6]));
8162d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8172d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,                 Toks[7].getKind());
8182d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" Blah "),       Toks[7].getText());
8192d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8202d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::verbatim_block_begin, Toks[8].getKind());
821e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("verbatim"),     getVerbatimBlockName(Toks[8]));
8222d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8232d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::verbatim_block_line,  Toks[9].getKind());
8248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(StringRef(" eee"),         Toks[9].getVerbatimBlockText());
8252d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8262d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::verbatim_block_end,   Toks[10].getKind());
827e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("endverbatim"),  getVerbatimBlockName(Toks[10]));
8282d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8292d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,                 Toks[11].getKind());
8302d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" BlahBlah"),    Toks[11].getText());
8312d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8322d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,              Toks[12].getKind());
8332d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,              Toks[13].getKind());
8342d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
8352d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8362d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// LaTeX verbatim blocks.
8378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri GribenkoTEST_F(CommentLexerTest, VerbatimBlock9) {
8382d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Source =
8392d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/// \\f$ Aaa \\f$ \\f[ Bbb \\f] \\f{ Ccc \\f}";
8402d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  std::vector<Token> Toks;
8412d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8422d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  lexString(Source, Toks);
8432d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8442d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(13U, Toks.size());
8452d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8462d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,                 Toks[0].getKind());
8472d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" "),            Toks[0].getText());
8482d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8492d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::verbatim_block_begin, Toks[1].getKind());
850e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("f$"),           getVerbatimBlockName(Toks[1]));
8512d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8522d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::verbatim_block_line,  Toks[2].getKind());
8532d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" Aaa "),        Toks[2].getVerbatimBlockText());
8542d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8552d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::verbatim_block_end,   Toks[3].getKind());
856e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("f$"),           getVerbatimBlockName(Toks[3]));
8572d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8582d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,                 Toks[4].getKind());
8592d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" "),            Toks[4].getText());
8602d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8612d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::verbatim_block_begin, Toks[5].getKind());
862e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("f["),           getVerbatimBlockName(Toks[5]));
8632d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8642d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::verbatim_block_line,  Toks[6].getKind());
8652d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" Bbb "),        Toks[6].getVerbatimBlockText());
8662d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8672d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::verbatim_block_end,   Toks[7].getKind());
868e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("f]"),           getVerbatimBlockName(Toks[7]));
8692d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8702d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,                 Toks[8].getKind());
8712d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" "),            Toks[8].getText());
8722d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8732d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::verbatim_block_begin, Toks[9].getKind());
874e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("f{"),           getVerbatimBlockName(Toks[9]));
8752d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8762d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::verbatim_block_line,  Toks[10].getKind());
8772d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" Ccc "),        Toks[10].getVerbatimBlockText());
8782d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8792d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::verbatim_block_end,   Toks[11].getKind());
880e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("f}"),           getVerbatimBlockName(Toks[11]));
8812d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8822d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,              Toks[12].getKind());
8832d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
8842d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8852d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// Empty verbatim line.
8862d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, VerbatimLine1) {
8872d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = {
8882d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/// \\fn\n//",
8892d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/** \\fn*/"
8902d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  };
8912d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8922d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
8932d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
8942d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8952d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
8962d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
8972d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(4U, Toks.size());
8982d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
899962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko    ASSERT_EQ(tok::text,               Toks[0].getKind());
900962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko    ASSERT_EQ(StringRef(" "),          Toks[0].getText());
9012d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
902962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko    ASSERT_EQ(tok::verbatim_line_name, Toks[1].getKind());
903e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko    ASSERT_EQ(StringRef("fn"),         getVerbatimLineName(Toks[1]));
9042d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
905962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko    ASSERT_EQ(tok::newline,            Toks[2].getKind());
906962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko    ASSERT_EQ(tok::newline,            Toks[3].getKind());
9072d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
9082d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
9092d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
9102d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// Verbatim line with Doxygen escape sequences, which should not be expanded.
9112d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, VerbatimLine2) {
9122d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = {
9132d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/// \\fn void *foo(const char *zzz = \"\\$\");\n//",
9142d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/** \\fn void *foo(const char *zzz = \"\\$\");*/"
9152d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  };
9162d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
9172d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
9182d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
9192d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
9202d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
9212d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
922962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko    ASSERT_EQ(5U, Toks.size());
9232d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
924962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko    ASSERT_EQ(tok::text,               Toks[0].getKind());
925962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko    ASSERT_EQ(StringRef(" "),          Toks[0].getText());
926962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko
927962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko    ASSERT_EQ(tok::verbatim_line_name, Toks[1].getKind());
928e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko    ASSERT_EQ(StringRef("fn"),         getVerbatimLineName(Toks[1]));
9292d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
930962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko    ASSERT_EQ(tok::verbatim_line_text, Toks[2].getKind());
9312d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef(" void *foo(const char *zzz = \"\\$\");"),
932962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko                                       Toks[2].getVerbatimLineText());
9332d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
934962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko    ASSERT_EQ(tok::newline,            Toks[3].getKind());
935962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko    ASSERT_EQ(tok::newline,            Toks[4].getKind());
9362d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
9372d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
9382d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
9392d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko// Verbatim line should not eat anything from next source line.
9402d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, VerbatimLine3) {
9412d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Source =
9422d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/** \\fn void *foo(const char *zzz = \"\\$\");\n"
9432d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    " * Meow\n"
9442d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    " */";
9452d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
9462d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  std::vector<Token> Toks;
9472d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
9482d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  lexString(Source, Toks);
9492d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
950962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko  ASSERT_EQ(9U, Toks.size());
9512d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
952962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko  ASSERT_EQ(tok::text,               Toks[0].getKind());
953962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko  ASSERT_EQ(StringRef(" "),          Toks[0].getText());
954962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko
955962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko  ASSERT_EQ(tok::verbatim_line_name, Toks[1].getKind());
956e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  ASSERT_EQ(StringRef("fn"),         getVerbatimLineName(Toks[1]));
9572d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
958962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko  ASSERT_EQ(tok::verbatim_line_text, Toks[2].getKind());
9592d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" void *foo(const char *zzz = \"\\$\");"),
960962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko                                     Toks[2].getVerbatimLineText());
961962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko  ASSERT_EQ(tok::newline,            Toks[3].getKind());
9622d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
963962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko  ASSERT_EQ(tok::text,               Toks[4].getKind());
964962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko  ASSERT_EQ(StringRef(" Meow"),      Toks[4].getText());
965962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko  ASSERT_EQ(tok::newline,            Toks[5].getKind());
9662d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
967962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko  ASSERT_EQ(tok::text,               Toks[6].getKind());
968962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko  ASSERT_EQ(StringRef(" "),          Toks[6].getText());
9692d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
970962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko  ASSERT_EQ(tok::newline,            Toks[7].getKind());
971962668d2c192dd02f75b8ec3628a89964bfb738bDmitri Gribenko  ASSERT_EQ(tok::newline,            Toks[8].getKind());
9722d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
9732d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
9742d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, HTML1) {
9752d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Source =
9762d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "// <";
9772d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
9782d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  std::vector<Token> Toks;
9792d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
9802d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  lexString(Source, Toks);
9812d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
9822d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(3U, Toks.size());
9832d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
9842d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,      Toks[0].getKind());
9852d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" "), Toks[0].getText());
9862d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
9872d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,      Toks[1].getKind());
9882d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef("<"), Toks[1].getText());
9892d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
9902d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,   Toks[2].getKind());
9912d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
9922d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
9932d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, HTML2) {
9945676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko  const char *Source =
995a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko    "// a<2";
996a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
997a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  std::vector<Token> Toks;
998a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
999a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  lexString(Source, Toks);
1000a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
1001a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  ASSERT_EQ(4U, Toks.size());
1002a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
1003a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  ASSERT_EQ(tok::text,       Toks[0].getKind());
1004a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  ASSERT_EQ(StringRef(" a"), Toks[0].getText());
1005a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
1006a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  ASSERT_EQ(tok::text,       Toks[1].getKind());
1007a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  ASSERT_EQ(StringRef("<"),  Toks[1].getText());
1008a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
1009a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  ASSERT_EQ(tok::text,       Toks[2].getKind());
1010a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  ASSERT_EQ(StringRef("2"),  Toks[2].getText());
1011a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
1012a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  ASSERT_EQ(tok::newline,    Toks[3].getKind());
1013a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko}
1014a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
1015a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri GribenkoTEST_F(CommentLexerTest, HTML3) {
1016a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  const char *Source =
1017834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// < img";
10185676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko
10195676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko  std::vector<Token> Toks;
10205676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko
10215676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko  lexString(Source, Toks);
10225676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko
10235676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko  ASSERT_EQ(4U, Toks.size());
10245676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko
10255676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[0].getKind());
10265676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko  ASSERT_EQ(StringRef(" "),    Toks[0].getText());
10275676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko
10285676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[1].getKind());
10295676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko  ASSERT_EQ(StringRef("<"),    Toks[1].getText());
10305676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko
10315676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[2].getKind());
1032834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef(" img"), Toks[2].getText());
10335676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko
10345676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[3].getKind());
10355676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko}
10365676d32a23faf0506f5c295980c2876c862488d5Dmitri Gribenko
1037a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri GribenkoTEST_F(CommentLexerTest, HTML4) {
10382d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = {
1039834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img",
1040834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img "
10412d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  };
10422d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
10432d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
10442d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
10452d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
10462d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
10472d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
10482d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(3U, Toks.size());
10492d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
10503f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(tok::text,           Toks[0].getKind());
10513f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(StringRef(" "),      Toks[0].getText());
10522d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
10533f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1054834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    ASSERT_EQ(StringRef("img"),    Toks[1].getHTMLTagStartName());
10552d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
10563f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(tok::newline,        Toks[2].getKind());
10572d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
10582d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
10592d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1060a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri GribenkoTEST_F(CommentLexerTest, HTML5) {
1061a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  const char *Source =
1062834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img 42";
1063a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
1064a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  std::vector<Token> Toks;
1065a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
1066a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  lexString(Source, Toks);
1067a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
1068a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  ASSERT_EQ(4U, Toks.size());
1069a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
10703f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::text,           Toks[0].getKind());
10713f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(StringRef(" "),      Toks[0].getText());
1072a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
10733f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1074834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef("img"),    Toks[1].getHTMLTagStartName());
1075a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
10763f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::text,           Toks[2].getKind());
10773f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(StringRef("42"),     Toks[2].getText());
1078a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
10793f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::newline,        Toks[3].getKind());
1080a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko}
1081a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
1082a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri GribenkoTEST_F(CommentLexerTest, HTML6) {
1083834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  const char *Source = "// <img> Meow";
1084a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
1085a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  std::vector<Token> Toks;
1086a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
1087a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  lexString(Source, Toks);
1088a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
1089a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  ASSERT_EQ(5U, Toks.size());
1090a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
10913f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::text,           Toks[0].getKind());
10923f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(StringRef(" "),      Toks[0].getText());
1093a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
10943f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1095834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef("img"),    Toks[1].getHTMLTagStartName());
1096a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
10973f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::html_greater,   Toks[2].getKind());
1098a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
10993f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::text,           Toks[3].getKind());
11003f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(StringRef(" Meow"),  Toks[3].getText());
1101a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
11023f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::newline,        Toks[4].getKind());
1103a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko}
1104a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
1105a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri GribenkoTEST_F(CommentLexerTest, HTML7) {
1106834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  const char *Source = "// <img=";
11072d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11082d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  std::vector<Token> Toks;
11092d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11102d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  lexString(Source, Toks);
11112d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11122d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(4U, Toks.size());
11132d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11143f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::text,           Toks[0].getKind());
11153f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(StringRef(" "),      Toks[0].getText());
11162d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11173f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1118834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef("img"),    Toks[1].getHTMLTagStartName());
11192d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11203f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::text,           Toks[2].getKind());
11213f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(StringRef("="),      Toks[2].getText());
11222d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11233f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::newline,        Toks[3].getKind());
11242d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
11252d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1126a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri GribenkoTEST_F(CommentLexerTest, HTML8) {
1127834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  const char *Source = "// <img src=> Meow";
1128a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
1129a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  std::vector<Token> Toks;
1130a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
1131a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  lexString(Source, Toks);
1132a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
1133a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko  ASSERT_EQ(7U, Toks.size());
1134a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
11353f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::text,           Toks[0].getKind());
11363f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(StringRef(" "),      Toks[0].getText());
1137a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
11383f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1139834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef("img"),    Toks[1].getHTMLTagStartName());
1140a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
11413f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::html_ident,     Toks[2].getKind());
1142834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef("src"),   Toks[2].getHTMLIdent());
1143a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
11443f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::html_equals,    Toks[3].getKind());
1145a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
11463f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::html_greater,   Toks[4].getKind());
1147a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
11483f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::text,           Toks[5].getKind());
11493f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(StringRef(" Meow"),  Toks[5].getText());
1150a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
11513f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::newline,        Toks[6].getKind());
1152a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko}
1153a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri Gribenko
1154a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri GribenkoTEST_F(CommentLexerTest, HTML9) {
11552d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = {
1156834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img src",
1157834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img src "
11582d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  };
11592d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11602d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
11612d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
11622d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11632d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
11642d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11652d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(4U, Toks.size());
11662d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11673f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(tok::text,           Toks[0].getKind());
11683f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(StringRef(" "),      Toks[0].getText());
11692d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11703f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1171834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    ASSERT_EQ(StringRef("img"),    Toks[1].getHTMLTagStartName());
11722d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11733f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(tok::html_ident,     Toks[2].getKind());
1174834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    ASSERT_EQ(StringRef("src"),    Toks[2].getHTMLIdent());
11752d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11763f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(tok::newline,        Toks[3].getKind());
11772d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
11782d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
11792d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1180a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri GribenkoTEST_F(CommentLexerTest, HTML10) {
11812d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = {
1182834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img src=",
1183834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img src ="
11842d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  };
11852d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11862d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
11872d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
11882d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11892d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
11902d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11912d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(5U, Toks.size());
11922d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11933f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(tok::text,           Toks[0].getKind());
11943f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(StringRef(" "),      Toks[0].getText());
11952d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11963f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1197834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    ASSERT_EQ(StringRef("img"),    Toks[1].getHTMLTagStartName());
11982d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
11993f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(tok::html_ident,     Toks[2].getKind());
1200834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    ASSERT_EQ(StringRef("src"),    Toks[2].getHTMLIdent());
12012d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12023f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(tok::html_equals,    Toks[3].getKind());
12032d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12043f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(tok::newline,        Toks[4].getKind());
12052d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
12062d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
12072d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1208a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri GribenkoTEST_F(CommentLexerTest, HTML11) {
12092d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = {
1210834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img src=\"",
1211834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img src = \"",
1212834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img src=\'",
1213834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img src = \'"
12142d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  };
12152d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12162d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
12172d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
12182d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12192d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
12202d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12212d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(6U, Toks.size());
12222d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12232d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::text,               Toks[0].getKind());
12242d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef(" "),          Toks[0].getText());
12252d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12263f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(tok::html_start_tag,     Toks[1].getKind());
1227834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    ASSERT_EQ(StringRef("img"),        Toks[1].getHTMLTagStartName());
12282d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12292d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::html_ident,         Toks[2].getKind());
1230834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    ASSERT_EQ(StringRef("src"),        Toks[2].getHTMLIdent());
12312d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12322d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::html_equals,        Toks[3].getKind());
12332d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12342d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::html_quoted_string, Toks[4].getKind());
12352d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef(""),           Toks[4].getHTMLQuotedString());
12362d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12372d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,            Toks[5].getKind());
12382d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
12392d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
12402d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1241a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri GribenkoTEST_F(CommentLexerTest, HTML12) {
1242834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  const char *Source = "// <img src=@";
12432d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12442d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  std::vector<Token> Toks;
12452d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12462d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  lexString(Source, Toks);
12472d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12482d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(6U, Toks.size());
12492d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12503f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::text,           Toks[0].getKind());
12513f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(StringRef(" "),      Toks[0].getText());
12522d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12533f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::html_start_tag, Toks[1].getKind());
1254834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef("img"),    Toks[1].getHTMLTagStartName());
12552d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12563f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::html_ident,     Toks[2].getKind());
1257834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef("src"),    Toks[2].getHTMLIdent());
12582d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12593f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::html_equals,    Toks[3].getKind());
12602d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12613f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::text,           Toks[4].getKind());
12623f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(StringRef("@"),      Toks[4].getText());
12632d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12643f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::newline,        Toks[5].getKind());
12652d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
12662d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1267a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri GribenkoTEST_F(CommentLexerTest, HTML13) {
12682d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = {
1269834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img src=\"val\\\"\\'val",
1270834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img src=\"val\\\"\\'val\"",
1271834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img src=\'val\\\"\\'val",
1272834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img src=\'val\\\"\\'val\'"
12732d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  };
12742d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12752d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
12762d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
12772d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12782d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
12792d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12802d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(6U, Toks.size());
12812d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12822d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::text,                  Toks[0].getKind());
12832d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef(" "),             Toks[0].getText());
12842d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12853f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(tok::html_start_tag,        Toks[1].getKind());
1286834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    ASSERT_EQ(StringRef("img"),           Toks[1].getHTMLTagStartName());
12872d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12882d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::html_ident,            Toks[2].getKind());
1289834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    ASSERT_EQ(StringRef("src"),           Toks[2].getHTMLIdent());
12902d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12912d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::html_equals,           Toks[3].getKind());
12922d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12932d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::html_quoted_string,    Toks[4].getKind());
12942d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef("val\\\"\\'val"), Toks[4].getHTMLQuotedString());
12952d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
12962d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,               Toks[5].getKind());
12972d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
12982d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
12992d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1300a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri GribenkoTEST_F(CommentLexerTest, HTML14) {
13012d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Sources[] = {
1302834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img src=\"val\\\"\\'val\">",
1303834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img src=\'val\\\"\\'val\'>"
13042d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  };
13052d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
13062d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
13072d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    std::vector<Token> Toks;
13082d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
13092d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    lexString(Sources[i], Toks);
13102d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
13112d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(7U, Toks.size());
13122d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
13132d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::text,                  Toks[0].getKind());
13142d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef(" "),             Toks[0].getText());
13152d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
13163f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(tok::html_start_tag,        Toks[1].getKind());
1317834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    ASSERT_EQ(StringRef("img"),           Toks[1].getHTMLTagStartName());
13182d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
13192d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::html_ident,            Toks[2].getKind());
1320834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    ASSERT_EQ(StringRef("src"),           Toks[2].getHTMLIdent());
13212d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
13222d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::html_equals,           Toks[3].getKind());
13232d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
13242d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::html_quoted_string,    Toks[4].getKind());
13252d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(StringRef("val\\\"\\'val"), Toks[4].getHTMLQuotedString());
13262d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
13272d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::html_greater,          Toks[5].getKind());
13282d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
13292d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    ASSERT_EQ(tok::newline,               Toks[6].getKind());
13302d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  }
13312d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
13322d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1333a99ec107ba6b5abaf27c6cc9318e65689163f2a1Dmitri GribenkoTEST_F(CommentLexerTest, HTML15) {
1334a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  const char *Sources[] = {
1335834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img/>",
1336834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img />"
1337a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  };
1338a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
1339a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1340a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    std::vector<Token> Toks;
1341a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
1342a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    lexString(Sources[i], Toks);
1343a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
1344a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    ASSERT_EQ(4U, Toks.size());
1345a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
1346a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    ASSERT_EQ(tok::text,               Toks[0].getKind());
1347a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    ASSERT_EQ(StringRef(" "),          Toks[0].getText());
1348a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
13493f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(tok::html_start_tag,     Toks[1].getKind());
1350834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    ASSERT_EQ(StringRef("img"),        Toks[1].getHTMLTagStartName());
1351a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
1352a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    ASSERT_EQ(tok::html_slash_greater, Toks[2].getKind());
1353a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
1354a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    ASSERT_EQ(tok::newline,            Toks[3].getKind());
1355a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  }
1356a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko}
1357a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
1358a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri GribenkoTEST_F(CommentLexerTest, HTML16) {
1359a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  const char *Sources[] = {
1360834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img/ Aaa",
1361834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    "// <img / Aaa"
1362a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  };
1363a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
1364a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1365a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    std::vector<Token> Toks;
1366a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
1367a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    lexString(Sources[i], Toks);
1368a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
1369a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    ASSERT_EQ(5U, Toks.size());
1370a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
1371a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    ASSERT_EQ(tok::text,               Toks[0].getKind());
1372a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    ASSERT_EQ(StringRef(" "),          Toks[0].getText());
1373a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
13743f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko    ASSERT_EQ(tok::html_start_tag,     Toks[1].getKind());
1375834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko    ASSERT_EQ(StringRef("img"),        Toks[1].getHTMLTagStartName());
1376a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
1377a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    ASSERT_EQ(tok::text,               Toks[2].getKind());
1378a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    ASSERT_EQ(StringRef("/"),          Toks[2].getText());
1379a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
1380a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    ASSERT_EQ(tok::text,               Toks[3].getKind());
1381a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    ASSERT_EQ(StringRef(" Aaa"),       Toks[3].getText());
1382a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
1383a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    ASSERT_EQ(tok::newline,            Toks[4].getKind());
1384a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko  }
1385a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko}
1386a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
1387a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri GribenkoTEST_F(CommentLexerTest, HTML17) {
13882d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Source = "// </";
13892d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
13902d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  std::vector<Token> Toks;
13912d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
13922d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  lexString(Source, Toks);
13932d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
13942d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(3U, Toks.size());
13952d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1396834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(tok::text,       Toks[0].getKind());
1397834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef(" "),  Toks[0].getText());
13982d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1399834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(tok::text,       Toks[1].getKind());
1400834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef("</"), Toks[1].getText());
14012d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1402834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(tok::newline,    Toks[2].getKind());
14032d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
14042d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1405a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri GribenkoTEST_F(CommentLexerTest, HTML18) {
14062d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Source = "// </@";
14072d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
14082d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  std::vector<Token> Toks;
14092d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
14102d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  lexString(Source, Toks);
14112d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
14122d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(4U, Toks.size());
14132d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1414834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(tok::text,       Toks[0].getKind());
1415834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef(" "),  Toks[0].getText());
14162d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1417834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(tok::text,       Toks[1].getKind());
1418834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef("</"), Toks[1].getText());
14192d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1420834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(tok::text,       Toks[2].getKind());
1421834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef("@"),  Toks[2].getText());
14222d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1423834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(tok::newline,    Toks[3].getKind());
14242d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
14252d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1426a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri GribenkoTEST_F(CommentLexerTest, HTML19) {
1427834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  const char *Source = "// </img";
14288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
14298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  std::vector<Token> Toks;
14308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
14318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  lexString(Source, Toks);
14328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
14338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  ASSERT_EQ(3U, Toks.size());
14348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
14353f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[0].getKind());
14363f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(StringRef(" "),    Toks[0].getText());
14378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
14383f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::html_end_tag, Toks[1].getKind());
1439834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef("img"),  Toks[1].getHTMLTagEndName());
14408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
14413f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[2].getKind());
14428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}
14438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1444834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri GribenkoTEST_F(CommentLexerTest, NotAKnownHTMLTag1) {
1445834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  const char *Source = "// <tag>";
14462d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1447834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  std::vector<Token> Toks;
14482d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1449834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  lexString(Source, Toks);
14502d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1451834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(4U, Toks.size());
14522d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1453834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[0].getKind());
1454834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef(" "),    Toks[0].getText());
14552d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1456834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[1].getKind());
1457834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef("<tag"), Toks[1].getText());
14582d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1459834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[2].getKind());
1460834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef(">"),    Toks[2].getText());
14618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
1462834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[3].getKind());
1463834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko}
1464834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko
1465834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri GribenkoTEST_F(CommentLexerTest, NotAKnownHTMLTag2) {
1466834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  const char *Source = "// </tag>";
1467834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko
1468834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  std::vector<Token> Toks;
1469834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko
1470834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  lexString(Source, Toks);
1471834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko
1472834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(4U, Toks.size());
1473834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko
1474834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(tok::text,          Toks[0].getKind());
1475834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef(" "),     Toks[0].getText());
1476834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko
1477834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(tok::text,          Toks[1].getKind());
1478834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef("</tag"), Toks[1].getText());
1479834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko
1480834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(tok::text,          Toks[2].getKind());
1481834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(StringRef(">"),     Toks[2].getText());
1482834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko
1483834a5bd311b4a32f89937ca5b6dd2b4111891859Dmitri Gribenko  ASSERT_EQ(tok::newline,       Toks[3].getKind());
14842d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
14852d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1486477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri GribenkoTEST_F(CommentLexerTest, HTMLCharacterReferences1) {
1487477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  const char *Source = "// &";
1488477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1489477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  std::vector<Token> Toks;
1490477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1491477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  lexString(Source, Toks);
1492477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1493477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(3U, Toks.size());
1494477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1495477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[0].getKind());
1496477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1497477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1498477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[1].getKind());
1499477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("&"),    Toks[1].getText());
1500477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1501477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[2].getKind());
1502477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko}
1503477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1504477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri GribenkoTEST_F(CommentLexerTest, HTMLCharacterReferences2) {
1505477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  const char *Source = "// &!";
1506477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1507477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  std::vector<Token> Toks;
1508477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1509477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  lexString(Source, Toks);
1510477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1511477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(4U, Toks.size());
1512477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1513477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[0].getKind());
1514477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1515477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1516477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[1].getKind());
1517477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("&"),    Toks[1].getText());
1518477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1519477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[2].getKind());
1520477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("!"),    Toks[2].getText());
1521477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1522477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[3].getKind());
1523477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko}
1524477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1525477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri GribenkoTEST_F(CommentLexerTest, HTMLCharacterReferences3) {
1526477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  const char *Source = "// &amp";
1527477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1528477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  std::vector<Token> Toks;
1529477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1530477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  lexString(Source, Toks);
1531477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1532477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(3U, Toks.size());
1533477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1534477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[0].getKind());
1535477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1536477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1537477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[1].getKind());
1538477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("&amp"), Toks[1].getText());
1539477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1540477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[2].getKind());
1541477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko}
1542477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1543477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri GribenkoTEST_F(CommentLexerTest, HTMLCharacterReferences4) {
1544477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  const char *Source = "// &amp!";
1545477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1546477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  std::vector<Token> Toks;
1547477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1548477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  lexString(Source, Toks);
1549477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1550477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(4U, Toks.size());
1551477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1552477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[0].getKind());
1553477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1554477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1555477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[1].getKind());
1556477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("&amp"), Toks[1].getText());
1557477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1558477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[2].getKind());
1559477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("!"),    Toks[2].getText());
1560477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1561477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[3].getKind());
1562477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko}
1563477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1564477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri GribenkoTEST_F(CommentLexerTest, HTMLCharacterReferences5) {
1565477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  const char *Source = "// &#";
1566477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1567477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  std::vector<Token> Toks;
1568477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1569477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  lexString(Source, Toks);
1570477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1571477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(3U, Toks.size());
1572477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1573477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[0].getKind());
1574477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1575477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1576477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[1].getKind());
1577477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("&#"),   Toks[1].getText());
1578477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1579477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[2].getKind());
1580477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko}
1581477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1582477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri GribenkoTEST_F(CommentLexerTest, HTMLCharacterReferences6) {
1583477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  const char *Source = "// &#a";
1584477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1585477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  std::vector<Token> Toks;
1586477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1587477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  lexString(Source, Toks);
1588477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1589477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(4U, Toks.size());
1590477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1591477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[0].getKind());
1592477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1593477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1594477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[1].getKind());
1595477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("&#"),   Toks[1].getText());
1596477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1597477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[2].getKind());
1598477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("a"),    Toks[2].getText());
1599477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1600477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[3].getKind());
1601477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko}
1602477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1603477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri GribenkoTEST_F(CommentLexerTest, HTMLCharacterReferences7) {
1604477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  const char *Source = "// &#42";
1605477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1606477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  std::vector<Token> Toks;
1607477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1608477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  lexString(Source, Toks);
1609477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1610477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(3U, Toks.size());
1611477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1612477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[0].getKind());
1613477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1614477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1615477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[1].getKind());
1616477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("&#42"), Toks[1].getText());
1617477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1618477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[2].getKind());
1619477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko}
1620477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1621477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri GribenkoTEST_F(CommentLexerTest, HTMLCharacterReferences8) {
1622477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  const char *Source = "// &#42a";
1623477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1624477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  std::vector<Token> Toks;
1625477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1626477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  lexString(Source, Toks);
1627477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1628477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(4U, Toks.size());
1629477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1630477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[0].getKind());
1631477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1632477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1633477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[1].getKind());
1634477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("&#42"), Toks[1].getText());
1635477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1636477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[2].getKind());
1637477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("a"),    Toks[2].getText());
1638477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1639477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[3].getKind());
1640477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko}
1641477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1642477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri GribenkoTEST_F(CommentLexerTest, HTMLCharacterReferences9) {
1643477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  const char *Source = "// &#x";
1644477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1645477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  std::vector<Token> Toks;
1646477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1647477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  lexString(Source, Toks);
1648477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1649477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(3U, Toks.size());
1650477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1651477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[0].getKind());
1652477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1653477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1654477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[1].getKind());
1655477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("&#x"),  Toks[1].getText());
1656477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1657477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[2].getKind());
1658477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko}
1659477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1660477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri GribenkoTEST_F(CommentLexerTest, HTMLCharacterReferences10) {
1661477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  const char *Source = "// &#xz";
1662477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1663477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  std::vector<Token> Toks;
1664477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1665477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  lexString(Source, Toks);
1666477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1667477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(4U, Toks.size());
1668477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1669477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[0].getKind());
1670477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef(" "),    Toks[0].getText());
1671477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1672477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[1].getKind());
1673477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("&#x"),  Toks[1].getText());
1674477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1675477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,         Toks[2].getKind());
1676477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("z"),    Toks[2].getText());
1677477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1678477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::newline,      Toks[3].getKind());
1679477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko}
1680477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1681477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri GribenkoTEST_F(CommentLexerTest, HTMLCharacterReferences11) {
1682477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  const char *Source = "// &#xab";
1683477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1684477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  std::vector<Token> Toks;
1685477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1686477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  lexString(Source, Toks);
1687477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1688477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(3U, Toks.size());
1689477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1690477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,          Toks[0].getKind());
1691477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef(" "),     Toks[0].getText());
1692477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1693477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,          Toks[1].getKind());
1694477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("&#xab"), Toks[1].getText());
1695477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1696477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::newline,       Toks[2].getKind());
1697477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko}
1698477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1699477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri GribenkoTEST_F(CommentLexerTest, HTMLCharacterReferences12) {
1700477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  const char *Source = "// &#xaBz";
1701477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1702477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  std::vector<Token> Toks;
1703477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1704477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  lexString(Source, Toks);
1705477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1706477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(4U, Toks.size());
1707477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1708477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,          Toks[0].getKind());
1709477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef(" "),     Toks[0].getText());
1710477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1711477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,          Toks[1].getKind());
1712477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("&#xaB"), Toks[1].getText());
1713477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1714477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,          Toks[2].getKind());
1715477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("z"),     Toks[2].getText());
1716477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1717477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::newline,       Toks[3].getKind());
1718477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko}
1719477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1720477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri GribenkoTEST_F(CommentLexerTest, HTMLCharacterReferences13) {
1721477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  const char *Source = "// &amp;";
1722477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1723477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  std::vector<Token> Toks;
1724477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1725477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  lexString(Source, Toks);
1726477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1727477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(3U, Toks.size());
1728477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1729477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,          Toks[0].getKind());
1730477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef(" "),     Toks[0].getText());
1731477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1732477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,          Toks[1].getKind());
1733477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("&"),     Toks[1].getText());
1734477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1735477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::newline,       Toks[2].getKind());
1736477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko}
1737477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1738477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri GribenkoTEST_F(CommentLexerTest, HTMLCharacterReferences14) {
1739477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  const char *Source = "// &amp;&lt;";
1740477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1741477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  std::vector<Token> Toks;
1742477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1743477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  lexString(Source, Toks);
1744477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1745477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(4U, Toks.size());
1746477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1747477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,          Toks[0].getKind());
1748477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef(" "),     Toks[0].getText());
1749477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1750477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,          Toks[1].getKind());
1751477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("&"),     Toks[1].getText());
1752477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1753477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,          Toks[2].getKind());
1754477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("<"),     Toks[2].getText());
1755477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1756477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::newline,       Toks[3].getKind());
1757477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko}
1758477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1759477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri GribenkoTEST_F(CommentLexerTest, HTMLCharacterReferences15) {
1760477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  const char *Source = "// &amp; meow";
1761477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1762477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  std::vector<Token> Toks;
1763477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1764477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  lexString(Source, Toks);
1765477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1766477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(4U, Toks.size());
1767477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1768477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,          Toks[0].getKind());
1769477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef(" "),     Toks[0].getText());
1770477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1771477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,          Toks[1].getKind());
1772477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef("&"),     Toks[1].getText());
1773477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1774477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::text,          Toks[2].getKind());
1775477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(StringRef(" meow"), Toks[2].getText());
1776477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1777477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  ASSERT_EQ(tok::newline,       Toks[3].getKind());
1778477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko}
1779477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1780477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri GribenkoTEST_F(CommentLexerTest, HTMLCharacterReferences16) {
1781477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  const char *Sources[] = {
1782477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko    "// &#61;",
1783477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko    "// &#x3d;",
178444a3ddbf7d2f46a002b5e85b240359c435509b4eDmitri Gribenko    "// &#X3d;",
178544a3ddbf7d2f46a002b5e85b240359c435509b4eDmitri Gribenko    "// &#X3D;"
1786477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  };
1787477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1788477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1789477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko    std::vector<Token> Toks;
1790477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1791477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko    lexString(Sources[i], Toks);
1792477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1793477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko    ASSERT_EQ(3U, Toks.size());
1794477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1795477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko    ASSERT_EQ(tok::text,          Toks[0].getKind());
1796477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko    ASSERT_EQ(StringRef(" "),     Toks[0].getText());
1797477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1798477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko    ASSERT_EQ(tok::text,          Toks[1].getKind());
1799477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko    ASSERT_EQ(StringRef("="),     Toks[1].getText());
1800477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
1801477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko    ASSERT_EQ(tok::newline,       Toks[2].getKind());
1802477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko  }
1803477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko}
1804477a9f58c1b197f315befd03b42a8a0b3a2f0ff9Dmitri Gribenko
18052d44d77fed3200e2eff289f55493317e90d3398cDmitri GribenkoTEST_F(CommentLexerTest, MultipleComments) {
18062d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  const char *Source =
18072d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "// Aaa\n"
18082d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/// Bbb\n"
18092d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/* Ccc\n"
18102d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    " * Ddd*/\n"
18112d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko    "/** Eee*/";
18122d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
18132d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  std::vector<Token> Toks;
18142d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
18152d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  lexString(Source, Toks);
18162d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
18172d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(12U, Toks.size());
18182d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
18192d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,           Toks[0].getKind());
18202d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" Aaa"),   Toks[0].getText());
18212d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,        Toks[1].getKind());
18222d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
18232d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,           Toks[2].getKind());
18242d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" Bbb"),   Toks[2].getText());
18252d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,        Toks[3].getKind());
18262d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
18272d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,           Toks[4].getKind());
18282d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" Ccc"),   Toks[4].getText());
18292d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,        Toks[5].getKind());
18302d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
18312d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,           Toks[6].getKind());
18322d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" Ddd"),   Toks[6].getText());
18332d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,        Toks[7].getKind());
18342d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,        Toks[8].getKind());
18352d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
18362d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::text,           Toks[9].getKind());
18372d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(StringRef(" Eee"),   Toks[9].getText());
18382d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
18392d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,        Toks[10].getKind());
18402d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko  ASSERT_EQ(tok::newline,        Toks[11].getKind());
18412d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko}
18422d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
18432d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko} // end namespace comments
18442d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko} // end namespace clang
18452d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko
1846