1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | #include "clang/Lex/HeaderSearch.h" |
10 | #include "clang/Basic/Diagnostic.h" |
11 | #include "clang/Basic/DiagnosticOptions.h" |
12 | #include "clang/Basic/FileManager.h" |
13 | #include "clang/Basic/LangOptions.h" |
14 | #include "clang/Basic/SourceManager.h" |
15 | #include "clang/Basic/TargetInfo.h" |
16 | #include "clang/Basic/TargetOptions.h" |
17 | #include "clang/Lex/HeaderSearch.h" |
18 | #include "clang/Lex/HeaderSearchOptions.h" |
19 | #include "clang/Serialization/InMemoryModuleCache.h" |
20 | #include "gtest/gtest.h" |
21 | |
22 | namespace clang { |
23 | namespace { |
24 | |
25 | |
26 | class : public ::testing::Test { |
27 | protected: |
28 | HeaderSearchTest() |
29 | : VFS(new llvm::vfs::InMemoryFileSystem), FileMgr(FileMgrOpts, VFS), |
30 | DiagID(new DiagnosticIDs()), |
31 | Diags(DiagID, new DiagnosticOptions, new IgnoringDiagConsumer()), |
32 | SourceMgr(Diags, FileMgr), TargetOpts(new TargetOptions), |
33 | Search(std::make_shared<HeaderSearchOptions>(), SourceMgr, Diags, |
34 | LangOpts, Target.get()) { |
35 | TargetOpts->Triple = "x86_64-apple-darwin11.1.0"; |
36 | Target = TargetInfo::CreateTargetInfo(Diags, TargetOpts); |
37 | } |
38 | |
39 | void (llvm::StringRef Dir) { |
40 | VFS->addFile(Dir, 0, llvm::MemoryBuffer::getMemBuffer(""), None, |
41 | None, llvm::sys::fs::file_type::directory_file); |
42 | const DirectoryEntry *DE = FileMgr.getDirectory(Dir); |
43 | assert(DE); |
44 | auto DL = DirectoryLookup(DE, SrcMgr::C_User, ); |
45 | Search.AddSearchPath(DL, ); |
46 | } |
47 | |
48 | IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> ; |
49 | FileSystemOptions ; |
50 | FileManager ; |
51 | IntrusiveRefCntPtr<DiagnosticIDs> ; |
52 | DiagnosticsEngine ; |
53 | SourceManager ; |
54 | LangOptions ; |
55 | std::shared_ptr<TargetOptions> ; |
56 | IntrusiveRefCntPtr<TargetInfo> ; |
57 | HeaderSearch ; |
58 | }; |
59 | |
60 | (HeaderSearchTest, NoSearchDir) { |
61 | EXPECT_EQ(Search.search_dir_size(), 0u); |
62 | EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/x/y/z", ), |
63 | "/x/y/z"); |
64 | } |
65 | |
66 | (HeaderSearchTest, SimpleShorten) { |
67 | addSearchDir("/x"); |
68 | addSearchDir("/x/y"); |
69 | EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/x/y/z", ), |
70 | "z"); |
71 | addSearchDir("/a/b/"); |
72 | EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/a/b/c", ), |
73 | "c"); |
74 | } |
75 | |
76 | (HeaderSearchTest, ShortenWithWorkingDir) { |
77 | addSearchDir("x/y"); |
78 | EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/a/b/c/x/y/z", |
79 | ), |
80 | "z"); |
81 | } |
82 | |
83 | (HeaderSearchTest, Dots) { |
84 | addSearchDir("/x/./y/"); |
85 | EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/x/y/./z", |
86 | ), |
87 | "z"); |
88 | addSearchDir("a/.././c/"); |
89 | EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/m/n/./c/z", |
90 | ), |
91 | "z"); |
92 | } |
93 | |
94 | } |
95 | } |
96 | |