summaryrefslogtreecommitdiffstats
path: root/document/src/tests
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahooinc.com>2023-08-22 13:41:47 +0000
committerGeir Storli <geirst@yahooinc.com>2023-08-22 13:41:47 +0000
commiteb5cf28c586205a1c60df31583252cf4d3a8a030 (patch)
tree3b43f5eb5946f3bf93879cd47ffc064ca26b6911 /document/src/tests
parent3ed739122e2bd5f029a7a68cfa99dafaa6ddefd5 (diff)
Add modify operation that creates non-existing sub-spaces with default cell values.
Diffstat (limited to 'document/src/tests')
-rw-r--r--document/src/tests/tensor_fieldvalue/partial_modify/partial_modify_test.cpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/document/src/tests/tensor_fieldvalue/partial_modify/partial_modify_test.cpp b/document/src/tests/tensor_fieldvalue/partial_modify/partial_modify_test.cpp
index 47ef9f21a27..bf0f893b901 100644
--- a/document/src/tests/tensor_fieldvalue/partial_modify/partial_modify_test.cpp
+++ b/document/src/tests/tensor_fieldvalue/partial_modify/partial_modify_test.cpp
@@ -60,12 +60,35 @@ Value::UP try_partial_modify(const TensorSpec &a, const TensorSpec &b, join_fun_
return TensorPartialUpdate::modify(*lhs, fun, *rhs, factory);
}
+Value::UP try_partial_modify_with_defaults(const TensorSpec &a, const TensorSpec &b, join_fun_t fun, double default_cell_value) {
+ const auto &factory = SimpleValueBuilderFactory::get();
+ auto lhs = value_from_spec(a, factory);
+ auto rhs = value_from_spec(b, factory);
+ return TensorPartialUpdate::modify_with_defaults(*lhs, fun, *rhs, default_cell_value, factory);
+}
+
TensorSpec perform_partial_modify(const TensorSpec &a, const TensorSpec &b, join_fun_t fun) {
auto up = try_partial_modify(a, b, fun);
EXPECT_TRUE(up);
return spec_from_value(*up);
}
+TensorSpec perform_partial_modify_with_defaults(const TensorSpec &a, const TensorSpec &b, join_fun_t fun, double default_cell_value) {
+ auto up = try_partial_modify_with_defaults(a, b, fun, default_cell_value);
+ EXPECT_TRUE(up);
+ return spec_from_value(*up);
+}
+
+void expect_modify_with_defaults(const vespalib::string& lhs_expr, const vespalib::string& rhs_expr,
+ join_fun_t fun, double default_cell_value, const vespalib::string& exp_expr) {
+ auto lhs = TensorSpec::from_expr(lhs_expr);
+ auto rhs = TensorSpec::from_expr(rhs_expr);
+ auto exp = TensorSpec::from_expr(exp_expr);
+ auto act = perform_partial_modify_with_defaults(lhs, rhs, fun, default_cell_value);
+ SCOPED_TRACE(fmt("\n===\nLHS: %s\nRHS: %s\n===\n", lhs.to_string().c_str(), rhs.to_string().c_str()));
+ EXPECT_EQ(exp, act);
+}
+
TEST(PartialModifyTest, partial_modify_works_for_simple_values) {
for (const auto &layouts: modify_layouts) {
for (auto lhs_ct: CellTypeUtils::list_types()) {
@@ -87,6 +110,27 @@ TEST(PartialModifyTest, partial_modify_works_for_simple_values) {
}
}
+TEST(PartialModifyTest, partial_modify_with_defauls) {
+ expect_modify_with_defaults("tensor(x{}):{{x:\"a\"}:1,{x:\"b\"}:2}",
+ "tensor(x{}):{{x:\"b\"}:3}",
+ operation::Add::f, 0.0,
+ "tensor(x{}):{{x:\"a\"}:1,{x:\"b\"}:5}");
+
+ expect_modify_with_defaults("tensor(x{}):{{x:\"a\"}:1,{x:\"b\"}:2}",
+ "tensor(x{}):{{x:\"b\"}:3,{x:\"c\"}:4}",
+ operation::Add::f, 0.0,
+ "tensor(x{}):{{x:\"a\"}:1,{x:\"b\"}:5,{x:\"c\"}:4}");
+
+ expect_modify_with_defaults("tensor(x{},y[3]):{{x:\"a\",y:0}:3,{x:\"a\",y:1}:4,{x:\"a\",y:2}:5}",
+ "tensor(x{},y{}):{{x:\"a\",y:\"0\"}:6,"
+ "{x:\"b\",y:\"1\"}:7,{x:\"b\",y:\"2\"}:8,"
+ "{x:\"c\",y:\"0\"}:9}",
+ operation::Add::f, 1.0,
+ "tensor(x{},y[3]):{{x:\"a\",y:0}:9,{x:\"a\",y:1}:4,{x:\"a\",y:2}:5,"
+ "{x:\"b\",y:0}:1,{x:\"b\",y:1}:8,{x:\"b\",y:2}:9,"
+ "{x:\"c\",y:0}:10,{x:\"c\",y:1}:1,{x:\"c\",y:2}:1}");
+}
+
std::vector<std::pair<vespalib::string,vespalib::string>> bad_layouts = {
{ "x3", "x3" },
{ "x3y4_1", "x3y4_1" },
@@ -108,4 +152,17 @@ TEST(PartialModifyTest, partial_modify_returns_nullptr_on_invalid_inputs) {
}
}
+TEST(PartialModifyTest, partial_modify_with_defaults_returns_nullptr_on_invalid_inputs) {
+ for (const auto &layouts: bad_layouts) {
+ TensorSpec lhs = GenSpec::from_desc(layouts.first).seq(N());
+ TensorSpec rhs = GenSpec::from_desc(layouts.second).seq(Div16(N()));
+ SCOPED_TRACE(fmt("\n===\nLHS: %s\nRHS: %s\n===\n", lhs.to_string().c_str(), rhs.to_string().c_str()));
+ for (auto fun: {operation::Add::f}) {
+ auto actual = try_partial_modify_with_defaults(lhs, rhs, fun, 0.0);
+ auto expect = Value::UP();
+ EXPECT_EQ(actual, expect);
+ }
+ }
+}
+
GTEST_MAIN_RUN_ALL_TESTS()