summaryrefslogtreecommitdiff
path: root/unittests/Tooling/RefactoringCallbacksTest.cpp
diff options
context:
space:
mode:
authorDaniel Jasper <djasper@google.com>2012-07-17 08:03:01 +0000
committerDaniel Jasper <djasper@google.com>2012-07-17 08:03:01 +0000
commitd5c66dd664b005866c9f7fc91eb0d49164bca36f (patch)
tree0fcd02e5c694f7c798caf6cf3d749f1dd27eca81 /unittests/Tooling/RefactoringCallbacksTest.cpp
parent19e88c02889017753747e64606d9b1ad0041f11a (diff)
downloadclang-d5c66dd664b005866c9f7fc91eb0d49164bca36f.tar.gz
clang-d5c66dd664b005866c9f7fc91eb0d49164bca36f.tar.bz2
clang-d5c66dd664b005866c9f7fc91eb0d49164bca36f.tar.xz
Move RefactoringCallbacks to Tooling to avoid dependency from
ASTMatchers (lower level abstraction) to Tooling (higher level abstraction). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160351 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests/Tooling/RefactoringCallbacksTest.cpp')
-rw-r--r--unittests/Tooling/RefactoringCallbacksTest.cpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/unittests/Tooling/RefactoringCallbacksTest.cpp b/unittests/Tooling/RefactoringCallbacksTest.cpp
new file mode 100644
index 0000000000..90d9377ccd
--- /dev/null
+++ b/unittests/Tooling/RefactoringCallbacksTest.cpp
@@ -0,0 +1,98 @@
+//===- unittest/ASTMatchers/RefactoringCallbacksTest.cpp ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/ASTMatchers/ASTMatchers.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+#include "clang/Tooling/RefactoringCallbacks.h"
+#include "gtest/gtest.h"
+#include "RewriterTestContext.h"
+
+namespace clang {
+namespace ast_matchers {
+
+template <typename T>
+void expectRewritten(const std::string &Code,
+ const std::string &Expected,
+ const T &AMatcher,
+ RefactoringCallback &Callback) {
+ MatchFinder Finder;
+ Finder.addMatcher(AMatcher, &Callback);
+ OwningPtr<tooling::FrontendActionFactory> Factory(
+ tooling::newFrontendActionFactory(&Finder));
+ ASSERT_TRUE(tooling::runToolOnCode(Factory->create(), Code))
+ << "Parsing error in \"" << Code << "\"";
+ RewriterTestContext Context;
+ FileID ID = Context.createInMemoryFile("input.cc", Code);
+ EXPECT_TRUE(tooling::applyAllReplacements(Callback.getReplacements(),
+ Context.Rewrite));
+ EXPECT_EQ(Expected, Context.getRewrittenText(ID));
+}
+
+TEST(RefactoringCallbacksTest, ReplacesStmtsWithString) {
+ std::string Code = "void f() { int i = 1; }";
+ std::string Expected = "void f() { ; }";
+ ReplaceStmtWithText Callback("id", ";");
+ expectRewritten(Code, Expected, id("id", declarationStatement()), Callback);
+}
+
+TEST(RefactoringCallbacksTest, ReplacesStmtsInCalledMacros) {
+ std::string Code = "#define A void f() { int i = 1; }\nA";
+ std::string Expected = "#define A void f() { ; }\nA";
+ ReplaceStmtWithText Callback("id", ";");
+ expectRewritten(Code, Expected, id("id", declarationStatement()), Callback);
+}
+
+TEST(RefactoringCallbacksTest, IgnoresStmtsInUncalledMacros) {
+ std::string Code = "#define A void f() { int i = 1; }";
+ std::string Expected = "#define A void f() { int i = 1; }";
+ ReplaceStmtWithText Callback("id", ";");
+ expectRewritten(Code, Expected, id("id", declarationStatement()), Callback);
+}
+
+TEST(RefactoringCallbacksTest, ReplacesInteger) {
+ std::string Code = "void f() { int i = 1; }";
+ std::string Expected = "void f() { int i = 2; }";
+ ReplaceStmtWithText Callback("id", "2");
+ expectRewritten(Code, Expected, id("id", expression(integerLiteral())),
+ Callback);
+}
+
+TEST(RefactoringCallbacksTest, ReplacesStmtWithStmt) {
+ std::string Code = "void f() { int i = false ? 1 : i * 2; }";
+ std::string Expected = "void f() { int i = i * 2; }";
+ ReplaceStmtWithStmt Callback("always-false", "should-be");
+ expectRewritten(Code, Expected,
+ id("always-false", conditionalOperator(
+ hasCondition(boolLiteral(equals(false))),
+ hasFalseExpression(id("should-be", expression())))),
+ Callback);
+}
+
+TEST(RefactoringCallbacksTest, ReplacesIfStmt) {
+ std::string Code = "bool a; void f() { if (a) f(); else a = true; }";
+ std::string Expected = "bool a; void f() { f(); }";
+ ReplaceIfStmtWithItsBody Callback("id", true);
+ expectRewritten(Code, Expected,
+ id("id", ifStmt(
+ hasCondition(implicitCast(hasSourceExpression(
+ declarationReference(to(variable(hasName("a"))))))))),
+ Callback);
+}
+
+TEST(RefactoringCallbacksTest, RemovesEntireIfOnEmptyElse) {
+ std::string Code = "void f() { if (false) int i = 0; }";
+ std::string Expected = "void f() { }";
+ ReplaceIfStmtWithItsBody Callback("id", false);
+ expectRewritten(Code, Expected,
+ id("id", ifStmt(hasCondition(boolLiteral(equals(false))))),
+ Callback);
+}
+
+} // end namespace ast_matchers
+} // end namespace clang