85 lines · cpp
1//===-- ProjectAwareIndexTests.cpp -------------------*- C++ -*-----------===//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 "Config.h"10#include "TestIndex.h"11#include "index/Index.h"12#include "index/MemIndex.h"13#include "index/ProjectAware.h"14#include "index/Ref.h"15#include "index/Relation.h"16#include "support/Context.h"17#include "support/Threading.h"18#include "llvm/ADT/StringRef.h"19#include "gmock/gmock.h"20#include "gtest/gtest.h"21#include <memory>22#include <utility>23 24namespace clang {25namespace clangd {26using testing::ElementsAre;27using testing::IsEmpty;28 29std::unique_ptr<SymbolIndex> createIndex() {30 SymbolSlab::Builder Builder;31 Builder.insert(symbol("1"));32 return MemIndex::build(std::move(Builder).build(), RefSlab(), RelationSlab());33}34 35TEST(ProjectAware, Test) {36 IndexFactory Gen = [](const Config::ExternalIndexSpec &, AsyncTaskRunner *) {37 return createIndex();38 };39 40 auto Idx = createProjectAwareIndex(std::move(Gen), true);41 FuzzyFindRequest Req;42 Req.Query = "1";43 Req.AnyScope = true;44 45 EXPECT_THAT(match(*Idx, Req), IsEmpty());46 47 Config C;48 C.Index.External.Kind = Config::ExternalIndexSpec::File;49 C.Index.External.Location = "test";50 WithContextValue With(Config::Key, std::move(C));51 EXPECT_THAT(match(*Idx, Req), ElementsAre("1"));52}53 54TEST(ProjectAware, CreatedOnce) {55 unsigned InvocationCount = 0;56 IndexFactory Gen = [&](const Config::ExternalIndexSpec &, AsyncTaskRunner *) {57 ++InvocationCount;58 return createIndex();59 };60 61 auto Idx = createProjectAwareIndex(std::move(Gen), true);62 // No invocation at start.63 EXPECT_EQ(InvocationCount, 0U);64 FuzzyFindRequest Req;65 Req.Query = "1";66 Req.AnyScope = true;67 68 // Cannot invoke without proper config.69 match(*Idx, Req);70 EXPECT_EQ(InvocationCount, 0U);71 72 Config C;73 C.Index.External.Kind = Config::ExternalIndexSpec::File;74 C.Index.External.Location = "test";75 WithContextValue With(Config::Key, std::move(C));76 match(*Idx, Req);77 // Now it should be created.78 EXPECT_EQ(InvocationCount, 1U);79 match(*Idx, Req);80 // It is cached afterwards.81 EXPECT_EQ(InvocationCount, 1U);82}83} // namespace clangd84} // namespace clang85