HeaderSearchTest.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. //===- unittests/Lex/HeaderSearchTest.cpp ------ HeaderSearch tests -------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  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/MemoryBufferCache.h"
  15. #include "clang/Basic/SourceManager.h"
  16. #include "clang/Basic/TargetInfo.h"
  17. #include "clang/Basic/TargetOptions.h"
  18. #include "clang/Lex/HeaderSearch.h"
  19. #include "clang/Lex/HeaderSearchOptions.h"
  20. #include "gtest/gtest.h"
  21. namespace clang {
  22. namespace {
  23. // The test fixture.
  24. class HeaderSearchTest : public ::testing::Test {
  25. protected:
  26. HeaderSearchTest()
  27. : VFS(new llvm::vfs::InMemoryFileSystem), FileMgr(FileMgrOpts, VFS),
  28. DiagID(new DiagnosticIDs()),
  29. Diags(DiagID, new DiagnosticOptions, new IgnoringDiagConsumer()),
  30. SourceMgr(Diags, FileMgr), TargetOpts(new TargetOptions),
  31. Search(std::make_shared<HeaderSearchOptions>(), SourceMgr, Diags,
  32. LangOpts, Target.get()) {
  33. TargetOpts->Triple = "x86_64-apple-darwin11.1.0";
  34. Target = TargetInfo::CreateTargetInfo(Diags, TargetOpts);
  35. }
  36. void addSearchDir(llvm::StringRef Dir) {
  37. VFS->addFile(Dir, 0, llvm::MemoryBuffer::getMemBuffer(""), /*User=*/None,
  38. /*Group=*/None, llvm::sys::fs::file_type::directory_file);
  39. const DirectoryEntry *DE = FileMgr.getDirectory(Dir);
  40. assert(DE);
  41. auto DL = DirectoryLookup(DE, SrcMgr::C_User, /*isFramework=*/false);
  42. Search.AddSearchPath(DL, /*isAngled=*/false);
  43. }
  44. IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> VFS;
  45. FileSystemOptions FileMgrOpts;
  46. FileManager FileMgr;
  47. IntrusiveRefCntPtr<DiagnosticIDs> DiagID;
  48. DiagnosticsEngine Diags;
  49. SourceManager SourceMgr;
  50. LangOptions LangOpts;
  51. std::shared_ptr<TargetOptions> TargetOpts;
  52. IntrusiveRefCntPtr<TargetInfo> Target;
  53. HeaderSearch Search;
  54. };
  55. TEST_F(HeaderSearchTest, NoSearchDir) {
  56. EXPECT_EQ(Search.search_dir_size(), 0u);
  57. EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/x/y/z", /*WorkingDir=*/""),
  58. "/x/y/z");
  59. }
  60. TEST_F(HeaderSearchTest, SimpleShorten) {
  61. addSearchDir("/x");
  62. addSearchDir("/x/y");
  63. EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/x/y/z", /*WorkingDir=*/""),
  64. "z");
  65. addSearchDir("/a/b/");
  66. EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/a/b/c", /*WorkingDir=*/""),
  67. "c");
  68. }
  69. TEST_F(HeaderSearchTest, ShortenWithWorkingDir) {
  70. addSearchDir("x/y");
  71. EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/a/b/c/x/y/z",
  72. /*WorkingDir=*/"/a/b/c"),
  73. "z");
  74. }
  75. TEST_F(HeaderSearchTest, Dots) {
  76. addSearchDir("/x/./y/");
  77. EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/x/y/./z",
  78. /*WorkingDir=*/""),
  79. "z");
  80. addSearchDir("a/.././c/");
  81. EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/m/n/./c/z",
  82. /*WorkingDir=*/"/m/n/"),
  83. "z");
  84. }
  85. } // namespace
  86. } // namespace clang