diff options
Diffstat (limited to 'unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp')
| -rw-r--r-- | unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp | 74 | 
1 files changed, 74 insertions, 0 deletions
| diff --git a/unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp b/unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp new file mode 100644 index 000000000000..33f1740bea8a --- /dev/null +++ b/unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp @@ -0,0 +1,74 @@ +//===- 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, 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 | 
