| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
- // Exceptions. See /LICENSE for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- #ifndef CARBON_MIGRATE_CPP_CPP_REFACTORING_MATCHER_TEST_BASE_H_
- #define CARBON_MIGRATE_CPP_CPP_REFACTORING_MATCHER_TEST_BASE_H_
- #include <gmock/gmock.h>
- #include <gtest/gtest.h>
- #include "clang/ASTMatchers/ASTMatchFinder.h"
- #include "clang/Tooling/Core/Replacement.h"
- #include "clang/Tooling/Tooling.h"
- #include "migrate_cpp/cpp_refactoring/matcher_manager.h"
- namespace Carbon::Testing {
- // Matcher test framework.
- template <typename MatcherFactoryType>
- class MatcherTestBase : public ::testing::Test {
- protected:
- MatcherTestBase() : matchers_(&replacements_) {
- matchers_.Register(std::make_unique<MatcherFactoryType>());
- }
- // Expects that the replacements produced by running the finder result in
- // the specified code transformation.
- void ExpectReplacement(llvm::StringRef before, llvm::StringRef after) {
- auto factory =
- clang::tooling::newFrontendActionFactory(matchers_.GetFinder());
- constexpr char Filename[] = "test.cc";
- replacements_.clear();
- replacements_.insert({Filename, {}});
- ASSERT_TRUE(clang::tooling::runToolOnCodeWithArgs(
- factory->create(), before, {}, Filename, "clang-tool",
- std::make_shared<clang::PCHContainerOperations>(),
- clang::tooling::FileContentMappings()));
- EXPECT_THAT(replacements_, testing::ElementsAre(testing::Key(Filename)));
- llvm::Expected<std::string> actual =
- clang::tooling::applyAllReplacements(before, replacements_[Filename]);
- // Make a specific note if the matcher didn't make any changes.
- std::string unchanged;
- if (before == *actual) {
- unchanged = "NOTE: Actual matches original text, no changes made.";
- }
- if (after.find('\n') == std::string::npos) {
- EXPECT_THAT(*actual, testing::Eq(after.str())) << unchanged;
- } else {
- // Split lines to get gmock to get an easier-to-read error.
- llvm::SmallVector<llvm::StringRef, 0> actual_lines;
- llvm::SplitString(*actual, actual_lines, "\n");
- llvm::SmallVector<llvm::StringRef, 0> after_lines;
- llvm::SplitString(after, after_lines, "\n");
- EXPECT_THAT(actual_lines, testing::ContainerEq(after_lines)) << unchanged;
- }
- }
- private:
- Matcher::ReplacementMap replacements_;
- MatcherManager matchers_;
- };
- } // namespace Carbon::Testing
- #endif // CARBON_MIGRATE_CPP_CPP_REFACTORING_MATCHER_TEST_BASE_H_
|