xref: /llvm-project/clang-tools-extra/clangd/unittests/ProjectAwareIndexTests.cpp (revision 9e9ac4138890425b92d2196344ab59305caa32d7)
1067ffbfeSKadir Cetinkaya //===-- ProjectAwareIndexTests.cpp  -------------------*- C++ -*-----------===//
2067ffbfeSKadir Cetinkaya //
3067ffbfeSKadir Cetinkaya // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4067ffbfeSKadir Cetinkaya // See https://llvm.org/LICENSE.txt for license information.
5067ffbfeSKadir Cetinkaya // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6067ffbfeSKadir Cetinkaya //
7067ffbfeSKadir Cetinkaya //===----------------------------------------------------------------------===//
8067ffbfeSKadir Cetinkaya 
9067ffbfeSKadir Cetinkaya #include "Config.h"
10067ffbfeSKadir Cetinkaya #include "TestIndex.h"
11067ffbfeSKadir Cetinkaya #include "index/Index.h"
12067ffbfeSKadir Cetinkaya #include "index/MemIndex.h"
13067ffbfeSKadir Cetinkaya #include "index/ProjectAware.h"
14067ffbfeSKadir Cetinkaya #include "index/Ref.h"
15067ffbfeSKadir Cetinkaya #include "index/Relation.h"
16067ffbfeSKadir Cetinkaya #include "support/Context.h"
17067ffbfeSKadir Cetinkaya #include "support/Threading.h"
18067ffbfeSKadir Cetinkaya #include "llvm/ADT/StringRef.h"
19067ffbfeSKadir Cetinkaya #include "gmock/gmock.h"
20067ffbfeSKadir Cetinkaya #include "gtest/gtest.h"
21067ffbfeSKadir Cetinkaya #include <memory>
22067ffbfeSKadir Cetinkaya #include <utility>
23067ffbfeSKadir Cetinkaya 
24067ffbfeSKadir Cetinkaya namespace clang {
25067ffbfeSKadir Cetinkaya namespace clangd {
26067ffbfeSKadir Cetinkaya using testing::ElementsAre;
27067ffbfeSKadir Cetinkaya using testing::IsEmpty;
28067ffbfeSKadir Cetinkaya 
createIndex()29067ffbfeSKadir Cetinkaya std::unique_ptr<SymbolIndex> createIndex() {
3065536009SKadir Cetinkaya   SymbolSlab::Builder Builder;
3165536009SKadir Cetinkaya   Builder.insert(symbol("1"));
3265536009SKadir Cetinkaya   return MemIndex::build(std::move(Builder).build(), RefSlab(), RelationSlab());
33067ffbfeSKadir Cetinkaya }
34067ffbfeSKadir Cetinkaya 
TEST(ProjectAware,Test)35067ffbfeSKadir Cetinkaya TEST(ProjectAware, Test) {
36dc9c0963SKadir Cetinkaya   IndexFactory Gen = [](const Config::ExternalIndexSpec &, AsyncTaskRunner *) {
37067ffbfeSKadir Cetinkaya     return createIndex();
38067ffbfeSKadir Cetinkaya   };
39067ffbfeSKadir Cetinkaya 
40dc9c0963SKadir Cetinkaya   auto Idx = createProjectAwareIndex(std::move(Gen), true);
41067ffbfeSKadir Cetinkaya   FuzzyFindRequest Req;
42067ffbfeSKadir Cetinkaya   Req.Query = "1";
43067ffbfeSKadir Cetinkaya   Req.AnyScope = true;
44067ffbfeSKadir Cetinkaya 
45067ffbfeSKadir Cetinkaya   EXPECT_THAT(match(*Idx, Req), IsEmpty());
46067ffbfeSKadir Cetinkaya 
47067ffbfeSKadir Cetinkaya   Config C;
48*9e9ac413SKadir Cetinkaya   C.Index.External.Kind = Config::ExternalIndexSpec::File;
49*9e9ac413SKadir Cetinkaya   C.Index.External.Location = "test";
50067ffbfeSKadir Cetinkaya   WithContextValue With(Config::Key, std::move(C));
51067ffbfeSKadir Cetinkaya   EXPECT_THAT(match(*Idx, Req), ElementsAre("1"));
52067ffbfeSKadir Cetinkaya   return;
53067ffbfeSKadir Cetinkaya }
54067ffbfeSKadir Cetinkaya 
TEST(ProjectAware,CreatedOnce)55067ffbfeSKadir Cetinkaya TEST(ProjectAware, CreatedOnce) {
56067ffbfeSKadir Cetinkaya   unsigned InvocationCount = 0;
57dc9c0963SKadir Cetinkaya   IndexFactory Gen = [&](const Config::ExternalIndexSpec &, AsyncTaskRunner *) {
58067ffbfeSKadir Cetinkaya     ++InvocationCount;
59067ffbfeSKadir Cetinkaya     return createIndex();
60067ffbfeSKadir Cetinkaya   };
61067ffbfeSKadir Cetinkaya 
62dc9c0963SKadir Cetinkaya   auto Idx = createProjectAwareIndex(std::move(Gen), true);
63067ffbfeSKadir Cetinkaya   // No invocation at start.
64067ffbfeSKadir Cetinkaya   EXPECT_EQ(InvocationCount, 0U);
65067ffbfeSKadir Cetinkaya   FuzzyFindRequest Req;
66067ffbfeSKadir Cetinkaya   Req.Query = "1";
67067ffbfeSKadir Cetinkaya   Req.AnyScope = true;
68067ffbfeSKadir Cetinkaya 
69067ffbfeSKadir Cetinkaya   // Cannot invoke without proper config.
70067ffbfeSKadir Cetinkaya   match(*Idx, Req);
71067ffbfeSKadir Cetinkaya   EXPECT_EQ(InvocationCount, 0U);
72067ffbfeSKadir Cetinkaya 
73067ffbfeSKadir Cetinkaya   Config C;
74*9e9ac413SKadir Cetinkaya   C.Index.External.Kind = Config::ExternalIndexSpec::File;
75*9e9ac413SKadir Cetinkaya   C.Index.External.Location = "test";
76067ffbfeSKadir Cetinkaya   WithContextValue With(Config::Key, std::move(C));
77067ffbfeSKadir Cetinkaya   match(*Idx, Req);
78067ffbfeSKadir Cetinkaya   // Now it should be created.
79067ffbfeSKadir Cetinkaya   EXPECT_EQ(InvocationCount, 1U);
80067ffbfeSKadir Cetinkaya   match(*Idx, Req);
81067ffbfeSKadir Cetinkaya   // It is cached afterwards.
82067ffbfeSKadir Cetinkaya   EXPECT_EQ(InvocationCount, 1U);
83067ffbfeSKadir Cetinkaya   return;
84067ffbfeSKadir Cetinkaya }
85067ffbfeSKadir Cetinkaya } // namespace clangd
86067ffbfeSKadir Cetinkaya } // namespace clang
87