1 //===- unittests/Basic/FileEntryTest.cpp - Test FileEntry/FileEntryRef ----===// 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 9 #include "clang/Basic/FileEntry.h" 10 #include "llvm/ADT/StringMap.h" 11 #include "gtest/gtest.h" 12 13 using namespace llvm; 14 using namespace clang; 15 16 namespace { 17 18 using FileMap = StringMap<llvm::ErrorOr<FileEntryRef::MapValue>>; 19 using DirMap = StringMap<llvm::ErrorOr<DirectoryEntry &>>; 20 21 struct RefMaps { 22 FileMap Files; 23 DirMap Dirs; 24 25 DirectoryEntry D; 26 DirectoryEntryRef DR; 27 SmallVector<std::unique_ptr<FileEntry>, 5> FEs; 28 29 RefMaps() : DR(*Dirs.insert({"dir", D}).first) {} 30 31 FileEntryRef addFile(StringRef Name) { 32 FEs.push_back(std::make_unique<FileEntry>()); 33 return FileEntryRef( 34 *Files.insert({Name, FileEntryRef::MapValue(*FEs.back().get(), DR)}) 35 .first); 36 } 37 FileEntryRef addFileAlias(StringRef Name, FileEntryRef Base) { 38 return FileEntryRef( 39 *Files 40 .insert( 41 {Name, FileEntryRef::MapValue( 42 const_cast<FileEntry &>(Base.getFileEntry()), DR)}) 43 .first); 44 } 45 }; 46 47 TEST(FileEntryTest, FileEntryRef) { 48 RefMaps Refs; 49 FileEntryRef R1 = Refs.addFile("1"); 50 FileEntryRef R2 = Refs.addFile("2"); 51 FileEntryRef R1Also = Refs.addFileAlias("1-also", R1); 52 53 EXPECT_EQ("1", R1.getName()); 54 EXPECT_EQ("2", R2.getName()); 55 EXPECT_EQ("1-also", R1Also.getName()); 56 57 EXPECT_NE(&R1.getFileEntry(), &R2.getFileEntry()); 58 EXPECT_EQ(&R1.getFileEntry(), &R1Also.getFileEntry()); 59 60 const FileEntry *CE1 = R1; 61 EXPECT_EQ(CE1, &R1.getFileEntry()); 62 } 63 64 TEST(FileEntryTest, OptionalFileEntryRefDegradesToFileEntryPtr) { 65 RefMaps Refs; 66 OptionalFileEntryRefDegradesToFileEntryPtr M0; 67 OptionalFileEntryRefDegradesToFileEntryPtr M1 = Refs.addFile("1"); 68 OptionalFileEntryRefDegradesToFileEntryPtr M2 = Refs.addFile("2"); 69 OptionalFileEntryRefDegradesToFileEntryPtr M0Also = None; 70 OptionalFileEntryRefDegradesToFileEntryPtr M1Also = 71 Refs.addFileAlias("1-also", *M1); 72 73 EXPECT_EQ(M0, M0Also); 74 EXPECT_EQ(StringRef("1"), M1->getName()); 75 EXPECT_EQ(StringRef("2"), M2->getName()); 76 EXPECT_EQ(StringRef("1-also"), M1Also->getName()); 77 78 const FileEntry *CE1 = M1; 79 EXPECT_EQ(CE1, &M1->getFileEntry()); 80 } 81 82 TEST(FileEntryTest, equals) { 83 RefMaps Refs; 84 FileEntryRef R1 = Refs.addFile("1"); 85 FileEntryRef R2 = Refs.addFile("2"); 86 FileEntryRef R1Also = Refs.addFileAlias("1-also", R1); 87 88 EXPECT_EQ(R1, &R1.getFileEntry()); 89 EXPECT_EQ(&R1.getFileEntry(), R1); 90 EXPECT_EQ(R1, R1Also); 91 EXPECT_NE(R1, &R2.getFileEntry()); 92 EXPECT_NE(&R2.getFileEntry(), R1); 93 EXPECT_NE(R1, R2); 94 95 OptionalFileEntryRefDegradesToFileEntryPtr M0; 96 OptionalFileEntryRefDegradesToFileEntryPtr M1 = R1; 97 98 EXPECT_EQ(M1, &R1.getFileEntry()); 99 EXPECT_EQ(&R1.getFileEntry(), M1); 100 EXPECT_NE(M1, &R2.getFileEntry()); 101 EXPECT_NE(&R2.getFileEntry(), M1); 102 } 103 104 TEST(FileEntryTest, isSameRef) { 105 RefMaps Refs; 106 FileEntryRef R1 = Refs.addFile("1"); 107 FileEntryRef R2 = Refs.addFile("2"); 108 FileEntryRef R1Also = Refs.addFileAlias("1-also", R1); 109 110 EXPECT_TRUE(R1.isSameRef(FileEntryRef(R1))); 111 EXPECT_TRUE(R1.isSameRef(FileEntryRef(R1.getMapEntry()))); 112 EXPECT_FALSE(R1.isSameRef(R2)); 113 EXPECT_FALSE(R1.isSameRef(R1Also)); 114 } 115 116 } // end namespace 117