15 #include "gmock/gmock.h" 21 std::vector<HighlightingToken>
23 std::vector<HighlightingToken>
Tokens(Ranges.size());
24 for (
int I = 0, End = Ranges.size(); I < End; ++I) {
32 void checkHighlightings(llvm::StringRef Code) {
33 Annotations Test(Code);
35 static const std::map<HighlightingKind, std::string> KindToString{
45 std::vector<HighlightingToken> ExpectedTokens;
46 for (
const auto &KindString : KindToString) {
47 std::vector<HighlightingToken> Toks = makeHighlightingTokens(
48 Test.ranges(KindString.second), KindString.first);
49 ExpectedTokens.insert(ExpectedTokens.end(), Toks.begin(), Toks.end());
53 EXPECT_THAT(ActualTokens, testing::UnorderedElementsAreArray(ExpectedTokens));
56 TEST(SemanticHighlighting, GetsCorrectTokens) {
57 const char *TestCases[] = {
60 double $Field[[SomeMember]]; 64 void $Function[[foo]](int $Variable[[A]], $Class[[AS]] $Variable[[As]]) { 65 auto $Variable[[VeryLongVariableName]] = 12312; 66 $Class[[AS]] $Variable[[AA]]; 67 auto $Variable[[L]] = $Variable[[AA]].$Field[[SomeMember]] + $Variable[[A]]; 68 auto $Variable[[FN]] = [ $Variable[[AA]]](int $Variable[[A]]) -> void {}; 69 $Variable[[FN]](12312); 73 void $Function[[foo]](int); 74 void $Function[[Gah]](); 75 void $Function[[foo]]() { 76 auto $Variable[[Bou]] = $Function[[Gah]]; 79 void $Method[[abc]](); 83 namespace $Namespace[[abc]] { 84 template<typename $TemplateParameter[[T]]> 86 $TemplateParameter[[T]] $Field[[t]]; 89 template<typename $TemplateParameter[[T]]> 90 struct $Class[[C]] : $Namespace[[abc]]::$Class[[A]]<$TemplateParameter[[T]]> { 91 typename $TemplateParameter[[T]]::A* $Field[[D]]; 93 $Namespace[[abc]]::$Class[[A]]<int> $Variable[[AA]]; 94 typedef $Namespace[[abc]]::$Class[[A]]<int> $Class[[AAA]]; 98 void operator<<($Class[[B]]); 99 $Class[[AAA]] $Field[[AA]]; 101 $Class[[B]]::$Class[[B]]() {} 102 $Class[[B]]::~$Class[[B]]() {} 103 void $Function[[f]] () { 104 $Class[[B]] $Variable[[BB]] = $Class[[B]](); 105 $Variable[[BB]].~$Class[[B]](); 110 enum class $Enum[[E]] { 118 $Enum[[E]] $Field[[EEE]]; 119 $Enum[[EE]] $Field[[EEEE]]; 121 int $Variable[[I]] = $EnumConstant[[Hi]]; 122 $Enum[[E]] $Variable[[L]] = $Enum[[E]]::$EnumConstant[[B]]; 125 namespace $Namespace[[abc]] { 127 namespace $Namespace[[bcd]] { 128 struct $Class[[A]] {}; 129 namespace $Namespace[[cde]] { 131 enum class $Enum[[B]] { 138 using namespace $Namespace[[abc]]::$Namespace[[bcd]]; 139 namespace $Namespace[[vwz]] = 140 $Namespace[[abc]]::$Namespace[[bcd]]::$Namespace[[cde]]; 141 $Namespace[[abc]]::$Namespace[[bcd]]::$Class[[A]] $Variable[[AA]]; 142 $Namespace[[vwz]]::$Class[[A]]::$Enum[[B]] $Variable[[AAA]] = 143 $Namespace[[vwz]]::$Class[[A]]::$Enum[[B]]::$EnumConstant[[Hi]]; 144 ::$Namespace[[vwz]]::$Class[[A]] $Variable[[B]]; 145 ::$Namespace[[abc]]::$Namespace[[bcd]]::$Class[[A]] $Variable[[BB]]; 153 $Class[[D]] $Field[[E]]; 154 static double $Variable[[S]]; 155 void $Method[[foo]]() { 157 this->$Field[[B]] = 156; 158 this->$Method[[foo]](); 160 $Variable[[S]] = 90.1; 163 void $Function[[foo]]() { 164 $Class[[A]] $Variable[[AA]]; 165 $Variable[[AA]].$Field[[B]] += 2; 166 $Variable[[AA]].$Method[[foo]](); 167 $Variable[[AA]].$Field[[E]].$Field[[C]]; 168 $Class[[A]]::$Variable[[S]] = 90; 172 struct $Class[[AA]] { 176 $Class[[AA]] $Variable[[A]]{$Variable[[B]]}; 179 namespace $Namespace[[a]] { 180 struct $Class[[A]] {}; 182 typedef $Namespace[[a]]::$Class[[A]] $Class[[B]]; 183 using $Class[[BB]] = $Namespace[[a]]::$Class[[A]]; 184 enum class $Enum[[E]] {}; 185 typedef $Enum[[E]] $Enum[[C]]; 186 typedef $Enum[[C]] $Enum[[CC]]; 187 using $Enum[[CD]] = $Enum[[CC]]; 188 $Enum[[CC]] $Function[[f]]($Class[[B]]); 189 $Enum[[CD]] $Function[[f]]($Class[[BB]]); 192 template<typename $TemplateParameter[[T]], typename = void> 194 $TemplateParameter[[T]] $Field[[AA]]; 195 $TemplateParameter[[T]] $Method[[foo]](); 197 template<class $TemplateParameter[[TT]]> 199 $Class[[A]]<$TemplateParameter[[TT]]> $Field[[AA]]; 201 template<class $TemplateParameter[[TT]], class $TemplateParameter[[GG]]> 202 class $Class[[BB]] {}; 203 template<class $TemplateParameter[[T]]> 204 class $Class[[BB]]<$TemplateParameter[[T]], int> {}; 205 template<class $TemplateParameter[[T]]> 206 class $Class[[BB]]<$TemplateParameter[[T]], $TemplateParameter[[T]]*> {}; 208 template<template<class> class $TemplateParameter[[T]], class $TemplateParameter[[C]]> 209 $TemplateParameter[[T]]<$TemplateParameter[[C]]> $Function[[f]](); 212 class $Class[[Foo]] {}; 214 template<typename $TemplateParameter[[T]]> 215 void $Function[[foo]]($TemplateParameter[[T]] ...); 217 for (
const auto &TestCase : TestCases) {
218 checkHighlightings(TestCase);
222 TEST(SemanticHighlighting, GeneratesHighlightsWhenFileChange) {
223 class HighlightingsCounterDiagConsumer :
public DiagnosticsConsumer {
225 std::atomic<int> Count = {0};
227 void onDiagnosticsReady(
PathRef, std::vector<Diag>)
override {}
228 void onHighlightingsReady(
229 PathRef File, std::vector<HighlightingToken> Highlightings)
override {
236 FS.Files[FooCpp] =
"";
238 MockCompilationDatabase MCD;
241 Server.addDocument(FooCpp,
"int a;");
242 ASSERT_TRUE(
Server.blockUntilIdleForTest()) <<
"Waiting for server";
243 ASSERT_EQ(DiagConsumer.Count, 1);
247 auto CreatePosition = [](
int Line,
int Character) -> Position {
250 Pos.character = Character;
254 std::vector<HighlightingToken>
Tokens{
256 Range{CreatePosition(3, 8), CreatePosition(3, 12)}},
258 Range{CreatePosition(3, 4), CreatePosition(3, 7)}},
260 Range{CreatePosition(1, 1), CreatePosition(1, 5)}}};
261 std::vector<SemanticHighlightingInformation> ActualResults =
263 std::vector<SemanticHighlightingInformation> ExpectedResults = {
265 {3,
"AAAACAAEAAAAAAAEAAMAAQ=="}};
266 EXPECT_EQ(ActualResults, ExpectedResults);
llvm::StringRef PathRef
A typedef to represent a ref to file path.
static Options optsForTest()
TEST(BackgroundQueueTest, Priority)
std::string testPath(PathRef File)
std::vector< SemanticHighlightingInformation > toSemanticHighlightingInformation(llvm::ArrayRef< HighlightingToken > Tokens)
static TestTU withCode(llvm::StringRef Code)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
CharSourceRange Range
SourceRange for the file name.
std::vector< HighlightingToken > getSemanticHighlightings(ParsedAST &AST)
IgnoreDiagnostics DiagConsumer