diff options
| author | SulfurNitride <SulfurNitride@users.noreply.github.com> | 2026-05-23 09:59:01 -0500 |
|---|---|---|
| committer | SulfurNitride <SulfurNitride@users.noreply.github.com> | 2026-05-23 09:59:01 -0500 |
| commit | 7f0ded9e4a6e11b5e0327dd8eb76dd5945b8693d (patch) | |
| tree | bfbc73c5c4c9f6cc5f196129fe8e0b583ebee639 /src/tests | |
| parent | b796e336c4795f5c208368aa09b178d905f46173 (diff) | |
prefix: align dependency setup and VFS fixes
Diffstat (limited to 'src/tests')
| -rw-r--r-- | src/tests/CMakeLists.txt | 23 | ||||
| -rw-r--r-- | src/tests/test_overwrite_duplicates.cpp | 71 |
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); +} |
