//===--- FeatureModulesRegistryTests.cpp ---------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "FeatureModule.h" #include "refactor/Tweak.h" #include "support/Logger.h" #include "gmock/gmock.h" #include "gtest/gtest.h" using testing::ElementsAre; namespace llvm { raw_ostream &operator<<(raw_ostream &OS, const clang::clangd::FeatureModuleRegistry::entry &E) { OS << "(name = " << E.getName() << ", description = '" << E.getDesc() << "')"; return OS; } raw_ostream &operator<<( raw_ostream &OS, const iterator_range::iterator> &Rng) { OS << "{ "; bool First = true; for (clang::clangd::FeatureModuleRegistry::entry E : Rng) { if (First) First = false; else OS << ", "; OS << E; } OS << " }"; return OS; } raw_ostream &operator<<(raw_ostream &OS, const clang::clangd::Tweak &T) { OS << "(id = " << T.id() << ", " << "title = " << T.title() << ")"; return OS; } } // namespace llvm namespace clang::clangd { namespace { class Dummy final : public FeatureModule { static constexpr const char *TweakID = "DummyTweak"; struct DummyTweak final : public Tweak { const char *id() const override { return TweakID; } bool prepare(const Selection &) override { return true; } Expected apply(const Selection &) override { return error("not implemented"); } std::string title() const override { return id(); } llvm::StringLiteral kind() const override { return llvm::StringLiteral(""); }; }; void contributeTweaks(std::vector> &Out) override { Out.emplace_back(new DummyTweak); } }; static FeatureModuleRegistry::Add X("dummy", "Dummy feature module with dummy tweak"); MATCHER_P(moduleName, Name, "") { return arg.getName() == Name; } MATCHER_P(tweakID, ID, "") { return arg->id() == llvm::StringRef(ID); } // In this test, it is assumed that for unittests executable, all feature // modules are added to the registry only here (in this file). To implement // modules for clangd tool, one need to link them directly to the clangd // executable in clangd/tool/CMakeLists.txt. TEST(FeatureModulesRegistryTest, DummyModule) { EXPECT_THAT(FeatureModuleRegistry::entries(), ElementsAre(moduleName("dummy"))); FeatureModuleSet Set = FeatureModuleSet::fromRegistry(); ASSERT_EQ(Set.end() - Set.begin(), 1u); std::vector> Tweaks; Set.begin()->contributeTweaks(Tweaks); EXPECT_THAT(Tweaks, ElementsAre(tweakID("DummyTweak"))); } } // namespace } // namespace clang::clangd