summaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/rankingexpression
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2017-08-18 13:20:55 +0000
committerHåvard Pettersen <havardpe@oath.com>2017-08-18 13:20:55 +0000
commit7e2a1be454585fea1f59ad921419e8dd389f4ba8 (patch)
tree783d2fd5742b9c54a26e1cd80dc319ebfbb37685 /searchlib/src/tests/rankingexpression
parente303676db9689853dd205989a553dbd035e467d1 (diff)
added test for intrinsic blueprint adapter
Diffstat (limited to 'searchlib/src/tests/rankingexpression')
-rw-r--r--searchlib/src/tests/rankingexpression/intrinsic_blueprint_adapter/CMakeLists.txt8
-rw-r--r--searchlib/src/tests/rankingexpression/intrinsic_blueprint_adapter/intrinsic_blueprint_adapter_test.cpp116
2 files changed, 124 insertions, 0 deletions
diff --git a/searchlib/src/tests/rankingexpression/intrinsic_blueprint_adapter/CMakeLists.txt b/searchlib/src/tests/rankingexpression/intrinsic_blueprint_adapter/CMakeLists.txt
new file mode 100644
index 00000000000..d8d6ebe0504
--- /dev/null
+++ b/searchlib/src/tests/rankingexpression/intrinsic_blueprint_adapter/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(searchlib_intrinsic_blueprint_adapter_test_app TEST
+ SOURCES
+ intrinsic_blueprint_adapter_test.cpp
+ DEPENDS
+ searchlib
+)
+vespa_add_test(NAME searchlib_intrinsic_blueprint_adapter_test_app COMMAND searchlib_intrinsic_blueprint_adapter_test_app)
diff --git a/searchlib/src/tests/rankingexpression/intrinsic_blueprint_adapter/intrinsic_blueprint_adapter_test.cpp b/searchlib/src/tests/rankingexpression/intrinsic_blueprint_adapter/intrinsic_blueprint_adapter_test.cpp
new file mode 100644
index 00000000000..b10da86dd8c
--- /dev/null
+++ b/searchlib/src/tests/rankingexpression/intrinsic_blueprint_adapter/intrinsic_blueprint_adapter_test.cpp
@@ -0,0 +1,116 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/test_kit.h>
+
+#include <vespa/searchlib/fef/blueprint.h>
+#include <vespa/searchlib/features/rankingexpression/intrinsic_blueprint_adapter.h>
+#include <vespa/searchlib/fef/test/indexenvironment.h>
+#include <vespa/searchlib/fef/test/queryenvironment.h>
+#include <set>
+
+using namespace search::features::rankingexpression;
+using namespace search::fef::test;
+using namespace search::fef;
+using vespalib::Stash;
+using vespalib::eval::ValueType;
+
+vespalib::string fail_setup = "fail_setup";
+vespalib::string extra_input = "extra_input";
+vespalib::string extra_output = "extra_output";
+vespalib::string no_output = "no_output";
+vespalib::string object_result = "object_result";
+vespalib::string error_result = "error_result";
+
+struct MyExecutor : FeatureExecutor {
+ void execute(uint32_t) override {}
+};
+
+struct MyBlueprint : Blueprint {
+ std::set<vespalib::string> flags;
+ MyBlueprint() : Blueprint("my_bp"), flags() {}
+ MyBlueprint(const std::set<vespalib::string> &flags_in) : Blueprint("my_bp"), flags(flags_in) {}
+ void set(const vespalib::string &flag) { flags.insert(flag); }
+ bool is_set(const vespalib::string &flag) const { return (flags.count(flag) > 0); }
+ void visitDumpFeatures(const IIndexEnvironment &, IDumpFeatureVisitor &) const override {}
+ Blueprint::UP createInstance() const override { return std::make_unique<MyBlueprint>(flags); }
+ bool setup(const IIndexEnvironment &, const std::vector<vespalib::string> &params) override {
+ EXPECT_EQUAL(getName(), "my_bp(foo,bar)");
+ ASSERT_TRUE(params.size() == 2);
+ EXPECT_EQUAL(params[0], "foo");
+ EXPECT_EQUAL(params[1], "bar");
+ if (is_set(extra_input)) {
+ defineInput("my_input", AcceptInput::ANY);
+ }
+ if (!is_set(no_output)) {
+ if (is_set(error_result)) {
+ describeOutput("out", "my output", FeatureType::object(ValueType::error_type()));
+ } else {
+ if (is_set(object_result)) {
+ describeOutput("out", "my output", FeatureType::object(ValueType::double_type()));
+ } else {
+ describeOutput("out", "my output", FeatureType::number());
+ }
+ }
+ if (is_set(extra_output)) {
+ describeOutput("extra", "my extra output", FeatureType::number());
+ }
+ }
+ return !is_set(fail_setup);
+ }
+ FeatureExecutor &createExecutor(const IQueryEnvironment &, vespalib::Stash &stash) const override {
+ return stash.create<MyExecutor>();
+ }
+};
+
+struct Fixture {
+ Stash stash;
+ IndexEnvironment idx_env;
+ QueryEnvironment query_env;
+ MyBlueprint blueprint;
+ Fixture() : stash(), idx_env(), query_env(&idx_env), blueprint() {}
+ IntrinsicExpression::UP create() const {
+ return IntrinsicBlueprintAdapter::try_create(blueprint, idx_env, {"foo", "bar"});
+ }
+};
+
+TEST_F("require that blueprints can be used for intrinsic expressions", Fixture()) {
+ auto expression = f1.create();
+ ASSERT_TRUE(bool(expression));
+ EXPECT_TRUE(!expression->result_type().is_object());
+ auto &executor = expression->create_executor(f1.query_env, f1.stash);
+ EXPECT_TRUE(dynamic_cast<MyExecutor*>(&executor) != nullptr);
+}
+
+TEST_F("require that result type is propagated for intrinsic blueprints", Fixture()) {
+ f1.blueprint.set(object_result);
+ auto expression = f1.create();
+ ASSERT_TRUE(bool(expression));
+ EXPECT_TRUE(expression->result_type().is_object());
+ EXPECT_TRUE(expression->result_type().type().is_double());
+}
+
+TEST_F("require that intrinsic blueprint adaption fails if blueprint setup fails", Fixture()) {
+ f1.blueprint.set(fail_setup);
+ EXPECT_TRUE(f1.create().get() == nullptr);
+}
+
+TEST_F("require that intrinsic blueprint adaption fails if blueprint has inputs", Fixture()) {
+ f1.blueprint.set(extra_input);
+ EXPECT_TRUE(f1.create().get() == nullptr);
+}
+
+TEST_F("require that intrinsic blueprint adaption fails if blueprint has more than one output", Fixture()) {
+ f1.blueprint.set(extra_output);
+ EXPECT_TRUE(f1.create().get() == nullptr);
+}
+
+TEST_F("require that intrinsic blueprint adaption fails if blueprint has no result", Fixture()) {
+ f1.blueprint.set(no_output);
+ EXPECT_TRUE(f1.create().get() == nullptr);
+}
+
+TEST_F("require that intrinsic blueprint adaption fails if blueprint has error typed output", Fixture()) {
+ f1.blueprint.set(error_result);
+ EXPECT_TRUE(f1.create().get() == nullptr);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }