diff options
author | Paul Cristian Sarbu <paul.cristian.sarbu@huawei.com> | 2025-03-24 13:01:27 +0100 |
---|---|---|
committer | Paul Cristian Sarbu <paul.cristian.sarbu@huawei.com> | 2025-03-24 16:28:05 +0100 |
commit | 9284b926199efabb66fc1e39b11c2e054870ba61 (patch) | |
tree | bb82b8cb5f32c1be2b689baca5a6f1da81e05d52 /test | |
parent | 8064a0d3fb1badd17ad292284f7fff8a900157af (diff) | |
download | justbuild-9284b926199efabb66fc1e39b11c2e054870ba61.tar.gz |
Test 'zip_with' expression
Diffstat (limited to 'test')
-rw-r--r-- | test/buildtool/build_engine/expression/expression.test.cpp | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/test/buildtool/build_engine/expression/expression.test.cpp b/test/buildtool/build_engine/expression/expression.test.cpp index 6ba9bf0b..4afce50c 100644 --- a/test/buildtool/build_engine/expression/expression.test.cpp +++ b/test/buildtool/build_engine/expression/expression.test.cpp @@ -1620,6 +1620,123 @@ TEST_CASE("Expression Evaluation", "[expression]") { // NOLINT CHECK_FALSE(expr.Evaluate(env, fcts)); } + SECTION("zip_with expression") { + auto expr = Expression::FromJson(R"( + { "type": "zip_with" + , "var_1": "key" + , "var_2": "val" + , "body": { "type": "concat" + , "$1": { "type": "var" + , "name": "key" } + , "$2": { "type": "var" + , "name": "val" }}})"_json); + REQUIRE(expr); + + // ranges are missing (should default to empty list) + auto result = expr.Evaluate(env, fcts); + REQUIRE(result); + REQUIRE(result->IsList()); + CHECK(result == Expression::FromJson(R"([])"_json)); + + // one range is missing (should default to empty list) + expr = Add(expr, "range_1", Expression::FromJson(R"( + { "type": "'" + , "$1": [""]})"_json)); + REQUIRE(expr); + + result = expr.Evaluate(env, fcts); + REQUIRE(result); + REQUIRE(result->IsList()); + CHECK(result == Expression::FromJson(R"([])"_json)); + + // ranges are lists with one entry + expr = Replace(expr, "range_1", Expression::FromJson(R"( + { "type": "'" + , "$1": ["foo"]})"_json)); + expr = Add(expr, "range_2", Expression::FromJson(R"( + { "type": "'" + , "$1": ["bar"]})"_json)); + REQUIRE(expr); + + result = expr.Evaluate(env, fcts); + REQUIRE(result); + REQUIRE(result->IsList()); + CHECK(result == Expression::FromJson(R"(["foobar"])"_json)); + + // ranges are lists with multiple entries + expr = Replace(expr, "range_1", Expression::FromJson(R"( + { "type": "'" + , "$1": ["foo", "bar"]})"_json)); + expr = Replace(expr, "range_2", Expression::FromJson(R"( + { "type": "'" + , "$1": ["bar", "baz"]})"_json)); + REQUIRE(expr); + + result = expr.Evaluate(env, fcts); + REQUIRE(result); + REQUIRE(result->IsList()); + CHECK(result == Expression::FromJson(R"(["foobar", "barbaz"])"_json)); + + // ranges are lists with different sizes + expr = Replace(expr, "range_1", Expression::FromJson(R"( + { "type": "'" + , "$1": ["foo", "bar"]})"_json)); + expr = Replace(expr, "range_2", Expression::FromJson(R"( + { "type": "'" + , "$1": ["bar"]})"_json)); + REQUIRE(expr); + + result = expr.Evaluate(env, fcts); + REQUIRE(result); + REQUIRE(result->IsList()); + CHECK(result == Expression::FromJson(R"(["foobar"])"_json)); + + // fail if ranges are string + expr = Replace(expr, "range_1", Expression::FromJson(R"( + { "type": "'" + , "$1": [""]})"_json)); + expr = Replace(expr, "range_2", Expression::FromJson(R"("foo")"_json)); + REQUIRE(expr); + CHECK_FALSE(expr.Evaluate(env, fcts)); + + expr = Replace(expr, "range_2", Expression::FromJson(R"( + { "type": "'" + , "$1": [""]})"_json)); + expr = Replace(expr, "range_1", Expression::FromJson(R"("foo")"_json)); + REQUIRE(expr); + CHECK_FALSE(expr.Evaluate(env, fcts)); + + // fail if ranges are number + expr = Replace(expr, "range_1", Expression::FromJson(R"( + { "type": "'" + , "$1": [""]})"_json)); + expr = Replace(expr, "range_2", Expression::FromJson(R"("4711")"_json)); + REQUIRE(expr); + CHECK_FALSE(expr.Evaluate(env, fcts)); + + expr = Replace(expr, "range_2", Expression::FromJson(R"( + { "type": "'" + , "$1": [""]})"_json)); + expr = Replace(expr, "range_1", Expression::FromJson(R"("4711")"_json)); + REQUIRE(expr); + CHECK_FALSE(expr.Evaluate(env, fcts)); + + // fail if ranges are Boolean + expr = Replace(expr, "range_1", Expression::FromJson(R"( + { "type": "'" + , "$1": [""]})"_json)); + expr = Replace(expr, "range_2", Expression::FromJson(R"("true")"_json)); + REQUIRE(expr); + CHECK_FALSE(expr.Evaluate(env, fcts)); + + expr = Replace(expr, "range_2", Expression::FromJson(R"( + { "type": "'" + , "$1": [""]})"_json)); + expr = Replace(expr, "range_1", Expression::FromJson(R"("true")"_json)); + REQUIRE(expr); + CHECK_FALSE(expr.Evaluate(env, fcts)); + } + SECTION("foldl expression") { auto expr = Expression::FromJson(R"( { "type": "foldl" |