diff options
author | Sam McCall <sam.mccall@gmail.com> | 2019-04-29 14:36:26 +0000 |
---|---|---|
committer | Sam McCall <sam.mccall@gmail.com> | 2019-04-29 14:36:26 +0000 |
commit | 29b46a4da53930a2ab5aeda093b530e6c9406de3 (patch) | |
tree | 03bbe15abfe33cb326ba7a6a6e08fcf1833e4f0b | |
parent | fc06e8cf690db8f2b827795f7a9df6629339ac2f (diff) |
[clangd] Add separate unit tests for CanonicalIncludes. NFC
git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@359455 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | clangd/unittests/CMakeLists.txt | 1 | ||||
-rw-r--r-- | clangd/unittests/CanonicalIncludesTests.cpp | 62 | ||||
-rw-r--r-- | clangd/unittests/SymbolCollectorTests.cpp | 38 |
3 files changed, 66 insertions, 35 deletions
diff --git a/clangd/unittests/CMakeLists.txt b/clangd/unittests/CMakeLists.txt index 94ab4e42..0db99368 100644 --- a/clangd/unittests/CMakeLists.txt +++ b/clangd/unittests/CMakeLists.txt @@ -25,6 +25,7 @@ add_unittest(ClangdUnitTests ClangdTests Annotations.cpp BackgroundIndexTests.cpp CancellationTests.cpp + CanonicalIncludesTests.cpp ClangdTests.cpp ClangdUnitTests.cpp CodeCompleteTests.cpp diff --git a/clangd/unittests/CanonicalIncludesTests.cpp b/clangd/unittests/CanonicalIncludesTests.cpp new file mode 100644 index 00000000..9fd78841 --- /dev/null +++ b/clangd/unittests/CanonicalIncludesTests.cpp @@ -0,0 +1,62 @@ +//===-- CanonicalIncludesTests.cpp - --------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "index/CanonicalIncludes.h" +#include "gtest/gtest.h" + +namespace clang { +namespace clangd { +namespace { + +TEST(CanonicalIncludesTest, CXXStandardLibrary) { + CanonicalIncludes CI; + addSystemHeadersMapping(&CI); + + // Usual standard library symbols are mapped correctly. + EXPECT_EQ("<vector>", CI.mapHeader("path/vector.h", "std::vector")); + // std::move is ambiguous, currently mapped only based on path + EXPECT_EQ("<utility>", CI.mapHeader("libstdc++/bits/move.h", "std::move")); + EXPECT_EQ("path/utility.h", CI.mapHeader("path/utility.h", "std::move")); + // Unknown std symbols aren't mapped. + EXPECT_EQ("foo/bar.h", CI.mapHeader("foo/bar.h", "std::notathing")); + // iosfwd declares some symbols it doesn't own. + EXPECT_EQ("<ostream>", CI.mapHeader("iosfwd", "std::ostream")); + // And (for now) we assume it owns the others. + EXPECT_EQ("<iosfwd>", CI.mapHeader("iosfwd", "std::notwathing")); +} + +TEST(CanonicalIncludesTest, PathMapping) { + // As used for IWYU pragmas. + CanonicalIncludes CI; + CI.addMapping("foo/bar", "<baz>"); + + EXPECT_EQ("<baz>", CI.mapHeader("foo/bar", "some::symbol")); + EXPECT_EQ("bar/bar", CI.mapHeader("bar/bar", "some::symbol")); +} + +TEST(CanonicalIncludesTest, SymbolMapping) { + // As used for standard library. + CanonicalIncludes CI; + CI.addSymbolMapping("some::symbol", "<baz>"); + + EXPECT_EQ("<baz>", CI.mapHeader("foo/bar", "some::symbol")); + EXPECT_EQ("foo/bar", CI.mapHeader("foo/bar", "other::symbol")); +} + +TEST(CanonicalIncludesTest, Precedence) { + CanonicalIncludes CI; + CI.addMapping("some/path", "<path>"); + CI.addSymbolMapping("some::symbol", "<symbol>"); + + // Symbol mapping beats path mapping. + EXPECT_EQ("<symbol>", CI.mapHeader("some/path", "some::symbol")); +} + +} // namespace +} // namespace clangd +} // namespace clang diff --git a/clangd/unittests/SymbolCollectorTests.cpp b/clangd/unittests/SymbolCollectorTests.cpp index 3d8766a0..52de7b0e 100644 --- a/clangd/unittests/SymbolCollectorTests.cpp +++ b/clangd/unittests/SymbolCollectorTests.cpp @@ -931,47 +931,15 @@ TEST_F(SymbolCollectorTest, IncludeHeaderSameAsFileURI) { UnorderedElementsAre(IncludeHeaderWithRef(TestHeaderURI, 1u))); } -#ifndef _WIN32 TEST_F(SymbolCollectorTest, CanonicalSTLHeader) { CollectorOpts.CollectIncludePath = true; CanonicalIncludes Includes; addSystemHeadersMapping(&Includes); CollectorOpts.Includes = &Includes; - // bits/basic_string.h$ should be mapped to <string> - TestHeaderName = "/nasty/bits/basic_string.h"; - TestFileName = "/nasty/bits/basic_string.cpp"; - TestHeaderURI = URI::create(TestHeaderName).toString(); - runSymbolCollector("class string {};", /*Main=*/""); - EXPECT_THAT(Symbols, UnorderedElementsAre(AllOf(QName("string"), - DeclURI(TestHeaderURI), - IncludeHeader("<string>")))); -} -#endif - -TEST_F(SymbolCollectorTest, STLiosfwd) { - CollectorOpts.CollectIncludePath = true; - CanonicalIncludes Includes; - addSystemHeadersMapping(&Includes); - CollectorOpts.Includes = &Includes; - // Symbols from <iosfwd> should be mapped individually. - TestHeaderName = testPath("iosfwd"); - TestFileName = testPath("iosfwd.cpp"); - std::string Header = R"( - namespace std { - class no_map {}; - class ios {}; - class ostream {}; - class filebuf {}; - } // namespace std - )"; - runSymbolCollector(Header, /*Main=*/""); + runSymbolCollector("namespace std { class string {}; }", /*Main=*/""); EXPECT_THAT(Symbols, - UnorderedElementsAre( - QName("std"), - AllOf(QName("std::no_map"), IncludeHeader("<iosfwd>")), - AllOf(QName("std::ios"), IncludeHeader("<ios>")), - AllOf(QName("std::ostream"), IncludeHeader("<ostream>")), - AllOf(QName("std::filebuf"), IncludeHeader("<fstream>")))); + Contains(AllOf(QName("std::string"), DeclURI(TestHeaderURI), + IncludeHeader("<string>")))); } TEST_F(SymbolCollectorTest, IWYUPragma) { |