aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src
diff options
context:
space:
mode:
Diffstat (limited to 'searchlib/src')
-rw-r--r--searchlib/src/tests/features/CMakeLists.txt1
-rw-r--r--searchlib/src/tests/features/beta/CMakeLists.txt1
-rw-r--r--searchlib/src/tests/features/beta/beta_features_test.cpp2
-rw-r--r--searchlib/src/tests/features/bm25/bm25_test.cpp2
-rw-r--r--searchlib/src/tests/features/element_completeness/CMakeLists.txt1
-rw-r--r--searchlib/src/tests/features/element_completeness/element_completeness_test.cpp2
-rw-r--r--searchlib/src/tests/features/element_similarity_feature/CMakeLists.txt1
-rw-r--r--searchlib/src/tests/features/element_similarity_feature/element_similarity_feature_test.cpp2
-rw-r--r--searchlib/src/tests/features/euclidean_distance/CMakeLists.txt1
-rw-r--r--searchlib/src/tests/features/euclidean_distance/euclidean_distance_test.cpp4
-rw-r--r--searchlib/src/tests/features/featurebenchmark.cpp2
-rw-r--r--searchlib/src/tests/features/internal_max_reduce_prod_join_feature/CMakeLists.txt1
-rw-r--r--searchlib/src/tests/features/internal_max_reduce_prod_join_feature/internal_max_reduce_prod_join_feature_test.cpp6
-rw-r--r--searchlib/src/tests/features/prod_features_test.h2
-rw-r--r--searchlib/src/tests/features/tensor/tensor_test.cpp16
-rw-r--r--searchlib/src/tests/features/tensor_from_labels/CMakeLists.txt1
-rw-r--r--searchlib/src/tests/features/tensor_from_labels/tensor_from_labels_test.cpp2
-rw-r--r--searchlib/src/tests/features/tensor_from_weighted_set/CMakeLists.txt1
-rw-r--r--searchlib/src/tests/features/tensor_from_weighted_set/tensor_from_weighted_set_test.cpp14
-rw-r--r--searchlib/src/tests/features/text_similarity_feature/CMakeLists.txt1
-rw-r--r--searchlib/src/tests/features/text_similarity_feature/text_similarity_feature_test.cpp6
-rw-r--r--searchlib/src/tests/nativerank/CMakeLists.txt1
-rw-r--r--searchlib/src/tests/nativerank/nativerank_test.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/fef/test/ftlib.cpp282
-rw-r--r--searchlib/src/vespa/searchlib/fef/test/ftlib.h57
-rw-r--r--searchlib/src/vespa/searchlib/test/CMakeLists.txt2
-rw-r--r--searchlib/src/vespa/searchlib/test/ft_test_app.cpp5
-rw-r--r--searchlib/src/vespa/searchlib/test/ft_test_app.h13
-rw-r--r--searchlib/src/vespa/searchlib/test/ft_test_app_base.cpp286
-rw-r--r--searchlib/src/vespa/searchlib/test/ft_test_app_base.h61
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 &params)
-{
- 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 &params)
-{
- 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 &params,
- 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 &params, 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 &params)
-{
- 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 &params);
- static void FT_SETUP_FAIL(const search::fef::Blueprint &prototype, const search::fef::test::IndexEnvironment &env,
- const StringList &params);
- static void FT_SETUP_OK(const search::fef::Blueprint &prototype, const StringList &params,
- const StringList &expectedIn, const StringList &expectedOut);
- static void FT_SETUP_OK(const search::fef::Blueprint &prototype, const search::fef::test::IndexEnvironment &env,
- const StringList &params, 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 &params);
- 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 &params)
+{
+ 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 &params)
+{
+ 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 &params,
+ 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 &params, 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 &params)
+{
+ 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 &params);
+ static void FT_SETUP_FAIL(const search::fef::Blueprint &prototype, const search::fef::test::IndexEnvironment &env,
+ const StringList &params);
+ static void FT_SETUP_OK(const search::fef::Blueprint &prototype, const StringList &params,
+ const StringList &expectedIn, const StringList &expectedOut);
+ static void FT_SETUP_OK(const search::fef::Blueprint &prototype, const search::fef::test::IndexEnvironment &env,
+ const StringList &params, 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 &params);
+ 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;
+ }
+};