SceneSwitcher/tests/test-macro-condition-file.cpp
WarmUpTill 7e2ef9aacc
Some checks failed
debian-build / build (push) Has been cancelled
Check locale / ubuntu64 (push) Has been cancelled
Push to master / Check Formatting 🔍 (push) Has been cancelled
Push to master / Build Project 🧱 (push) Has been cancelled
Push to master / Create Release 🛫 (push) Has been cancelled
Add tests for "File" condition
2026-04-01 11:13:01 +02:00

326 lines
8.9 KiB
C++

#include "catch.hpp"
#include "macro-condition-file.hpp"
#include <QDateTime>
#include <QFile>
#include <QFileDevice>
#include <QTemporaryDir>
#include <QTextStream>
using advss::MacroConditionFile;
// Write (or overwrite) a file with the given content.
static void writeFile(const QString &path, const QString &content)
{
QFile f(path);
f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate);
QTextStream(&f) << content;
}
// ---------------------------------------------------------------------------
// CONTENT_CHANGE
// ---------------------------------------------------------------------------
TEST_CASE("CONTENT_CHANGE: first check does not trigger for non-empty file",
"[macro-condition-file]")
{
QTemporaryDir dir;
QString path = dir.filePath("test.txt");
writeFile(path, "hello world");
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::CONTENT_CHANGE);
cond._file = path.toStdString();
REQUIRE_FALSE(cond.CheckCondition());
}
TEST_CASE("CONTENT_CHANGE: first check does not trigger for empty file",
"[macro-condition-file]")
{
QTemporaryDir dir;
QString path = dir.filePath("test.txt");
writeFile(path, "");
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::CONTENT_CHANGE);
cond._file = path.toStdString();
REQUIRE_FALSE(cond.CheckCondition());
}
TEST_CASE("CONTENT_CHANGE: no trigger when content stays the same",
"[macro-condition-file]")
{
QTemporaryDir dir;
QString path = dir.filePath("test.txt");
writeFile(path, "same content");
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::CONTENT_CHANGE);
cond._file = path.toStdString();
cond.CheckCondition(); // baseline
REQUIRE_FALSE(cond.CheckCondition());
}
TEST_CASE("CONTENT_CHANGE: triggers when content changes",
"[macro-condition-file]")
{
QTemporaryDir dir;
QString path = dir.filePath("test.txt");
writeFile(path, "initial");
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::CONTENT_CHANGE);
cond._file = path.toStdString();
cond.CheckCondition(); // baseline
writeFile(path, "changed");
REQUIRE(cond.CheckCondition());
}
TEST_CASE("CONTENT_CHANGE: no trigger after content stabilizes",
"[macro-condition-file]")
{
QTemporaryDir dir;
QString path = dir.filePath("test.txt");
writeFile(path, "initial");
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::CONTENT_CHANGE);
cond._file = path.toStdString();
cond.CheckCondition(); // baseline
writeFile(path, "changed");
cond.CheckCondition(); // change detected
REQUIRE_FALSE(cond.CheckCondition()); // same content again
}
TEST_CASE("CONTENT_CHANGE: returns false when file cannot be opened",
"[macro-condition-file]")
{
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::CONTENT_CHANGE);
cond._file = "/nonexistent/path/to/file.txt";
REQUIRE_FALSE(cond.CheckCondition());
}
// ---------------------------------------------------------------------------
// DATE_CHANGE
// ---------------------------------------------------------------------------
TEST_CASE("DATE_CHANGE: first check does not trigger", "[macro-condition-file]")
{
QTemporaryDir dir;
QString path = dir.filePath("test.txt");
writeFile(path, "content");
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::DATE_CHANGE);
cond._file = path.toStdString();
REQUIRE_FALSE(cond.CheckCondition());
}
TEST_CASE("DATE_CHANGE: no trigger when modification date stays the same",
"[macro-condition-file]")
{
QTemporaryDir dir;
QString path = dir.filePath("test.txt");
writeFile(path, "content");
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::DATE_CHANGE);
cond._file = path.toStdString();
cond.CheckCondition(); // baseline
REQUIRE_FALSE(cond.CheckCondition());
}
TEST_CASE("DATE_CHANGE: triggers when modification date changes",
"[macro-condition-file]")
{
QTemporaryDir dir;
QString path = dir.filePath("test.txt");
writeFile(path, "content");
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::DATE_CHANGE);
cond._file = path.toStdString();
cond.CheckCondition(); // baseline
// Explicitly set the modification time to a known future value so the
// test is not sensitive to filesystem mtime resolution.
QFile f(path);
f.open(QIODevice::ReadWrite);
f.setFileTime(QDateTime::currentDateTime().addSecs(10),
QFileDevice::FileModificationTime);
f.close();
REQUIRE(cond.CheckCondition());
}
// ---------------------------------------------------------------------------
// MATCH
// ---------------------------------------------------------------------------
TEST_CASE("MATCH: returns true when file content matches text",
"[macro-condition-file]")
{
QTemporaryDir dir;
QString path = dir.filePath("test.txt");
writeFile(path, "hello");
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::MATCH);
cond._file = path.toStdString();
cond._text = "hello";
REQUIRE(cond.CheckCondition());
}
TEST_CASE("MATCH: returns false when file content does not match text",
"[macro-condition-file]")
{
QTemporaryDir dir;
QString path = dir.filePath("test.txt");
writeFile(path, "hello");
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::MATCH);
cond._file = path.toStdString();
cond._text = "world";
REQUIRE_FALSE(cond.CheckCondition());
}
TEST_CASE("MATCH: returns false when file cannot be opened",
"[macro-condition-file]")
{
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::MATCH);
cond._file = "/nonexistent/path/to/file.txt";
cond._text = "anything";
REQUIRE_FALSE(cond.CheckCondition());
}
TEST_CASE("MATCH: regex enabled matches file content against pattern",
"[macro-condition-file]")
{
QTemporaryDir dir;
QString path = dir.filePath("test.txt");
writeFile(path, "hello world");
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::MATCH);
cond._file = path.toStdString();
cond._text = "h.*d"; // matches "hello world" as a regex
cond._regex.SetEnabled(true);
REQUIRE(cond.CheckCondition());
}
TEST_CASE("MATCH: regex disabled treats pattern as literal text",
"[macro-condition-file]")
{
QTemporaryDir dir;
QString path = dir.filePath("test.txt");
writeFile(path, "hello world");
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::MATCH);
cond._file = path.toStdString();
cond._text = "h.*d"; // does not literally appear in "hello world"
cond._regex.SetEnabled(false);
REQUIRE_FALSE(cond.CheckCondition());
}
// ---------------------------------------------------------------------------
// EXISTS
// ---------------------------------------------------------------------------
TEST_CASE("EXISTS: returns true for an existing file", "[macro-condition-file]")
{
QTemporaryDir dir;
QString path = dir.filePath("test.txt");
writeFile(path, "");
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::EXISTS);
cond._file = path.toStdString();
REQUIRE(cond.CheckCondition());
}
TEST_CASE("EXISTS: returns false for a non-existing path",
"[macro-condition-file]")
{
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::EXISTS);
cond._file = "/nonexistent/path/to/file.txt";
REQUIRE_FALSE(cond.CheckCondition());
}
// ---------------------------------------------------------------------------
// IS_FILE
// ---------------------------------------------------------------------------
TEST_CASE("IS_FILE: returns true for a regular file", "[macro-condition-file]")
{
QTemporaryDir dir;
QString path = dir.filePath("test.txt");
writeFile(path, "");
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::IS_FILE);
cond._file = path.toStdString();
REQUIRE(cond.CheckCondition());
}
TEST_CASE("IS_FILE: returns false for a directory", "[macro-condition-file]")
{
QTemporaryDir dir;
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::IS_FILE);
cond._file = dir.path().toStdString();
REQUIRE_FALSE(cond.CheckCondition());
}
// ---------------------------------------------------------------------------
// IS_FOLDER
// ---------------------------------------------------------------------------
TEST_CASE("IS_FOLDER: returns true for a directory", "[macro-condition-file]")
{
QTemporaryDir dir;
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::IS_FOLDER);
cond._file = dir.path().toStdString();
REQUIRE(cond.CheckCondition());
}
TEST_CASE("IS_FOLDER: returns false for a regular file",
"[macro-condition-file]")
{
QTemporaryDir dir;
QString path = dir.filePath("test.txt");
writeFile(path, "");
MacroConditionFile cond(nullptr);
cond.SetCondition(MacroConditionFile::Condition::IS_FOLDER);
cond._file = path.toStdString();
REQUIRE_FALSE(cond.CheckCondition());
}