//===- unittests/Basic/FileEntryTest.cpp - Test FileEntry/FileEntryRef ----===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "clang/Basic/FileEntry.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/StringMap.h" #include "gtest/gtest.h" using namespace llvm; using namespace clang; namespace { using FileMap = StringMap>; using DirMap = StringMap>; struct RefMaps { FileMap Files; DirMap Dirs; SmallVector, 5> FEs; SmallVector, 5> DEs; DirectoryEntryRef DR; RefMaps() : DR(addDirectory("dir")) {} DirectoryEntryRef addDirectory(StringRef Name) { DEs.push_back(std::make_unique()); return DirectoryEntryRef(*Dirs.insert({Name, *DEs.back()}).first); } DirectoryEntryRef addDirectoryAlias(StringRef Name, DirectoryEntryRef Base) { return DirectoryEntryRef( *Dirs.insert({Name, const_cast(Base.getDirEntry())}) .first); } FileEntryRef addFile(StringRef Name) { FEs.push_back(std::make_unique()); return FileEntryRef( *Files.insert({Name, FileEntryRef::MapValue(*FEs.back().get(), DR)}) .first); } FileEntryRef addFileAlias(StringRef Name, FileEntryRef Base) { return FileEntryRef( *Files .insert( {Name, FileEntryRef::MapValue( const_cast(Base.getFileEntry()), DR)}) .first); } }; TEST(FileEntryTest, Constructor) { FileEntry FE; EXPECT_EQ(0, FE.getSize()); EXPECT_EQ(0, FE.getModificationTime()); EXPECT_EQ(nullptr, FE.getDir()); EXPECT_EQ(0U, FE.getUniqueID().getDevice()); EXPECT_EQ(0U, FE.getUniqueID().getFile()); EXPECT_EQ(false, FE.isNamedPipe()); EXPECT_EQ(false, FE.isValid()); } TEST(FileEntryTest, FileEntryRef) { RefMaps Refs; FileEntryRef R1 = Refs.addFile("1"); FileEntryRef R2 = Refs.addFile("2"); FileEntryRef R1Also = Refs.addFileAlias("1-also", R1); EXPECT_EQ("1", R1.getName()); EXPECT_EQ("2", R2.getName()); EXPECT_EQ("1-also", R1Also.getName()); EXPECT_NE(&R1.getFileEntry(), &R2.getFileEntry()); EXPECT_EQ(&R1.getFileEntry(), &R1Also.getFileEntry()); const FileEntry *CE1 = R1; EXPECT_EQ(CE1, &R1.getFileEntry()); } TEST(FileEntryTest, OptionalFileEntryRefDegradesToFileEntryPtr) { RefMaps Refs; OptionalFileEntryRefDegradesToFileEntryPtr M0; OptionalFileEntryRefDegradesToFileEntryPtr M1 = Refs.addFile("1"); OptionalFileEntryRefDegradesToFileEntryPtr M2 = Refs.addFile("2"); OptionalFileEntryRefDegradesToFileEntryPtr M0Also = None; OptionalFileEntryRefDegradesToFileEntryPtr M1Also = Refs.addFileAlias("1-also", *M1); EXPECT_EQ(M0, M0Also); EXPECT_EQ(StringRef("1"), M1->getName()); EXPECT_EQ(StringRef("2"), M2->getName()); EXPECT_EQ(StringRef("1-also"), M1Also->getName()); const FileEntry *CE1 = M1; EXPECT_EQ(CE1, &M1->getFileEntry()); } TEST(FileEntryTest, equals) { RefMaps Refs; FileEntryRef R1 = Refs.addFile("1"); FileEntryRef R2 = Refs.addFile("2"); FileEntryRef R1Also = Refs.addFileAlias("1-also", R1); EXPECT_EQ(R1, &R1.getFileEntry()); EXPECT_EQ(&R1.getFileEntry(), R1); EXPECT_EQ(R1, R1Also); EXPECT_NE(R1, &R2.getFileEntry()); EXPECT_NE(&R2.getFileEntry(), R1); EXPECT_NE(R1, R2); OptionalFileEntryRefDegradesToFileEntryPtr M1 = R1; EXPECT_EQ(M1, &R1.getFileEntry()); EXPECT_EQ(&R1.getFileEntry(), M1); EXPECT_NE(M1, &R2.getFileEntry()); EXPECT_NE(&R2.getFileEntry(), M1); } TEST(FileEntryTest, isSameRef) { RefMaps Refs; FileEntryRef R1 = Refs.addFile("1"); FileEntryRef R2 = Refs.addFile("2"); FileEntryRef R1Also = Refs.addFileAlias("1-also", R1); EXPECT_TRUE(R1.isSameRef(FileEntryRef(R1))); EXPECT_TRUE(R1.isSameRef(FileEntryRef(R1.getMapEntry()))); EXPECT_FALSE(R1.isSameRef(R2)); EXPECT_FALSE(R1.isSameRef(R1Also)); } TEST(FileEntryTest, DenseMapInfo) { RefMaps Refs; FileEntryRef R1 = Refs.addFile("1"); FileEntryRef R2 = Refs.addFile("2"); FileEntryRef R1Also = Refs.addFileAlias("1-also", R1); // Insert R1Also first and confirm it "wins". { SmallDenseSet Set; Set.insert(R1Also); Set.insert(R1); Set.insert(R2); EXPECT_TRUE(Set.find(R1Also)->isSameRef(R1Also)); EXPECT_TRUE(Set.find(R1)->isSameRef(R1Also)); EXPECT_TRUE(Set.find(R2)->isSameRef(R2)); } // Insert R1Also second and confirm R1 "wins". { SmallDenseSet Set; Set.insert(R1); Set.insert(R1Also); Set.insert(R2); EXPECT_TRUE(Set.find(R1Also)->isSameRef(R1)); EXPECT_TRUE(Set.find(R1)->isSameRef(R1)); EXPECT_TRUE(Set.find(R2)->isSameRef(R2)); } } TEST(DirectoryEntryTest, isSameRef) { RefMaps Refs; DirectoryEntryRef R1 = Refs.addDirectory("1"); DirectoryEntryRef R2 = Refs.addDirectory("2"); DirectoryEntryRef R1Also = Refs.addDirectoryAlias("1-also", R1); EXPECT_TRUE(R1.isSameRef(DirectoryEntryRef(R1))); EXPECT_TRUE(R1.isSameRef(DirectoryEntryRef(R1.getMapEntry()))); EXPECT_FALSE(R1.isSameRef(R2)); EXPECT_FALSE(R1.isSameRef(R1Also)); } TEST(DirectoryEntryTest, DenseMapInfo) { RefMaps Refs; DirectoryEntryRef R1 = Refs.addDirectory("1"); DirectoryEntryRef R2 = Refs.addDirectory("2"); DirectoryEntryRef R1Also = Refs.addDirectoryAlias("1-also", R1); // Insert R1Also first and confirm it "wins". { SmallDenseSet Set; Set.insert(R1Also); Set.insert(R1); Set.insert(R2); EXPECT_TRUE(Set.find(R1Also)->isSameRef(R1Also)); EXPECT_TRUE(Set.find(R1)->isSameRef(R1Also)); EXPECT_TRUE(Set.find(R2)->isSameRef(R2)); } // Insert R1Also second and confirm R1 "wins". { SmallDenseSet Set; Set.insert(R1); Set.insert(R1Also); Set.insert(R2); EXPECT_TRUE(Set.find(R1Also)->isSameRef(R1)); EXPECT_TRUE(Set.find(R1)->isSameRef(R1)); EXPECT_TRUE(Set.find(R2)->isSameRef(R2)); } } } // end namespace