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