clang-tools  9.0.0
CanonicalIncludesTests.cpp
Go to the documentation of this file.
1 //===-- CanonicalIncludesTests.cpp - --------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
10 #include "gtest/gtest.h"
11 
12 namespace clang {
13 namespace clangd {
14 namespace {
15 
16 TEST(CanonicalIncludesTest, CStandardLibrary) {
17  CanonicalIncludes CI;
18  auto Language = LangOptions();
19  Language.C11 = true;
20  addSystemHeadersMapping(&CI, Language);
21  // Usual standard library symbols are mapped correctly.
22  EXPECT_EQ("<stdio.h>", CI.mapHeader("path/stdio.h", "printf"));
23 }
24 
25 TEST(CanonicalIncludesTest, CXXStandardLibrary) {
26  CanonicalIncludes CI;
27  auto Language = LangOptions();
28  Language.CPlusPlus = true;
29  addSystemHeadersMapping(&CI, Language);
30 
31  // Usual standard library symbols are mapped correctly.
32  EXPECT_EQ("<vector>", CI.mapHeader("path/vector.h", "std::vector"));
33  EXPECT_EQ("<cstdio>", CI.mapHeader("path/stdio.h", "std::printf"));
34  // std::move is ambiguous, currently mapped only based on path
35  EXPECT_EQ("<utility>", CI.mapHeader("libstdc++/bits/move.h", "std::move"));
36  EXPECT_EQ("path/utility.h", CI.mapHeader("path/utility.h", "std::move"));
37  // Unknown std symbols aren't mapped.
38  EXPECT_EQ("foo/bar.h", CI.mapHeader("foo/bar.h", "std::notathing"));
39  // iosfwd declares some symbols it doesn't own.
40  EXPECT_EQ("<ostream>", CI.mapHeader("iosfwd", "std::ostream"));
41  // And (for now) we assume it owns the others.
42  EXPECT_EQ("<iosfwd>", CI.mapHeader("iosfwd", "std::notwathing"));
43 }
44 
45 TEST(CanonicalIncludesTest, PathMapping) {
46  // As used for IWYU pragmas.
47  CanonicalIncludes CI;
48  CI.addMapping("foo/bar", "<baz>");
49 
50  EXPECT_EQ("<baz>", CI.mapHeader("foo/bar", "some::symbol"));
51  EXPECT_EQ("bar/bar", CI.mapHeader("bar/bar", "some::symbol"));
52 }
53 
54 TEST(CanonicalIncludesTest, SymbolMapping) {
55  // As used for standard library.
56  CanonicalIncludes CI;
57  CI.addSymbolMapping("some::symbol", "<baz>");
58 
59  EXPECT_EQ("<baz>", CI.mapHeader("foo/bar", "some::symbol"));
60  EXPECT_EQ("foo/bar", CI.mapHeader("foo/bar", "other::symbol"));
61 }
62 
63 TEST(CanonicalIncludesTest, Precedence) {
64  CanonicalIncludes CI;
65  CI.addMapping("some/path", "<path>");
66  CI.addSymbolMapping("some::symbol", "<symbol>");
67 
68  // Symbol mapping beats path mapping.
69  EXPECT_EQ("<symbol>", CI.mapHeader("some/path", "some::symbol"));
70 }
71 
72 } // namespace
73 } // namespace clangd
74 } // namespace clang
void addSystemHeadersMapping(CanonicalIncludes *Includes, const LangOptions &Language)
Adds mapping for system headers and some special symbols (e.g.
TEST(BackgroundQueueTest, Priority)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//