diff options
Diffstat (limited to 'searchlib')
30 files changed, 408 insertions, 370 deletions
diff --git a/searchlib/src/tests/features/CMakeLists.txt b/searchlib/src/tests/features/CMakeLists.txt index 9d2ed02f5dd..ea2410734b5 100644 --- a/searchlib/src/tests/features/CMakeLists.txt +++ b/searchlib/src/tests/features/CMakeLists.txt @@ -17,5 +17,6 @@ vespa_add_executable(searchlib_featurebenchmark_app featurebenchmark.cpp DEPENDS searchlib + searchlib_test ) vespa_add_test(NAME searchlib_featurebenchmark_app COMMAND searchlib_featurebenchmark_app BENCHMARK) diff --git a/searchlib/src/tests/features/beta/CMakeLists.txt b/searchlib/src/tests/features/beta/CMakeLists.txt index 543982c549c..db45f02d898 100644 --- a/searchlib/src/tests/features/beta/CMakeLists.txt +++ b/searchlib/src/tests/features/beta/CMakeLists.txt @@ -4,6 +4,7 @@ vespa_add_executable(searchlib_beta_features_test_app TEST beta_features_test.cpp DEPENDS searchlib + searchlib_test ) vespa_add_test( NAME searchlib_beta_features_test_app diff --git a/searchlib/src/tests/features/beta/beta_features_test.cpp b/searchlib/src/tests/features/beta/beta_features_test.cpp index e0f57a6cad1..8413cfde47f 100644 --- a/searchlib/src/tests/features/beta/beta_features_test.cpp +++ b/searchlib/src/tests/features/beta/beta_features_test.cpp @@ -14,7 +14,7 @@ #include <vespa/searchlib/features/utils.h> #include <vespa/searchlib/fef/test/plugin/setup.h> #include <vespa/vespalib/util/rand48.h> -#include <vespa/searchlib/fef/test/ftlib.h> +#include <vespa/searchlib/test/ft_test_app.h> #include <vespa/vespalib/util/stringfmt.h> using namespace search::features; diff --git a/searchlib/src/tests/features/bm25/bm25_test.cpp b/searchlib/src/tests/features/bm25/bm25_test.cpp index 8abd3d104b9..233c0ec09f3 100644 --- a/searchlib/src/tests/features/bm25/bm25_test.cpp +++ b/searchlib/src/tests/features/bm25/bm25_test.cpp @@ -4,9 +4,9 @@ #include <vespa/searchlib/features/setup.h> #include <vespa/searchlib/fef/blueprintfactory.h> #include <vespa/searchlib/fef/test/dummy_dependency_handler.h> -#include <vespa/searchlib/fef/test/ftlib.h> #include <vespa/searchlib/fef/test/indexenvironment.h> #include <vespa/searchlib/fef/test/indexenvironmentbuilder.h> +#include <vespa/searchlib/test/ft_test_app.h> #include <vespa/vespalib/gtest/gtest.h> using namespace search::features; diff --git a/searchlib/src/tests/features/element_completeness/CMakeLists.txt b/searchlib/src/tests/features/element_completeness/CMakeLists.txt index 327bb691819..046b061b884 100644 --- a/searchlib/src/tests/features/element_completeness/CMakeLists.txt +++ b/searchlib/src/tests/features/element_completeness/CMakeLists.txt @@ -4,5 +4,6 @@ vespa_add_executable(searchlib_element_completeness_test_app TEST element_completeness_test.cpp DEPENDS searchlib + searchlib_test ) vespa_add_test(NAME searchlib_element_completeness_test_app COMMAND searchlib_element_completeness_test_app) diff --git a/searchlib/src/tests/features/element_completeness/element_completeness_test.cpp b/searchlib/src/tests/features/element_completeness/element_completeness_test.cpp index 3b2a5035d1a..ff210035502 100644 --- a/searchlib/src/tests/features/element_completeness/element_completeness_test.cpp +++ b/searchlib/src/tests/features/element_completeness/element_completeness_test.cpp @@ -5,8 +5,8 @@ #include <vespa/searchlib/fef/test/indexenvironmentbuilder.h> #include <vespa/searchlib/fef/test/queryenvironment.h> #include <vespa/searchlib/features/element_completeness_feature.h> -#include <vespa/searchlib/fef/test/ftlib.h> #include <vespa/searchlib/fef/test/dummy_dependency_handler.h> +#include <vespa/searchlib/test/ft_test_app.h> #include <vespa/vespalib/util/stringfmt.h> using namespace search::fef; diff --git a/searchlib/src/tests/features/element_similarity_feature/CMakeLists.txt b/searchlib/src/tests/features/element_similarity_feature/CMakeLists.txt index 921e4bab04e..748556b0fcd 100644 --- a/searchlib/src/tests/features/element_similarity_feature/CMakeLists.txt +++ b/searchlib/src/tests/features/element_similarity_feature/CMakeLists.txt @@ -4,5 +4,6 @@ vespa_add_executable(searchlib_element_similarity_feature_test_app TEST element_similarity_feature_test.cpp DEPENDS searchlib + searchlib_test ) vespa_add_test(NAME searchlib_element_similarity_feature_test_app COMMAND searchlib_element_similarity_feature_test_app) diff --git a/searchlib/src/tests/features/element_similarity_feature/element_similarity_feature_test.cpp b/searchlib/src/tests/features/element_similarity_feature/element_similarity_feature_test.cpp index 3aedb3c51ed..1eda660d2ec 100644 --- a/searchlib/src/tests/features/element_similarity_feature/element_similarity_feature_test.cpp +++ b/searchlib/src/tests/features/element_similarity_feature/element_similarity_feature_test.cpp @@ -5,7 +5,7 @@ #include <vespa/searchlib/fef/test/indexenvironmentbuilder.h> #include <vespa/searchlib/fef/test/queryenvironment.h> #include <vespa/searchlib/features/element_similarity_feature.h> -#include <vespa/searchlib/fef/test/ftlib.h> +#include <vespa/searchlib/test/ft_test_app.h> #include <initializer_list> #include <vespa/searchlib/fef/test/dummy_dependency_handler.h> #include <vespa/vespalib/util/stringfmt.h> diff --git a/searchlib/src/tests/features/euclidean_distance/CMakeLists.txt b/searchlib/src/tests/features/euclidean_distance/CMakeLists.txt index 6af6a9095ac..df55b8f834c 100644 --- a/searchlib/src/tests/features/euclidean_distance/CMakeLists.txt +++ b/searchlib/src/tests/features/euclidean_distance/CMakeLists.txt @@ -4,5 +4,6 @@ vespa_add_executable(searchlib_euclidean_distance_test_app TEST euclidean_distance_test.cpp DEPENDS searchlib + searchlib_test ) vespa_add_test(NAME searchlib_euclidean_distance_test_app COMMAND searchlib_euclidean_distance_test_app) diff --git a/searchlib/src/tests/features/euclidean_distance/euclidean_distance_test.cpp b/searchlib/src/tests/features/euclidean_distance/euclidean_distance_test.cpp index d327253731d..3bc61a77c55 100644 --- a/searchlib/src/tests/features/euclidean_distance/euclidean_distance_test.cpp +++ b/searchlib/src/tests/features/euclidean_distance/euclidean_distance_test.cpp @@ -1,16 +1,16 @@ // Copyright Vespa.ai. 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/searchcommon/attribute/config.h> #include <vespa/searchlib/attribute/attributefactory.h> #include <vespa/searchlib/attribute/attributevector.h> #include <vespa/searchlib/attribute/integerbase.h> #include <vespa/searchlib/attribute/floatbase.h> #include <vespa/searchlib/features/setup.h> #include <vespa/searchlib/fef/test/indexenvironment.h> -#include <vespa/searchlib/fef/test/ftlib.h> #include <vespa/searchlib/features/euclidean_distance_feature.h> #include <vespa/searchlib/fef/fef.h> -#include <vespa/searchcommon/attribute/config.h> +#include <vespa/searchlib/test/ft_test_app.h> using search::feature_t; diff --git a/searchlib/src/tests/features/featurebenchmark.cpp b/searchlib/src/tests/features/featurebenchmark.cpp index e151b47a0c9..9c3d4943d65 100644 --- a/searchlib/src/tests/features/featurebenchmark.cpp +++ b/searchlib/src/tests/features/featurebenchmark.cpp @@ -11,7 +11,7 @@ #include <vespa/searchlib/fef/functiontablefactory.h> #include <vespa/searchlib/fef/test/plugin/setup.h> #include <vespa/vespalib/util/stringfmt.h> -#include <vespa/searchlib/fef/test/ftlib.h> +#include <vespa/searchlib/test/ft_test_app.h> #include <vespa/searchcommon/attribute/config.h> #include <fstream> diff --git a/searchlib/src/tests/features/internal_max_reduce_prod_join_feature/CMakeLists.txt b/searchlib/src/tests/features/internal_max_reduce_prod_join_feature/CMakeLists.txt index 217af473987..e7fc3126e2f 100644 --- a/searchlib/src/tests/features/internal_max_reduce_prod_join_feature/CMakeLists.txt +++ b/searchlib/src/tests/features/internal_max_reduce_prod_join_feature/CMakeLists.txt @@ -4,5 +4,6 @@ vespa_add_executable(searchlib_internal_max_reduce_prod_join_feature_test_app TE internal_max_reduce_prod_join_feature_test.cpp DEPENDS searchlib + searchlib_test ) vespa_add_test(NAME searchlib_internal_max_reduce_prod_join_feature_test_app COMMAND searchlib_internal_max_reduce_prod_join_feature_test_app) diff --git a/searchlib/src/tests/features/internal_max_reduce_prod_join_feature/internal_max_reduce_prod_join_feature_test.cpp b/searchlib/src/tests/features/internal_max_reduce_prod_join_feature/internal_max_reduce_prod_join_feature_test.cpp index 852827244bc..7611296c641 100644 --- a/searchlib/src/tests/features/internal_max_reduce_prod_join_feature/internal_max_reduce_prod_join_feature_test.cpp +++ b/searchlib/src/tests/features/internal_max_reduce_prod_join_feature/internal_max_reduce_prod_join_feature_test.cpp @@ -2,11 +2,11 @@ #include <vespa/vespalib/testkit/test_kit.h> +#include <vespa/searchcommon/attribute/config.h> +#include <vespa/searchlib/attribute/attribute.h> #include <vespa/searchlib/attribute/attributefactory.h> -#include <vespa/searchlib/fef/test/ftlib.h> #include <vespa/searchlib/features/internal_max_reduce_prod_join_feature.h> -#include <vespa/searchlib/attribute/attribute.h> -#include <vespa/searchcommon/attribute/config.h> +#include <vespa/searchlib/test/ft_test_app.h> using search::feature_t; using namespace search::fef; diff --git a/searchlib/src/tests/features/prod_features_test.h b/searchlib/src/tests/features/prod_features_test.h index 94c4e496dd2..aeadf23be80 100644 --- a/searchlib/src/tests/features/prod_features_test.h +++ b/searchlib/src/tests/features/prod_features_test.h @@ -4,7 +4,7 @@ #include <vespa/searchlib/features/distancetopathfeature.h> #include <vespa/searchlib/features/termdistancefeature.h> -#include <vespa/searchlib/fef/test/ftlib.h> +#include <vespa/searchlib/test/ft_test_app.h> class Test : public FtTestApp { diff --git a/searchlib/src/tests/features/tensor/tensor_test.cpp b/searchlib/src/tests/features/tensor/tensor_test.cpp index 96a53d98865..fe4464bad72 100644 --- a/searchlib/src/tests/features/tensor/tensor_test.cpp +++ b/searchlib/src/tests/features/tensor/tensor_test.cpp @@ -1,21 +1,21 @@ // Copyright Vespa.ai. 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/eval/eval/function.h> +#include <vespa/eval/eval/simple_value.h> +#include <vespa/eval/eval/tensor_spec.h> +#include <vespa/eval/eval/value.h> +#include <vespa/eval/eval/value_codec.h> +#include <vespa/eval/eval/test/value_compare.h> +#include <vespa/searchcommon/attribute/config.h> #include <vespa/searchlib/attribute/attributefactory.h> #include <vespa/searchlib/attribute/attributevector.h> #include <vespa/searchlib/features/setup.h> #include <vespa/searchlib/fef/fef.h> -#include <vespa/searchlib/fef/test/ftlib.h> #include <vespa/searchlib/fef/test/indexenvironment.h> #include <vespa/searchlib/tensor/tensor_attribute.h> #include <vespa/searchlib/tensor/direct_tensor_attribute.h> -#include <vespa/searchcommon/attribute/config.h> -#include <vespa/eval/eval/function.h> -#include <vespa/eval/eval/simple_value.h> -#include <vespa/eval/eval/tensor_spec.h> -#include <vespa/eval/eval/value.h> -#include <vespa/eval/eval/value_codec.h> -#include <vespa/eval/eval/test/value_compare.h> +#include <vespa/searchlib/test/ft_test_app.h> #include <vespa/vespalib/objects/nbostream.h> using search::feature_t; diff --git a/searchlib/src/tests/features/tensor_from_labels/CMakeLists.txt b/searchlib/src/tests/features/tensor_from_labels/CMakeLists.txt index 186ecf38c9e..3ecceffd422 100644 --- a/searchlib/src/tests/features/tensor_from_labels/CMakeLists.txt +++ b/searchlib/src/tests/features/tensor_from_labels/CMakeLists.txt @@ -4,5 +4,6 @@ vespa_add_executable(searchlib_tensor_from_labels_test_app TEST tensor_from_labels_test.cpp DEPENDS searchlib + searchlib_test ) vespa_add_test(NAME searchlib_tensor_from_labels_test_app COMMAND searchlib_tensor_from_labels_test_app) diff --git a/searchlib/src/tests/features/tensor_from_labels/tensor_from_labels_test.cpp b/searchlib/src/tests/features/tensor_from_labels/tensor_from_labels_test.cpp index 20cfa4d84c8..f241398539a 100644 --- a/searchlib/src/tests/features/tensor_from_labels/tensor_from_labels_test.cpp +++ b/searchlib/src/tests/features/tensor_from_labels/tensor_from_labels_test.cpp @@ -8,8 +8,8 @@ #include <vespa/searchlib/features/setup.h> #include <vespa/searchlib/features/tensor_from_labels_feature.h> #include <vespa/searchlib/fef/fef.h> -#include <vespa/searchlib/fef/test/ftlib.h> #include <vespa/searchlib/fef/test/indexenvironment.h> +#include <vespa/searchlib/test/ft_test_app.h> #include <vespa/searchcommon/attribute/config.h> #include <vespa/eval/eval/function.h> #include <vespa/eval/eval/simple_value.h> diff --git a/searchlib/src/tests/features/tensor_from_weighted_set/CMakeLists.txt b/searchlib/src/tests/features/tensor_from_weighted_set/CMakeLists.txt index bf93e8923b5..b5322c1a64c 100644 --- a/searchlib/src/tests/features/tensor_from_weighted_set/CMakeLists.txt +++ b/searchlib/src/tests/features/tensor_from_weighted_set/CMakeLists.txt @@ -4,5 +4,6 @@ vespa_add_executable(searchlib_tensor_from_weighted_set_test_app TEST tensor_from_weighted_set_test.cpp DEPENDS searchlib + searchlib_test ) vespa_add_test(NAME searchlib_tensor_from_weighted_set_test_app COMMAND searchlib_tensor_from_weighted_set_test_app) diff --git a/searchlib/src/tests/features/tensor_from_weighted_set/tensor_from_weighted_set_test.cpp b/searchlib/src/tests/features/tensor_from_weighted_set/tensor_from_weighted_set_test.cpp index db734387288..9c8f231051e 100644 --- a/searchlib/src/tests/features/tensor_from_weighted_set/tensor_from_weighted_set_test.cpp +++ b/searchlib/src/tests/features/tensor_from_weighted_set/tensor_from_weighted_set_test.cpp @@ -1,6 +1,12 @@ // Copyright Vespa.ai. 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/eval/eval/function.h> +#include <vespa/eval/eval/simple_value.h> +#include <vespa/eval/eval/tensor_spec.h> +#include <vespa/eval/eval/value.h> +#include <vespa/eval/eval/test/value_compare.h> +#include <vespa/searchcommon/attribute/config.h> #include <vespa/searchlib/attribute/attributefactory.h> #include <vespa/searchlib/attribute/attributevector.h> #include <vespa/searchlib/attribute/integerbase.h> @@ -8,14 +14,8 @@ #include <vespa/searchlib/features/setup.h> #include <vespa/searchlib/features/tensor_from_weighted_set_feature.h> #include <vespa/searchlib/fef/fef.h> -#include <vespa/searchlib/fef/test/ftlib.h> #include <vespa/searchlib/fef/test/indexenvironment.h> -#include <vespa/searchcommon/attribute/config.h> -#include <vespa/eval/eval/function.h> -#include <vespa/eval/eval/simple_value.h> -#include <vespa/eval/eval/tensor_spec.h> -#include <vespa/eval/eval/value.h> -#include <vespa/eval/eval/test/value_compare.h> +#include <vespa/searchlib/test/ft_test_app.h> using search::feature_t; using namespace search::fef; diff --git a/searchlib/src/tests/features/text_similarity_feature/CMakeLists.txt b/searchlib/src/tests/features/text_similarity_feature/CMakeLists.txt index 363619ce4fb..cfa715af516 100644 --- a/searchlib/src/tests/features/text_similarity_feature/CMakeLists.txt +++ b/searchlib/src/tests/features/text_similarity_feature/CMakeLists.txt @@ -4,5 +4,6 @@ vespa_add_executable(searchlib_text_similarity_feature_test_app TEST text_similarity_feature_test.cpp DEPENDS searchlib + searchlib_test ) vespa_add_test(NAME searchlib_text_similarity_feature_test_app COMMAND searchlib_text_similarity_feature_test_app) diff --git a/searchlib/src/tests/features/text_similarity_feature/text_similarity_feature_test.cpp b/searchlib/src/tests/features/text_similarity_feature/text_similarity_feature_test.cpp index 03734b15d64..cf0660282f2 100644 --- a/searchlib/src/tests/features/text_similarity_feature/text_similarity_feature_test.cpp +++ b/searchlib/src/tests/features/text_similarity_feature/text_similarity_feature_test.cpp @@ -1,14 +1,14 @@ // Copyright Vespa.ai. 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/features/setup.h> +#include <vespa/searchlib/fef/test/dummy_dependency_handler.h> #include <vespa/searchlib/fef/test/indexenvironment.h> #include <vespa/searchlib/fef/test/indexenvironmentbuilder.h> #include <vespa/searchlib/fef/test/queryenvironment.h> #include <vespa/searchlib/features/text_similarity_feature.h> -#include <vespa/searchlib/fef/test/ftlib.h> -#include <initializer_list> -#include <vespa/searchlib/fef/test/dummy_dependency_handler.h> +#include <vespa/searchlib/test/ft_test_app.h> #include <vespa/vespalib/util/stringfmt.h> +#include <initializer_list> using namespace search::fef; using namespace search::fef::test; diff --git a/searchlib/src/tests/nativerank/CMakeLists.txt b/searchlib/src/tests/nativerank/CMakeLists.txt index 20fdc0c1245..2a46dd54904 100644 --- a/searchlib/src/tests/nativerank/CMakeLists.txt +++ b/searchlib/src/tests/nativerank/CMakeLists.txt @@ -4,6 +4,7 @@ vespa_add_executable(searchlib_nativerank_test_app TEST nativerank_test.cpp DEPENDS searchlib + searchlib_test ) vespa_add_test( NAME searchlib_nativerank_test_app diff --git a/searchlib/src/tests/nativerank/nativerank_test.cpp b/searchlib/src/tests/nativerank/nativerank_test.cpp index bc9c579a597..69234071a34 100644 --- a/searchlib/src/tests/nativerank/nativerank_test.cpp +++ b/searchlib/src/tests/nativerank/nativerank_test.cpp @@ -10,8 +10,8 @@ #include <vespa/searchlib/fef/functiontablefactory.h> #include <vespa/searchlib/fef/test/plugin/setup.h> #include <vespa/vespalib/util/stringfmt.h> -#include <vespa/searchlib/fef/test/ftlib.h> #include <vespa/searchlib/fef/test/dummy_dependency_handler.h> +#include <vespa/searchlib/test/ft_test_app.h> #include <vespa/log/log.h> LOG_SETUP("nativerank_test"); diff --git a/searchlib/src/vespa/searchlib/fef/test/ftlib.cpp b/searchlib/src/vespa/searchlib/fef/test/ftlib.cpp index 774e17d015a..b3b42a179d8 100644 --- a/searchlib/src/vespa/searchlib/fef/test/ftlib.cpp +++ b/searchlib/src/vespa/searchlib/fef/test/ftlib.cpp @@ -1,14 +1,9 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "ftlib.h" -#include "dummy_dependency_handler.h" #include <vespa/searchlib/features/utils.h> -#include <vespa/vespalib/util/stringfmt.h> #include <vespa/vespalib/text/stringtokenizer.h> -#include <vespa/log/log.h> -LOG_SETUP(".ftlib"); - using namespace search::features; using namespace search::fef; using namespace search::fef::test; @@ -110,280 +105,3 @@ FtUtil::toRankResult(const vespalib::string & baseName, const vespalib::string & } FtIndex::~FtIndex() = default; - -//--------------------------------------------------------------------------------------------------------------------- -// FtTestApp -//--------------------------------------------------------------------------------------------------------------------- -void -FtTestApp::FT_SETUP_FAIL(const search::fef::Blueprint &prototype, const StringList ¶ms) -{ - search::fef::test::IndexEnvironment ie; - FT_SETUP_FAIL(prototype, ie, params); -} - -void -FtTestApp::FT_SETUP_FAIL(const search::fef::Blueprint &prototype, const search::fef::test::IndexEnvironment &env, - const StringList ¶ms) -{ - FT_LOG(prototype, env, params); - search::fef::Blueprint::UP bp = prototype.createInstance(); - DummyDependencyHandler deps(*bp); - EXPECT_TRUE(!bp->setup(env, params)); -} - -void -FtTestApp::FT_SETUP_OK(const search::fef::Blueprint &prototype, const StringList ¶ms, - const StringList &expectedIn, const StringList &expectedOut) -{ - search::fef::test::IndexEnvironment ie; - FT_SETUP_OK(prototype, ie, params, expectedIn, expectedOut); -} - -void -FtTestApp::FT_SETUP_OK(const search::fef::Blueprint &prototype, const search::fef::test::IndexEnvironment &env, - const StringList ¶ms, const StringList &expectedIn, const StringList &expectedOut) -{ - FT_LOG(prototype, env, params); - search::fef::Blueprint::UP bp = prototype.createInstance(); - DummyDependencyHandler deps(*bp); - ASSERT_TRUE(bp->setup(env, params)); - FT_EQUAL(expectedIn, deps.input, "In, "); - FT_EQUAL(expectedOut, deps.output, "Out,"); -} - -void -FtTestApp::FT_DUMP_EMPTY(search::fef::BlueprintFactory &factory, const vespalib::string &baseName) -{ - StringList empty; - FT_DUMP(factory, baseName, empty); -} - -void -FtTestApp::FT_DUMP_EMPTY(search::fef::BlueprintFactory &factory, const vespalib::string &baseName, - search::fef::test::IndexEnvironment &env) -{ - StringList empty; - FT_DUMP(factory, baseName, env, empty); -} - -void -FtTestApp::FT_DUMP(search::fef::BlueprintFactory &factory, const vespalib::string &baseName, - const StringList &expected) -{ - search::fef::test::IndexEnvironment ie; - FT_DUMP(factory, baseName, ie, expected); -} - -void -FtTestApp::FT_DUMP(search::fef::BlueprintFactory &factory, const vespalib::string &baseName, - search::fef::test::IndexEnvironment &env, - const StringList &expected) -{ - FtDumpFeatureVisitor dfv; - search::fef::Blueprint::SP bp = factory.createBlueprint(baseName); - if ( ! bp) { - LOG(error, "Blueprint '%s' does not exist in factory, did you forget to add it?", baseName.c_str()); - ASSERT_TRUE(bp); - } - bp->visitDumpFeatures(env, dfv); - FT_EQUAL(expected, dfv.features(), "Dump"); -} - -void -FtTestApp::FT_EQUAL(const std::vector<string> &expected, const std::vector<string> &actual, - const vespalib::string &prefix) -{ - FT_LOG(prefix + " expected", expected); - FT_LOG(prefix + " actual ", actual); - EXPECT_EQUAL(expected.size(), actual.size()); - ASSERT_TRUE(expected.size() == actual.size()); - for (uint32_t i = 0; i < expected.size(); ++i) { - EXPECT_EQUAL(expected[i], actual[i]); - ASSERT_TRUE(expected[i] == actual[i]); - } -} - -void -FtTestApp::FT_LOG(const search::fef::Blueprint &prototype, const search::fef::test::IndexEnvironment &env, - const StringList ¶ms) -{ - LOG(info, "Testing blueprint '%s'.", prototype.getBaseName().c_str()); - std::vector<vespalib::string> arr; - for (const auto & it : env.getFields()) { - arr.push_back(it.name()); - } - FT_LOG("Environment ", arr); - FT_LOG("Parameters ", params); -} - -void -FtTestApp::FT_LOG(const vespalib::string &prefix, const std::vector<vespalib::string> &arr) -{ - vespalib::string str = prefix + " = [ "; - for (uint32_t i = 0; i < arr.size(); ++i) { - str.append("'").append(arr[i]).append("'"); - if (i < arr.size() - 1) { - str.append(", "); - } - } - str.append(" ]"); - LOG(info, "%s", str.c_str()); -} - -void -FtTestApp::FT_SETUP(FtFeatureTest &test, const vespalib::string &query, const StringMap &index, - uint32_t docId) -{ - LOG(info, "Setup test for query '%s'.", query.c_str()); - - // Add all query terms. - FtQueryEnvironment &queryEnv = test.getQueryEnv(); - for (uint32_t i = 0; i < query.size(); ++i) { - queryEnv.getBuilder().addAllFields(); - } - ASSERT_TRUE(test.setup()); - - // Add all occurences. - search::fef::test::MatchDataBuilder::UP mdb = test.createMatchDataBuilder(); - for (auto it = index.begin();it != index.end(); ++it) { - ASSERT_TRUE(mdb->setFieldLength(it->first, it->second.size())); - for (uint32_t i = 0; i < it->second.size(); ++i) { - size_t pos = query.find_first_of(it->second[i]); - if (pos != vespalib::string::npos) { - LOG(debug, "Occurence of '%c' added to field '%s' at position %d.", query[pos], it->first.c_str(), i); - ASSERT_TRUE(mdb->addOccurence(it->first, pos, i)); - } - } - } - ASSERT_TRUE(mdb->apply(docId)); -} - -void -FtTestApp::FT_SETUP(FtFeatureTest & test, const std::vector<FtQueryTerm> & query, const StringVectorMap & index, - uint32_t docId) -{ - setupQueryEnv(test.getQueryEnv(), query); - ASSERT_TRUE(test.setup()); - - search::fef::test::MatchDataBuilder::UP mdb = test.createMatchDataBuilder(); - - // Add all occurences. - for (auto itr = index.begin(); itr != index.end(); ++itr) { - ASSERT_TRUE(mdb->setFieldLength(itr->first, itr->second.size())); - for (uint32_t i = 0; i < itr->second.size(); ++i) { - auto fitr = query.begin(); - for (;;) { - fitr = std::find(fitr, query.end(), FtQueryTerm(itr->second[i])); - if (fitr != query.end()) { - uint32_t termId = fitr - query.begin(); - LOG(debug, "Occurence of '%s' added to field '%s' at position %u.", fitr->term.c_str(), itr->first.c_str(), i); - ASSERT_TRUE(mdb->addOccurence(itr->first, termId, i)); - ++fitr; - } else { - break; - } - } - } - } - ASSERT_TRUE(mdb->apply(docId)); -} - -void -FtTestApp::FT_SETUP(FtFeatureTest &test, const FtQuery &query, const FtIndex &index, uint32_t docId) -{ - setupQueryEnv(test.getQueryEnv(), query); - ASSERT_TRUE(test.setup()); - search::fef::test::MatchDataBuilder::UP mdb = test.createMatchDataBuilder(); - - // Add all occurences. - for (auto itr = index.index.begin(); itr != index.index.end(); ++itr) { - const FtIndex::Field &field = itr->second; - for (size_t e = 0; e < field.size(); ++e) { - const FtIndex::Element &element = field[e]; - ASSERT_TRUE(mdb->addElement(itr->first, element.weight, element.tokens.size())); - for (size_t t = 0; t < element.tokens.size(); ++t) { - const vespalib::string &token = element.tokens[t]; - for (size_t q = 0; q < query.size(); ++q) { - if (query[q].term == token) { - ASSERT_TRUE(mdb->addOccurence(itr->first, q, t, e)); - } - } - } - } - } - ASSERT_TRUE(mdb->apply(docId)); -} - -void -FtTestApp::setupQueryEnv(FtQueryEnvironment & queryEnv, const FtQuery & query) -{ - // Add all query terms. - for (uint32_t i = 0; i < query.size(); ++i) { - queryEnv.getBuilder().addAllFields(); - queryEnv.getTerms()[i].setPhraseLength(1); - queryEnv.getTerms()[i].setUniqueId(i); - queryEnv.getTerms()[i].setWeight(query[i].termWeight); - if (i > 0) { - vespalib::string from = vespalib::make_string("vespa.term.%u.connexity", i); - vespalib::string to = vespalib::make_string("%u", i - 1); - vespalib::string connexity = vespalib::make_string("%f", query[i].connexity); - queryEnv.getProperties().add(from, to); - queryEnv.getProperties().add(from, connexity); - } - vespalib::string term = vespalib::make_string("vespa.term.%u.significance", i); - vespalib::string significance = vespalib::make_string("%f", query[i].significance); - queryEnv.getProperties().add(term, significance); - LOG(debug, "Add term node: '%s'", query[i].term.c_str()); - } -} - -void -FtTestApp::setupFieldMatch(FtFeatureTest & ft, const vespalib::string & indexName, - const vespalib::string & query, const vespalib::string & field, - const fieldmatch::Params * params, uint32_t totalTermWeight, feature_t totalSignificance, - uint32_t docId) -{ - ft.getIndexEnv().getBuilder().addField(FieldType::INDEX, FieldInfo::CollectionType::SINGLE, indexName); - - if (params != nullptr) { - Properties & p = ft.getIndexEnv().getProperties(); - p.add("fieldMatch(" + indexName + ").proximityLimit", vespalib::make_string("%u", params->getProximityLimit())); - p.add("fieldMatch(" + indexName + ").maxAlternativeSegmentations", vespalib::make_string("%u", params->getMaxAlternativeSegmentations())); - p.add("fieldMatch(" + indexName + ").maxOccurrences", vespalib::make_string("%u", params->getMaxOccurrences())); - p.add("fieldMatch(" + indexName + ").proximityCompletenessImportance", vespalib::make_string("%f", params->getProximityCompletenessImportance())); - p.add("fieldMatch(" + indexName + ").relatednessImportance", vespalib::make_string("%f", params->getRelatednessImportance())); - p.add("fieldMatch(" + indexName + ").earlinessImportance", vespalib::make_string("%f", params->getEarlinessImportance())); - p.add("fieldMatch(" + indexName + ").segmentProximityImportance", vespalib::make_string("%f", params->getSegmentProximityImportance())); - p.add("fieldMatch(" + indexName + ").occurrenceImportance", vespalib::make_string("%f", params->getOccurrenceImportance())); - p.add("fieldMatch(" + indexName + ").fieldCompletenessImportance", vespalib::make_string("%f", params->getFieldCompletenessImportance())); - for (double it : params->getProximityTable()) { - p.add("fieldMatch(" + indexName + ").proximityTable", vespalib::make_string("%f", it)); - } - } - - if (totalTermWeight > 0) { - ft.getQueryEnv().getProperties().add("fieldMatch(" + indexName + ").totalTermWeight", - vespalib::make_string("%u", totalTermWeight)); - } - - if (totalSignificance > 0.0f) { - ft.getQueryEnv().getProperties().add("fieldMatch(" + indexName + ").totalTermSignificance", - vespalib::make_string("%f", totalSignificance)); - } - - std::map<vespalib::string, std::vector<vespalib::string> > index; - index[indexName] = FtUtil::tokenize(field); - FT_SETUP(ft, FtUtil::toQuery(query), index, docId); -} - - -RankResult -FtTestApp::toRankResult(const vespalib::string & baseName, - const vespalib::string & result, - const vespalib::string & separator) -{ - return FtUtil::toRankResult(baseName, result, separator); -} - - - diff --git a/searchlib/src/vespa/searchlib/fef/test/ftlib.h b/searchlib/src/vespa/searchlib/fef/test/ftlib.h index be52b407369..2281151f9cf 100644 --- a/searchlib/src/vespa/searchlib/fef/test/ftlib.h +++ b/searchlib/src/vespa/searchlib/fef/test/ftlib.h @@ -8,10 +8,8 @@ #include "queryenvironment.h" #include "queryenvironmentbuilder.h" #include "rankresult.h" -#include <vespa/vespalib/testkit/testapp.h> #include <vespa/searchlib/common/feature.h> #include <vespa/searchlib/query/weight.h> -#include <vespa/searchlib/features/fieldmatch/params.h> #include <vespa/searchlib/fef/fef.h> using search::feature_t; @@ -183,58 +181,3 @@ struct FtIndex { return *this; } }; - -//--------------------------------------------------------------------------------------------------------------------- -// FtTestApp -//--------------------------------------------------------------------------------------------------------------------- -struct FtTestApp : public vespalib::TestApp { - using string = vespalib::string; - static void FT_SETUP_FAIL(const search::fef::Blueprint &prototype, const StringList ¶ms); - static void FT_SETUP_FAIL(const search::fef::Blueprint &prototype, const search::fef::test::IndexEnvironment &env, - const StringList ¶ms); - static void FT_SETUP_OK(const search::fef::Blueprint &prototype, const StringList ¶ms, - const StringList &expectedIn, const StringList &expectedOut); - static void FT_SETUP_OK(const search::fef::Blueprint &prototype, const search::fef::test::IndexEnvironment &env, - const StringList ¶ms, const StringList &expectedIn, const StringList &expectedOut); - - static void FT_DUMP_EMPTY(search::fef::BlueprintFactory &factory, const vespalib::string &baseName); - static void FT_DUMP_EMPTY(search::fef::BlueprintFactory &factory, const vespalib::string &baseName, - search::fef::test::IndexEnvironment &env); - static void FT_DUMP(search::fef::BlueprintFactory &factory, const vespalib::string &baseName, - const StringList &expected); - static void FT_DUMP(search::fef::BlueprintFactory &factory, const vespalib::string &baseName, - search::fef::test::IndexEnvironment &env, - const StringList &expected); - - static void FT_EQUAL(const std::vector<string> &expected, const std::vector<string> &actual, - const vespalib::string & prefix = ""); - - static void FT_LOG(const search::fef::Blueprint &prototype, const search::fef::test::IndexEnvironment &env, const StringList ¶ms); - static void FT_LOG(const vespalib::string &prefix, const std::vector<vespalib::string> &arr); - - - static void FT_SETUP(FtFeatureTest & test, const vespalib::string & query, const StringMap & index, uint32_t docId); - static void FT_SETUP(FtFeatureTest & test, const FtQuery & query, const StringVectorMap & index, uint32_t docId); - - static void FT_SETUP(FtFeatureTest &test, const FtQuery &query, const FtIndex &index, uint32_t docId); - - static void setupQueryEnv(FtQueryEnvironment & queryEnv, const FtQuery & query); - static void setupFieldMatch(FtFeatureTest & test, const vespalib::string & indexName, - const vespalib::string & query, const vespalib::string & field, - const search::features::fieldmatch::Params * params, - uint32_t totalTermWeight, feature_t totalSignificance, - uint32_t docId); - - static search::fef::test::RankResult toRankResult(const vespalib::string & baseName, - const vespalib::string & result, - const vespalib::string & separator = " "); - - template <typename T> - static bool assertCreateInstance(const T & prototype, const vespalib::string & baseName) { - search::fef::Blueprint::UP bp = prototype.createInstance(); - if (!EXPECT_TRUE(dynamic_cast<T*>(bp.get()) != NULL)) return false; - if (!EXPECT_EQUAL(bp->getBaseName(), baseName)) return false; - return true; - } -}; - diff --git a/searchlib/src/vespa/searchlib/test/CMakeLists.txt b/searchlib/src/vespa/searchlib/test/CMakeLists.txt index e7401d74c71..a4db57a44cd 100644 --- a/searchlib/src/vespa/searchlib/test/CMakeLists.txt +++ b/searchlib/src/vespa/searchlib/test/CMakeLists.txt @@ -4,6 +4,8 @@ vespa_add_library(searchlib_test attribute_builder.cpp document_weight_attribute_helper.cpp doc_builder.cpp + ft_test_app.cpp + ft_test_app_base.cpp imported_attribute_fixture.cpp initrange.cpp make_attribute_map_lookup_node.cpp diff --git a/searchlib/src/vespa/searchlib/test/ft_test_app.cpp b/searchlib/src/vespa/searchlib/test/ft_test_app.cpp new file mode 100644 index 00000000000..1d9d7c05d76 --- /dev/null +++ b/searchlib/src/vespa/searchlib/test/ft_test_app.cpp @@ -0,0 +1,5 @@ +// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "ft_test_app.h" + +FtTestApp::~FtTestApp() = default; diff --git a/searchlib/src/vespa/searchlib/test/ft_test_app.h b/searchlib/src/vespa/searchlib/test/ft_test_app.h new file mode 100644 index 00000000000..432d9d80e4d --- /dev/null +++ b/searchlib/src/vespa/searchlib/test/ft_test_app.h @@ -0,0 +1,13 @@ +// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include "ft_test_app_base.h" +#include <vespa/vespalib/testkit/testapp.h> + +/* + * Test application used by feature unit tests. + */ +struct FtTestApp : public vespalib::TestApp, public FtTestAppBase { + ~FtTestApp() override; +}; diff --git a/searchlib/src/vespa/searchlib/test/ft_test_app_base.cpp b/searchlib/src/vespa/searchlib/test/ft_test_app_base.cpp new file mode 100644 index 00000000000..eee5631dcc5 --- /dev/null +++ b/searchlib/src/vespa/searchlib/test/ft_test_app_base.cpp @@ -0,0 +1,286 @@ +// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "ft_test_app.h" +#include <vespa/searchlib/fef/test/dummy_dependency_handler.h> +#include <vespa/vespalib/util/stringfmt.h> + +#include <vespa/log/log.h> +LOG_SETUP(".ft_test_app_base"); + +namespace fieldmatch = search::features::fieldmatch; +using search::fef::test::DummyDependencyHandler; +using search::fef::FieldInfo; +using search::fef::FieldType; +using search::fef::Properties; +using search::fef::test::RankResult; + +void +FtTestAppBase::FT_SETUP_FAIL(const search::fef::Blueprint &prototype, const StringList ¶ms) +{ + search::fef::test::IndexEnvironment ie; + FT_SETUP_FAIL(prototype, ie, params); +} + +void +FtTestAppBase::FT_SETUP_FAIL(const search::fef::Blueprint &prototype, const search::fef::test::IndexEnvironment &env, + const StringList ¶ms) +{ + FT_LOG(prototype, env, params); + search::fef::Blueprint::UP bp = prototype.createInstance(); + DummyDependencyHandler deps(*bp); + EXPECT_TRUE(!bp->setup(env, params)); +} + +void +FtTestAppBase::FT_SETUP_OK(const search::fef::Blueprint &prototype, const StringList ¶ms, + const StringList &expectedIn, const StringList &expectedOut) +{ + search::fef::test::IndexEnvironment ie; + FT_SETUP_OK(prototype, ie, params, expectedIn, expectedOut); +} + +void +FtTestAppBase::FT_SETUP_OK(const search::fef::Blueprint &prototype, const search::fef::test::IndexEnvironment &env, + const StringList ¶ms, const StringList &expectedIn, const StringList &expectedOut) +{ + FT_LOG(prototype, env, params); + search::fef::Blueprint::UP bp = prototype.createInstance(); + DummyDependencyHandler deps(*bp); + ASSERT_TRUE(bp->setup(env, params)); + FT_EQUAL(expectedIn, deps.input, "In, "); + FT_EQUAL(expectedOut, deps.output, "Out,"); +} + +void +FtTestAppBase::FT_DUMP_EMPTY(search::fef::BlueprintFactory &factory, const vespalib::string &baseName) +{ + StringList empty; + FT_DUMP(factory, baseName, empty); +} + +void +FtTestAppBase::FT_DUMP_EMPTY(search::fef::BlueprintFactory &factory, const vespalib::string &baseName, + search::fef::test::IndexEnvironment &env) +{ + StringList empty; + FT_DUMP(factory, baseName, env, empty); +} + +void +FtTestAppBase::FT_DUMP(search::fef::BlueprintFactory &factory, const vespalib::string &baseName, + const StringList &expected) +{ + search::fef::test::IndexEnvironment ie; + FT_DUMP(factory, baseName, ie, expected); +} + +void +FtTestAppBase::FT_DUMP(search::fef::BlueprintFactory &factory, const vespalib::string &baseName, + search::fef::test::IndexEnvironment &env, + const StringList &expected) +{ + FtDumpFeatureVisitor dfv; + search::fef::Blueprint::SP bp = factory.createBlueprint(baseName); + if ( ! bp) { + LOG(error, "Blueprint '%s' does not exist in factory, did you forget to add it?", baseName.c_str()); + ASSERT_TRUE(bp); + } + bp->visitDumpFeatures(env, dfv); + FT_EQUAL(expected, dfv.features(), "Dump"); +} + +void +FtTestAppBase::FT_EQUAL(const std::vector<string> &expected, const std::vector<string> &actual, + const vespalib::string &prefix) +{ + FT_LOG(prefix + " expected", expected); + FT_LOG(prefix + " actual ", actual); + EXPECT_EQUAL(expected.size(), actual.size()); + ASSERT_TRUE(expected.size() == actual.size()); + for (uint32_t i = 0; i < expected.size(); ++i) { + EXPECT_EQUAL(expected[i], actual[i]); + ASSERT_TRUE(expected[i] == actual[i]); + } +} + +void +FtTestAppBase::FT_LOG(const search::fef::Blueprint &prototype, const search::fef::test::IndexEnvironment &env, + const StringList ¶ms) +{ + LOG(info, "Testing blueprint '%s'.", prototype.getBaseName().c_str()); + std::vector<vespalib::string> arr; + for (const auto & it : env.getFields()) { + arr.push_back(it.name()); + } + FT_LOG("Environment ", arr); + FT_LOG("Parameters ", params); +} + +void +FtTestAppBase::FT_LOG(const vespalib::string &prefix, const std::vector<vespalib::string> &arr) +{ + vespalib::string str = prefix + " = [ "; + for (uint32_t i = 0; i < arr.size(); ++i) { + str.append("'").append(arr[i]).append("'"); + if (i < arr.size() - 1) { + str.append(", "); + } + } + str.append(" ]"); + LOG(info, "%s", str.c_str()); +} + +void +FtTestAppBase::FT_SETUP(FtFeatureTest &test, const vespalib::string &query, const StringMap &index, + uint32_t docId) +{ + LOG(info, "Setup test for query '%s'.", query.c_str()); + + // Add all query terms. + FtQueryEnvironment &queryEnv = test.getQueryEnv(); + for (uint32_t i = 0; i < query.size(); ++i) { + queryEnv.getBuilder().addAllFields(); + } + ASSERT_TRUE(test.setup()); + + // Add all occurences. + search::fef::test::MatchDataBuilder::UP mdb = test.createMatchDataBuilder(); + for (auto it = index.begin();it != index.end(); ++it) { + ASSERT_TRUE(mdb->setFieldLength(it->first, it->second.size())); + for (uint32_t i = 0; i < it->second.size(); ++i) { + size_t pos = query.find_first_of(it->second[i]); + if (pos != vespalib::string::npos) { + LOG(debug, "Occurence of '%c' added to field '%s' at position %d.", query[pos], it->first.c_str(), i); + ASSERT_TRUE(mdb->addOccurence(it->first, pos, i)); + } + } + } + ASSERT_TRUE(mdb->apply(docId)); +} + +void +FtTestAppBase::FT_SETUP(FtFeatureTest & test, const std::vector<FtQueryTerm> & query, const StringVectorMap & index, + uint32_t docId) +{ + setupQueryEnv(test.getQueryEnv(), query); + ASSERT_TRUE(test.setup()); + + search::fef::test::MatchDataBuilder::UP mdb = test.createMatchDataBuilder(); + + // Add all occurences. + for (auto itr = index.begin(); itr != index.end(); ++itr) { + ASSERT_TRUE(mdb->setFieldLength(itr->first, itr->second.size())); + for (uint32_t i = 0; i < itr->second.size(); ++i) { + auto fitr = query.begin(); + for (;;) { + fitr = std::find(fitr, query.end(), FtQueryTerm(itr->second[i])); + if (fitr != query.end()) { + uint32_t termId = fitr - query.begin(); + LOG(debug, "Occurence of '%s' added to field '%s' at position %u.", fitr->term.c_str(), itr->first.c_str(), i); + ASSERT_TRUE(mdb->addOccurence(itr->first, termId, i)); + ++fitr; + } else { + break; + } + } + } + } + ASSERT_TRUE(mdb->apply(docId)); +} + +void +FtTestAppBase::FT_SETUP(FtFeatureTest &test, const FtQuery &query, const FtIndex &index, uint32_t docId) +{ + setupQueryEnv(test.getQueryEnv(), query); + ASSERT_TRUE(test.setup()); + search::fef::test::MatchDataBuilder::UP mdb = test.createMatchDataBuilder(); + + // Add all occurences. + for (auto itr = index.index.begin(); itr != index.index.end(); ++itr) { + const FtIndex::Field &field = itr->second; + for (size_t e = 0; e < field.size(); ++e) { + const FtIndex::Element &element = field[e]; + ASSERT_TRUE(mdb->addElement(itr->first, element.weight, element.tokens.size())); + for (size_t t = 0; t < element.tokens.size(); ++t) { + const vespalib::string &token = element.tokens[t]; + for (size_t q = 0; q < query.size(); ++q) { + if (query[q].term == token) { + ASSERT_TRUE(mdb->addOccurence(itr->first, q, t, e)); + } + } + } + } + } + ASSERT_TRUE(mdb->apply(docId)); +} + +void +FtTestAppBase::setupQueryEnv(FtQueryEnvironment & queryEnv, const FtQuery & query) +{ + // Add all query terms. + for (uint32_t i = 0; i < query.size(); ++i) { + queryEnv.getBuilder().addAllFields(); + queryEnv.getTerms()[i].setPhraseLength(1); + queryEnv.getTerms()[i].setUniqueId(i); + queryEnv.getTerms()[i].setWeight(query[i].termWeight); + if (i > 0) { + vespalib::string from = vespalib::make_string("vespa.term.%u.connexity", i); + vespalib::string to = vespalib::make_string("%u", i - 1); + vespalib::string connexity = vespalib::make_string("%f", query[i].connexity); + queryEnv.getProperties().add(from, to); + queryEnv.getProperties().add(from, connexity); + } + vespalib::string term = vespalib::make_string("vespa.term.%u.significance", i); + vespalib::string significance = vespalib::make_string("%f", query[i].significance); + queryEnv.getProperties().add(term, significance); + LOG(debug, "Add term node: '%s'", query[i].term.c_str()); + } +} + +void +FtTestAppBase::setupFieldMatch(FtFeatureTest & ft, const vespalib::string & indexName, + const vespalib::string & query, const vespalib::string & field, + const fieldmatch::Params * params, uint32_t totalTermWeight, feature_t totalSignificance, + uint32_t docId) +{ + ft.getIndexEnv().getBuilder().addField(FieldType::INDEX, FieldInfo::CollectionType::SINGLE, indexName); + + if (params != nullptr) { + Properties & p = ft.getIndexEnv().getProperties(); + p.add("fieldMatch(" + indexName + ").proximityLimit", vespalib::make_string("%u", params->getProximityLimit())); + p.add("fieldMatch(" + indexName + ").maxAlternativeSegmentations", vespalib::make_string("%u", params->getMaxAlternativeSegmentations())); + p.add("fieldMatch(" + indexName + ").maxOccurrences", vespalib::make_string("%u", params->getMaxOccurrences())); + p.add("fieldMatch(" + indexName + ").proximityCompletenessImportance", vespalib::make_string("%f", params->getProximityCompletenessImportance())); + p.add("fieldMatch(" + indexName + ").relatednessImportance", vespalib::make_string("%f", params->getRelatednessImportance())); + p.add("fieldMatch(" + indexName + ").earlinessImportance", vespalib::make_string("%f", params->getEarlinessImportance())); + p.add("fieldMatch(" + indexName + ").segmentProximityImportance", vespalib::make_string("%f", params->getSegmentProximityImportance())); + p.add("fieldMatch(" + indexName + ").occurrenceImportance", vespalib::make_string("%f", params->getOccurrenceImportance())); + p.add("fieldMatch(" + indexName + ").fieldCompletenessImportance", vespalib::make_string("%f", params->getFieldCompletenessImportance())); + for (double it : params->getProximityTable()) { + p.add("fieldMatch(" + indexName + ").proximityTable", vespalib::make_string("%f", it)); + } + } + + if (totalTermWeight > 0) { + ft.getQueryEnv().getProperties().add("fieldMatch(" + indexName + ").totalTermWeight", + vespalib::make_string("%u", totalTermWeight)); + } + + if (totalSignificance > 0.0f) { + ft.getQueryEnv().getProperties().add("fieldMatch(" + indexName + ").totalTermSignificance", + vespalib::make_string("%f", totalSignificance)); + } + + std::map<vespalib::string, std::vector<vespalib::string> > index; + index[indexName] = FtUtil::tokenize(field); + FT_SETUP(ft, FtUtil::toQuery(query), index, docId); +} + + +RankResult +FtTestAppBase::toRankResult(const vespalib::string & baseName, + const vespalib::string & result, + const vespalib::string & separator) +{ + return FtUtil::toRankResult(baseName, result, separator); +} diff --git a/searchlib/src/vespa/searchlib/test/ft_test_app_base.h b/searchlib/src/vespa/searchlib/test/ft_test_app_base.h new file mode 100644 index 00000000000..329d93e4c47 --- /dev/null +++ b/searchlib/src/vespa/searchlib/test/ft_test_app_base.h @@ -0,0 +1,61 @@ +// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include <vespa/searchlib/features/fieldmatch/params.h> +#include <vespa/searchlib/fef/test/ftlib.h> +#include <vespa/vespalib/testkit/test_macros.h> + +/* + * Base class for test application used by feature unit tests. + */ +struct FtTestAppBase { + using string = vespalib::string; + static void FT_SETUP_FAIL(const search::fef::Blueprint &prototype, const StringList ¶ms); + static void FT_SETUP_FAIL(const search::fef::Blueprint &prototype, const search::fef::test::IndexEnvironment &env, + const StringList ¶ms); + static void FT_SETUP_OK(const search::fef::Blueprint &prototype, const StringList ¶ms, + const StringList &expectedIn, const StringList &expectedOut); + static void FT_SETUP_OK(const search::fef::Blueprint &prototype, const search::fef::test::IndexEnvironment &env, + const StringList ¶ms, const StringList &expectedIn, const StringList &expectedOut); + + static void FT_DUMP_EMPTY(search::fef::BlueprintFactory &factory, const vespalib::string &baseName); + static void FT_DUMP_EMPTY(search::fef::BlueprintFactory &factory, const vespalib::string &baseName, + search::fef::test::IndexEnvironment &env); + static void FT_DUMP(search::fef::BlueprintFactory &factory, const vespalib::string &baseName, + const StringList &expected); + static void FT_DUMP(search::fef::BlueprintFactory &factory, const vespalib::string &baseName, + search::fef::test::IndexEnvironment &env, + const StringList &expected); + + static void FT_EQUAL(const std::vector<string> &expected, const std::vector<string> &actual, + const vespalib::string & prefix = ""); + + static void FT_LOG(const search::fef::Blueprint &prototype, const search::fef::test::IndexEnvironment &env, const StringList ¶ms); + static void FT_LOG(const vespalib::string &prefix, const std::vector<vespalib::string> &arr); + + + static void FT_SETUP(FtFeatureTest & test, const vespalib::string & query, const StringMap & index, uint32_t docId); + static void FT_SETUP(FtFeatureTest & test, const FtQuery & query, const StringVectorMap & index, uint32_t docId); + + static void FT_SETUP(FtFeatureTest &test, const FtQuery &query, const FtIndex &index, uint32_t docId); + + static void setupQueryEnv(FtQueryEnvironment & queryEnv, const FtQuery & query); + static void setupFieldMatch(FtFeatureTest & test, const vespalib::string & indexName, + const vespalib::string & query, const vespalib::string & field, + const search::features::fieldmatch::Params * params, + uint32_t totalTermWeight, feature_t totalSignificance, + uint32_t docId); + + static search::fef::test::RankResult toRankResult(const vespalib::string & baseName, + const vespalib::string & result, + const vespalib::string & separator = " "); + + template <typename T> + static bool assertCreateInstance(const T & prototype, const vespalib::string & baseName) { + search::fef::Blueprint::UP bp = prototype.createInstance(); + if (!EXPECT_TRUE(dynamic_cast<T*>(bp.get()) != NULL)) return false; + if (!EXPECT_EQUAL(bp->getBaseName(), baseName)) return false; + return true; + } +}; |