TEST(ParseLineFilter, EmptyFilter) { ClangTidyGlobalOptions Options; EXPECT_FALSE(parseLineFilter("", Options)); EXPECT_TRUE(Options.LineFilter.empty()); EXPECT_FALSE(parseLineFilter("[]", Options)); EXPECT_TRUE(Options.LineFilter.empty()); }
static std::unique_ptr<ClangTidyOptionsProvider> createOptionsProvider() { ClangTidyGlobalOptions GlobalOptions; if (std::error_code Err = parseLineFilter(LineFilter, GlobalOptions)) { llvm::errs() << "Invalid LineFilter: " << Err.message() << "\n\nUsage:\n"; llvm::cl::PrintHelpMessage(/*Hidden=*/false, /*Categorized=*/true); return nullptr; } ClangTidyOptions DefaultOptions; DefaultOptions.Checks = DefaultChecks; DefaultOptions.HeaderFilterRegex = HeaderFilter; DefaultOptions.SystemHeaders = SystemHeaders; DefaultOptions.AnalyzeTemporaryDtors = AnalyzeTemporaryDtors; DefaultOptions.User = llvm::sys::Process::GetEnv("USER"); // USERNAME is used on Windows. if (!DefaultOptions.User) DefaultOptions.User = llvm::sys::Process::GetEnv("USERNAME"); ClangTidyOptions OverrideOptions; if (Checks.getNumOccurrences() > 0) OverrideOptions.Checks = Checks; if (HeaderFilter.getNumOccurrences() > 0) OverrideOptions.HeaderFilterRegex = HeaderFilter; if (SystemHeaders.getNumOccurrences() > 0) OverrideOptions.SystemHeaders = SystemHeaders; if (AnalyzeTemporaryDtors.getNumOccurrences() > 0) OverrideOptions.AnalyzeTemporaryDtors = AnalyzeTemporaryDtors; if (!Config.empty()) { if (llvm::ErrorOr<ClangTidyOptions> ParsedConfig = parseConfiguration(Config)) { return llvm::make_unique<DefaultOptionsProvider>( GlobalOptions, ClangTidyOptions::getDefaults() .mergeWith(DefaultOptions) .mergeWith(*ParsedConfig) .mergeWith(OverrideOptions)); } else { llvm::errs() << "Error: invalid configuration specified.\n" << ParsedConfig.getError().message() << "\n"; return nullptr; } } return llvm::make_unique<FileOptionsProvider>(GlobalOptions, DefaultOptions, OverrideOptions); }
TEST(ParseLineFilter, InvalidFilter) { ClangTidyGlobalOptions Options; // TODO: Figure out why parsing succeeds here. EXPECT_FALSE(parseLineFilter("asdf", Options)); EXPECT_TRUE(Options.LineFilter.empty()); EXPECT_TRUE(!!parseLineFilter("[{}]", Options)); EXPECT_TRUE(!!parseLineFilter("[{\"name\":\"\"}]", Options)); EXPECT_TRUE( !!parseLineFilter("[{\"name\":\"test\",\"lines\":[[1]]}]", Options)); EXPECT_TRUE( !!parseLineFilter("[{\"name\":\"test\",\"lines\":[[1,2,3]]}]", Options)); EXPECT_TRUE( !!parseLineFilter("[{\"name\":\"test\",\"lines\":[[1,-1]]}]", Options)); }
TEST(ParseLineFilter, ValidFilter) { ClangTidyGlobalOptions Options; std::error_code Error = parseLineFilter( "[{\"name\":\"file1.cpp\",\"lines\":[[3,15],[20,30],[42,42]]}," "{\"name\":\"file2.h\"}," "{\"name\":\"file3.cc\",\"lines\":[[100,1000]]}]", Options); EXPECT_FALSE(Error); EXPECT_EQ(3u, Options.LineFilter.size()); EXPECT_EQ("file1.cpp", Options.LineFilter[0].Name); EXPECT_EQ(3u, Options.LineFilter[0].LineRanges.size()); EXPECT_EQ(3u, Options.LineFilter[0].LineRanges[0].first); EXPECT_EQ(15u, Options.LineFilter[0].LineRanges[0].second); EXPECT_EQ(20u, Options.LineFilter[0].LineRanges[1].first); EXPECT_EQ(30u, Options.LineFilter[0].LineRanges[1].second); EXPECT_EQ(42u, Options.LineFilter[0].LineRanges[2].first); EXPECT_EQ(42u, Options.LineFilter[0].LineRanges[2].second); EXPECT_EQ("file2.h", Options.LineFilter[1].Name); EXPECT_EQ(0u, Options.LineFilter[1].LineRanges.size()); EXPECT_EQ("file3.cc", Options.LineFilter[2].Name); EXPECT_EQ(1u, Options.LineFilter[2].LineRanges.size()); EXPECT_EQ(100u, Options.LineFilter[2].LineRanges[0].first); EXPECT_EQ(1000u, Options.LineFilter[2].LineRanges[0].second); }