1ac49500cSDuncan P. N. Exon Smith //===- unittests/Basic/FileEntryTest.cpp - Test FileEntry/FileEntryRef ----===//
2ac49500cSDuncan P. N. Exon Smith //
3ac49500cSDuncan P. N. Exon Smith // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ac49500cSDuncan P. N. Exon Smith // See https://llvm.org/LICENSE.txt for license information.
5ac49500cSDuncan P. N. Exon Smith // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ac49500cSDuncan P. N. Exon Smith //
7ac49500cSDuncan P. N. Exon Smith //===----------------------------------------------------------------------===//
8ac49500cSDuncan P. N. Exon Smith 
9ac49500cSDuncan P. N. Exon Smith #include "clang/Basic/FileEntry.h"
102878e965SDuncan P. N. Exon Smith #include "llvm/ADT/DenseSet.h"
11ac49500cSDuncan P. N. Exon Smith #include "llvm/ADT/StringMap.h"
12ac49500cSDuncan P. N. Exon Smith #include "gtest/gtest.h"
13ac49500cSDuncan P. N. Exon Smith 
14ac49500cSDuncan P. N. Exon Smith using namespace llvm;
15ac49500cSDuncan P. N. Exon Smith 
16*b2a7f1c3SSam McCall namespace clang {
17ac49500cSDuncan P. N. Exon Smith 
18*b2a7f1c3SSam McCall class FileEntryTestHelper {
19*b2a7f1c3SSam McCall   StringMap<llvm::ErrorOr<FileEntryRef::MapValue>> Files;
20*b2a7f1c3SSam McCall   StringMap<llvm::ErrorOr<DirectoryEntry &>> Dirs;
211b042de5SDuncan P. N. Exon Smith 
221b042de5SDuncan P. N. Exon Smith   SmallVector<std::unique_ptr<FileEntry>, 5> FEs;
232878e965SDuncan P. N. Exon Smith   SmallVector<std::unique_ptr<DirectoryEntry>, 5> DEs;
242878e965SDuncan P. N. Exon Smith   DirectoryEntryRef DR;
251b042de5SDuncan P. N. Exon Smith 
26*b2a7f1c3SSam McCall public:
FileEntryTestHelper()27*b2a7f1c3SSam McCall   FileEntryTestHelper() : DR(addDirectory("dir")) {}
282878e965SDuncan P. N. Exon Smith 
addDirectory(StringRef Name)292878e965SDuncan P. N. Exon Smith   DirectoryEntryRef addDirectory(StringRef Name) {
30*b2a7f1c3SSam McCall     DEs.emplace_back(new DirectoryEntry());
312878e965SDuncan P. N. Exon Smith     return DirectoryEntryRef(*Dirs.insert({Name, *DEs.back()}).first);
322878e965SDuncan P. N. Exon Smith   }
addDirectoryAlias(StringRef Name,DirectoryEntryRef Base)332878e965SDuncan P. N. Exon Smith   DirectoryEntryRef addDirectoryAlias(StringRef Name, DirectoryEntryRef Base) {
342878e965SDuncan P. N. Exon Smith     return DirectoryEntryRef(
352878e965SDuncan P. N. Exon Smith         *Dirs.insert({Name, const_cast<DirectoryEntry &>(Base.getDirEntry())})
362878e965SDuncan P. N. Exon Smith              .first);
372878e965SDuncan P. N. Exon Smith   }
381b042de5SDuncan P. N. Exon Smith 
addFile(StringRef Name)391b042de5SDuncan P. N. Exon Smith   FileEntryRef addFile(StringRef Name) {
40*b2a7f1c3SSam McCall     FEs.emplace_back(new FileEntry());
411b042de5SDuncan P. N. Exon Smith     return FileEntryRef(
421b042de5SDuncan P. N. Exon Smith         *Files.insert({Name, FileEntryRef::MapValue(*FEs.back().get(), DR)})
431b042de5SDuncan P. N. Exon Smith              .first);
44ac49500cSDuncan P. N. Exon Smith   }
addFileAlias(StringRef Name,FileEntryRef Base)451b042de5SDuncan P. N. Exon Smith   FileEntryRef addFileAlias(StringRef Name, FileEntryRef Base) {
461b042de5SDuncan P. N. Exon Smith     return FileEntryRef(
471b042de5SDuncan P. N. Exon Smith         *Files
481b042de5SDuncan P. N. Exon Smith              .insert(
491b042de5SDuncan P. N. Exon Smith                  {Name, FileEntryRef::MapValue(
501b042de5SDuncan P. N. Exon Smith                             const_cast<FileEntry &>(Base.getFileEntry()), DR)})
511b042de5SDuncan P. N. Exon Smith              .first);
521b042de5SDuncan P. N. Exon Smith   }
531b042de5SDuncan P. N. Exon Smith };
54ac49500cSDuncan P. N. Exon Smith 
55*b2a7f1c3SSam McCall namespace {
TEST(FileEntryTest,FileEntryRef)56ac49500cSDuncan P. N. Exon Smith TEST(FileEntryTest, FileEntryRef) {
57*b2a7f1c3SSam McCall   FileEntryTestHelper Refs;
581b042de5SDuncan P. N. Exon Smith   FileEntryRef R1 = Refs.addFile("1");
591b042de5SDuncan P. N. Exon Smith   FileEntryRef R2 = Refs.addFile("2");
601b042de5SDuncan P. N. Exon Smith   FileEntryRef R1Also = Refs.addFileAlias("1-also", R1);
61ac49500cSDuncan P. N. Exon Smith 
62ac49500cSDuncan P. N. Exon Smith   EXPECT_EQ("1", R1.getName());
63ac49500cSDuncan P. N. Exon Smith   EXPECT_EQ("2", R2.getName());
64ac49500cSDuncan P. N. Exon Smith   EXPECT_EQ("1-also", R1Also.getName());
65ac49500cSDuncan P. N. Exon Smith 
661b042de5SDuncan P. N. Exon Smith   EXPECT_NE(&R1.getFileEntry(), &R2.getFileEntry());
671b042de5SDuncan P. N. Exon Smith   EXPECT_EQ(&R1.getFileEntry(), &R1Also.getFileEntry());
68ac49500cSDuncan P. N. Exon Smith 
69ac49500cSDuncan P. N. Exon Smith   const FileEntry *CE1 = R1;
701b042de5SDuncan P. N. Exon Smith   EXPECT_EQ(CE1, &R1.getFileEntry());
71ac49500cSDuncan P. N. Exon Smith }
72ac49500cSDuncan P. N. Exon Smith 
TEST(FileEntryTest,OptionalFileEntryRefDegradesToFileEntryPtr)73ac49500cSDuncan P. N. Exon Smith TEST(FileEntryTest, OptionalFileEntryRefDegradesToFileEntryPtr) {
74*b2a7f1c3SSam McCall   FileEntryTestHelper Refs;
75ac49500cSDuncan P. N. Exon Smith   OptionalFileEntryRefDegradesToFileEntryPtr M0;
761b042de5SDuncan P. N. Exon Smith   OptionalFileEntryRefDegradesToFileEntryPtr M1 = Refs.addFile("1");
771b042de5SDuncan P. N. Exon Smith   OptionalFileEntryRefDegradesToFileEntryPtr M2 = Refs.addFile("2");
78ac49500cSDuncan P. N. Exon Smith   OptionalFileEntryRefDegradesToFileEntryPtr M0Also = None;
79ac49500cSDuncan P. N. Exon Smith   OptionalFileEntryRefDegradesToFileEntryPtr M1Also =
801b042de5SDuncan P. N. Exon Smith       Refs.addFileAlias("1-also", *M1);
81ac49500cSDuncan P. N. Exon Smith 
82ac49500cSDuncan P. N. Exon Smith   EXPECT_EQ(M0, M0Also);
83ac49500cSDuncan P. N. Exon Smith   EXPECT_EQ(StringRef("1"), M1->getName());
84ac49500cSDuncan P. N. Exon Smith   EXPECT_EQ(StringRef("2"), M2->getName());
85ac49500cSDuncan P. N. Exon Smith   EXPECT_EQ(StringRef("1-also"), M1Also->getName());
86ac49500cSDuncan P. N. Exon Smith 
87ac49500cSDuncan P. N. Exon Smith   const FileEntry *CE1 = M1;
881b042de5SDuncan P. N. Exon Smith   EXPECT_EQ(CE1, &M1->getFileEntry());
89ac49500cSDuncan P. N. Exon Smith }
90ac49500cSDuncan P. N. Exon Smith 
TEST(FileEntryTest,equals)91ac49500cSDuncan P. N. Exon Smith TEST(FileEntryTest, equals) {
92*b2a7f1c3SSam McCall   FileEntryTestHelper Refs;
931b042de5SDuncan P. N. Exon Smith   FileEntryRef R1 = Refs.addFile("1");
941b042de5SDuncan P. N. Exon Smith   FileEntryRef R2 = Refs.addFile("2");
951b042de5SDuncan P. N. Exon Smith   FileEntryRef R1Also = Refs.addFileAlias("1-also", R1);
96ac49500cSDuncan P. N. Exon Smith 
971b042de5SDuncan P. N. Exon Smith   EXPECT_EQ(R1, &R1.getFileEntry());
981b042de5SDuncan P. N. Exon Smith   EXPECT_EQ(&R1.getFileEntry(), R1);
99ac49500cSDuncan P. N. Exon Smith   EXPECT_EQ(R1, R1Also);
1001b042de5SDuncan P. N. Exon Smith   EXPECT_NE(R1, &R2.getFileEntry());
1011b042de5SDuncan P. N. Exon Smith   EXPECT_NE(&R2.getFileEntry(), R1);
102ac49500cSDuncan P. N. Exon Smith   EXPECT_NE(R1, R2);
103ac49500cSDuncan P. N. Exon Smith 
104ac49500cSDuncan P. N. Exon Smith   OptionalFileEntryRefDegradesToFileEntryPtr M1 = R1;
105ac49500cSDuncan P. N. Exon Smith 
1061b042de5SDuncan P. N. Exon Smith   EXPECT_EQ(M1, &R1.getFileEntry());
1071b042de5SDuncan P. N. Exon Smith   EXPECT_EQ(&R1.getFileEntry(), M1);
1081b042de5SDuncan P. N. Exon Smith   EXPECT_NE(M1, &R2.getFileEntry());
1091b042de5SDuncan P. N. Exon Smith   EXPECT_NE(&R2.getFileEntry(), M1);
110ac49500cSDuncan P. N. Exon Smith }
111ac49500cSDuncan P. N. Exon Smith 
TEST(FileEntryTest,isSameRef)112ac49500cSDuncan P. N. Exon Smith TEST(FileEntryTest, isSameRef) {
113*b2a7f1c3SSam McCall   FileEntryTestHelper Refs;
1141b042de5SDuncan P. N. Exon Smith   FileEntryRef R1 = Refs.addFile("1");
1151b042de5SDuncan P. N. Exon Smith   FileEntryRef R2 = Refs.addFile("2");
1161b042de5SDuncan P. N. Exon Smith   FileEntryRef R1Also = Refs.addFileAlias("1-also", R1);
117ac49500cSDuncan P. N. Exon Smith 
118ac49500cSDuncan P. N. Exon Smith   EXPECT_TRUE(R1.isSameRef(FileEntryRef(R1)));
119ac49500cSDuncan P. N. Exon Smith   EXPECT_TRUE(R1.isSameRef(FileEntryRef(R1.getMapEntry())));
120ac49500cSDuncan P. N. Exon Smith   EXPECT_FALSE(R1.isSameRef(R2));
121ac49500cSDuncan P. N. Exon Smith   EXPECT_FALSE(R1.isSameRef(R1Also));
122ac49500cSDuncan P. N. Exon Smith }
123ac49500cSDuncan P. N. Exon Smith 
TEST(FileEntryTest,DenseMapInfo)1242878e965SDuncan P. N. Exon Smith TEST(FileEntryTest, DenseMapInfo) {
125*b2a7f1c3SSam McCall   FileEntryTestHelper Refs;
1262878e965SDuncan P. N. Exon Smith   FileEntryRef R1 = Refs.addFile("1");
1272878e965SDuncan P. N. Exon Smith   FileEntryRef R2 = Refs.addFile("2");
1282878e965SDuncan P. N. Exon Smith   FileEntryRef R1Also = Refs.addFileAlias("1-also", R1);
1292878e965SDuncan P. N. Exon Smith 
1302878e965SDuncan P. N. Exon Smith   // Insert R1Also first and confirm it "wins".
1312878e965SDuncan P. N. Exon Smith   {
1322878e965SDuncan P. N. Exon Smith     SmallDenseSet<FileEntryRef, 8> Set;
1332878e965SDuncan P. N. Exon Smith     Set.insert(R1Also);
1342878e965SDuncan P. N. Exon Smith     Set.insert(R1);
1352878e965SDuncan P. N. Exon Smith     Set.insert(R2);
1362878e965SDuncan P. N. Exon Smith     EXPECT_TRUE(Set.find(R1Also)->isSameRef(R1Also));
1372878e965SDuncan P. N. Exon Smith     EXPECT_TRUE(Set.find(R1)->isSameRef(R1Also));
1382878e965SDuncan P. N. Exon Smith     EXPECT_TRUE(Set.find(R2)->isSameRef(R2));
1392878e965SDuncan P. N. Exon Smith   }
1402878e965SDuncan P. N. Exon Smith 
1412878e965SDuncan P. N. Exon Smith   // Insert R1Also second and confirm R1 "wins".
1422878e965SDuncan P. N. Exon Smith   {
1432878e965SDuncan P. N. Exon Smith     SmallDenseSet<FileEntryRef, 8> Set;
1442878e965SDuncan P. N. Exon Smith     Set.insert(R1);
1452878e965SDuncan P. N. Exon Smith     Set.insert(R1Also);
1462878e965SDuncan P. N. Exon Smith     Set.insert(R2);
1472878e965SDuncan P. N. Exon Smith     EXPECT_TRUE(Set.find(R1Also)->isSameRef(R1));
1482878e965SDuncan P. N. Exon Smith     EXPECT_TRUE(Set.find(R1)->isSameRef(R1));
1492878e965SDuncan P. N. Exon Smith     EXPECT_TRUE(Set.find(R2)->isSameRef(R2));
1502878e965SDuncan P. N. Exon Smith   }
1512878e965SDuncan P. N. Exon Smith }
1522878e965SDuncan P. N. Exon Smith 
TEST(DirectoryEntryTest,isSameRef)1532878e965SDuncan P. N. Exon Smith TEST(DirectoryEntryTest, isSameRef) {
154*b2a7f1c3SSam McCall   FileEntryTestHelper Refs;
1552878e965SDuncan P. N. Exon Smith   DirectoryEntryRef R1 = Refs.addDirectory("1");
1562878e965SDuncan P. N. Exon Smith   DirectoryEntryRef R2 = Refs.addDirectory("2");
1572878e965SDuncan P. N. Exon Smith   DirectoryEntryRef R1Also = Refs.addDirectoryAlias("1-also", R1);
1582878e965SDuncan P. N. Exon Smith 
1592878e965SDuncan P. N. Exon Smith   EXPECT_TRUE(R1.isSameRef(DirectoryEntryRef(R1)));
1602878e965SDuncan P. N. Exon Smith   EXPECT_TRUE(R1.isSameRef(DirectoryEntryRef(R1.getMapEntry())));
1612878e965SDuncan P. N. Exon Smith   EXPECT_FALSE(R1.isSameRef(R2));
1622878e965SDuncan P. N. Exon Smith   EXPECT_FALSE(R1.isSameRef(R1Also));
1632878e965SDuncan P. N. Exon Smith }
1642878e965SDuncan P. N. Exon Smith 
TEST(DirectoryEntryTest,DenseMapInfo)1652878e965SDuncan P. N. Exon Smith TEST(DirectoryEntryTest, DenseMapInfo) {
166*b2a7f1c3SSam McCall   FileEntryTestHelper Refs;
1672878e965SDuncan P. N. Exon Smith   DirectoryEntryRef R1 = Refs.addDirectory("1");
1682878e965SDuncan P. N. Exon Smith   DirectoryEntryRef R2 = Refs.addDirectory("2");
1692878e965SDuncan P. N. Exon Smith   DirectoryEntryRef R1Also = Refs.addDirectoryAlias("1-also", R1);
1702878e965SDuncan P. N. Exon Smith 
1712878e965SDuncan P. N. Exon Smith   // Insert R1Also first and confirm it "wins".
1722878e965SDuncan P. N. Exon Smith   {
1732878e965SDuncan P. N. Exon Smith     SmallDenseSet<DirectoryEntryRef, 8> Set;
1742878e965SDuncan P. N. Exon Smith     Set.insert(R1Also);
1752878e965SDuncan P. N. Exon Smith     Set.insert(R1);
1762878e965SDuncan P. N. Exon Smith     Set.insert(R2);
1772878e965SDuncan P. N. Exon Smith     EXPECT_TRUE(Set.find(R1Also)->isSameRef(R1Also));
1782878e965SDuncan P. N. Exon Smith     EXPECT_TRUE(Set.find(R1)->isSameRef(R1Also));
1792878e965SDuncan P. N. Exon Smith     EXPECT_TRUE(Set.find(R2)->isSameRef(R2));
1802878e965SDuncan P. N. Exon Smith   }
1812878e965SDuncan P. N. Exon Smith 
1822878e965SDuncan P. N. Exon Smith   // Insert R1Also second and confirm R1 "wins".
1832878e965SDuncan P. N. Exon Smith   {
1842878e965SDuncan P. N. Exon Smith     SmallDenseSet<DirectoryEntryRef, 8> Set;
1852878e965SDuncan P. N. Exon Smith     Set.insert(R1);
1862878e965SDuncan P. N. Exon Smith     Set.insert(R1Also);
1872878e965SDuncan P. N. Exon Smith     Set.insert(R2);
1882878e965SDuncan P. N. Exon Smith     EXPECT_TRUE(Set.find(R1Also)->isSameRef(R1));
1892878e965SDuncan P. N. Exon Smith     EXPECT_TRUE(Set.find(R1)->isSameRef(R1));
1902878e965SDuncan P. N. Exon Smith     EXPECT_TRUE(Set.find(R2)->isSameRef(R2));
1912878e965SDuncan P. N. Exon Smith   }
1922878e965SDuncan P. N. Exon Smith }
1932878e965SDuncan P. N. Exon Smith 
194ac49500cSDuncan P. N. Exon Smith } // end namespace
195*b2a7f1c3SSam McCall } // namespace clang
196