xref: /llvm-project/clang/unittests/Basic/FileEntryTest.cpp (revision 1b042de5b29af4869a77ecbc632029fba0313dec)
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