xref: /aosp_15_r20/external/clang/unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===- unittest/Analysis/AnalyzerOptionsTest.cpp - SA Options test --------===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li 
10*67e74705SXin Li #include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
11*67e74705SXin Li #include "clang/StaticAnalyzer/Core/Checker.h"
12*67e74705SXin Li #include "gtest/gtest.h"
13*67e74705SXin Li 
14*67e74705SXin Li namespace clang {
15*67e74705SXin Li namespace ento {
16*67e74705SXin Li 
TEST(StaticAnalyzerOptions,SearchInParentPackageTests)17*67e74705SXin Li TEST(StaticAnalyzerOptions, SearchInParentPackageTests) {
18*67e74705SXin Li   AnalyzerOptions Opts;
19*67e74705SXin Li   Opts.Config["Outer.Inner.CheckerOne:Option"] = "true";
20*67e74705SXin Li   Opts.Config["Outer.Inner:Option"] = "false";
21*67e74705SXin Li   Opts.Config["Outer.Inner:Option2"] = "true";
22*67e74705SXin Li   Opts.Config["Outer:Option2"] = "false";
23*67e74705SXin Li 
24*67e74705SXin Li   struct CheckerOneMock : CheckerBase {
25*67e74705SXin Li     StringRef getTagDescription() const override {
26*67e74705SXin Li       return "Outer.Inner.CheckerOne";
27*67e74705SXin Li     }
28*67e74705SXin Li   };
29*67e74705SXin Li   struct CheckerTwoMock : CheckerBase {
30*67e74705SXin Li     StringRef getTagDescription() const override {
31*67e74705SXin Li       return "Outer.Inner.CheckerTwo";
32*67e74705SXin Li     }
33*67e74705SXin Li   };
34*67e74705SXin Li 
35*67e74705SXin Li   // Checker one has Option specified as true. It should read true regardless of
36*67e74705SXin Li   // search mode.
37*67e74705SXin Li   CheckerOneMock CheckerOne;
38*67e74705SXin Li   EXPECT_TRUE(Opts.getBooleanOption("Option", false, &CheckerOne));
39*67e74705SXin Li   // The package option is overriden with a checker option.
40*67e74705SXin Li   EXPECT_TRUE(Opts.getBooleanOption("Option", false, &CheckerOne, true));
41*67e74705SXin Li   // The Outer package option is overriden by the Inner package option. No
42*67e74705SXin Li   // package option is specified.
43*67e74705SXin Li   EXPECT_TRUE(Opts.getBooleanOption("Option2", false, &CheckerOne, true));
44*67e74705SXin Li   // No package option is specified and search in packages is turned off. The
45*67e74705SXin Li   // default value should be returned.
46*67e74705SXin Li   EXPECT_FALSE(Opts.getBooleanOption("Option2", false, &CheckerOne));
47*67e74705SXin Li   EXPECT_TRUE(Opts.getBooleanOption("Option2", true, &CheckerOne));
48*67e74705SXin Li 
49*67e74705SXin Li   // Checker true has no option specified. It should get the default value when
50*67e74705SXin Li   // search in parents turned off and false when search in parents turned on.
51*67e74705SXin Li   CheckerTwoMock CheckerTwo;
52*67e74705SXin Li   EXPECT_FALSE(Opts.getBooleanOption("Option", false, &CheckerTwo));
53*67e74705SXin Li   EXPECT_TRUE(Opts.getBooleanOption("Option", true, &CheckerTwo));
54*67e74705SXin Li   EXPECT_FALSE(Opts.getBooleanOption("Option", true, &CheckerTwo, true));
55*67e74705SXin Li }
56*67e74705SXin Li 
TEST(StaticAnalyzerOptions,StringOptions)57*67e74705SXin Li TEST(StaticAnalyzerOptions, StringOptions) {
58*67e74705SXin Li   AnalyzerOptions Opts;
59*67e74705SXin Li   Opts.Config["Outer.Inner.CheckerOne:Option"] = "StringValue";
60*67e74705SXin Li 
61*67e74705SXin Li   struct CheckerOneMock : CheckerBase {
62*67e74705SXin Li     StringRef getTagDescription() const override {
63*67e74705SXin Li       return "Outer.Inner.CheckerOne";
64*67e74705SXin Li     }
65*67e74705SXin Li   };
66*67e74705SXin Li 
67*67e74705SXin Li   CheckerOneMock CheckerOne;
68*67e74705SXin Li   EXPECT_TRUE("StringValue" ==
69*67e74705SXin Li               Opts.getOptionAsString("Option", "DefaultValue", &CheckerOne));
70*67e74705SXin Li   EXPECT_TRUE("DefaultValue" ==
71*67e74705SXin Li               Opts.getOptionAsString("Option2", "DefaultValue", &CheckerOne));
72*67e74705SXin Li }
73*67e74705SXin Li } // end namespace ento
74*67e74705SXin Li } // end namespace clang
75