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-exception
6//
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(S: symbol(QName: "1"));
32 return MemIndex::build(Symbols: std::move(Builder).build(), Refs: RefSlab(), Relations: 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), Sync: 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 return;
53}
54
55TEST(ProjectAware, CreatedOnce) {
56 unsigned InvocationCount = 0;
57 IndexFactory Gen = [&](const Config::ExternalIndexSpec &, AsyncTaskRunner *) {
58 ++InvocationCount;
59 return createIndex();
60 };
61
62 auto Idx = createProjectAwareIndex(std::move(Gen), Sync: true);
63 // No invocation at start.
64 EXPECT_EQ(InvocationCount, 0U);
65 FuzzyFindRequest Req;
66 Req.Query = "1";
67 Req.AnyScope = true;
68
69 // Cannot invoke without proper config.
70 match(I: *Idx, Req);
71 EXPECT_EQ(InvocationCount, 0U);
72
73 Config C;
74 C.Index.External.Kind = Config::ExternalIndexSpec::File;
75 C.Index.External.Location = "test";
76 WithContextValue With(Config::Key, std::move(C));
77 match(I: *Idx, Req);
78 // Now it should be created.
79 EXPECT_EQ(InvocationCount, 1U);
80 match(I: *Idx, Req);
81 // It is cached afterwards.
82 EXPECT_EQ(InvocationCount, 1U);
83 return;
84}
85} // namespace clangd
86} // namespace clang
87

source code of clang-tools-extra/clangd/unittests/ProjectAwareIndexTests.cpp