diff options
author | Paul Cristian Sarbu <paul.cristian.sarbu@huawei.com> | 2025-03-24 15:44:11 +0100 |
---|---|---|
committer | Paul Cristian Sarbu <paul.cristian.sarbu@huawei.com> | 2025-03-24 16:28:51 +0100 |
commit | c39bac9d573f9692cd67ba79c1192f2554c7385d (patch) | |
tree | d94518554890b9e22c0cf528e82ba97637e1974b /test/buildtool/build_engine | |
parent | ed2a48615e568a59409fc0dd7d7341d27af896ca (diff) | |
download | justbuild-c39bac9d573f9692cd67ba79c1192f2554c7385d.tar.gz |
Test 'zip_map' expression
Diffstat (limited to 'test/buildtool/build_engine')
-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 4afce50c..c16ffe97 100644 --- a/test/buildtool/build_engine/expression/expression.test.cpp +++ b/test/buildtool/build_engine/expression/expression.test.cpp @@ -1737,6 +1737,123 @@ TEST_CASE("Expression Evaluation", "[expression]") { // NOLINT CHECK_FALSE(expr.Evaluate(env, fcts)); } + SECTION("zip_map expression") { + auto expr = Expression::FromJson(R"( + { "type": "zip_map" })"_json); + REQUIRE(expr); + + // ranges are missing (should default to empty map) + auto result = expr.Evaluate(env, fcts); + REQUIRE(result); + REQUIRE(result->IsMap()); + CHECK(result == Expression::FromJson(R"({})"_json)); + + // one range is missing (should default to empty map) + expr = Add(expr, "range_key", Expression::FromJson(R"( + { "type": "'" + , "$1": [""]})"_json)); + REQUIRE(expr); + + result = expr.Evaluate(env, fcts); + REQUIRE(result); + REQUIRE(result->IsMap()); + CHECK(result == Expression::FromJson(R"({})"_json)); + + // ranges are lists with one entry + expr = Replace(expr, "range_key", Expression::FromJson(R"( + { "type": "'" + , "$1": ["foo"]})"_json)); + expr = Add(expr, "range_val", Expression::FromJson(R"( + { "type": "'" + , "$1": ["bar"]})"_json)); + REQUIRE(expr); + + result = expr.Evaluate(env, fcts); + REQUIRE(result); + REQUIRE(result->IsMap()); + CHECK(result == Expression::FromJson(R"({"foo" : "bar"})"_json)); + + // ranges are lists with multiple entries + expr = Replace(expr, "range_key", Expression::FromJson(R"( + { "type": "'" + , "$1": ["foo", "bar"]})"_json)); + expr = Replace(expr, "range_val", Expression::FromJson(R"( + { "type": "'" + , "$1": ["bar", "baz"]})"_json)); + REQUIRE(expr); + + result = expr.Evaluate(env, fcts); + REQUIRE(result); + REQUIRE(result->IsMap()); + CHECK(result == + Expression::FromJson(R"({"bar": "baz", "foo": "bar"})"_json)); + + // ranges are lists with different sizes + expr = Replace(expr, "range_key", Expression::FromJson(R"( + { "type": "'" + , "$1": ["foo", "bar"]})"_json)); + expr = Replace(expr, "range_val", Expression::FromJson(R"( + { "type": "'" + , "$1": ["bar"]})"_json)); + REQUIRE(expr); + + result = expr.Evaluate(env, fcts); + REQUIRE(result); + REQUIRE(result->IsMap()); + CHECK(result == Expression::FromJson(R"({"foo": "bar"})"_json)); + + // fail if ranges are string + expr = Replace(expr, "range_key", Expression::FromJson(R"( + { "type": "'" + , "$1": [""]})"_json)); + expr = + Replace(expr, "range_val", Expression::FromJson(R"("foo")"_json)); + REQUIRE(expr); + CHECK_FALSE(expr.Evaluate(env, fcts)); + + expr = Replace(expr, "range_val", Expression::FromJson(R"( + { "type": "'" + , "$1": [""]})"_json)); + expr = + Replace(expr, "range_key", Expression::FromJson(R"("foo")"_json)); + REQUIRE(expr); + CHECK_FALSE(expr.Evaluate(env, fcts)); + + // fail if ranges are number + expr = Replace(expr, "range_key", Expression::FromJson(R"( + { "type": "'" + , "$1": [""]})"_json)); + expr = + Replace(expr, "range_val", Expression::FromJson(R"("4711")"_json)); + REQUIRE(expr); + CHECK_FALSE(expr.Evaluate(env, fcts)); + + expr = Replace(expr, "range_val", Expression::FromJson(R"( + { "type": "'" + , "$1": [""]})"_json)); + expr = + Replace(expr, "range_key", Expression::FromJson(R"("4711")"_json)); + REQUIRE(expr); + CHECK_FALSE(expr.Evaluate(env, fcts)); + + // fail if ranges are Boolean + expr = Replace(expr, "range_key", Expression::FromJson(R"( + { "type": "'" + , "$1": [""]})"_json)); + expr = + Replace(expr, "range_val", Expression::FromJson(R"("true")"_json)); + REQUIRE(expr); + CHECK_FALSE(expr.Evaluate(env, fcts)); + + expr = Replace(expr, "range_val", Expression::FromJson(R"( + { "type": "'" + , "$1": [""]})"_json)); + expr = + Replace(expr, "range_key", Expression::FromJson(R"("true")"_json)); + REQUIRE(expr); + CHECK_FALSE(expr.Evaluate(env, fcts)); + } + SECTION("foldl expression") { auto expr = Expression::FromJson(R"( { "type": "foldl" |