Add VariableRef wrapper and variable reference collector

Just a wrapper around weark_ptr<Variable> to make tracking usage easier
This commit is contained in:
WarmUpTill
2026-10-19 17:45:55 +02:00
committed by WarmUpTill
parent 7e1acd8f61
commit 392aebff5c
5 changed files with 210 additions and 0 deletions

View File

@@ -1,6 +1,9 @@
#include "catch.hpp"
#include <variable-ref.hpp>
#include <variable.hpp>
#include <obs.hpp>
#include <thread>
TEST_CASE("Variable", "[variable]")
@@ -50,3 +53,70 @@ TEST_CASE("Variable", "[variable]")
variable.SetValue(123);
REQUIRE(*variable.GetSecondsSinceLastChange() > 0);
}
static std::shared_ptr<advss::Variable> addVariable(const std::string &name)
{
OBSDataAutoRelease data = obs_data_create();
obs_data_set_string(data, "name", name.c_str());
auto variable = std::make_shared<advss::Variable>();
variable->Load(data);
advss::GetVariables().emplace_back(variable);
return variable;
}
TEST_CASE("VariableRef", "[variable]")
{
auto var = addVariable("var");
addVariable("var2");
addVariable("Var");
SECTION("Save reports and writes name")
{
advss::VariableRefCollector collector;
advss::VariableRef ref(var);
OBSDataAutoRelease data = obs_data_create();
ref.Save(data, "key");
REQUIRE(std::string(obs_data_get_string(data, "key")) == "var");
REQUIRE(collector.Counts().at("var") == 1);
advss::VariableRef loaded;
loaded.Load(data, "key");
REQUIRE(loaded.lock() == var);
}
SECTION("Expired ref is not saved or reported")
{
advss::VariableRefCollector collector;
advss::VariableRef ref;
OBSDataAutoRelease data = obs_data_create();
ref.Save(data, "key");
REQUIRE_FALSE(obs_data_has_user_value(data, "key"));
REQUIRE(collector.Counts().empty());
}
SECTION("Text references")
{
advss::VariableRefCollector collector;
advss::ReportVariableRefsInText(
"${var} ${var2} ${var} var Var");
const auto &counts = collector.Counts();
REQUIRE(counts.at("var") == 2);
REQUIRE(counts.at("var2") == 1);
REQUIRE(counts.find("Var") == counts.end());
}
SECTION("Nested collectors")
{
advss::VariableRefCollector outer;
{
advss::VariableRefCollector inner;
advss::ReportVariableRef(var);
REQUIRE(inner.Counts().at("var") == 1);
}
REQUIRE(outer.Counts().empty());
advss::ReportVariableRef(var);
REQUIRE(outer.Counts().at("var") == 1);
}
advss::GetVariables().clear();
}