blob: 36105a24cba87b533b2b9ba2dec3f82b0a7c9147 [file] [log] [blame]
Alexander Kornienkodad4acb2014-05-22 16:07:11 +00001#include "ClangTidyOptions.h"
2#include "gtest/gtest.h"
Alexander Kornienkobb560522016-08-23 14:48:29 +00003#include "llvm/ADT/StringExtras.h"
Alexander Kornienkodad4acb2014-05-22 16:07:11 +00004
5namespace clang {
6namespace tidy {
7namespace test {
8
9TEST(ParseLineFilter, EmptyFilter) {
Alexander Kornienkoa4695222014-06-05 13:31:45 +000010 ClangTidyGlobalOptions Options;
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000011 EXPECT_FALSE(parseLineFilter("", Options));
12 EXPECT_TRUE(Options.LineFilter.empty());
13 EXPECT_FALSE(parseLineFilter("[]", Options));
14 EXPECT_TRUE(Options.LineFilter.empty());
15}
16
17TEST(ParseLineFilter, InvalidFilter) {
Alexander Kornienkoa4695222014-06-05 13:31:45 +000018 ClangTidyGlobalOptions Options;
Daniel Jasper136f4b32015-03-02 18:07:00 +000019 EXPECT_TRUE(!!parseLineFilter("asdf", Options));
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000020 EXPECT_TRUE(Options.LineFilter.empty());
21
Rafael Espindolaf1451372014-06-03 04:40:55 +000022 EXPECT_TRUE(!!parseLineFilter("[{}]", Options));
23 EXPECT_TRUE(!!parseLineFilter("[{\"name\":\"\"}]", Options));
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000024 EXPECT_TRUE(
Rafael Espindolaf1451372014-06-03 04:40:55 +000025 !!parseLineFilter("[{\"name\":\"test\",\"lines\":[[1]]}]", Options));
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000026 EXPECT_TRUE(
Rafael Espindolaf1451372014-06-03 04:40:55 +000027 !!parseLineFilter("[{\"name\":\"test\",\"lines\":[[1,2,3]]}]", Options));
NAKAMURA Takumi98247b32014-05-24 17:22:01 +000028 EXPECT_TRUE(
Rafael Espindolaf1451372014-06-03 04:40:55 +000029 !!parseLineFilter("[{\"name\":\"test\",\"lines\":[[1,-1]]}]", Options));
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000030}
31
32TEST(ParseLineFilter, ValidFilter) {
Alexander Kornienkoa4695222014-06-05 13:31:45 +000033 ClangTidyGlobalOptions Options;
Rafael Espindola15c57842014-06-12 13:32:11 +000034 std::error_code Error = parseLineFilter(
NAKAMURA Takumi98247b32014-05-24 17:22:01 +000035 "[{\"name\":\"file1.cpp\",\"lines\":[[3,15],[20,30],[42,42]]},"
36 "{\"name\":\"file2.h\"},"
37 "{\"name\":\"file3.cc\",\"lines\":[[100,1000]]}]",
Alexander Kornienkodad4acb2014-05-22 16:07:11 +000038 Options);
39 EXPECT_FALSE(Error);
40 EXPECT_EQ(3u, Options.LineFilter.size());
41 EXPECT_EQ("file1.cpp", Options.LineFilter[0].Name);
42 EXPECT_EQ(3u, Options.LineFilter[0].LineRanges.size());
43 EXPECT_EQ(3u, Options.LineFilter[0].LineRanges[0].first);
44 EXPECT_EQ(15u, Options.LineFilter[0].LineRanges[0].second);
45 EXPECT_EQ(20u, Options.LineFilter[0].LineRanges[1].first);
46 EXPECT_EQ(30u, Options.LineFilter[0].LineRanges[1].second);
47 EXPECT_EQ(42u, Options.LineFilter[0].LineRanges[2].first);
48 EXPECT_EQ(42u, Options.LineFilter[0].LineRanges[2].second);
49 EXPECT_EQ("file2.h", Options.LineFilter[1].Name);
50 EXPECT_EQ(0u, Options.LineFilter[1].LineRanges.size());
51 EXPECT_EQ("file3.cc", Options.LineFilter[2].Name);
52 EXPECT_EQ(1u, Options.LineFilter[2].LineRanges.size());
53 EXPECT_EQ(100u, Options.LineFilter[2].LineRanges[0].first);
54 EXPECT_EQ(1000u, Options.LineFilter[2].LineRanges[0].second);
55}
56
Alexander Kornienkoa4695222014-06-05 13:31:45 +000057TEST(ParseConfiguration, ValidConfiguration) {
Alexander Kornienkoe9951542014-09-24 18:36:03 +000058 llvm::ErrorOr<ClangTidyOptions> Options =
59 parseConfiguration("Checks: \"-*,misc-*\"\n"
60 "HeaderFilterRegex: \".*\"\n"
61 "AnalyzeTemporaryDtors: true\n"
62 "User: some.user");
63 EXPECT_TRUE(!!Options);
64 EXPECT_EQ("-*,misc-*", *Options->Checks);
65 EXPECT_EQ(".*", *Options->HeaderFilterRegex);
66 EXPECT_TRUE(*Options->AnalyzeTemporaryDtors);
67 EXPECT_EQ("some.user", *Options->User);
Alexander Kornienkoa4695222014-06-05 13:31:45 +000068}
69
Alexander Kornienkobb560522016-08-23 14:48:29 +000070TEST(ParseConfiguration, MergeConfigurations) {
71 llvm::ErrorOr<ClangTidyOptions> Options1 = parseConfiguration(R"(
72 Checks: "check1,check2"
73 HeaderFilterRegex: "filter1"
74 AnalyzeTemporaryDtors: true
75 User: user1
76 ExtraArgs: ['arg1', 'arg2']
77 ExtraArgsBefore: ['arg-before1', 'arg-before2']
78 )");
79 ASSERT_TRUE(!!Options1);
80 llvm::ErrorOr<ClangTidyOptions> Options2 = parseConfiguration(R"(
81 Checks: "check3,check4"
82 HeaderFilterRegex: "filter2"
83 AnalyzeTemporaryDtors: false
84 User: user2
85 ExtraArgs: ['arg3', 'arg4']
86 ExtraArgsBefore: ['arg-before3', 'arg-before4']
87 )");
88 ASSERT_TRUE(!!Options2);
89 ClangTidyOptions Options = Options1->mergeWith(*Options2);
90 EXPECT_EQ("check1,check2,check3,check4", *Options.Checks);
91 EXPECT_EQ("filter2", *Options.HeaderFilterRegex);
92 EXPECT_FALSE(*Options.AnalyzeTemporaryDtors);
93 EXPECT_EQ("user2", *Options.User);
94 ASSERT_TRUE(Options.ExtraArgs.hasValue());
95 EXPECT_EQ("arg1,arg2,arg3,arg4", llvm::join(Options.ExtraArgs->begin(),
96 Options.ExtraArgs->end(), ","));
97 ASSERT_TRUE(Options.ExtraArgsBefore.hasValue());
98 EXPECT_EQ("arg-before1,arg-before2,arg-before3,arg-before4",
99 llvm::join(Options.ExtraArgsBefore->begin(),
100 Options.ExtraArgsBefore->end(), ","));
101}
Alexander Kornienkodad4acb2014-05-22 16:07:11 +0000102} // namespace test
103} // namespace tidy
104} // namespace clang