93 lines · cpp
1//===--- FeatureModulesRegistryTests.cpp ---------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "FeatureModule.h"10#include "refactor/Tweak.h"11#include "support/Logger.h"12 13#include "gmock/gmock.h"14#include "gtest/gtest.h"15 16using testing::ElementsAre;17 18namespace llvm {19raw_ostream &operator<<(raw_ostream &OS,20 const clang::clangd::FeatureModuleRegistry::entry &E) {21 OS << "(name = " << E.getName() << ", description = '" << E.getDesc() << "')";22 return OS;23}24 25raw_ostream &operator<<(26 raw_ostream &OS,27 const iterator_range<Registry<clang::clangd::FeatureModule>::iterator>28 &Rng) {29 OS << "{ ";30 bool First = true;31 for (clang::clangd::FeatureModuleRegistry::entry E : Rng) {32 if (First)33 First = false;34 else35 OS << ", ";36 OS << E;37 }38 OS << " }";39 return OS;40}41 42raw_ostream &operator<<(raw_ostream &OS, const clang::clangd::Tweak &T) {43 OS << "(id = " << T.id() << ", "44 << "title = " << T.title() << ")";45 return OS;46}47} // namespace llvm48 49namespace clang::clangd {50namespace {51 52class Dummy final : public FeatureModule {53 static constexpr const char *TweakID = "DummyTweak";54 struct DummyTweak final : public Tweak {55 const char *id() const override { return TweakID; }56 bool prepare(const Selection &) override { return true; }57 Expected<Effect> apply(const Selection &) override {58 return error("not implemented");59 }60 std::string title() const override { return id(); }61 llvm::StringLiteral kind() const override {62 return llvm::StringLiteral("");63 };64 };65 66 void contributeTweaks(std::vector<std::unique_ptr<Tweak>> &Out) override {67 Out.emplace_back(new DummyTweak);68 }69};70 71static FeatureModuleRegistry::Add<Dummy>72 X("dummy", "Dummy feature module with dummy tweak");73 74MATCHER_P(moduleName, Name, "") { return arg.getName() == Name; }75MATCHER_P(tweakID, ID, "") { return arg->id() == llvm::StringRef(ID); }76 77// In this test, it is assumed that for unittests executable, all feature78// modules are added to the registry only here (in this file). To implement79// modules for clangd tool, one need to link them directly to the clangd80// executable in clangd/tool/CMakeLists.txt.81TEST(FeatureModulesRegistryTest, DummyModule) {82 EXPECT_THAT(FeatureModuleRegistry::entries(),83 ElementsAre(moduleName("dummy")));84 FeatureModuleSet Set = FeatureModuleSet::fromRegistry();85 ASSERT_EQ(Set.end() - Set.begin(), 1u);86 std::vector<std::unique_ptr<Tweak>> Tweaks;87 Set.begin()->contributeTweaks(Tweaks);88 EXPECT_THAT(Tweaks, ElementsAre(tweakID("DummyTweak")));89}90 91} // namespace92} // namespace clang::clangd93