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 "llvm/Support/Path.h" |
13 | #include "gtest/gtest.h" |
14 | |
15 | using namespace llvm; |
16 | |
17 | namespace clang { |
18 | |
19 | class FileEntryTestHelper { |
20 | StringMap<llvm::ErrorOr<FileEntryRef::MapValue>> Files; |
21 | StringMap<llvm::ErrorOr<DirectoryEntry &>> Dirs; |
22 | |
23 | SmallVector<std::unique_ptr<FileEntry>, 5> FEs; |
24 | SmallVector<std::unique_ptr<DirectoryEntry>, 5> DEs; |
25 | DirectoryEntryRef DR; |
26 | |
27 | public: |
28 | FileEntryTestHelper() : DR(addDirectory(Name: "dir" )) {} |
29 | |
30 | DirectoryEntryRef addDirectory(StringRef Name) { |
31 | DEs.emplace_back(Args: new DirectoryEntry()); |
32 | return DirectoryEntryRef(*Dirs.insert(KV: {Name, *DEs.back()}).first); |
33 | } |
34 | DirectoryEntryRef addDirectoryAlias(StringRef Name, DirectoryEntryRef Base) { |
35 | return DirectoryEntryRef( |
36 | *Dirs.insert(KV: {Name, const_cast<DirectoryEntry &>(Base.getDirEntry())}) |
37 | .first); |
38 | } |
39 | |
40 | FileEntryRef addFile(StringRef Name) { |
41 | FEs.emplace_back(Args: new FileEntry()); |
42 | return FileEntryRef( |
43 | *Files.insert(KV: {Name, FileEntryRef::MapValue(*FEs.back().get(), DR)}) |
44 | .first); |
45 | } |
46 | FileEntryRef addFileAlias(StringRef Name, FileEntryRef Base) { |
47 | return FileEntryRef( |
48 | *Files |
49 | .insert( |
50 | KV: {Name, FileEntryRef::MapValue( |
51 | const_cast<FileEntry &>(Base.getFileEntry()), DR)}) |
52 | .first); |
53 | } |
54 | FileEntryRef addFileRedirect(StringRef Name, FileEntryRef Base) { |
55 | auto Dir = addDirectory(Name: llvm::sys::path::parent_path(path: Name)); |
56 | |
57 | return FileEntryRef( |
58 | *Files |
59 | .insert(KV: {Name, FileEntryRef::MapValue( |
60 | const_cast<FileEntryRef::MapEntry &>( |
61 | Base.getMapEntry()), |
62 | Dir)}) |
63 | .first); |
64 | } |
65 | }; |
66 | |
67 | namespace { |
68 | TEST(FileEntryTest, FileEntryRef) { |
69 | FileEntryTestHelper Refs; |
70 | FileEntryRef R1 = Refs.addFile(Name: "1" ); |
71 | FileEntryRef R2 = Refs.addFile(Name: "2" ); |
72 | FileEntryRef R1Also = Refs.addFileAlias(Name: "1-also" , Base: R1); |
73 | FileEntryRef R1Redirect = Refs.addFileRedirect(Name: "1-redirect" , Base: R1); |
74 | FileEntryRef R1Redirect2 = Refs.addFileRedirect(Name: "1-redirect2" , Base: R1Redirect); |
75 | |
76 | EXPECT_EQ("1" , R1.getName()); |
77 | EXPECT_EQ("2" , R2.getName()); |
78 | EXPECT_EQ("1-also" , R1Also.getName()); |
79 | EXPECT_EQ("1" , R1Redirect.getName()); |
80 | EXPECT_EQ("1" , R1Redirect2.getName()); |
81 | |
82 | EXPECT_EQ("1" , R1.getNameAsRequested()); |
83 | EXPECT_EQ("1-redirect" , R1Redirect.getNameAsRequested()); |
84 | EXPECT_EQ("1-redirect2" , R1Redirect2.getNameAsRequested()); |
85 | |
86 | EXPECT_NE(&R1.getFileEntry(), &R2.getFileEntry()); |
87 | EXPECT_EQ(&R1.getFileEntry(), &R1Also.getFileEntry()); |
88 | EXPECT_EQ(&R1.getFileEntry(), &R1Redirect.getFileEntry()); |
89 | EXPECT_EQ(&R1Redirect.getFileEntry(), &R1Redirect2.getFileEntry()); |
90 | |
91 | const FileEntry *CE1 = R1; |
92 | EXPECT_EQ(CE1, &R1.getFileEntry()); |
93 | } |
94 | |
95 | TEST(FileEntryTest, equals) { |
96 | FileEntryTestHelper Refs; |
97 | FileEntryRef R1 = Refs.addFile(Name: "1" ); |
98 | FileEntryRef R2 = Refs.addFile(Name: "2" ); |
99 | FileEntryRef R1Also = Refs.addFileAlias(Name: "1-also" , Base: R1); |
100 | FileEntryRef R1Redirect = Refs.addFileRedirect(Name: "1-redirect" , Base: R1); |
101 | FileEntryRef R1Redirect2 = Refs.addFileRedirect(Name: "1-redirect2" , Base: R1Redirect); |
102 | |
103 | EXPECT_EQ(R1, &R1.getFileEntry()); |
104 | EXPECT_EQ(&R1.getFileEntry(), R1); |
105 | EXPECT_EQ(R1, R1Also); |
106 | EXPECT_NE(R1, &R2.getFileEntry()); |
107 | EXPECT_NE(&R2.getFileEntry(), R1); |
108 | EXPECT_NE(R1, R2); |
109 | EXPECT_EQ(R1, R1Redirect); |
110 | EXPECT_EQ(R1, R1Redirect2); |
111 | } |
112 | |
113 | TEST(FileEntryTest, isSameRef) { |
114 | FileEntryTestHelper Refs; |
115 | FileEntryRef R1 = Refs.addFile(Name: "1" ); |
116 | FileEntryRef R2 = Refs.addFile(Name: "2" ); |
117 | FileEntryRef R1Also = Refs.addFileAlias(Name: "1-also" , Base: R1); |
118 | FileEntryRef R1Redirect = Refs.addFileRedirect(Name: "1-redirect" , Base: R1); |
119 | FileEntryRef R1Redirect2 = Refs.addFileRedirect(Name: "1-redirect2" , Base: R1Redirect); |
120 | |
121 | EXPECT_TRUE(R1.isSameRef(FileEntryRef(R1))); |
122 | EXPECT_TRUE(R1.isSameRef(FileEntryRef(R1.getMapEntry()))); |
123 | EXPECT_FALSE(R1.isSameRef(R2)); |
124 | EXPECT_FALSE(R1.isSameRef(R1Also)); |
125 | EXPECT_FALSE(R1.isSameRef(R1Redirect)); |
126 | EXPECT_FALSE(R1.isSameRef(R1Redirect2)); |
127 | EXPECT_FALSE(R1Redirect.isSameRef(R1Redirect2)); |
128 | } |
129 | |
130 | TEST(FileEntryTest, DenseMapInfo) { |
131 | FileEntryTestHelper Refs; |
132 | FileEntryRef R1 = Refs.addFile(Name: "1" ); |
133 | FileEntryRef R2 = Refs.addFile(Name: "2" ); |
134 | FileEntryRef R1Also = Refs.addFileAlias(Name: "1-also" , Base: R1); |
135 | |
136 | // Insert R1Also first and confirm it "wins". |
137 | { |
138 | SmallDenseSet<FileEntryRef, 8> Set; |
139 | Set.insert(V: R1Also); |
140 | Set.insert(V: R1); |
141 | Set.insert(V: R2); |
142 | EXPECT_TRUE(Set.find(R1Also)->isSameRef(R1Also)); |
143 | EXPECT_TRUE(Set.find(R1)->isSameRef(R1Also)); |
144 | EXPECT_TRUE(Set.find(R2)->isSameRef(R2)); |
145 | } |
146 | |
147 | // Insert R1Also second and confirm R1 "wins". |
148 | { |
149 | SmallDenseSet<FileEntryRef, 8> Set; |
150 | Set.insert(V: R1); |
151 | Set.insert(V: R1Also); |
152 | Set.insert(V: R2); |
153 | EXPECT_TRUE(Set.find(R1Also)->isSameRef(R1)); |
154 | EXPECT_TRUE(Set.find(R1)->isSameRef(R1)); |
155 | EXPECT_TRUE(Set.find(R2)->isSameRef(R2)); |
156 | } |
157 | |
158 | // Insert R1Also first and confirm it "wins" when looked up as FileEntry. |
159 | { |
160 | SmallDenseSet<FileEntryRef, 8> Set; |
161 | Set.insert(V: R1Also); |
162 | Set.insert(V: R1); |
163 | Set.insert(V: R2); |
164 | |
165 | auto R1AlsoIt = Set.find_as(Val: &R1Also.getFileEntry()); |
166 | ASSERT_TRUE(R1AlsoIt != Set.end()); |
167 | EXPECT_TRUE(R1AlsoIt->isSameRef(R1Also)); |
168 | |
169 | auto R1It = Set.find_as(Val: &R1.getFileEntry()); |
170 | ASSERT_TRUE(R1It != Set.end()); |
171 | EXPECT_TRUE(R1It->isSameRef(R1Also)); |
172 | |
173 | auto R2It = Set.find_as(Val: &R2.getFileEntry()); |
174 | ASSERT_TRUE(R2It != Set.end()); |
175 | EXPECT_TRUE(R2It->isSameRef(R2)); |
176 | } |
177 | |
178 | // Insert R1Also second and confirm R1 "wins" when looked up as FileEntry. |
179 | { |
180 | SmallDenseSet<FileEntryRef, 8> Set; |
181 | Set.insert(V: R1); |
182 | Set.insert(V: R1Also); |
183 | Set.insert(V: R2); |
184 | |
185 | auto R1AlsoIt = Set.find_as(Val: &R1Also.getFileEntry()); |
186 | ASSERT_TRUE(R1AlsoIt != Set.end()); |
187 | EXPECT_TRUE(R1AlsoIt->isSameRef(R1)); |
188 | |
189 | auto R1It = Set.find_as(Val: &R1.getFileEntry()); |
190 | ASSERT_TRUE(R1It != Set.end()); |
191 | EXPECT_TRUE(R1It->isSameRef(R1)); |
192 | |
193 | auto R2It = Set.find_as(Val: &R2.getFileEntry()); |
194 | ASSERT_TRUE(R2It != Set.end()); |
195 | EXPECT_TRUE(R2It->isSameRef(R2)); |
196 | } |
197 | } |
198 | |
199 | TEST(DirectoryEntryTest, isSameRef) { |
200 | FileEntryTestHelper Refs; |
201 | DirectoryEntryRef R1 = Refs.addDirectory(Name: "1" ); |
202 | DirectoryEntryRef R2 = Refs.addDirectory(Name: "2" ); |
203 | DirectoryEntryRef R1Also = Refs.addDirectoryAlias(Name: "1-also" , Base: R1); |
204 | |
205 | EXPECT_TRUE(R1.isSameRef(DirectoryEntryRef(R1))); |
206 | EXPECT_TRUE(R1.isSameRef(DirectoryEntryRef(R1.getMapEntry()))); |
207 | EXPECT_FALSE(R1.isSameRef(R2)); |
208 | EXPECT_FALSE(R1.isSameRef(R1Also)); |
209 | } |
210 | |
211 | TEST(DirectoryEntryTest, DenseMapInfo) { |
212 | FileEntryTestHelper Refs; |
213 | DirectoryEntryRef R1 = Refs.addDirectory(Name: "1" ); |
214 | DirectoryEntryRef R2 = Refs.addDirectory(Name: "2" ); |
215 | DirectoryEntryRef R1Also = Refs.addDirectoryAlias(Name: "1-also" , Base: R1); |
216 | |
217 | // Insert R1Also first and confirm it "wins". |
218 | { |
219 | SmallDenseSet<DirectoryEntryRef, 8> Set; |
220 | Set.insert(V: R1Also); |
221 | Set.insert(V: R1); |
222 | Set.insert(V: R2); |
223 | EXPECT_TRUE(Set.find(R1Also)->isSameRef(R1Also)); |
224 | EXPECT_TRUE(Set.find(R1)->isSameRef(R1Also)); |
225 | EXPECT_TRUE(Set.find(R2)->isSameRef(R2)); |
226 | } |
227 | |
228 | // Insert R1Also second and confirm R1 "wins". |
229 | { |
230 | SmallDenseSet<DirectoryEntryRef, 8> Set; |
231 | Set.insert(V: R1); |
232 | Set.insert(V: R1Also); |
233 | Set.insert(V: R2); |
234 | EXPECT_TRUE(Set.find(R1Also)->isSameRef(R1)); |
235 | EXPECT_TRUE(Set.find(R1)->isSameRef(R1)); |
236 | EXPECT_TRUE(Set.find(R2)->isSameRef(R2)); |
237 | } |
238 | } |
239 | |
240 | } // end namespace |
241 | } // namespace clang |
242 | |