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 @@
+