From 94b90a2cb0b4a0e13018cd5ebbf09394abf3b96b Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Tue, 28 Apr 2026 18:10:25 +0100 Subject: config/lua: add ExpressionVec2, allow using a table for vec2 rules (#14197) --- tests/config/lua/ConfigValueTypes.cpp | 53 +++++++++++++++++++++++++++++++++++ tests/helpers/Expression.cpp | 11 ++++++++ 2 files changed, 64 insertions(+) (limited to 'tests') diff --git a/tests/config/lua/ConfigValueTypes.cpp b/tests/config/lua/ConfigValueTypes.cpp index 90e97520..76de98bf 100644 --- a/tests/config/lua/ConfigValueTypes.cpp +++ b/tests/config/lua/ConfigValueTypes.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -49,6 +50,14 @@ namespace { lua_pushnumber(L, y); lua_rawseti(L, -2, 2); } + + void pushExpressionVec2Table(lua_State* L, const char* x, const char* y) { + lua_createtable(L, 2, 2); + lua_pushstring(L, x); + lua_rawseti(L, -2, 1); + lua_pushstring(L, y); + lua_rawseti(L, -2, 2); + } } TEST(ConfigLuaValueTypes, boolParseAndReset) { @@ -234,6 +243,50 @@ TEST(ConfigLuaValueTypes, vec2ParseValidateAndPush) { EXPECT_EQ(err.errorCode, PARSE_ERROR_BAD_VALUE); } +TEST(ConfigLuaValueTypes, expressionVec2AcceptsStringNumberAndTableForms) { + CLuaState S; + const auto L = S.get(); + + CLuaConfigExpressionVec2 value; + + lua_pushstring(L, "monitor_w*0.5 monitor_h*0.25"); + auto err = value.parse(L); + lua_pop(L, 1); + EXPECT_EQ(err.errorCode, PARSE_ERROR_OK); + EXPECT_EQ(value.parsed().x, "monitor_w*0.5"); + EXPECT_EQ(value.parsed().y, "monitor_h*0.25"); + + pushVec2Table(L, 150, 200); + err = value.parse(L); + lua_pop(L, 1); + EXPECT_EQ(err.errorCode, PARSE_ERROR_OK); + EXPECT_EQ(value.parsed().x, "150"); + EXPECT_EQ(value.parsed().y, "200"); + + pushExpressionVec2Table(L, "monitor_h * 0.5", "monitor_h * 0.25"); + err = value.parse(L); + lua_pop(L, 1); + EXPECT_EQ(err.errorCode, PARSE_ERROR_OK); + EXPECT_EQ(value.parsed().x, "monitor_h * 0.5"); + EXPECT_EQ(value.parsed().y, "monitor_h * 0.25"); + + value.push(L); + ASSERT_TRUE(lua_istable(L, -1)); + lua_rawgeti(L, -1, 1); + EXPECT_STREQ(lua_tostring(L, -1), "monitor_h * 0.5"); + lua_pop(L, 1); + lua_getfield(L, -1, "y"); + EXPECT_STREQ(lua_tostring(L, -1), "monitor_h * 0.25"); + lua_pop(L, 2); + + lua_createtable(L, 1, 0); + lua_pushnumber(L, 1); + lua_rawseti(L, -2, 1); + err = value.parse(L); + lua_pop(L, 1); + EXPECT_EQ(err.errorCode, PARSE_ERROR_BAD_VALUE); +} + TEST(ConfigLuaValueTypes, cssGapParseFormsAndRange) { CLuaState S; const auto L = S.get(); diff --git a/tests/helpers/Expression.cpp b/tests/helpers/Expression.cpp index 8db67776..6b0d1873 100644 --- a/tests/helpers/Expression.cpp +++ b/tests/helpers/Expression.cpp @@ -65,3 +65,14 @@ TEST(Helpers, expressionZero) { EXPECT_DOUBLE_EQ(expr.compute("0 * 999").value(), 0.0); EXPECT_DOUBLE_EQ(expr.compute("5 - 5").value(), 0.0); } + +TEST(Helpers, expressionVec2ParsesLegacyString) { + auto parsed = parseExpressionVec2("monitor_w*0.5 monitor_h*0.25"); + ASSERT_TRUE(parsed.has_value()) << parsed.error(); + + EXPECT_EQ(parsed->x, "monitor_w*0.5"); + EXPECT_EQ(parsed->y, "monitor_h*0.25"); + EXPECT_EQ(parsed->toString(), "monitor_w*0.5 monitor_h*0.25"); + + EXPECT_FALSE(parseExpressionVec2("monitor_w*0.5").has_value()); +} -- cgit v1.2.3