HeaderSearchTest.cpp 3.3 KB

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