test(cpp): tests para sql_parse, process_state_machine, file_poll_diff

This commit is contained in:
2026-04-28 23:58:40 +02:00
parent 0cfaa27ee1
commit 4f280f34d7
5 changed files with 302 additions and 6 deletions
+105
View File
@@ -0,0 +1,105 @@
// Tests for fn_ui::file_poll_diff (cpp/functions/core/file_poll_diff).
// Pura: compara dos snapshots de FS y devuelve added/modified/removed.
#define CATCH_CONFIG_MAIN
#include "catch_amalgamated.hpp"
#include "core/file_poll_diff.h"
#include <algorithm>
#include <vector>
#include <string>
using fn_ui::file_poll_diff;
using fn_ui::FileEntry;
namespace {
// Helper: ordena los vectores para comparaciones estables (el orden interno
// depende del orden de iteracion de unordered_map, no es estable).
void sort_diff(fn_ui::FileDiff& d) {
std::sort(d.added.begin(), d.added.end());
std::sort(d.modified.begin(), d.modified.end());
std::sort(d.removed.begin(), d.removed.end());
}
}
TEST_CASE("file_poll_diff detects added/modified/removed") {
std::vector<FileEntry> before = {{"a", 10, 1}, {"b", 20, 2}, {"c", 30, 3}};
std::vector<FileEntry> after = {{"a", 10, 1}, {"b", 25, 2}, {"d", 40, 4}};
auto d = file_poll_diff(before, after);
sort_diff(d);
REQUIRE(d.added == std::vector<std::string>{"d"});
REQUIRE(d.modified == std::vector<std::string>{"b"});
REQUIRE(d.removed == std::vector<std::string>{"c"});
}
TEST_CASE("file_poll_diff: empty inputs") {
auto d = file_poll_diff({}, {});
REQUIRE(d.added.empty());
REQUIRE(d.modified.empty());
REQUIRE(d.removed.empty());
}
TEST_CASE("file_poll_diff: identical snapshots") {
std::vector<FileEntry> snap = {{"a", 1, 100}, {"b", 2, 200}};
auto d = file_poll_diff(snap, snap);
REQUIRE(d.added.empty());
REQUIRE(d.modified.empty());
REQUIRE(d.removed.empty());
}
TEST_CASE("file_poll_diff: all added (before vacio)") {
std::vector<FileEntry> after = {{"a", 1, 1}, {"b", 2, 2}};
auto d = file_poll_diff({}, after);
sort_diff(d);
REQUIRE(d.added == std::vector<std::string>{"a", "b"});
REQUIRE(d.modified.empty());
REQUIRE(d.removed.empty());
}
TEST_CASE("file_poll_diff: all removed (after vacio)") {
std::vector<FileEntry> before = {{"a", 1, 1}, {"b", 2, 2}};
auto d = file_poll_diff(before, {});
sort_diff(d);
REQUIRE(d.removed == std::vector<std::string>{"a", "b"});
REQUIRE(d.modified.empty());
REQUIRE(d.added.empty());
}
TEST_CASE("file_poll_diff: solo size cambia -> modified") {
std::vector<FileEntry> before = {{"a", 100, 5}};
std::vector<FileEntry> after = {{"a", 200, 5}};
auto d = file_poll_diff(before, after);
REQUIRE(d.modified == std::vector<std::string>{"a"});
REQUIRE(d.added.empty());
REQUIRE(d.removed.empty());
}
TEST_CASE("file_poll_diff: solo mtime cambia -> modified") {
std::vector<FileEntry> before = {{"a", 100, 5}};
std::vector<FileEntry> after = {{"a", 100, 9}};
auto d = file_poll_diff(before, after);
REQUIRE(d.modified == std::vector<std::string>{"a"});
REQUIRE(d.added.empty());
REQUIRE(d.removed.empty());
}
TEST_CASE("file_poll_diff: combinacion compleja") {
std::vector<FileEntry> before = {
{"keep", 10, 1},
{"mod_size", 20, 2},
{"mod_mtime", 30, 3},
{"removed", 40, 4},
};
std::vector<FileEntry> after = {
{"keep", 10, 1},
{"mod_size", 21, 2},
{"mod_mtime", 30, 9},
{"new", 50, 5},
};
auto d = file_poll_diff(before, after);
sort_diff(d);
REQUIRE(d.added == std::vector<std::string>{"new"});
REQUIRE(d.modified == std::vector<std::string>{"mod_mtime", "mod_size"});
REQUIRE(d.removed == std::vector<std::string>{"removed"});
}