summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/unittests/clang-rename
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/unittests/clang-rename')
-rw-r--r--clang-tools-extra/unittests/clang-rename/CMakeLists.txt33
-rw-r--r--clang-tools-extra/unittests/clang-rename/Makefile24
-rw-r--r--clang-tools-extra/unittests/clang-rename/USRLocFindingTest.cpp77
3 files changed, 134 insertions, 0 deletions
diff --git a/clang-tools-extra/unittests/clang-rename/CMakeLists.txt b/clang-tools-extra/unittests/clang-rename/CMakeLists.txt
new file mode 100644
index 00000000000..dca9a80da88
--- /dev/null
+++ b/clang-tools-extra/unittests/clang-rename/CMakeLists.txt
@@ -0,0 +1,33 @@
+set(LLVM_LINK_COMPONENTS
+ support
+ )
+
+get_filename_component(CLANG_RENAME_SOURCE_DIR
+ ${CMAKE_CURRENT_SOURCE_DIR}/../../clang-rename REALPATH)
+include_directories(
+ ${CLANG_RENAME_SOURCE_DIR}
+ )
+
+add_extra_unittest(ClangRenameTests
+ USRLocFindingTest.cpp
+ ${CLANG_RENAME_SOURCE_DIR}/USRFinder.cpp
+ ${CLANG_RENAME_SOURCE_DIR}/USRFindingAction.cpp
+ )
+
+target_link_libraries(ClangRenameTests
+ clangAnalysis
+ clangAST
+ clangBasic
+ clangDriver
+ clangEdit
+ clangFrontend
+ clangFrontendTool
+ clangIndex
+ clangLex
+ clangParse
+ clangRewrite
+ clangRewriteFrontend
+ clangSerialization
+ clangSema
+ clangTooling
+ ) \ No newline at end of file
diff --git a/clang-tools-extra/unittests/clang-rename/Makefile b/clang-tools-extra/unittests/clang-rename/Makefile
new file mode 100644
index 00000000000..c86d13253ab
--- /dev/null
+++ b/clang-tools-extra/unittests/clang-rename/Makefile
@@ -0,0 +1,24 @@
+##===- unittests/clang-rename/Makefile ---------------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+CLANG_LEVEL = ../../../..
+include $(CLANG_LEVEL)/../../Makefile.config
+
+TESTNAME = ClangRenameTests
+LINK_COMPONENTS := asmparser bitreader support MC MCParser option \
+ TransformUtils
+USEDLIBS = clangAnalysis.a clangAST.a clangBasic.a clangDriver.a clangEdit.a \
+ clangFrontend.a clangFrontendTool.a clangIndex.a clangLex.a \
+ clangParse.a clangRewrite.a clangRewriteFrontend.a \
+ clangSerialization.a clangSema.a clangTooling.a
+
+include $(CLANG_LEVEL)/Makefile
+MAKEFILE_UNITTEST_NO_INCLUDE_COMMON := 1
+CPP.Flags += -I(PROJ_SRC_DIR)/../../clang-rename
+include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest
diff --git a/clang-tools-extra/unittests/clang-rename/USRLocFindingTest.cpp b/clang-tools-extra/unittests/clang-rename/USRLocFindingTest.cpp
new file mode 100644
index 00000000000..81627eec836
--- /dev/null
+++ b/clang-tools-extra/unittests/clang-rename/USRLocFindingTest.cpp
@@ -0,0 +1,77 @@
+#include "USRFindingAction.h"
+#include "gtest/gtest.h"
+#include "clang/Tooling/Tooling.h"
+#include <stdio.h>
+#include <set>
+#include <map>
+#include <vector>
+
+namespace clang {
+namespace rename {
+namespace test {
+
+// Determines if the symbol group invariants hold. To recap, those invariants
+// are:
+// (1) All symbols in the same symbol group share the same USR.
+// (2) Two symbols from two different groups do not share the same USR.
+static void testOffsetGroups(const char *Code,
+ const std::vector<std::vector<unsigned>> Groups) {
+ std::set<std::string> AllUSRs, CurrUSR;
+
+ for (const auto &Group : Groups) {
+ // Groups the invariants do not hold then the value of USR is also invalid,
+ // but at that point the test has already failed and USR ceases to be
+ // useful.
+ std::string USR;
+ for (const auto &Offset : Group) {
+ USRFindingAction Action(Offset);
+ auto Factory = tooling::newFrontendActionFactory(&Action);
+ EXPECT_TRUE(tooling::runToolOnCode(Factory->create(), Code));
+ const auto &USRs = Action.getUSRs();
+ EXPECT_EQ(1u, USRs.size());
+ USR = USRs[0];
+ CurrUSR.insert(USR);
+ }
+ EXPECT_EQ(1u, CurrUSR.size());
+ CurrUSR.clear();
+ AllUSRs.insert(USR);
+ }
+
+ EXPECT_EQ(Groups.size(), AllUSRs.size());
+}
+
+
+TEST(USRLocFinding, FindsVarUSR) {
+ const char VarTest[] = "\n\
+namespace A {\n\
+int foo;\n\
+}\n\
+int foo;\n\
+int bar = foo;\n\
+int baz = A::foo;\n\
+void fun1() {\n\
+ struct {\n\
+ int foo;\n\
+ } b = { 100 };\n\
+ int foo = 100;\n\
+ baz = foo;\n\
+ {\n\
+ extern int foo;\n\
+ baz = foo;\n\
+ foo = A::foo + baz;\n\
+ A::foo = b.foo;\n\
+ }\n\
+ foo = b.foo;\n\
+}\n";
+ std::vector<std::vector<unsigned>> VarTestOffsets = {
+ { 19, 63, 205, 223 },
+ { 30, 45, 172, 187 },
+ { 129, 148, 242 },
+ };
+
+ testOffsetGroups(VarTest, VarTestOffsets);
+}
+
+}
+}
+}
OpenPOWER on IntegriCloud