diff options
Diffstat (limited to 'clang/unittests')
-rw-r--r-- | clang/unittests/Basic/CMakeLists.txt | 1 | ||||
-rw-r--r-- | clang/unittests/Basic/FileEntryTest.cpp | 104 | ||||
-rw-r--r-- | clang/unittests/Basic/FileManagerTest.cpp | 52 |
3 files changed, 157 insertions, 0 deletions
diff --git a/clang/unittests/Basic/CMakeLists.txt b/clang/unittests/Basic/CMakeLists.txt index b7fa259..add190b 100644 --- a/clang/unittests/Basic/CMakeLists.txt +++ b/clang/unittests/Basic/CMakeLists.txt @@ -5,6 +5,7 @@ set(LLVM_LINK_COMPONENTS add_clang_unittest(BasicTests CharInfoTest.cpp DiagnosticTest.cpp + FileEntryTest.cpp FileManagerTest.cpp LineOffsetMappingTest.cpp SourceManagerTest.cpp diff --git a/clang/unittests/Basic/FileEntryTest.cpp b/clang/unittests/Basic/FileEntryTest.cpp new file mode 100644 index 0000000..ce57d16 --- /dev/null +++ b/clang/unittests/Basic/FileEntryTest.cpp @@ -0,0 +1,104 @@ +//===- 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/StringMap.h" +#include "gtest/gtest.h" + +using namespace llvm; +using namespace clang; + +namespace { + +using MapEntry = FileEntryRef::MapEntry; +using MapValue = FileEntryRef::MapValue; +using MapType = StringMap<llvm::ErrorOr<MapValue>>; + +FileEntryRef addRef(MapType &M, StringRef Name, FileEntry &E) { + return FileEntryRef(*M.insert({Name, MapValue(E)}).first); +} + +TEST(FileEntryTest, FileEntryRef) { + MapType Refs; + FileEntry E1, E2; + FileEntryRef R1 = addRef(Refs, "1", E1); + FileEntryRef R2 = addRef(Refs, "2", E2); + FileEntryRef R1Also = addRef(Refs, "1-also", E1); + + EXPECT_EQ("1", R1.getName()); + EXPECT_EQ("2", R2.getName()); + EXPECT_EQ("1-also", R1Also.getName()); + + EXPECT_EQ(&E1, &R1.getFileEntry()); + EXPECT_EQ(&E2, &R2.getFileEntry()); + EXPECT_EQ(&E1, &R1Also.getFileEntry()); + + const FileEntry *CE1 = R1; + EXPECT_EQ(CE1, &E1); +} + +TEST(FileEntryTest, OptionalFileEntryRefDegradesToFileEntryPtr) { + MapType Refs; + FileEntry E1, E2; + OptionalFileEntryRefDegradesToFileEntryPtr M0; + OptionalFileEntryRefDegradesToFileEntryPtr M1 = addRef(Refs, "1", E1); + OptionalFileEntryRefDegradesToFileEntryPtr M2 = addRef(Refs, "2", E2); + OptionalFileEntryRefDegradesToFileEntryPtr M0Also = None; + OptionalFileEntryRefDegradesToFileEntryPtr M1Also = + addRef(Refs, "1-also", E1); + + EXPECT_EQ(M0, M0Also); + EXPECT_EQ(StringRef("1"), M1->getName()); + EXPECT_EQ(StringRef("2"), M2->getName()); + EXPECT_EQ(StringRef("1-also"), M1Also->getName()); + + EXPECT_EQ(&E1, &M1->getFileEntry()); + EXPECT_EQ(&E2, &M2->getFileEntry()); + EXPECT_EQ(&E1, &M1Also->getFileEntry()); + + const FileEntry *CE1 = M1; + EXPECT_EQ(CE1, &E1); +} + +TEST(FileEntryTest, equals) { + MapType Refs; + FileEntry E1, E2; + FileEntryRef R1 = addRef(Refs, "1", E1); + FileEntryRef R2 = addRef(Refs, "2", E2); + FileEntryRef R1Also = addRef(Refs, "1-also", E1); + + EXPECT_EQ(R1, &E1); + EXPECT_EQ(&E1, R1); + EXPECT_EQ(R1, R1Also); + EXPECT_NE(R1, &E2); + EXPECT_NE(&E2, R1); + EXPECT_NE(R1, R2); + + OptionalFileEntryRefDegradesToFileEntryPtr M0; + OptionalFileEntryRefDegradesToFileEntryPtr M1 = R1; + + EXPECT_EQ(M1, &E1); + EXPECT_EQ(&E1, M1); + EXPECT_NE(M1, &E2); + EXPECT_NE(&E2, M1); +} + +TEST(FileEntryTest, isSameRef) { + MapType Refs; + FileEntry E1, E2; + FileEntryRef R1 = addRef(Refs, "1", E1); + FileEntryRef R2 = addRef(Refs, "2", E2); + FileEntryRef R1Also = addRef(Refs, "1-also", E1); + + EXPECT_TRUE(R1.isSameRef(FileEntryRef(R1))); + EXPECT_TRUE(R1.isSameRef(FileEntryRef(R1.getMapEntry()))); + EXPECT_FALSE(R1.isSameRef(R2)); + EXPECT_FALSE(R1.isSameRef(R1Also)); +} + +} // end namespace diff --git a/clang/unittests/Basic/FileManagerTest.cpp b/clang/unittests/Basic/FileManagerTest.cpp index 43680d5..0a1f58f3 100644 --- a/clang/unittests/Basic/FileManagerTest.cpp +++ b/clang/unittests/Basic/FileManagerTest.cpp @@ -350,6 +350,58 @@ TEST_F(FileManagerTest, getFileReturnsSameFileEntryForAliasedVirtualFiles) { f2 ? *f2 : nullptr); } +TEST_F(FileManagerTest, getFileRefEquality) { + auto StatCache = std::make_unique<FakeStatCache>(); + StatCache->InjectDirectory("dir", 40); + StatCache->InjectFile("dir/f1.cpp", 41); + StatCache->InjectFile("dir/f1-also.cpp", 41); + StatCache->InjectFile("dir/f1-redirect.cpp", 41, "dir/f1.cpp"); + StatCache->InjectFile("dir/f2.cpp", 42); + manager.setStatCache(std::move(StatCache)); + + auto F1 = manager.getFileRef("dir/f1.cpp"); + auto F1Again = manager.getFileRef("dir/f1.cpp"); + auto F1Also = manager.getFileRef("dir/f1-also.cpp"); + auto F1Redirect = manager.getFileRef("dir/f1-redirect.cpp"); + auto F2 = manager.getFileRef("dir/f2.cpp"); + + // Check Expected<FileEntryRef> for error. + ASSERT_FALSE(!F1); + ASSERT_FALSE(!F1Also); + ASSERT_FALSE(!F1Again); + ASSERT_FALSE(!F1Redirect); + ASSERT_FALSE(!F2); + + // Check names. + EXPECT_EQ("dir/f1.cpp", F1->getName()); + EXPECT_EQ("dir/f1.cpp", F1Again->getName()); + EXPECT_EQ("dir/f1-also.cpp", F1Also->getName()); + EXPECT_EQ("dir/f1.cpp", F1Redirect->getName()); + EXPECT_EQ("dir/f2.cpp", F2->getName()); + + // Compare against FileEntry*. + EXPECT_EQ(&F1->getFileEntry(), *F1); + EXPECT_EQ(*F1, &F1->getFileEntry()); + EXPECT_NE(&F2->getFileEntry(), *F1); + EXPECT_NE(*F1, &F2->getFileEntry()); + + // Compare using ==. + EXPECT_EQ(*F1, *F1Also); + EXPECT_EQ(*F1, *F1Again); + EXPECT_EQ(*F1, *F1Redirect); + EXPECT_EQ(*F1Also, *F1Redirect); + EXPECT_NE(*F2, *F1); + EXPECT_NE(*F2, *F1Also); + EXPECT_NE(*F2, *F1Again); + EXPECT_NE(*F2, *F1Redirect); + + // Compare using isSameRef. + EXPECT_TRUE(F1->isSameRef(*F1Again)); + EXPECT_TRUE(F1->isSameRef(*F1Redirect)); + EXPECT_FALSE(F1->isSameRef(*F1Also)); + EXPECT_FALSE(F1->isSameRef(*F2)); +} + // getFile() Should return the same entry as getVirtualFile if the file actually // is a virtual file, even if the name is not exactly the same (but is after // normalisation done by the file system, like on Windows). This can be checked |