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}
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), Sync: 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(I: *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(I: *Idx, Req);
77 // Now it should be created.
78 EXPECT_EQ(InvocationCount, 1U);
79 match(I: *Idx, Req);
80 // It is cached afterwards.
81 EXPECT_EQ(InvocationCount, 1U);
82}
83} // namespace clangd
84} // namespace clang
85

Provided by KDAB

Privacy Policy
Improve your Profiling and Debugging skills
Find out more

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