diff --git a/radiantcore/decl/FavouritesManager.cpp b/radiantcore/decl/FavouritesManager.cpp index 3fb88f88ac..11059fc972 100644 --- a/radiantcore/decl/FavouritesManager.cpp +++ b/radiantcore/decl/FavouritesManager.cpp @@ -15,6 +15,8 @@ namespace void FavouritesManager::addFavourite(decl::Type type, const std::string& path) { + if (path.empty()) return; + auto set = _favouritesByType.find(type); if (set == _favouritesByType.end()) @@ -27,6 +29,8 @@ void FavouritesManager::addFavourite(decl::Type type, const std::string& path) void FavouritesManager::removeFavourite(decl::Type type, const std::string& path) { + if (path.empty()) return; + auto set = _favouritesByType.find(type); if (set == _favouritesByType.end()) @@ -39,6 +43,8 @@ void FavouritesManager::removeFavourite(decl::Type type, const std::string& path bool FavouritesManager::isFavourite(decl::Type type, const std::string& path) { + if (path.empty()) return false; + auto set = _favouritesByType.find(type); return set != _favouritesByType.end() ? set->second.get().count(path) > 0 : false; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 57d2e20de3..5290c1f9e7 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -4,6 +4,7 @@ add_executable(drtest CSG.cpp Face.cpp FacePlane.cpp + Favourites.cpp FileTypes.cpp HeadlessOpenGLContext.cpp ImageLoading.cpp diff --git a/test/Favourites.cpp b/test/Favourites.cpp new file mode 100644 index 0000000000..c563e9df7a --- /dev/null +++ b/test/Favourites.cpp @@ -0,0 +1,78 @@ +#include "RadiantTest.h" + +#include "ifavourites.h" + +namespace test +{ + +using FavouritesTest = RadiantTest; + +TEST_F(FavouritesTest, AddingAndRemovingFavourites) +{ + EXPECT_TRUE(GlobalFavouritesManager().getFavourites(decl::Type::Material).empty()); + + // Add caulk + GlobalFavouritesManager().addFavourite(decl::Type::Material, "textures/common/caulk"); + + EXPECT_EQ(GlobalFavouritesManager().getFavourites(decl::Type::Material).size(), 1); + EXPECT_EQ(GlobalFavouritesManager().getFavourites(decl::Type::Material).count("textures/common/caulk"), 1); + EXPECT_TRUE(GlobalFavouritesManager().isFavourite(decl::Type::Material, "textures/common/caulk")); + EXPECT_FALSE(GlobalFavouritesManager().isFavourite(decl::Type::Material, "textures/common/clip")); + + // Add clip + GlobalFavouritesManager().addFavourite(decl::Type::Material, "textures/common/clip"); + + EXPECT_EQ(GlobalFavouritesManager().getFavourites(decl::Type::Material).size(), 2); + EXPECT_EQ(GlobalFavouritesManager().getFavourites(decl::Type::Material).count("textures/common/caulk"), 1); + EXPECT_EQ(GlobalFavouritesManager().getFavourites(decl::Type::Material).count("textures/common/clip"), 1); + EXPECT_TRUE(GlobalFavouritesManager().isFavourite(decl::Type::Material, "textures/common/caulk")); + EXPECT_TRUE(GlobalFavouritesManager().isFavourite(decl::Type::Material, "textures/common/clip")); + + // Remove caulk + GlobalFavouritesManager().removeFavourite(decl::Type::Material, "textures/common/caulk"); + + EXPECT_EQ(GlobalFavouritesManager().getFavourites(decl::Type::Material).size(), 1); + EXPECT_EQ(GlobalFavouritesManager().getFavourites(decl::Type::Material).count("textures/common/clip"), 1); + EXPECT_FALSE(GlobalFavouritesManager().isFavourite(decl::Type::Material, "textures/common/caulk")); + EXPECT_TRUE(GlobalFavouritesManager().isFavourite(decl::Type::Material, "textures/common/clip")); + + // Remove clip + GlobalFavouritesManager().removeFavourite(decl::Type::Material, "textures/common/clip"); + + EXPECT_EQ(GlobalFavouritesManager().getFavourites(decl::Type::Material).size(), 0); + EXPECT_FALSE(GlobalFavouritesManager().isFavourite(decl::Type::Material, "textures/common/caulk")); + EXPECT_FALSE(GlobalFavouritesManager().isFavourite(decl::Type::Material, "textures/common/clip")); +} + +TEST_F(FavouritesTest, RemovingNonExistent) +{ + EXPECT_TRUE(GlobalFavouritesManager().getFavourites(decl::Type::Material).empty()); + + // Add caulk + GlobalFavouritesManager().addFavourite(decl::Type::Material, "textures/common/caulk"); + + EXPECT_EQ(GlobalFavouritesManager().getFavourites(decl::Type::Material).size(), 1); + EXPECT_TRUE(GlobalFavouritesManager().isFavourite(decl::Type::Material, "textures/common/caulk")); + + // Remove non-existent => shouldn't change anything + GlobalFavouritesManager().removeFavourite(decl::Type::Material, "textures/doesntexist"); + + EXPECT_EQ(GlobalFavouritesManager().getFavourites(decl::Type::Material).size(), 1); + EXPECT_TRUE(GlobalFavouritesManager().isFavourite(decl::Type::Material, "textures/common/caulk")); +} + +TEST_F(FavouritesTest, AddingEmptyPaths) +{ + EXPECT_TRUE(GlobalFavouritesManager().getFavourites(decl::Type::Material).empty()); + + // Add an empty string + GlobalFavouritesManager().addFavourite(decl::Type::Material, ""); + + // Should still be empty + EXPECT_TRUE(GlobalFavouritesManager().getFavourites(decl::Type::Material).empty()); + + // Empty strings always evaluate to false + EXPECT_FALSE(GlobalFavouritesManager().isFavourite(decl::Type::Material, "")); +} + +} diff --git a/tools/msvc/Tests/Tests.vcxproj b/tools/msvc/Tests/Tests.vcxproj index 8e0d5a5ead..dfd0afa8f2 100644 --- a/tools/msvc/Tests/Tests.vcxproj +++ b/tools/msvc/Tests/Tests.vcxproj @@ -73,6 +73,7 @@ + diff --git a/tools/msvc/Tests/Tests.vcxproj.filters b/tools/msvc/Tests/Tests.vcxproj.filters index 884b4d814c..e5bfc069b9 100644 --- a/tools/msvc/Tests/Tests.vcxproj.filters +++ b/tools/msvc/Tests/Tests.vcxproj.filters @@ -35,6 +35,7 @@ +