summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorPaul Cristian Sarbu <paul.cristian.sarbu@huawei.com>2025-03-24 13:01:27 +0100
committerPaul Cristian Sarbu <paul.cristian.sarbu@huawei.com>2025-03-24 16:28:05 +0100
commit9284b926199efabb66fc1e39b11c2e054870ba61 (patch)
treebb82b8cb5f32c1be2b689baca5a6f1da81e05d52 /test
parent8064a0d3fb1badd17ad292284f7fff8a900157af (diff)
downloadjustbuild-9284b926199efabb66fc1e39b11c2e054870ba61.tar.gz
Test 'zip_with' expression
Diffstat (limited to 'test')
-rw-r--r--test/buildtool/build_engine/expression/expression.test.cpp117
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"