diff options
Diffstat (limited to 'clang-tools-extra/unittests/clang-rename')
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); +} + +} +} +} |

