//===----------------------------------------------------------------------===//
//
// 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 "CheckerRegistration.h"
#include "clang/StaticAnalyzer/Core/Checker.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/CallDescription.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h"
#include "clang/StaticAnalyzer/Frontend/CheckerRegistry.h"
#include "gtest/gtest.h"

using namespace clang;
using namespace ento;

namespace {
class EvalCallBase : public Checker<eval::Call> {
  const CallDescription Foo = {"foo", 0};

public:
  bool evalCall(const CallEvent &Call, CheckerContext &C) const {
    return Foo.matches(Call);
  }
};

class EvalCallFoo1 : public EvalCallBase {};
class EvalCallFoo2 : public EvalCallBase {};
void addEvalFooCheckers(AnalysisASTConsumer &AnalysisConsumer,
                        AnalyzerOptions &AnOpts) {
  AnOpts.CheckersAndPackages = {{"test.EvalFoo1", true},
                                {"test.EvalFoo2", true}};
  AnalysisConsumer.AddCheckerRegistrationFn([](CheckerRegistry &Registry) {
    Registry.addChecker<EvalCallFoo1>("test.EvalFoo1", "EmptyDescription",
                                      "EmptyDocsUri");
    Registry.addChecker<EvalCallFoo2>("test.EvalFoo2", "EmptyDescription",
                                      "EmptyDocsUri");
  });
}
} // namespace

TEST(EvalCall, DetectConflictingEvalCalls) {
#ifdef NDEBUG
  GTEST_SKIP() << "This test is only available for debug builds.";
#endif
  const std::string Code = R"code(
    void foo();
    void top() {
      foo(); // crash
    }
  )code";
  constexpr auto Regex =
      "The 'foo\\(\\)' call has been already evaluated by the test\\.EvalFoo1 "
      "checker, while the test\\.EvalFoo2 checker also tried to evaluate the "
      "same call\\. At most one checker supposed to evaluate a call\\.";
  ASSERT_DEATH(runCheckerOnCode<addEvalFooCheckers>(Code), Regex);
}
