aboutsummaryrefslogtreecommitdiff
path: root/src/tests
diff options
context:
space:
mode:
authorSulfurNitride <SulfurNitride@users.noreply.github.com>2026-05-23 09:59:01 -0500
committerSulfurNitride <SulfurNitride@users.noreply.github.com>2026-05-23 09:59:01 -0500
commit7f0ded9e4a6e11b5e0327dd8eb76dd5945b8693d (patch)
treebfbc73c5c4c9f6cc5f196129fe8e0b583ebee639 /src/tests
parentb796e336c4795f5c208368aa09b178d905f46173 (diff)
prefix: align dependency setup and VFS fixes
Diffstat (limited to 'src/tests')
-rw-r--r--src/tests/CMakeLists.txt23
-rw-r--r--src/tests/test_overwrite_duplicates.cpp71
2 files changed, 93 insertions, 1 deletions
diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index 8e71366..24c4597 100644
--- a/src/tests/CMakeLists.txt
+++ b/src/tests/CMakeLists.txt
@@ -48,6 +48,27 @@ target_link_libraries(test_external_dir_mapping PRIVATE
)
add_test(NAME test_external_dir_mapping COMMAND test_external_dir_mapping)
+# ---------------------------------------------------------------------------
+# Overwrite duplicate scan tests
+# ---------------------------------------------------------------------------
+add_executable(test_overwrite_duplicates EXCLUDE_FROM_ALL
+ test_overwrite_duplicates.cpp
+ ${CMAKE_SOURCE_DIR}/src/src/vfs/trackedwrites.cpp
+)
+set_target_properties(test_overwrite_duplicates PROPERTIES
+ AUTOMOC OFF
+ CXX_STANDARD 23
+ CXX_STANDARD_REQUIRED ON
+)
+target_include_directories(test_overwrite_duplicates PRIVATE
+ ${CMAKE_SOURCE_DIR}/src/src
+)
+target_link_libraries(test_overwrite_duplicates PRIVATE
+ GTest::gtest
+ GTest::gtest_main
+)
+add_test(NAME test_overwrite_duplicates COMMAND test_overwrite_duplicates)
+
# Register a "fluorine-tests" umbrella target that builds every test exe.
add_custom_target(fluorine-tests
- DEPENDS test_metainiutils test_external_dir_mapping)
+ DEPENDS test_metainiutils test_external_dir_mapping test_overwrite_duplicates)
diff --git a/src/tests/test_overwrite_duplicates.cpp b/src/tests/test_overwrite_duplicates.cpp
new file mode 100644
index 0000000..8cbf3ec
--- /dev/null
+++ b/src/tests/test_overwrite_duplicates.cpp
@@ -0,0 +1,71 @@
+#include "vfs/trackedwrites.h"
+
+#include <strings.h>
+
+#include <gtest/gtest.h>
+
+#include <algorithm>
+#include <filesystem>
+#include <fstream>
+
+namespace fs = std::filesystem;
+
+namespace
+{
+
+void writeText(const fs::path& path, const std::string& text)
+{
+ fs::create_directories(path.parent_path());
+ std::ofstream out(path, std::ios::binary | std::ios::trunc);
+ ASSERT_TRUE(out.is_open());
+ out << text;
+}
+
+} // namespace
+
+TEST(OverwriteDuplicates, DetectsIdenticalAndDifferentMatches)
+{
+ const fs::path base = fs::temp_directory_path() / "fluorine_overwrite_dup_test";
+ fs::remove_all(base);
+
+ const fs::path overwrite = base / "overwrite";
+ const fs::path modA = base / "ModA";
+ const fs::path modB = base / "ModB";
+
+ writeText(overwrite / "SKSE/Plugins/Identical.ini", "same\n");
+ writeText(overwrite / "SKSE/Plugins/Different.ini", "overwrite\n");
+ writeText(overwrite / "SKSE/Plugins/OnlyOverwrite.ini", "only overwrite\n");
+
+ writeText(modA / "SKSE/Plugins/Identical.ini", "same\n");
+ writeText(modA / "SKSE/Plugins/Different.ini", "mod a\n");
+ writeText(modB / "SKSE/Plugins/Different.ini", "mod b wins\n");
+
+ TrackedWrites tracker;
+ const std::vector<std::pair<std::string, std::string>> mods = {
+ {"ModA", modA.string()},
+ {"ModB", modB.string()},
+ };
+
+ const auto duplicates = tracker.scanOverwriteDuplicates(overwrite.string(), mods);
+ ASSERT_EQ(duplicates.size(), 2u);
+
+ const auto identical = std::find_if(
+ duplicates.begin(), duplicates.end(),
+ [](const TrackedWrites::DuplicateEntry& entry) {
+ return entry.relative_path == "SKSE/Plugins/Identical.ini";
+ });
+ ASSERT_NE(identical, duplicates.end());
+ EXPECT_EQ(identical->mod_name, "ModA");
+ EXPECT_EQ(identical->state, TrackedWrites::DuplicateState::Identical);
+
+ const auto different = std::find_if(
+ duplicates.begin(), duplicates.end(),
+ [](const TrackedWrites::DuplicateEntry& entry) {
+ return entry.relative_path == "SKSE/Plugins/Different.ini";
+ });
+ ASSERT_NE(different, duplicates.end());
+ EXPECT_EQ(different->mod_name, "ModB");
+ EXPECT_EQ(different->state, TrackedWrites::DuplicateState::Different);
+
+ fs::remove_all(base);
+}