Files
clice/unittests/Feature/SemanticTokens.cpp
2025-01-25 00:56:34 +08:00

109 lines
2.4 KiB
C++

#include "Test/CTest.h"
#include "Feature/SemanticTokens.h"
namespace clice::testing {
namespace {
struct SemanticTokens : ::testing::Test, Tester {
index::Shared<std::vector<feature::SemanticToken>> result;
void run(llvm::StringRef code) {
addMain("main.cpp", code);
Tester::run();
result = feature::semanticTokens(*info);
}
void EXPECT_TOKEN(llvm::StringRef pos,
SymbolKind kind,
uint32_t length,
std::source_location current = std::source_location::current()) {
bool visited = false;
auto offset = offsets[pos];
auto& tokens = result[info->getInterestedFile()];
for(auto& token: tokens) {
if(token.range.begin == offset) {
EXPECT_EQ(token.kind, kind, current);
EXPECT_EQ(token.range.end - token.range.begin, length, current);
visited = true;
break;
}
}
EXPECT_EQ(visited, true, current);
}
};
TEST_F(SemanticTokens, Include) {
run(R"cpp(
$(0)#include $(1)<stddef.h>
$(2)#include $(3)"stddef.h"
$(4)# $(5)include $(6)"stddef.h"
)cpp");
EXPECT_TOKEN("0", SymbolKind::Directive, 8);
EXPECT_TOKEN("1", SymbolKind::Header, 10);
EXPECT_TOKEN("2", SymbolKind::Directive, 8);
EXPECT_TOKEN("3", SymbolKind::Header, 10);
EXPECT_TOKEN("4", SymbolKind::Directive, 1);
EXPECT_TOKEN("5", SymbolKind::Directive, 7);
EXPECT_TOKEN("6", SymbolKind::Header, 10);
}
TEST_F(SemanticTokens, Comment) {
run(R"cpp(
$(line)/// line comment
int x = 1;
)cpp");
EXPECT_TOKEN("line", SymbolKind::Comment, 16);
}
TEST_F(SemanticTokens, Keyword) {
run(R"cpp(
$(int)int main() {
$(return)return 0;
}
)cpp");
EXPECT_TOKEN("int", SymbolKind::Keyword, 3);
EXPECT_TOKEN("return", SymbolKind::Keyword, 6);
}
TEST_F(SemanticTokens, Macro) {
run(R"cpp(
$(0)#define $(macro)FOO
)cpp");
EXPECT_TOKEN("0", SymbolKind::Directive, 7);
EXPECT_TOKEN("macro", SymbolKind::Macro, 3);
}
TEST_F(SemanticTokens, FinalAndOverride) {
run(R"cpp(
struct A $(0)final {};
struct B {
virtual void foo();
};
struct C : B {
void foo() $(1)override;
};
struct D : C {
void foo() $(2)final;
};
)cpp");
EXPECT_TOKEN("0", SymbolKind::Keyword, 5);
EXPECT_TOKEN("1", SymbolKind::Keyword, 8);
EXPECT_TOKEN("2", SymbolKind::Keyword, 5);
}
} // namespace
} // namespace clice::testing