//===- unittest/Analysis/AnalyzerOptionsTest.cpp - SA Options test --------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
#include "clang/StaticAnalyzer/Core/Checker.h"
#include "gtest/gtest.h"

namespace clang {
namespace ento {

TEST(StaticAnalyzerOptions, getRegisteredCheckers) {
  auto IsDebugChecker = [](StringRef CheckerName) {
    return CheckerName.startswith("debug");
  };
  auto IsAlphaChecker = [](StringRef CheckerName) {
    return CheckerName.startswith("alpha");
  };
  const auto &AllCheckers =
      AnalyzerOptions::getRegisteredCheckers(/*IncludeExperimental=*/true);
  EXPECT_FALSE(llvm::any_of(AllCheckers, IsDebugChecker));
  EXPECT_TRUE(llvm::any_of(AllCheckers, IsAlphaChecker));

  const auto &StableCheckers = AnalyzerOptions::getRegisteredCheckers();
  EXPECT_FALSE(llvm::any_of(StableCheckers, IsDebugChecker));
  EXPECT_FALSE(llvm::any_of(StableCheckers, IsAlphaChecker));
}

TEST(StaticAnalyzerOptions, SearchInParentPackageTests) {
  AnalyzerOptions Opts;
  Opts.Config["Outer.Inner.CheckerOne:Option"] = "true";
  Opts.Config["Outer.Inner:Option"] = "false";
  Opts.Config["Outer.Inner:Option2"] = "true";
  Opts.Config["Outer:Option2"] = "false";

  struct CheckerOneMock : CheckerBase {
    StringRef getTagDescription() const override {
      return "Outer.Inner.CheckerOne";
    }
  };
  struct CheckerTwoMock : CheckerBase {
    StringRef getTagDescription() const override {
      return "Outer.Inner.CheckerTwo";
    }
  };

  // Checker one has Option specified as true. It should read true regardless of
  // search mode.
  CheckerOneMock CheckerOne;
  EXPECT_TRUE(Opts.getBooleanOption("Option", false, &CheckerOne));
  // The package option is overriden with a checker option.
  EXPECT_TRUE(Opts.getBooleanOption("Option", false, &CheckerOne, true));
  // The Outer package option is overriden by the Inner package option. No
  // package option is specified.
  EXPECT_TRUE(Opts.getBooleanOption("Option2", false, &CheckerOne, true));
  // No package option is specified and search in packages is turned off. The
  // default value should be returned.
  EXPECT_FALSE(Opts.getBooleanOption("Option2", false, &CheckerOne));
  EXPECT_TRUE(Opts.getBooleanOption("Option2", true, &CheckerOne));

  // Checker true has no option specified. It should get the default value when
  // search in parents turned off and false when search in parents turned on.
  CheckerTwoMock CheckerTwo;
  EXPECT_FALSE(Opts.getBooleanOption("Option", false, &CheckerTwo));
  EXPECT_TRUE(Opts.getBooleanOption("Option", true, &CheckerTwo));
  EXPECT_FALSE(Opts.getBooleanOption("Option", true, &CheckerTwo, true));
}

TEST(StaticAnalyzerOptions, StringOptions) {
  AnalyzerOptions Opts;
  Opts.Config["Outer.Inner.CheckerOne:Option"] = "StringValue";

  struct CheckerOneMock : CheckerBase {
    StringRef getTagDescription() const override {
      return "Outer.Inner.CheckerOne";
    }
  };

  CheckerOneMock CheckerOne;
  EXPECT_TRUE("StringValue" ==
              Opts.getOptionAsString("Option", "DefaultValue", &CheckerOne));
  EXPECT_TRUE("DefaultValue" ==
              Opts.getOptionAsString("Option2", "DefaultValue", &CheckerOne));
}
} // end namespace ento
} // end namespace clang
