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/DenseSet.h" 11 #include "llvm/ADT/StringMap.h" 12 #include "gtest/gtest.h" 13 14 using namespace llvm; 15 using namespace clang; 16 17 namespace { 18 19 using FileMap = StringMap<llvm::ErrorOr<FileEntryRef::MapValue>>; 20 using DirMap = StringMap<llvm::ErrorOr<DirectoryEntry &>>; 21 22 struct RefMaps { 23 FileMap Files; 24 DirMap Dirs; 25 26 SmallVector<std::unique_ptr<FileEntry>, 5> FEs; 27 SmallVector<std::unique_ptr<DirectoryEntry>, 5> DEs; 28 DirectoryEntryRef DR; 29 30 RefMaps() : DR(addDirectory("dir")) {} 31 32 DirectoryEntryRef addDirectory(StringRef Name) { 33 DEs.push_back(std::make_unique<DirectoryEntry>()); 34 return DirectoryEntryRef(*Dirs.insert({Name, *DEs.back()}).first); 35 } 36 DirectoryEntryRef addDirectoryAlias(StringRef Name, DirectoryEntryRef Base) { 37 return DirectoryEntryRef( 38 *Dirs.insert({Name, const_cast<DirectoryEntry &>(Base.getDirEntry())}) 39 .first); 40 } 41 42 FileEntryRef addFile(StringRef Name) { 43 FEs.push_back(std::make_unique<FileEntry>()); 44 return FileEntryRef( 45 *Files.insert({Name, FileEntryRef::MapValue(*FEs.back().get(), DR)}) 46 .first); 47 } 48 FileEntryRef addFileAlias(StringRef Name, FileEntryRef Base) { 49 return FileEntryRef( 50 *Files 51 .insert( 52 {Name, FileEntryRef::MapValue( 53 const_cast<FileEntry &>(Base.getFileEntry()), DR)}) 54 .first); 55 } 56 }; 57 58 TEST(FileEntryTest, Constructor) { 59 FileEntry FE; 60 EXPECT_EQ(0, FE.getSize()); 61 EXPECT_EQ(0, FE.getModificationTime()); 62 EXPECT_EQ(nullptr, FE.getDir()); 63 EXPECT_EQ(0U, FE.getUniqueID().getDevice()); 64 EXPECT_EQ(0U, FE.getUniqueID().getFile()); 65 EXPECT_EQ(false, FE.isNamedPipe()); 66 EXPECT_EQ(false, FE.isValid()); 67 } 68 69 TEST(FileEntryTest, FileEntryRef) { 70 RefMaps Refs; 71 FileEntryRef R1 = Refs.addFile("1"); 72 FileEntryRef R2 = Refs.addFile("2"); 73 FileEntryRef R1Also = Refs.addFileAlias("1-also", R1); 74 75 EXPECT_EQ("1", R1.getName()); 76 EXPECT_EQ("2", R2.getName()); 77 EXPECT_EQ("1-also", R1Also.getName()); 78 79 EXPECT_NE(&R1.getFileEntry(), &R2.getFileEntry()); 80 EXPECT_EQ(&R1.getFileEntry(), &R1Also.getFileEntry()); 81 82 const FileEntry *CE1 = R1; 83 EXPECT_EQ(CE1, &R1.getFileEntry()); 84 } 85 86 TEST(FileEntryTest, OptionalFileEntryRefDegradesToFileEntryPtr) { 87 RefMaps Refs; 88 OptionalFileEntryRefDegradesToFileEntryPtr M0; 89 OptionalFileEntryRefDegradesToFileEntryPtr M1 = Refs.addFile("1"); 90 OptionalFileEntryRefDegradesToFileEntryPtr M2 = Refs.addFile("2"); 91 OptionalFileEntryRefDegradesToFileEntryPtr M0Also = None; 92 OptionalFileEntryRefDegradesToFileEntryPtr M1Also = 93 Refs.addFileAlias("1-also", *M1); 94 95 EXPECT_EQ(M0, M0Also); 96 EXPECT_EQ(StringRef("1"), M1->getName()); 97 EXPECT_EQ(StringRef("2"), M2->getName()); 98 EXPECT_EQ(StringRef("1-also"), M1Also->getName()); 99 100 const FileEntry *CE1 = M1; 101 EXPECT_EQ(CE1, &M1->getFileEntry()); 102 } 103 104 TEST(FileEntryTest, equals) { 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_EQ(R1, &R1.getFileEntry()); 111 EXPECT_EQ(&R1.getFileEntry(), R1); 112 EXPECT_EQ(R1, R1Also); 113 EXPECT_NE(R1, &R2.getFileEntry()); 114 EXPECT_NE(&R2.getFileEntry(), R1); 115 EXPECT_NE(R1, R2); 116 117 OptionalFileEntryRefDegradesToFileEntryPtr M1 = R1; 118 119 EXPECT_EQ(M1, &R1.getFileEntry()); 120 EXPECT_EQ(&R1.getFileEntry(), M1); 121 EXPECT_NE(M1, &R2.getFileEntry()); 122 EXPECT_NE(&R2.getFileEntry(), M1); 123 } 124 125 TEST(FileEntryTest, isSameRef) { 126 RefMaps Refs; 127 FileEntryRef R1 = Refs.addFile("1"); 128 FileEntryRef R2 = Refs.addFile("2"); 129 FileEntryRef R1Also = Refs.addFileAlias("1-also", R1); 130 131 EXPECT_TRUE(R1.isSameRef(FileEntryRef(R1))); 132 EXPECT_TRUE(R1.isSameRef(FileEntryRef(R1.getMapEntry()))); 133 EXPECT_FALSE(R1.isSameRef(R2)); 134 EXPECT_FALSE(R1.isSameRef(R1Also)); 135 } 136 137 TEST(FileEntryTest, DenseMapInfo) { 138 RefMaps Refs; 139 FileEntryRef R1 = Refs.addFile("1"); 140 FileEntryRef R2 = Refs.addFile("2"); 141 FileEntryRef R1Also = Refs.addFileAlias("1-also", R1); 142 143 // Insert R1Also first and confirm it "wins". 144 { 145 SmallDenseSet<FileEntryRef, 8> Set; 146 Set.insert(R1Also); 147 Set.insert(R1); 148 Set.insert(R2); 149 EXPECT_TRUE(Set.find(R1Also)->isSameRef(R1Also)); 150 EXPECT_TRUE(Set.find(R1)->isSameRef(R1Also)); 151 EXPECT_TRUE(Set.find(R2)->isSameRef(R2)); 152 } 153 154 // Insert R1Also second and confirm R1 "wins". 155 { 156 SmallDenseSet<FileEntryRef, 8> Set; 157 Set.insert(R1); 158 Set.insert(R1Also); 159 Set.insert(R2); 160 EXPECT_TRUE(Set.find(R1Also)->isSameRef(R1)); 161 EXPECT_TRUE(Set.find(R1)->isSameRef(R1)); 162 EXPECT_TRUE(Set.find(R2)->isSameRef(R2)); 163 } 164 } 165 166 TEST(DirectoryEntryTest, isSameRef) { 167 RefMaps Refs; 168 DirectoryEntryRef R1 = Refs.addDirectory("1"); 169 DirectoryEntryRef R2 = Refs.addDirectory("2"); 170 DirectoryEntryRef R1Also = Refs.addDirectoryAlias("1-also", R1); 171 172 EXPECT_TRUE(R1.isSameRef(DirectoryEntryRef(R1))); 173 EXPECT_TRUE(R1.isSameRef(DirectoryEntryRef(R1.getMapEntry()))); 174 EXPECT_FALSE(R1.isSameRef(R2)); 175 EXPECT_FALSE(R1.isSameRef(R1Also)); 176 } 177 178 TEST(DirectoryEntryTest, DenseMapInfo) { 179 RefMaps Refs; 180 DirectoryEntryRef R1 = Refs.addDirectory("1"); 181 DirectoryEntryRef R2 = Refs.addDirectory("2"); 182 DirectoryEntryRef R1Also = Refs.addDirectoryAlias("1-also", R1); 183 184 // Insert R1Also first and confirm it "wins". 185 { 186 SmallDenseSet<DirectoryEntryRef, 8> Set; 187 Set.insert(R1Also); 188 Set.insert(R1); 189 Set.insert(R2); 190 EXPECT_TRUE(Set.find(R1Also)->isSameRef(R1Also)); 191 EXPECT_TRUE(Set.find(R1)->isSameRef(R1Also)); 192 EXPECT_TRUE(Set.find(R2)->isSameRef(R2)); 193 } 194 195 // Insert R1Also second and confirm R1 "wins". 196 { 197 SmallDenseSet<DirectoryEntryRef, 8> Set; 198 Set.insert(R1); 199 Set.insert(R1Also); 200 Set.insert(R2); 201 EXPECT_TRUE(Set.find(R1Also)->isSameRef(R1)); 202 EXPECT_TRUE(Set.find(R1)->isSameRef(R1)); 203 EXPECT_TRUE(Set.find(R2)->isSameRef(R2)); 204 } 205 } 206 207 } // end namespace 208