//===-- ProjectAwareIndexTests.cpp  -------------------*- C++ -*-----------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "Config.h"
#include "TestIndex.h"
#include "index/Index.h"
#include "index/MemIndex.h"
#include "index/ProjectAware.h"
#include "index/Ref.h"
#include "index/Relation.h"
#include "support/Context.h"
#include "support/Threading.h"
#include "llvm/ADT/StringRef.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include <memory>
#include <utility>

namespace clang {
namespace clangd {
using testing::ElementsAre;
using testing::IsEmpty;

std::unique_ptr<SymbolIndex> createIndex() {
  SymbolSlab::Builder Builder;
  Builder.insert(symbol("1"));
  return MemIndex::build(std::move(Builder).build(), RefSlab(), RelationSlab());
}

TEST(ProjectAware, Test) {
  IndexFactory Gen = [](const Config::ExternalIndexSpec &, AsyncTaskRunner *) {
    return createIndex();
  };

  auto Idx = createProjectAwareIndex(std::move(Gen), true);
  FuzzyFindRequest Req;
  Req.Query = "1";
  Req.AnyScope = true;

  EXPECT_THAT(match(*Idx, Req), IsEmpty());

  Config C;
  C.Index.External.Kind = Config::ExternalIndexSpec::File;
  C.Index.External.Location = "test";
  WithContextValue With(Config::Key, std::move(C));
  EXPECT_THAT(match(*Idx, Req), ElementsAre("1"));
  return;
}

TEST(ProjectAware, CreatedOnce) {
  unsigned InvocationCount = 0;
  IndexFactory Gen = [&](const Config::ExternalIndexSpec &, AsyncTaskRunner *) {
    ++InvocationCount;
    return createIndex();
  };

  auto Idx = createProjectAwareIndex(std::move(Gen), true);
  // No invocation at start.
  EXPECT_EQ(InvocationCount, 0U);
  FuzzyFindRequest Req;
  Req.Query = "1";
  Req.AnyScope = true;

  // Cannot invoke without proper config.
  match(*Idx, Req);
  EXPECT_EQ(InvocationCount, 0U);

  Config C;
  C.Index.External.Kind = Config::ExternalIndexSpec::File;
  C.Index.External.Location = "test";
  WithContextValue With(Config::Key, std::move(C));
  match(*Idx, Req);
  // Now it should be created.
  EXPECT_EQ(InvocationCount, 1U);
  match(*Idx, Req);
  // It is cached afterwards.
  EXPECT_EQ(InvocationCount, 1U);
  return;
}
} // namespace clangd
} // namespace clang
