summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--searchlib/src/tests/features/featurebenchmark.cpp49
-rw-r--r--searchlib/src/tests/features/prod_features_attributematch.cpp6
-rw-r--r--searchlib/src/tests/features/prod_features_fieldmatch.cpp6
-rw-r--r--searchlib/src/tests/features/prod_features_fieldtermmatch.cpp5
-rw-r--r--searchlib/src/tests/features/prod_features_framework.cpp38
-rw-r--r--searchlib/src/tests/features/prod_features_test.cpp397
-rw-r--r--searchlib/src/tests/features/prod_features_test.h48
-rw-r--r--searchlib/src/tests/nativerank/nativerank_test.cpp350
8 files changed, 405 insertions, 494 deletions
diff --git a/searchlib/src/tests/features/featurebenchmark.cpp b/searchlib/src/tests/features/featurebenchmark.cpp
index 9c3d4943d65..1c208cb0537 100644
--- a/searchlib/src/tests/features/featurebenchmark.cpp
+++ b/searchlib/src/tests/features/featurebenchmark.cpp
@@ -11,8 +11,10 @@
#include <vespa/searchlib/fef/functiontablefactory.h>
#include <vespa/searchlib/fef/test/plugin/setup.h>
#include <vespa/vespalib/util/stringfmt.h>
-#include <vespa/searchlib/test/ft_test_app.h>
+#define ENABLE_GTEST_MIGRATION
+#include <vespa/searchlib/test/ft_test_app_base.h>
#include <vespa/searchcommon/attribute/config.h>
+#include <vespa/vespalib/gtest/gtest.h>
#include <fstream>
#include <iomanip>
@@ -37,7 +39,8 @@ using AttributePtr = AttributeVector::SP;
using CollectionType = FieldInfo::CollectionType;
-class Benchmark : public FtTestApp {
+class Benchmark : public ::testing::Test,
+ public FtTestAppBase {
public:
using KeyValueVector = std::vector<std::pair<vespalib::string, vespalib::string> >;
@@ -106,6 +109,8 @@ public:
};
private:
+ int _argc;
+ char **_argv;
search::fef::BlueprintFactory _factory;
vespalib::Timer _timer;
vespalib::duration _sample;
@@ -130,16 +135,24 @@ private:
void runNativeProximity(Config & cfg);
public:
- Benchmark();
- ~Benchmark();
- int Main() override;
+ Benchmark(int argc, char **argv);
+ ~Benchmark() override;
+ void TestBody() override;
};
-TEST_APPHOOK(Benchmark);
+Benchmark::Benchmark(int argc, char **argv)
+ : ::testing::Test(),
+ FtTestAppBase(),
+ _argc(argc),
+ _argv(argv),
+ _factory(),
+ _timer(),
+ _sample()
+{
+}
-Benchmark::Benchmark() : _factory(), _timer(), _sample() {}
-Benchmark::~Benchmark() {}
+Benchmark::~Benchmark() = default;
bool
Benchmark::Config::isKnown(const vespalib::string & key) const
@@ -589,11 +602,9 @@ Benchmark::runNativeProximity(Config & cfg)
sample();
}
-int
-Benchmark::Main()
+void
+Benchmark::TestBody()
{
- TEST_INIT("featurebenchmark");
-
// Configure factory with all known blueprints.
setup_fef_test_plugin(_factory);
setup_search_features(_factory);
@@ -617,8 +628,8 @@ Benchmark::Main()
}
if (_argc != optind || optError) {
- //usage();
- return -1;
+ FAIL() << "Bad options";
+ return;
}
Config cfg;
@@ -651,8 +662,12 @@ Benchmark::Main()
std::cout << "TET: " << vespalib::count_ms(_sample) << " (ms)" << std::endl;
std::cout << "ETPD: " << std::fixed << std::setprecision(10) << double(vespalib::count_ms(_sample)) / cfg.getNumRuns() << " (ms)" << std::endl;
std::cout << "**** '" << cfg.getFeature() << "' ****" << std::endl;
-
- TEST_DONE();
- return 0;
}
+int main(int argc, char** argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ ::testing::RegisterTest("Benchmark", "benchmark", nullptr, "",
+ __FILE__, __LINE__,
+ [=]() -> Benchmark* { return new Benchmark(argc, argv); });
+ return RUN_ALL_TESTS();
+}
diff --git a/searchlib/src/tests/features/prod_features_attributematch.cpp b/searchlib/src/tests/features/prod_features_attributematch.cpp
index aac15801b8c..7db5d352448 100644
--- a/searchlib/src/tests/features/prod_features_attributematch.cpp
+++ b/searchlib/src/tests/features/prod_features_attributematch.cpp
@@ -6,9 +6,6 @@
#include <vespa/searchlib/attribute/attributevector.h>
#include <vespa/searchcommon/attribute/config.h>
-#include <vespa/log/log.h>
-LOG_SETUP(".prod_features_attributematch");
-
using namespace search::features;
using namespace search::fef;
using namespace search::fef::test;
@@ -23,8 +20,7 @@ using AVCT = search::attribute::CollectionType;
using CollectionType = FieldInfo::CollectionType;
using DataType = FieldInfo::DataType;
-void
-Test::testAttributeMatch()
+TEST_F(ProdFeaturesTest, test_attribute_match)
{
AttributeMatchBlueprint pt;
{
diff --git a/searchlib/src/tests/features/prod_features_fieldmatch.cpp b/searchlib/src/tests/features/prod_features_fieldmatch.cpp
index 38e74f9ae5b..66815247344 100644
--- a/searchlib/src/tests/features/prod_features_fieldmatch.cpp
+++ b/searchlib/src/tests/features/prod_features_fieldmatch.cpp
@@ -12,11 +12,7 @@ using namespace search::fef::test;
using search::AttributeVector;
using CollectionType = FieldInfo::CollectionType;
-Test::Test() {}
-Test::~Test() {}
-
-void
-Test::testFieldMatch()
+TEST_F(ProdFeaturesTest, test_field_match)
{
testFieldMatchBluePrint();
testFieldMatchExecutor();
diff --git a/searchlib/src/tests/features/prod_features_fieldtermmatch.cpp b/searchlib/src/tests/features/prod_features_fieldtermmatch.cpp
index 397f2597390..921b690bf6f 100644
--- a/searchlib/src/tests/features/prod_features_fieldtermmatch.cpp
+++ b/searchlib/src/tests/features/prod_features_fieldtermmatch.cpp
@@ -3,16 +3,13 @@
#include "prod_features_test.h"
#include <vespa/searchlib/features/fieldtermmatchfeature.h>
#include <vespa/vespalib/util/stringfmt.h>
-#include <vespa/log/log.h>
-LOG_SETUP(".prod_features_fieldtermmatch");
using namespace search::features;
using namespace search::fef;
using namespace search::fef::test;
using CollectionType = FieldInfo::CollectionType;
-void
-Test::testFieldTermMatch()
+TEST_F(ProdFeaturesTest, test_field_term_match)
{
{
// Test blueprint.
diff --git a/searchlib/src/tests/features/prod_features_framework.cpp b/searchlib/src/tests/features/prod_features_framework.cpp
index 0f78182817b..46d509b31b1 100644
--- a/searchlib/src/tests/features/prod_features_framework.cpp
+++ b/searchlib/src/tests/features/prod_features_framework.cpp
@@ -1,6 +1,4 @@
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-#include <vespa/log/log.h>
-LOG_SETUP(".prod_features_framework");
#include "prod_features_test.h"
#include <vespa/searchlib/features/valuefeature.h>
@@ -10,10 +8,8 @@ using namespace search::fef;
using namespace search::fef::test;
using CollectionType = FieldInfo::CollectionType;
-void
-Test::testFramework()
+TEST_F(ProdFeaturesTest, test_framework)
{
- LOG(info, "testFramework()");
IndexEnvironment indexEnv;
{ // test index environment builder
IndexEnvironmentBuilder ieb(indexEnv);
@@ -23,21 +19,21 @@ Test::testFramework()
{
const FieldInfo * info = indexEnv.getFieldByName("foo");
ASSERT_TRUE(info != NULL);
- EXPECT_EQUAL(info->id(), 0u);
+ EXPECT_EQ(info->id(), 0u);
EXPECT_TRUE(info->type() == FieldType::INDEX);
EXPECT_TRUE(info->collection() == CollectionType::SINGLE);
}
{
const FieldInfo * info = indexEnv.getFieldByName("bar");
ASSERT_TRUE(info != NULL);
- EXPECT_EQUAL(info->id(), 1u);
+ EXPECT_EQ(info->id(), 1u);
EXPECT_TRUE(info->type() == FieldType::ATTRIBUTE);
EXPECT_TRUE(info->collection() == CollectionType::WEIGHTEDSET);
}
{
const FieldInfo * info = indexEnv.getFieldByName("baz");
ASSERT_TRUE(info != NULL);
- EXPECT_EQUAL(info->id(), 2u);
+ EXPECT_EQ(info->id(), 2u);
EXPECT_TRUE(info->type() == FieldType::INDEX);
EXPECT_TRUE(info->collection() == CollectionType::ARRAY);
}
@@ -59,7 +55,7 @@ Test::testFramework()
EXPECT_TRUE(tr.lookupField(2)->getHandle() == 2u);
const ITermData *tp = queryEnv.getTerm(0);
ASSERT_TRUE(tp != NULL);
- EXPECT_EQUAL(tp, &tr);
+ EXPECT_EQ(tp, &tr);
}
{
SimpleTermData *tr = qeb.addAttributeNode("bar");
@@ -71,12 +67,12 @@ Test::testFramework()
EXPECT_TRUE(tr->lookupField(1)->getHandle() == 3u);
const ITermData *tp = queryEnv.getTerm(1);
ASSERT_TRUE(tp != NULL);
- EXPECT_EQUAL(tp, tr);
+ EXPECT_EQ(tp, tr);
}
}
MatchData::UP data = layout.createMatchData();
- EXPECT_EQUAL(data->getNumTermFields(), 4u);
+ EXPECT_EQ(data->getNumTermFields(), 4u);
{ // check match data access
MatchDataBuilder mdb(queryEnv, *data);
@@ -97,11 +93,11 @@ Test::testFramework()
FieldPositionsIterator itr = tfmd->getIterator(); // foo (index)
ASSERT_TRUE(itr.valid());
- EXPECT_EQUAL(itr.getFieldLength(), 50u);
- EXPECT_EQUAL(itr.getPosition(), 10u);
+ EXPECT_EQ(itr.getFieldLength(), 50u);
+ EXPECT_EQ(itr.getPosition(), 10u);
itr.next();
ASSERT_TRUE(itr.valid());
- EXPECT_EQUAL(itr.getPosition(), 20u);
+ EXPECT_EQ(itr.getPosition(), 20u);
itr.next();
ASSERT_TRUE(!itr.valid());
}
@@ -118,11 +114,11 @@ Test::testFramework()
FieldPositionsIterator itr = tfmd->getIterator(); // baz (index)
ASSERT_TRUE(itr.valid());
- EXPECT_EQUAL(itr.getFieldLength(), 100u);
- EXPECT_EQUAL(itr.getPosition(), 5u);
+ EXPECT_EQ(itr.getFieldLength(), 100u);
+ EXPECT_EQ(itr.getPosition(), 5u);
itr.next();
ASSERT_TRUE(itr.valid());
- EXPECT_EQUAL(itr.getPosition(), 15u);
+ EXPECT_EQ(itr.getPosition(), 15u);
itr.next();
ASSERT_TRUE(!itr.valid());
}
@@ -137,10 +133,10 @@ Test::testFramework()
}
{ // check that data is cleared
MatchDataBuilder mdb(queryEnv, *data);
- EXPECT_EQUAL(mdb.getTermFieldMatchData(0, 0)->getDocId(), TermFieldMatchData::invalidId());
- EXPECT_EQUAL(mdb.getTermFieldMatchData(0, 1)->getDocId(), TermFieldMatchData::invalidId());
- EXPECT_EQUAL(mdb.getTermFieldMatchData(0, 2)->getDocId(), TermFieldMatchData::invalidId());
- EXPECT_EQUAL(mdb.getTermFieldMatchData(1, 1)->getDocId(), TermFieldMatchData::invalidId());
+ EXPECT_EQ(mdb.getTermFieldMatchData(0, 0)->getDocId(), TermFieldMatchData::invalidId());
+ EXPECT_EQ(mdb.getTermFieldMatchData(0, 1)->getDocId(), TermFieldMatchData::invalidId());
+ EXPECT_EQ(mdb.getTermFieldMatchData(0, 2)->getDocId(), TermFieldMatchData::invalidId());
+ EXPECT_EQ(mdb.getTermFieldMatchData(1, 1)->getDocId(), TermFieldMatchData::invalidId());
// test illegal things
ASSERT_TRUE(!mdb.addOccurence("foo", 1, 10)); // invalid term/field combination
diff --git a/searchlib/src/tests/features/prod_features_test.cpp b/searchlib/src/tests/features/prod_features_test.cpp
index 472bb545f33..22105533895 100644
--- a/searchlib/src/tests/features/prod_features_test.cpp
+++ b/searchlib/src/tests/features/prod_features_test.cpp
@@ -79,103 +79,65 @@ using DataType = FieldInfo::DataType;
const double EPS = 10e-6;
-TEST_APPHOOK(Test);
-
-int
-Test::Main()
+Test::Test()
{
- TEST_INIT("prod_features_test");
-
// Configure factory with all known blueprints.
setup_fef_test_plugin(_factory);
setup_search_features(_factory);
-
- // Test all features.
- TEST_DO(testFramework()); TEST_FLUSH();
- TEST_DO(testFtLib()); TEST_FLUSH();
- TEST_DO(testAge()); TEST_FLUSH();
- TEST_DO(testAttribute()); TEST_FLUSH();
- TEST_DO(testAttributeMatch()); TEST_FLUSH();
- TEST_DO(testCloseness()); TEST_FLUSH();
- TEST_DO(testMatchCount()); TEST_FLUSH();
- TEST_DO(testGreatCircleDistance()); TEST_FLUSH();
- TEST_DO(testDistance()); TEST_FLUSH();
- TEST_DO(testDistanceToPath()); TEST_FLUSH();
- TEST_DO(testDotProduct()); TEST_FLUSH();
- TEST_DO(testFieldLength()); TEST_FLUSH();
- TEST_DO(testFieldMatch()); TEST_FLUSH();
- TEST_DO(testFieldTermMatch()); TEST_FLUSH();
- TEST_DO(testFirstPhase()); TEST_FLUSH();
- TEST_DO(testForeach()); TEST_FLUSH();
- TEST_DO(testFreshness()); TEST_FLUSH();
- TEST_DO(testMatch()); TEST_FLUSH();
- TEST_DO(testMatches()); TEST_FLUSH();
- TEST_DO(testNow()); TEST_FLUSH();
- TEST_DO(testQuery()); TEST_FLUSH();
- TEST_DO(testQueryTermCount()); TEST_FLUSH();
- TEST_DO(testRandom()); TEST_FLUSH();
- TEST_DO(testRandomNormal()); TEST_FLUSH();
- TEST_DO(testRandomNormalStable()); TEST_FLUSH();
- TEST_DO(testRankingExpression()); TEST_FLUSH();
- TEST_DO(testTerm()); TEST_FLUSH();
- TEST_DO(testTermDistance()); TEST_FLUSH();
- TEST_DO(testUtils()); TEST_FLUSH();
- TEST_DO(testUnique()); TEST_FLUSH();
-
- TEST_DONE();
- return 0;
}
+Test::~Test() = default;
-void
-Test::testFtLib()
+ProdFeaturesTest::ProdFeaturesTest() = default;
+ProdFeaturesTest::~ProdFeaturesTest() = default;
+
+TEST_F(ProdFeaturesTest, test_ft_lib)
{
{ // toQuery
FtQuery q = FtUtil::toQuery("a b!50 0.5:c!200%0.5 d%0.3 e!300 0.3:f ");
ASSERT_TRUE(q.size() == 6);
- EXPECT_EQUAL(q[0].term, vespalib::string("a"));
- EXPECT_EQUAL(q[0].termWeight.percent(), 100);
- EXPECT_APPROX(q[0].connexity, 0.1f, EPS);
- EXPECT_APPROX(q[0].significance, 0.1f, EPS);
- EXPECT_EQUAL(q[1].term, vespalib::string("b"));
- EXPECT_EQUAL(q[1].termWeight.percent(), 50);
- EXPECT_APPROX(q[1].connexity, 0.1f, EPS);
- EXPECT_APPROX(q[1].significance, 0.1f, EPS);
- EXPECT_EQUAL(q[2].term, vespalib::string("c"));
- EXPECT_EQUAL(q[2].termWeight.percent(), 200);
- EXPECT_APPROX(q[2].connexity, 0.5f, EPS);
- EXPECT_APPROX(q[2].significance, 0.5f, EPS);
- EXPECT_EQUAL(q[3].term, vespalib::string("d"));
- EXPECT_EQUAL(q[3].termWeight.percent(), 100);
- EXPECT_APPROX(q[3].connexity, 0.1f, EPS);
- EXPECT_APPROX(q[3].significance, 0.3f, EPS);
- EXPECT_EQUAL(q[4].term, vespalib::string("e"));
- EXPECT_EQUAL(q[4].termWeight.percent(), 300);
- EXPECT_APPROX(q[4].connexity, 0.1f, EPS);
- EXPECT_APPROX(q[4].significance, 0.1f, EPS);
- EXPECT_EQUAL(q[5].term, vespalib::string("f"));
- EXPECT_EQUAL(q[5].termWeight.percent(), 100);
- EXPECT_APPROX(q[5].connexity, 0.3f, EPS);
- EXPECT_APPROX(q[5].significance, 0.1f, EPS);
+ EXPECT_EQ(q[0].term, vespalib::string("a"));
+ EXPECT_EQ(q[0].termWeight.percent(), 100);
+ EXPECT_NEAR(q[0].connexity, 0.1f, EPS);
+ EXPECT_NEAR(q[0].significance, 0.1f, EPS);
+ EXPECT_EQ(q[1].term, vespalib::string("b"));
+ EXPECT_EQ(q[1].termWeight.percent(), 50);
+ EXPECT_NEAR(q[1].connexity, 0.1f, EPS);
+ EXPECT_NEAR(q[1].significance, 0.1f, EPS);
+ EXPECT_EQ(q[2].term, vespalib::string("c"));
+ EXPECT_EQ(q[2].termWeight.percent(), 200);
+ EXPECT_NEAR(q[2].connexity, 0.5f, EPS);
+ EXPECT_NEAR(q[2].significance, 0.5f, EPS);
+ EXPECT_EQ(q[3].term, vespalib::string("d"));
+ EXPECT_EQ(q[3].termWeight.percent(), 100);
+ EXPECT_NEAR(q[3].connexity, 0.1f, EPS);
+ EXPECT_NEAR(q[3].significance, 0.3f, EPS);
+ EXPECT_EQ(q[4].term, vespalib::string("e"));
+ EXPECT_EQ(q[4].termWeight.percent(), 300);
+ EXPECT_NEAR(q[4].connexity, 0.1f, EPS);
+ EXPECT_NEAR(q[4].significance, 0.1f, EPS);
+ EXPECT_EQ(q[5].term, vespalib::string("f"));
+ EXPECT_EQ(q[5].termWeight.percent(), 100);
+ EXPECT_NEAR(q[5].connexity, 0.3f, EPS);
+ EXPECT_NEAR(q[5].significance, 0.1f, EPS);
}
{ // toRankResult
RankResult rr = toRankResult("foo", "a:0.5 b:-0.5 c:2 d:3 ");
std::vector<vespalib::string> keys = rr.getKeys();
ASSERT_TRUE(keys.size() == 4);
- EXPECT_EQUAL(keys[0], vespalib::string("foo.a"));
- EXPECT_EQUAL(keys[1], vespalib::string("foo.b"));
- EXPECT_EQUAL(keys[2], vespalib::string("foo.c"));
- EXPECT_EQUAL(keys[3], vespalib::string("foo.d"));
- EXPECT_APPROX(rr.getScore("foo.a"), 0.5f, EPS);
- EXPECT_APPROX(rr.getScore("foo.b"), -0.5f, EPS);
- EXPECT_APPROX(rr.getScore("foo.c"), 2.0f, EPS);
- EXPECT_APPROX(rr.getScore("foo.d"), 3.0f, EPS);
+ EXPECT_EQ(keys[0], vespalib::string("foo.a"));
+ EXPECT_EQ(keys[1], vespalib::string("foo.b"));
+ EXPECT_EQ(keys[2], vespalib::string("foo.c"));
+ EXPECT_EQ(keys[3], vespalib::string("foo.d"));
+ EXPECT_NEAR(rr.getScore("foo.a"), 0.5f, EPS);
+ EXPECT_NEAR(rr.getScore("foo.b"), -0.5f, EPS);
+ EXPECT_NEAR(rr.getScore("foo.c"), 2.0f, EPS);
+ EXPECT_NEAR(rr.getScore("foo.d"), 3.0f, EPS);
}
}
-void
-Test::testAge()
+TEST_F(ProdFeaturesTest, test_age)
{
{ // Test blueprint
FtIndexEnvironment idx_env;
@@ -222,8 +184,7 @@ Test::setupForAgeTest(FtFeatureTest & ft, int64_t docTime)
ft.getIndexEnv().getAttributeMap().add(doctime);
}
-void
-Test::testAttribute()
+TEST_F(ProdFeaturesTest, test_attribute)
{
AttributeBlueprint prototype;
{
@@ -476,8 +437,7 @@ Test::setupForAttributeTest(FtFeatureTest &ft, bool setup_env)
ASSERT_TRUE(avs[9]->load());
}
-void
-Test::testCloseness()
+TEST_F(ProdFeaturesTest, test_closeness)
{
{ // Test blueprint.
ClosenessBlueprint pt;
@@ -492,11 +452,11 @@ Test::testCloseness()
}
{ // Test executor.
- TEST_DO(assertCloseness(1, "pos", 0));
+ assertCloseness(1, "pos", 0);
assertCloseness(0.8, "pos", 1802661);
assertCloseness(0, "pos", 9013306);
// two-argument version
- TEST_DO(assertCloseness(0.8, "field,pos", 1802661));
+ assertCloseness(0.8, "field,pos", 1802661);
// use non-default maxDistance
assertCloseness(1, "pos", 0, 100);
@@ -536,8 +496,7 @@ Test::assertCloseness(feature_t exp, const vespalib::string & attr, double dista
ASSERT_TRUE(ft.execute(RankResult().addScore(feature, exp)));
}
-void
-Test::testFieldLength()
+TEST_F(ProdFeaturesTest, test_field_length)
{
FieldLengthBlueprint pt;
@@ -629,8 +588,7 @@ Test::assertFieldMatchTS(const vespalib::string & spec,
}
-void
-Test::testFirstPhase()
+TEST_F(ProdFeaturesTest, test_first_phase)
{
{ // Test blueprint.
FirstPhaseBlueprint pt;
@@ -656,8 +614,7 @@ Test::testFirstPhase()
}
}
-void
-Test::testForeach()
+TEST_F(ProdFeaturesTest, test_foreach)
{
{ // Test blueprint.
ForeachBlueprint pt;
@@ -764,8 +721,7 @@ Test::assertForeachOperation(feature_t exp, const vespalib::string & cond, const
}
-void
-Test::testFreshness()
+TEST_F(ProdFeaturesTest, test_freshness)
{
{ // Test blueprint.
FtIndexEnvironment idx_env;
@@ -853,8 +809,7 @@ GeoLocation toGL(const AirPort &p) {
}
-void
-Test::testGreatCircleDistance()
+TEST_F(ProdFeaturesTest, test_great_circle_distance)
{
{ // Test blueprint.
GreatCircleDistanceBlueprint pt;
@@ -892,8 +847,7 @@ Test::testGreatCircleDistance()
}
}
-void
-Test::testDistance()
+TEST_F(ProdFeaturesTest, test_distance)
{
{ // Test blueprint.
DistanceBlueprint pt;
@@ -924,34 +878,34 @@ Test::testDistance()
{ // test 2D multi location (zcurve)
// note: "aspect" is ignored now, computed from "y", and cos(60 degrees) = 0.5
vespalib::string positions = "5:59999995," "35:60000000," "5:60000040," "35:59999960";
- TEST_DO(assert2DZDistance(static_cast<feature_t>(0.0f), positions, 5, 59999995, 0, 0));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(0.0f), positions, 35, 60000000, 0x10000000, 1));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(0.0f), positions, 5, 60000040, 0x20000000, 2));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(0.0f), positions, 35, 59999960, 0x30000000, 3));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(std::sqrt(250.0f)), positions, 15, 59999980, 0x40000000, 0));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(std::sqrt(250.0f)), positions, -5, 59999980, 0x50000000, 0));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(std::sqrt(250.0f)), positions, 45, 59999985, 0x60000000, 1));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(std::sqrt(250.0f)), positions, 45, 60000015, 0x70000000, 1));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(std::sqrt(425.0f)), positions, 15, 60000020, 0x80000000, 2));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(std::sqrt(425.0f)), positions, -5, 60000020, 0x90000000, 2));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(std::sqrt(50.0f)), positions, 45, 59999955, 0xa0000000, 3));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(std::sqrt(50.0f)), positions, 45, 59999965, 0xb0000000, 3));
-
- TEST_DO(assert2DZDistance(static_cast<feature_t>(std::sqrt(450.0f)), positions, -25, 59999980, 0xc0000000, 0));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(std::sqrt(625.0f)), positions, -25, 60000060, 0xd0000000, 2));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(std::sqrt(250.0f)), positions, 15, 59999980, 0xe0000000, 0));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(std::sqrt(425.0f)), positions, 45, 59999980, 0xf0000000, 1));
+ assert2DZDistance(static_cast<feature_t>(0.0f), positions, 5, 59999995, 0, 0);
+ assert2DZDistance(static_cast<feature_t>(0.0f), positions, 35, 60000000, 0x10000000, 1);
+ assert2DZDistance(static_cast<feature_t>(0.0f), positions, 5, 60000040, 0x20000000, 2);
+ assert2DZDistance(static_cast<feature_t>(0.0f), positions, 35, 59999960, 0x30000000, 3);
+ assert2DZDistance(static_cast<feature_t>(std::sqrt(250.0f)), positions, 15, 59999980, 0x40000000, 0);
+ assert2DZDistance(static_cast<feature_t>(std::sqrt(250.0f)), positions, -5, 59999980, 0x50000000, 0);
+ assert2DZDistance(static_cast<feature_t>(std::sqrt(250.0f)), positions, 45, 59999985, 0x60000000, 1);
+ assert2DZDistance(static_cast<feature_t>(std::sqrt(250.0f)), positions, 45, 60000015, 0x70000000, 1);
+ assert2DZDistance(static_cast<feature_t>(std::sqrt(425.0f)), positions, 15, 60000020, 0x80000000, 2);
+ assert2DZDistance(static_cast<feature_t>(std::sqrt(425.0f)), positions, -5, 60000020, 0x90000000, 2);
+ assert2DZDistance(static_cast<feature_t>(std::sqrt(50.0f)), positions, 45, 59999955, 0xa0000000, 3);
+ assert2DZDistance(static_cast<feature_t>(std::sqrt(50.0f)), positions, 45, 59999965, 0xb0000000, 3);
+
+ assert2DZDistance(static_cast<feature_t>(std::sqrt(450.0f)), positions, -25, 59999980, 0xc0000000, 0);
+ assert2DZDistance(static_cast<feature_t>(std::sqrt(625.0f)), positions, -25, 60000060, 0xd0000000, 2);
+ assert2DZDistance(static_cast<feature_t>(std::sqrt(250.0f)), positions, 15, 59999980, 0xe0000000, 0);
+ assert2DZDistance(static_cast<feature_t>(std::sqrt(425.0f)), positions, 45, 59999980, 0xf0000000, 1);
}
{ // test geo multi location (zcurve)
// note: cos(70.528779 degrees) = 1/3
vespalib::string positions = "0:70528779," "100:70528879," "-200:70528979," "-300:70528479," "400:70528379";
- TEST_DO(assert2DZDistance(static_cast<feature_t>(0.0f), positions, 0, 70528779 + 0, 0, 0));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(1.0f), positions, 100, 70528779 + 101, 0x20000000, 1));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(0.0f), positions, -200, 70528779 + 200, 0x40000000, 2));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(13.0f), positions, -315, 70528779 -312, 0x80000000, 3));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(5.0f), positions, 412, 70528779 -403, 0xB0000000, 4));
- TEST_DO(assert2DZDistance(static_cast<feature_t>(5.0f), positions, 109, 70528779 + 104, 0xF0000000, 1));
+ assert2DZDistance(static_cast<feature_t>(0.0f), positions, 0, 70528779 + 0, 0, 0);
+ assert2DZDistance(static_cast<feature_t>(1.0f), positions, 100, 70528779 + 101, 0x20000000, 1);
+ assert2DZDistance(static_cast<feature_t>(0.0f), positions, -200, 70528779 + 200, 0x40000000, 2);
+ assert2DZDistance(static_cast<feature_t>(13.0f), positions, -315, 70528779 -312, 0x80000000, 3);
+ assert2DZDistance(static_cast<feature_t>(5.0f), positions, 412, 70528779 -403, 0xB0000000, 4);
+ assert2DZDistance(static_cast<feature_t>(5.0f), positions, 109, 70528779 + 104, 0xF0000000, 1);
}
{ // test default distance
@@ -1056,8 +1010,7 @@ Test::assert2DZDistance(feature_t exp, const vespalib::string & positions,
addScore("distance(pos).longitude", pos[hit_index].first * 1e-6)));
}
-void
-Test::testDistanceToPath()
+TEST_F(ProdFeaturesTest, test_distance_to_path)
{
{
// Test blueprint.
@@ -1197,8 +1150,8 @@ verifyCorrectDotProductExecutor(BlueprintFactory & factory, vespalib::stringref
vespalib::Stash stash;
FeatureExecutor &exc = bp.createExecutor(ft.getQueryEnv(), stash);
// check that we have the optimized enum version
- EXPECT_EQUAL(expected, exc.getClassName());
- EXPECT_EQUAL(1u, deps.output.size());
+ EXPECT_EQ(expected, exc.getClassName());
+ EXPECT_EQ(1u, deps.output.size());
}
template<typename T>
@@ -1208,22 +1161,21 @@ void verifyArrayParser()
for(const vespalib::string & s : v) {
std::vector<T> out;
ArrayParser::parse(s, out);
- EXPECT_EQUAL(8u, out.size());
- EXPECT_EQUAL(2, out[0]);
- EXPECT_EQUAL(-3, out[1]);
- EXPECT_EQUAL(0, out[2]);
- EXPECT_EQUAL(0, out[3]);
- EXPECT_EQUAL(0, out[4]);
- EXPECT_EQUAL(0, out[5]);
- EXPECT_EQUAL(0, out[6]);
- EXPECT_EQUAL(-3, out[7]);
+ EXPECT_EQ(8u, out.size());
+ EXPECT_EQ(2, out[0]);
+ EXPECT_EQ(-3, out[1]);
+ EXPECT_EQ(0, out[2]);
+ EXPECT_EQ(0, out[3]);
+ EXPECT_EQ(0, out[4]);
+ EXPECT_EQ(0, out[5]);
+ EXPECT_EQ(0, out[6]);
+ EXPECT_EQ(-3, out[7]);
}
}
}
-void
-Test::testDotProduct()
+TEST_F(ProdFeaturesTest, test_dot_product)
{
{ // Test blueprint.
FtIndexEnvironment idx_env;
@@ -1252,69 +1204,69 @@ Test::testDotProduct()
{
dotproduct::wset::EnumVector out(sv);
WeightedSetParser::parse("", out);
- EXPECT_EQUAL(out.getVector().size(), 0u);
+ EXPECT_EQ(out.getVector().size(), 0u);
WeightedSetParser::parse("()", out);
- EXPECT_EQUAL(out.getVector().size(), 0u);
+ EXPECT_EQ(out.getVector().size(), 0u);
WeightedSetParser::parse("(a;1)", out);
- EXPECT_EQUAL(out.getVector().size(), 0u);
+ EXPECT_EQ(out.getVector().size(), 0u);
WeightedSetParser::parse("(a:1)", out);
- EXPECT_EQUAL(out.getVector().size(), 1u);
+ EXPECT_EQ(out.getVector().size(), 1u);
EXPECT_TRUE(sv->findEnum("a", e));
- EXPECT_EQUAL(out.getVector()[0].first, e);
- EXPECT_EQUAL(out.getVector()[0].second, 1.0);
+ EXPECT_EQ(out.getVector()[0].first, e);
+ EXPECT_EQ(out.getVector()[0].second, 1.0);
}
std::vector<vespalib::string> v = {"(b:2.5,c:-3.5)", "{b:2.5,c:-3.5}"};
for(const vespalib::string & s : v) {
dotproduct::wset::EnumVector out(sv);
WeightedSetParser::parse(s, out);
- EXPECT_EQUAL(out.getVector().size(), 2u);
+ EXPECT_EQ(out.getVector().size(), 2u);
EXPECT_TRUE(sv->findEnum("b", e));
- EXPECT_EQUAL(out.getVector()[0].first, e);
- EXPECT_EQUAL(out.getVector()[0].second, 2.5);
+ EXPECT_EQ(out.getVector()[0].first, e);
+ EXPECT_EQ(out.getVector()[0].second, 2.5);
EXPECT_TRUE(sv->findEnum("c", e));
- EXPECT_EQUAL(out.getVector()[1].first, e);
- EXPECT_EQUAL(out.getVector()[1].second, -3.5);
+ EXPECT_EQ(out.getVector()[1].first, e);
+ EXPECT_EQ(out.getVector()[1].second, -3.5);
}
{ // test funky syntax
dotproduct::wset::EnumVector out(sv);
WeightedSetParser::parse("( a: 1, b:2 ,c: , :3)", out);
- EXPECT_EQUAL(out.getVector().size(), 4u);
+ EXPECT_EQ(out.getVector().size(), 4u);
EXPECT_TRUE(sv->findEnum("a", e));
- EXPECT_EQUAL(out.getVector()[0].first, e);
- EXPECT_EQUAL(out.getVector()[0].second, 1);
+ EXPECT_EQ(out.getVector()[0].first, e);
+ EXPECT_EQ(out.getVector()[0].second, 1);
EXPECT_TRUE(sv->findEnum("b", e));
- EXPECT_EQUAL(out.getVector()[1].first, e);
- EXPECT_EQUAL(out.getVector()[1].second, 2);
+ EXPECT_EQ(out.getVector()[1].first, e);
+ EXPECT_EQ(out.getVector()[1].second, 2);
EXPECT_TRUE(sv->findEnum("c", e));
- EXPECT_EQUAL(out.getVector()[2].first, e);
- EXPECT_EQUAL(out.getVector()[2].second, 0);
+ EXPECT_EQ(out.getVector()[2].first, e);
+ EXPECT_EQ(out.getVector()[2].second, 0);
EXPECT_TRUE(sv->findEnum("", e));
- EXPECT_EQUAL(out.getVector()[3].first, e);
- EXPECT_EQUAL(out.getVector()[3].second, 3);
+ EXPECT_EQ(out.getVector()[3].first, e);
+ EXPECT_EQ(out.getVector()[3].second, 3);
}
{ // strings not in attribute vector
dotproduct::wset::EnumVector out(sv);
WeightedSetParser::parse("(not:1)", out);
- EXPECT_EQUAL(out.getVector().size(), 0u);
+ EXPECT_EQ(out.getVector().size(), 0u);
}
}
{ // string vector
dotproduct::wset::StringVector out;
WeightedSetParser::parse("(b:2.5,c:-3.5)", out);
- EXPECT_EQUAL(out.getVector().size(), 2u);
- EXPECT_EQUAL(out.getVector()[0].first, "b");
- EXPECT_EQUAL(out.getVector()[0].second, 2.5);
- EXPECT_EQUAL(out.getVector()[1].first, "c");
- EXPECT_EQUAL(out.getVector()[1].second, -3.5);
+ EXPECT_EQ(out.getVector().size(), 2u);
+ EXPECT_EQ(out.getVector()[0].first, "b");
+ EXPECT_EQ(out.getVector()[0].second, 2.5);
+ EXPECT_EQ(out.getVector()[1].first, "c");
+ EXPECT_EQ(out.getVector()[1].second, -3.5);
}
{ // integer vector
dotproduct::wset::IntegerVector out;
WeightedSetParser::parse("(20:2.5,30:-3.5)", out);
- EXPECT_EQUAL(out.getVector().size(), 2u);
- EXPECT_EQUAL(out.getVector()[0].first, 20);
- EXPECT_EQUAL(out.getVector()[0].second, 2.5);
- EXPECT_EQUAL(out.getVector()[1].first, 30);
- EXPECT_EQUAL(out.getVector()[1].second, -3.5);
+ EXPECT_EQ(out.getVector().size(), 2u);
+ EXPECT_EQ(out.getVector()[0].first, 20);
+ EXPECT_EQ(out.getVector()[0].second, 2.5);
+ EXPECT_EQ(out.getVector()[1].first, 30);
+ EXPECT_EQ(out.getVector()[1].second, -3.5);
}
}
verifyArrayParser<int8_t>();
@@ -1327,7 +1279,7 @@ Test::testDotProduct()
vespalib::string s = "[[1:3]]";
std::vector<int32_t> out;
ArrayParser::parse(s, out);
- EXPECT_EQUAL(0u, out.size());
+ EXPECT_EQ(0u, out.size());
}
{ // Test executor.
@@ -1351,10 +1303,10 @@ Test::testDotProduct()
assertDotProduct(550, "(a:1,b:2,c:3,d:4,e:5)", 1, "wsextstr");
}
for (const char * name : {"wsbyte", "wsint", "wsint_fast"}) {
- TEST_DO(assertDotProduct(0, "()", 1, name));
- TEST_DO(assertDotProduct(0, "(6:5,7:5)", 1, name));
- TEST_DO(assertDotProduct(18, "(4:4.5)", 1, name));
- TEST_DO(assertDotProduct(57, "(1:1,2:2,3:3,4:4.5,5:5)", 1, name));
+ assertDotProduct(0, "()", 1, name);
+ assertDotProduct(0, "(6:5,7:5)", 1, name);
+ assertDotProduct(18, "(4:4.5)", 1, name);
+ assertDotProduct(57, "(1:1,2:2,3:3,4:4.5,5:5)", 1, name);
}
for (const char * name : {"arrbyte", "arrint", "arrfloat", "arrint_fast", "arrfloat_fast"}) {
assertDotProduct(0, "()", 1, name);
@@ -1375,12 +1327,12 @@ Test::testDotProduct()
assertDotProduct(17, "(0:1,3:4,50:97)", 1, "sint", "arrfloat"); // attribute override
assertDotProduct(0, "(0:1,3:4,50:97)", 1, "sint", "arrfloat_non_existing"); // incorrect attribute override
}
- TEST_DO(verifyCorrectDotProductExecutor(_factory, "wsstr", "{a:1,b:2}", "search::features::dotproduct::wset::(anonymous namespace)::DotProductExecutorByEnum"));
- TEST_DO(verifyCorrectDotProductExecutor(_factory, "wsstr", "{a:1}", "search::features::dotproduct::wset::(anonymous namespace)::SingleDotProductExecutorByEnum"));
- TEST_DO(verifyCorrectDotProductExecutor(_factory, "wsstr", "{unknown:1}", "search::features::SingleZeroValueExecutor"));
- TEST_DO(verifyCorrectDotProductExecutor(_factory, "wsint", "{1:1, 2:3}", "search::features::dotproduct::wset::DotProductByWeightedSetReadViewExecutor<int>"));
- TEST_DO(verifyCorrectDotProductExecutor(_factory, "wsint", "{1:1}", "search::features::dotproduct::wset::(anonymous namespace)::SingleDotProductByWeightedValueExecutor<int>"));
- TEST_DO(verifyCorrectDotProductExecutor(_factory, "wsint", "{}", "search::features::SingleZeroValueExecutor"));
+ verifyCorrectDotProductExecutor(_factory, "wsstr", "{a:1,b:2}", "search::features::dotproduct::wset::(anonymous namespace)::DotProductExecutorByEnum");
+ verifyCorrectDotProductExecutor(_factory, "wsstr", "{a:1}", "search::features::dotproduct::wset::(anonymous namespace)::SingleDotProductExecutorByEnum");
+ verifyCorrectDotProductExecutor(_factory, "wsstr", "{unknown:1}", "search::features::SingleZeroValueExecutor");
+ verifyCorrectDotProductExecutor(_factory, "wsint", "{1:1, 2:3}", "search::features::dotproduct::wset::DotProductByWeightedSetReadViewExecutor<int>");
+ verifyCorrectDotProductExecutor(_factory, "wsint", "{1:1}", "search::features::dotproduct::wset::(anonymous namespace)::SingleDotProductByWeightedValueExecutor<int>");
+ verifyCorrectDotProductExecutor(_factory, "wsint", "{}", "search::features::SingleZeroValueExecutor");
}
@@ -1463,8 +1415,7 @@ Test::setupForDotProductTest(FtFeatureTest & ft)
d->addDoc(docId);
}
-void
-Test::testNow()
+TEST_F(ProdFeaturesTest, test_now)
{
{
// Test blueprint.
@@ -1503,13 +1454,12 @@ Test::testNow()
RankResult res;
ASSERT_TRUE(ft.executeOnly(res, 1));
feature_t now = 15000000000;
- ASSERT_EQUAL(now, res.getScore("now"));
+ ASSERT_EQ(now, res.getScore("now"));
}
}
-void
-Test::testMatch()
+TEST_F(ProdFeaturesTest, test_match)
{
{ // Test blueprint.
MatchBlueprint pt;
@@ -1617,8 +1567,7 @@ Test::testMatch()
}
}
-void
-Test::testMatchCount()
+TEST_F(ProdFeaturesTest, test_match_count)
{
{ // Test blueprint.
MatchCountBlueprint pt;
@@ -1666,12 +1615,11 @@ Test::testMatchCount()
}
void verifySequence(uint64_t first, uint64_t second) {
- ASSERT_GREATER(first, second);
- ASSERT_GREATER(double(first), double(second));
+ ASSERT_GT(first, second);
+ ASSERT_GT(double(first), double(second));
}
-void
-Test::testUnique()
+TEST_F(ProdFeaturesTest, test_unique)
{
{
GlobalSequenceBlueprint bp;
@@ -1683,19 +1631,18 @@ Test::testUnique()
}
FtFeatureTest ft(_factory, "globalSequence");
ASSERT_TRUE(ft.setup());
- TEST_DO(verifySequence(GlobalSequenceBlueprint::globalSequence(1, 0), GlobalSequenceBlueprint::globalSequence(1,1)));
- TEST_DO(verifySequence(GlobalSequenceBlueprint::globalSequence(1, 1), GlobalSequenceBlueprint::globalSequence(1,2)));
- TEST_DO(verifySequence(GlobalSequenceBlueprint::globalSequence(1, 1), GlobalSequenceBlueprint::globalSequence(2,1)));
- TEST_DO(verifySequence(GlobalSequenceBlueprint::globalSequence(2, 1), GlobalSequenceBlueprint::globalSequence(2,2)));
- TEST_DO(verifySequence(GlobalSequenceBlueprint::globalSequence(2, 2), GlobalSequenceBlueprint::globalSequence(2,3)));
- TEST_DO(verifySequence(GlobalSequenceBlueprint::globalSequence(2, 2), GlobalSequenceBlueprint::globalSequence(3,0)));
- ASSERT_EQUAL(0xfffffffefffdul, (1ul << 48) - 0x10003l);
+ verifySequence(GlobalSequenceBlueprint::globalSequence(1, 0), GlobalSequenceBlueprint::globalSequence(1,1));
+ verifySequence(GlobalSequenceBlueprint::globalSequence(1, 1), GlobalSequenceBlueprint::globalSequence(1,2));
+ verifySequence(GlobalSequenceBlueprint::globalSequence(1, 1), GlobalSequenceBlueprint::globalSequence(2,1));
+ verifySequence(GlobalSequenceBlueprint::globalSequence(2, 1), GlobalSequenceBlueprint::globalSequence(2,2));
+ verifySequence(GlobalSequenceBlueprint::globalSequence(2, 2), GlobalSequenceBlueprint::globalSequence(2,3));
+ verifySequence(GlobalSequenceBlueprint::globalSequence(2, 2), GlobalSequenceBlueprint::globalSequence(3,0));
+ ASSERT_EQ(0xfffffffefffdul, (1ul << 48) - 0x10003l);
EXPECT_TRUE(ft.execute(0xfffffffefffdul, 0, 1));
EXPECT_TRUE(ft.execute(0xfffffff8fffdul, 0, 7));
}
-void
-Test::testMatches()
+TEST_F(ProdFeaturesTest, test_matches)
{
{ // Test blueprint.
MatchesBlueprint pt;
@@ -1784,13 +1731,14 @@ Test::assertMatches(uint32_t output,
index["foo"] = FtUtil::tokenize(field);
FT_SETUP(ft, FtUtil::toQuery(query), index, 1);
- ASSERT_TRUE(ft.execute(output, EPS, docId));
+ EXPECT_TRUE(ft.execute(output, EPS, docId));
// Execute and compare results.
- return EXPECT_TRUE(ft.execute(output, EPS, docId));
+ bool failed = false;
+ EXPECT_TRUE(ft.execute(output, EPS, docId)) << (failed = true, "");
+ return !failed;
}
-void
-Test::testQuery()
+TEST_F(ProdFeaturesTest, test_query)
{
{ // Test blueprint.
QueryBlueprint pt;
@@ -1831,8 +1779,7 @@ Test::testQuery()
}
}
-void
-Test::testQueryTermCount()
+TEST_F(ProdFeaturesTest, test_query_term_count)
{
{ // Test blueprint.
QueryTermCountBlueprint pt;
@@ -1869,8 +1816,7 @@ Test::testQueryTermCount()
}
}
-void
-Test::testRandom()
+TEST_F(ProdFeaturesTest, test_random)
{
{ // Test blueprint.
RandomBlueprint pt;
@@ -1921,8 +1867,8 @@ Test::testRandom()
}
}
-void
-Test::testRandomNormal() {
+TEST_F(ProdFeaturesTest, test_random_normal)
+{
{ // Test blueprint.
RandomNormalBlueprint pt;
@@ -1965,8 +1911,8 @@ Test::testRandomNormal() {
}
}
-void
-Test::testRandomNormalStable() {
+TEST_F(ProdFeaturesTest, test_random_normal_stable)
+{
{ // Test blueprint.
RandomNormalStableBlueprint pt;
@@ -2008,8 +1954,7 @@ Test::testRandomNormalStable() {
}
}
-void
-Test::testRankingExpression()
+TEST_F(ProdFeaturesTest, test_ranking_expression)
{
{ // Test blueprint.
RankingExpressionBlueprint prototype;
@@ -2090,8 +2035,7 @@ Test::getExpression(const vespalib::string &parameter) const
return FNB().baseName("rankingExpression").parameter(parameter).buildName();
}
-void
-Test::testTerm()
+TEST_F(ProdFeaturesTest, test_term)
{
{
// Test blueprint.
@@ -2171,8 +2115,7 @@ Test::testTerm()
}
}
-void
-Test::testTermDistance()
+TEST_F(ProdFeaturesTest, test_term_distance)
{
{ // test blueprint
TermDistanceBlueprint pt;
@@ -2238,32 +2181,34 @@ Test::assertTermDistance(const TermDistanceCalculator::Result & exp,
rr.addScore(feature + ".forwardTermPosition", exp.forwardTermPos);
rr.addScore(feature + ".reverse", exp.reverseDist);
rr.addScore(feature + ".reverseTermPosition", exp.reverseTermPos);
- return EXPECT_TRUE(ft.execute(rr, docId));
+ bool failed = false;
+ EXPECT_TRUE(ft.execute(rr, docId)) << (failed = true, "");
+ return !failed;
}
-void
-Test::testUtils()
+TEST_F(ProdFeaturesTest, test_utils)
{
{ // getSignificance
- EXPECT_APPROX(util::getSignificance(0.0), 1, EPS);
- EXPECT_APPROX(util::getSignificance(0.0 + 1.0e-7), 1, EPS);
- EXPECT_APPROX(util::getSignificance(1.0), 0.5, EPS);
- EXPECT_APPROX(util::getSignificance(1.0 + 1.0e-7), 0.5, EPS);
+ EXPECT_NEAR(util::getSignificance(0.0), 1, EPS);
+ EXPECT_NEAR(util::getSignificance(0.0 + 1.0e-7), 1, EPS);
+ EXPECT_NEAR(util::getSignificance(1.0), 0.5, EPS);
+ EXPECT_NEAR(util::getSignificance(1.0 + 1.0e-7), 0.5, EPS);
feature_t last = 1;
for (uint32_t i = 2; i <= 100; i = i + 1) {
feature_t s = util::getSignificance(i * 1.0e-6);
- EXPECT_GREATER(s, 0);
- EXPECT_LESS(s, 1);
- EXPECT_LESS(s, last);
+ EXPECT_GT(s, 0);
+ EXPECT_LT(s, 1);
+ EXPECT_LT(s, last);
last = s;
}
for (uint32_t i = 999900; i <= 1000000; i = i + 1) {
feature_t s = util::getSignificance(i * 1.0e-6);
- EXPECT_GREATER(s, 0);
- EXPECT_LESS(s, 1);
- EXPECT_LESS(s, last);
+ EXPECT_GT(s, 0);
+ EXPECT_LT(s, 1);
+ EXPECT_LT(s, last);
last = s;
}
}
}
+GTEST_MAIN_RUN_ALL_TESTS()
diff --git a/searchlib/src/tests/features/prod_features_test.h b/searchlib/src/tests/features/prod_features_test.h
index aeadf23be80..9cd3df7a2ec 100644
--- a/searchlib/src/tests/features/prod_features_test.h
+++ b/searchlib/src/tests/features/prod_features_test.h
@@ -4,48 +4,18 @@
#include <vespa/searchlib/features/distancetopathfeature.h>
#include <vespa/searchlib/features/termdistancefeature.h>
-#include <vespa/searchlib/test/ft_test_app.h>
+#define ENABLE_GTEST_MIGRATION
+#include <vespa/searchlib/test/ft_test_app_base.h>
-class Test : public FtTestApp
+class Test : public FtTestAppBase
{
public:
Test();
- ~Test() override;
- int Main() override;
- void testFramework();
- static void testFtLib();
- void testAge();
- void testAttribute();
- void testAttributeMatch();
- void testCloseness();
- void testMatchCount();
- void testGreatCircleDistance();
- void testDistance();
- void testDistanceToPath();
- void testDotProduct();
- void testFieldLength();
- void testFieldMatch();
- void testFieldTermMatch();
- void testFirstPhase();
- void testForeach();
- void testFreshness();
- void testMatch();
- void testMatches();
- void testNow();
- void testQuery();
- void testQueryTermCount();
- void testRandom();
- void testRandomNormal();
- void testRandomNormalStable();
- void testRankingExpression();
- void testTerm();
- void testTermDistance();
- void testUnique();
- static void testUtils();
+ ~Test();
static void setupForDotProductTest(FtFeatureTest & ft);
-private:
+protected:
void testFieldMatchBluePrint();
void testFieldMatchExecutor();
void testFieldMatchExecutorOutOfOrder();
@@ -109,7 +79,13 @@ private:
bool assertMatches(uint32_t output, const vespalib::string & query, const vespalib::string & field,
const vespalib::string & feature = "matches(foo)", uint32_t docId = 1);
-private:
search::fef::BlueprintFactory _factory;
};
+class ProdFeaturesTest : public ::testing::Test,
+ public Test
+{
+protected:
+ ProdFeaturesTest();
+ ~ProdFeaturesTest();
+};
diff --git a/searchlib/src/tests/nativerank/nativerank_test.cpp b/searchlib/src/tests/nativerank/nativerank_test.cpp
index 69234071a34..d9f0782008a 100644
--- a/searchlib/src/tests/nativerank/nativerank_test.cpp
+++ b/searchlib/src/tests/nativerank/nativerank_test.cpp
@@ -9,9 +9,11 @@
#include <vespa/searchlib/fef/fef.h>
#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/dummy_dependency_handler.h>
-#include <vespa/searchlib/test/ft_test_app.h>
+#define ENABLE_GTEST_MIGRATION
+#include <vespa/searchlib/test/ft_test_app_base.h>
+#include <vespa/vespalib/gtest/gtest.h>
+#include <vespa/vespalib/util/stringfmt.h>
#include <vespa/log/log.h>
LOG_SETUP("nativerank_test");
@@ -22,13 +24,16 @@ using CollectionType = FieldInfo::CollectionType;
const double EPS = 10e-4;
-namespace search {
-namespace features {
+namespace search::features {
-class Test : public FtTestApp {
-private:
+class NativeRankTest : public ::testing::Test,
+ public FtTestAppBase {
+protected:
BlueprintFactory _factory;
+ NativeRankTest();
+ ~NativeRankTest() override;
+
struct ANAM {
int32_t attributeWeight;
search::query::Weight termWeight;
@@ -49,21 +54,20 @@ private:
bool assertNativeProximity(feature_t score, const vespalib::string & query, const vespalib::string & field,
const Properties & props = Properties(), uint32_t docId = 1);
bool assertNativeRank(feature_t score, feature_t fieldMatchWeight, feature_t attributeMatchWeight, feature_t proximityWeight);
-
- void testNativeFieldMatch();
- void testNativeAttributeMatch();
- void testNativeProximity();
- void testNativeRank();
-
-public:
- ~Test();
- int Main() override;
};
-Test::~Test() {}
+NativeRankTest::NativeRankTest()
+ : ::testing::Test(),
+ FtTestAppBase()
+{
+ // Configure factory with all known blueprints.
+ setup_fef_test_plugin(_factory);
+ setup_search_features(_factory);
+}
-void
-Test::testNativeFieldMatch()
+NativeRankTest::~NativeRankTest() = default;
+
+TEST_F(NativeRankTest, test_native_field_match)
{
{ // test blueprint
NativeFieldMatchBlueprint pt;
@@ -100,18 +104,18 @@ Test::testNativeFieldMatch()
EXPECT_TRUE(pas.vector[1].firstOccTable == tm.getTable("expdecay(8000,12.50)"));
EXPECT_TRUE(pas.vector[0].numOccTable == tm.getTable("loggrowth(1500,4000,19)"));
EXPECT_TRUE(pas.vector[1].numOccTable == tm.getTable("loggrowth(1500,4000,19)"));
- EXPECT_EQUAL(pas.vector[0].maxTableSum, 1);
- EXPECT_EQUAL(pas.vector[1].maxTableSum, 1);
- EXPECT_EQUAL(pas.vector[0].fieldWeight, 100u);
- EXPECT_EQUAL(pas.vector[1].fieldWeight, 100u);
- EXPECT_EQUAL(pas.vector[0].field, true);
- EXPECT_EQUAL(pas.vector[1].field, true);
- EXPECT_EQUAL(pas.vector[2].field, false);
- EXPECT_EQUAL(pas.vector[0].averageFieldLength, NativeFieldMatchParam::NOT_DEF_FIELD_LENGTH);
- EXPECT_EQUAL(pas.vector[1].averageFieldLength, NativeFieldMatchParam::NOT_DEF_FIELD_LENGTH);
- EXPECT_EQUAL(pas.minFieldLength, 6u);
- EXPECT_EQUAL(pas.vector[0].firstOccImportance, 0.5);
- EXPECT_EQUAL(pas.vector[1].firstOccImportance, 0.5);
+ EXPECT_EQ(pas.vector[0].maxTableSum, 1);
+ EXPECT_EQ(pas.vector[1].maxTableSum, 1);
+ EXPECT_EQ(pas.vector[0].fieldWeight, 100u);
+ EXPECT_EQ(pas.vector[1].fieldWeight, 100u);
+ EXPECT_EQ(pas.vector[0].field, true);
+ EXPECT_EQ(pas.vector[1].field, true);
+ EXPECT_EQ(pas.vector[2].field, false);
+ EXPECT_EQ(pas.vector[0].averageFieldLength, NativeFieldMatchParam::NOT_DEF_FIELD_LENGTH);
+ EXPECT_EQ(pas.vector[1].averageFieldLength, NativeFieldMatchParam::NOT_DEF_FIELD_LENGTH);
+ EXPECT_EQ(pas.minFieldLength, 6u);
+ EXPECT_EQ(pas.vector[0].firstOccImportance, 0.5);
+ EXPECT_EQ(pas.vector[1].firstOccImportance, 0.5);
}
{
p.clear();
@@ -139,21 +143,21 @@ Test::testNativeFieldMatch()
EXPECT_TRUE(pas.vector[3].firstOccTable == tm.getTable("linear(0,1)"));
EXPECT_TRUE(pas.vector[0].numOccTable == tm.getTable("linear(0,3)"));
EXPECT_TRUE(pas.vector[3].numOccTable == tm.getTable("linear(0,4)"));
- EXPECT_APPROX(pas.vector[0].maxTableSum, 2.4, 10e-6);
- EXPECT_APPROX(pas.vector[3].maxTableSum, 1.6, 10e-6);
- EXPECT_EQUAL(pas.vector[0].fieldWeight, 200u);
- EXPECT_EQUAL(pas.vector[1].fieldWeight, 100u);
- EXPECT_EQUAL(pas.vector[3].fieldWeight, 0u);
- EXPECT_EQUAL(pas.vector[0].field, true);
- EXPECT_EQUAL(pas.vector[1].field, false); // only 'foo' and 'baz' are specified explicit
- EXPECT_EQUAL(pas.vector[2].field, false); // 'qux' is an attribute
- EXPECT_EQUAL(pas.vector[3].field, false); // fieldWeight == 0 -> do not consider this field
- EXPECT_EQUAL(pas.vector[4].field, false); // filter field
- EXPECT_EQUAL(pas.vector[0].averageFieldLength, 400u);
- EXPECT_EQUAL(pas.vector[3].averageFieldLength, 500u);
- EXPECT_EQUAL(pas.minFieldLength, 12u);
- EXPECT_EQUAL(pas.vector[0].firstOccImportance, 0.6);
- EXPECT_EQUAL(pas.vector[3].firstOccImportance, 0.8);
+ EXPECT_NEAR(pas.vector[0].maxTableSum, 2.4, 10e-6);
+ EXPECT_NEAR(pas.vector[3].maxTableSum, 1.6, 10e-6);
+ EXPECT_EQ(pas.vector[0].fieldWeight, 200u);
+ EXPECT_EQ(pas.vector[1].fieldWeight, 100u);
+ EXPECT_EQ(pas.vector[3].fieldWeight, 0u);
+ EXPECT_EQ(pas.vector[0].field, true);
+ EXPECT_EQ(pas.vector[1].field, false); // only 'foo' and 'baz' are specified explicit
+ EXPECT_EQ(pas.vector[2].field, false); // 'qux' is an attribute
+ EXPECT_EQ(pas.vector[3].field, false); // fieldWeight == 0 -> do not consider this field
+ EXPECT_EQ(pas.vector[4].field, false); // filter field
+ EXPECT_EQ(pas.vector[0].averageFieldLength, 400u);
+ EXPECT_EQ(pas.vector[3].averageFieldLength, 500u);
+ EXPECT_EQ(pas.minFieldLength, 12u);
+ EXPECT_EQ(pas.vector[0].firstOccImportance, 0.6);
+ EXPECT_EQ(pas.vector[3].firstOccImportance, 0.8);
}
{
FtIndexEnvironment ie;
@@ -172,32 +176,32 @@ Test::testNativeFieldMatch()
p.vector.push_back(f);
NativeFieldMatchExecutorSharedState nfmess(ft.getQueryEnv(), p);
NativeFieldMatchExecutor nfme(nfmess);
- EXPECT_EQUAL(p.minFieldLength, 6u);
- EXPECT_EQUAL(nfme.getFirstOccBoost(0, 0, 4), 0);
- EXPECT_EQUAL(nfme.getFirstOccBoost(0, 1, 4), 1);
- EXPECT_EQUAL(nfme.getFirstOccBoost(0, 2, 4), 2);
- EXPECT_EQUAL(nfme.getFirstOccBoost(0, 3, 4), 4);
- EXPECT_EQUAL(nfme.getFirstOccBoost(0, 3, 6), 4);
- EXPECT_EQUAL(nfme.getFirstOccBoost(0, 4, 6), 5);
- EXPECT_EQUAL(nfme.getFirstOccBoost(0, 5, 6), 7);
- EXPECT_EQUAL(nfme.getFirstOccBoost(0, 0, 12), 0);
- EXPECT_EQUAL(nfme.getFirstOccBoost(0, 4, 12), 2);
- EXPECT_EQUAL(nfme.getFirstOccBoost(0, 11, 12), 7);
- EXPECT_EQUAL(nfme.getNumOccBoost(0, 0, 4), 0);
- EXPECT_EQUAL(nfme.getNumOccBoost(0, 2, 4), 2);
- EXPECT_EQUAL(nfme.getNumOccBoost(0, 4, 4), 4);
- EXPECT_EQUAL(nfme.getNumOccBoost(0, 4, 6), 4);
- EXPECT_EQUAL(nfme.getNumOccBoost(0, 5, 6), 5);
- EXPECT_EQUAL(nfme.getNumOccBoost(0, 6, 6), 7);
- EXPECT_EQUAL(nfme.getNumOccBoost(0, 0, 12), 0);
- EXPECT_EQUAL(nfme.getNumOccBoost(0, 6, 12), 3);
- EXPECT_EQUAL(nfme.getNumOccBoost(0, 12, 12), 7);
+ EXPECT_EQ(p.minFieldLength, 6u);
+ EXPECT_EQ(nfme.getFirstOccBoost(0, 0, 4), 0);
+ EXPECT_EQ(nfme.getFirstOccBoost(0, 1, 4), 1);
+ EXPECT_EQ(nfme.getFirstOccBoost(0, 2, 4), 2);
+ EXPECT_EQ(nfme.getFirstOccBoost(0, 3, 4), 4);
+ EXPECT_EQ(nfme.getFirstOccBoost(0, 3, 6), 4);
+ EXPECT_EQ(nfme.getFirstOccBoost(0, 4, 6), 5);
+ EXPECT_EQ(nfme.getFirstOccBoost(0, 5, 6), 7);
+ EXPECT_EQ(nfme.getFirstOccBoost(0, 0, 12), 0);
+ EXPECT_EQ(nfme.getFirstOccBoost(0, 4, 12), 2);
+ EXPECT_EQ(nfme.getFirstOccBoost(0, 11, 12), 7);
+ EXPECT_EQ(nfme.getNumOccBoost(0, 0, 4), 0);
+ EXPECT_EQ(nfme.getNumOccBoost(0, 2, 4), 2);
+ EXPECT_EQ(nfme.getNumOccBoost(0, 4, 4), 4);
+ EXPECT_EQ(nfme.getNumOccBoost(0, 4, 6), 4);
+ EXPECT_EQ(nfme.getNumOccBoost(0, 5, 6), 5);
+ EXPECT_EQ(nfme.getNumOccBoost(0, 6, 6), 7);
+ EXPECT_EQ(nfme.getNumOccBoost(0, 0, 12), 0);
+ EXPECT_EQ(nfme.getNumOccBoost(0, 6, 12), 3);
+ EXPECT_EQ(nfme.getNumOccBoost(0, 12, 12), 7);
}
{ // test params object
NativeFieldMatchParams p;
p.resize(1);
p.setMaxTableSums(0, 0); // test reset to 1
- EXPECT_EQUAL(p.vector[0].maxTableSum, 1);
+ EXPECT_EQ(p.vector[0].maxTableSum, 1);
}
{ // test executor
@@ -259,11 +263,11 @@ Test::testNativeFieldMatch()
}
bool
-Test::assertNativeFieldMatch(feature_t score,
- const vespalib::string & query,
- const vespalib::string & field,
- const Properties & props,
- uint32_t docId)
+NativeRankTest::assertNativeFieldMatch(feature_t score,
+ const vespalib::string & query,
+ const vespalib::string & field,
+ const Properties & props,
+ uint32_t docId)
{
LOG(info, "assertNativeFieldMatch(%f, '%s', '%s')", score, query.c_str(), field.c_str());
@@ -284,14 +288,12 @@ Test::assertNativeFieldMatch(feature_t score,
FT_SETUP(ft, FtUtil::toQuery(query), index, 1);
// Execute and compare results.
- if (!EXPECT_TRUE(ft.execute(score, EPS, docId))) {
- return false;
- }
- return true;
+ bool failure = false;
+ EXPECT_TRUE(ft.execute(score, EPS, docId)) << (failure = true, "");
+ return !failure;
}
-void
-Test::testNativeAttributeMatch()
+TEST_F(NativeRankTest, test_native_attribute_match)
{
{ // test blueprint
NativeAttributeMatchBlueprint pt;
@@ -324,13 +326,13 @@ Test::testNativeAttributeMatch()
ASSERT_TRUE(pas.vector.size() == 3);
// EXPECT_TRUE(pas.vector[0].weightBoostTable == tm.getTable("linear(1,0)"));
// EXPECT_TRUE(pas.vector[1].weightBoostTable == tm.getTable("linear(1,0)"));
- EXPECT_EQUAL(pas.vector[0].maxTableSum, 1);
- EXPECT_EQUAL(pas.vector[1].maxTableSum, 1);
- EXPECT_EQUAL(pas.vector[0].fieldWeight, 100u);
- EXPECT_EQUAL(pas.vector[1].fieldWeight, 100u);
- EXPECT_EQUAL(pas.vector[0].field, true);
- EXPECT_EQUAL(pas.vector[1].field, true);
- EXPECT_EQUAL(pas.vector[2].field, false);
+ EXPECT_EQ(pas.vector[0].maxTableSum, 1);
+ EXPECT_EQ(pas.vector[1].maxTableSum, 1);
+ EXPECT_EQ(pas.vector[0].fieldWeight, 100u);
+ EXPECT_EQ(pas.vector[1].fieldWeight, 100u);
+ EXPECT_EQ(pas.vector[0].field, true);
+ EXPECT_EQ(pas.vector[1].field, true);
+ EXPECT_EQ(pas.vector[2].field, false);
}
{
p.clear();
@@ -347,15 +349,15 @@ Test::testNativeAttributeMatch()
ASSERT_TRUE(pas.vector.size() == 4);
// EXPECT_TRUE(pas.vector[0].weightBoostTable == tm.getTable("linear(0,2)"));
// EXPECT_TRUE(pas.vector[3].weightBoostTable == tm.getTable("linear(0,3)"));
- EXPECT_EQUAL(pas.vector[0].maxTableSum, 2);
- EXPECT_EQUAL(pas.vector[3].maxTableSum, 3);
- EXPECT_EQUAL(pas.vector[0].fieldWeight, 200u);
- EXPECT_EQUAL(pas.vector[1].fieldWeight, 100u);
- EXPECT_EQUAL(pas.vector[3].fieldWeight, 0u);
- EXPECT_EQUAL(pas.vector[0].field, true);
- EXPECT_EQUAL(pas.vector[1].field, false); // only 'foo' and 'baz' are specified explicit
- EXPECT_EQUAL(pas.vector[2].field, false); // 'qux' is an index
- EXPECT_EQUAL(pas.vector[3].field, false); // fieldWeight == 0 -> do not consider this field
+ EXPECT_EQ(pas.vector[0].maxTableSum, 2);
+ EXPECT_EQ(pas.vector[3].maxTableSum, 3);
+ EXPECT_EQ(pas.vector[0].fieldWeight, 200u);
+ EXPECT_EQ(pas.vector[1].fieldWeight, 100u);
+ EXPECT_EQ(pas.vector[3].fieldWeight, 0u);
+ EXPECT_EQ(pas.vector[0].field, true);
+ EXPECT_EQ(pas.vector[1].field, false); // only 'foo' and 'baz' are specified explicit
+ EXPECT_EQ(pas.vector[2].field, false); // 'qux' is an index
+ EXPECT_EQ(pas.vector[3].field, false); // fieldWeight == 0 -> do not consider this field
}
{
@@ -388,7 +390,7 @@ Test::testNativeAttributeMatch()
}
bool
-Test::assertNativeAttributeMatch(feature_t score, const ANAM & t1, const ANAM & t2, const Properties & props)
+NativeRankTest::assertNativeAttributeMatch(feature_t score, const ANAM & t1, const ANAM & t2, const Properties & props)
{
LOG(info, "assertNativeAttributeMatch(%f, '%s', '%s')", score, t1.toString().c_str(), t2.toString().c_str());
vespalib::string feature = "nativeAttributeMatch";
@@ -402,15 +404,21 @@ Test::assertNativeAttributeMatch(feature_t score, const ANAM & t1, const ANAM &
ft.getIndexEnv().getProperties().add("vespa.fieldweight.bar", vespalib::make_string("%u", t2.fieldWeight));
ft.getIndexEnv().getProperties().add("nativeRank.useTableNormalization", "false"); // make it easier to test
ft.getIndexEnv().getProperties().import(props);
- if (!EXPECT_TRUE(ft.getQueryEnv().getBuilder().addAttributeNode("foo") != NULL)) { // t1
+ bool failure = false;
+ EXPECT_TRUE(ft.getQueryEnv().getBuilder().addAttributeNode("foo") != NULL) << (failure = true, "");
+ if (failure) {
return false;
}
- if (!EXPECT_TRUE(ft.getQueryEnv().getBuilder().addAttributeNode("bar") != NULL)) { // t2
+ EXPECT_TRUE(ft.getQueryEnv().getBuilder().addAttributeNode("bar") != NULL) << (failure = true, "");
+ if (failure) {
return false;
}
ft.getQueryEnv().getTerms()[0].setWeight(t1.termWeight);
ft.getQueryEnv().getTerms()[1].setWeight(t2.termWeight);
- ASSERT_TRUE(ft.setup());
+ EXPECT_TRUE(ft.setup()) << (failure = true, "");
+ if (failure) {
+ return false;
+ }
MatchDataBuilder::UP mdb = ft.createMatchDataBuilder();
{
@@ -427,14 +435,14 @@ Test::assertNativeAttributeMatch(feature_t score, const ANAM & t1, const ANAM &
pos.setElementWeight(t2.attributeWeight);
tfmd->appendPosition(pos);
}
- if (!EXPECT_TRUE(ft.execute(score, EPS))) {
+ EXPECT_TRUE(ft.execute(score, EPS)) << (failure = true, "");
+ if (failure) {
return false;
}
return true;
}
-void
-Test::testNativeProximity()
+TEST_F(NativeRankTest, test_native_proximity)
{
{ // test blueprint
NativeProximityBlueprint pt;
@@ -471,16 +479,16 @@ Test::testNativeProximity()
EXPECT_TRUE(pas.vector[1].proximityTable == tm.getTable("expdecay(500,3)"));
EXPECT_TRUE(pas.vector[0].revProximityTable == tm.getTable("expdecay(400,3)"));
EXPECT_TRUE(pas.vector[1].revProximityTable == tm.getTable("expdecay(400,3)"));
- EXPECT_EQUAL(pas.vector[0].maxTableSum, 1);
- EXPECT_EQUAL(pas.vector[1].maxTableSum, 1);
- EXPECT_EQUAL(pas.vector[0].fieldWeight, 100u);
- EXPECT_EQUAL(pas.vector[1].fieldWeight, 100u);
- EXPECT_EQUAL(pas.vector[0].field, true);
- EXPECT_EQUAL(pas.vector[1].field, true);
- EXPECT_EQUAL(pas.vector[2].field, false);
- EXPECT_EQUAL(pas.slidingWindow, 4u);
- EXPECT_EQUAL(pas.vector[0].proximityImportance, 0.5);
- EXPECT_EQUAL(pas.vector[1].proximityImportance, 0.5);
+ EXPECT_EQ(pas.vector[0].maxTableSum, 1);
+ EXPECT_EQ(pas.vector[1].maxTableSum, 1);
+ EXPECT_EQ(pas.vector[0].fieldWeight, 100u);
+ EXPECT_EQ(pas.vector[1].fieldWeight, 100u);
+ EXPECT_EQ(pas.vector[0].field, true);
+ EXPECT_EQ(pas.vector[1].field, true);
+ EXPECT_EQ(pas.vector[2].field, false);
+ EXPECT_EQ(pas.slidingWindow, 4u);
+ EXPECT_EQ(pas.vector[0].proximityImportance, 0.5);
+ EXPECT_EQ(pas.vector[1].proximityImportance, 0.5);
}
{
p.clear();
@@ -506,19 +514,19 @@ Test::testNativeProximity()
EXPECT_TRUE(pas.vector[3].proximityTable == tm.getTable("linear(0,1)"));
EXPECT_TRUE(pas.vector[0].revProximityTable == tm.getTable("linear(0,3)"));
EXPECT_TRUE(pas.vector[3].revProximityTable == tm.getTable("linear(0,4)"));
- EXPECT_APPROX(pas.vector[0].maxTableSum, 2.4, 10e-6);
- EXPECT_APPROX(pas.vector[3].maxTableSum, 1.6, 10e-6);
- EXPECT_EQUAL(pas.vector[0].fieldWeight, 200u);
- EXPECT_EQUAL(pas.vector[1].fieldWeight, 100u);
- EXPECT_EQUAL(pas.vector[3].fieldWeight, 0u);
- EXPECT_EQUAL(pas.vector[0].field, true);
- EXPECT_EQUAL(pas.vector[1].field, false); // only 'foo' and 'baz' are specified explicit
- EXPECT_EQUAL(pas.vector[2].field, false); // 'qux' is an attribute
- EXPECT_EQUAL(pas.vector[3].field, false); // fieldWeight == 0 -> do not consider this field
- EXPECT_EQUAL(pas.vector[4].field, false); // filter field
- EXPECT_EQUAL(pas.slidingWindow, 2u);
- EXPECT_EQUAL(pas.vector[0].proximityImportance, 0.6);
- EXPECT_EQUAL(pas.vector[3].proximityImportance, 0.8);
+ EXPECT_NEAR(pas.vector[0].maxTableSum, 2.4, 10e-6);
+ EXPECT_NEAR(pas.vector[3].maxTableSum, 1.6, 10e-6);
+ EXPECT_EQ(pas.vector[0].fieldWeight, 200u);
+ EXPECT_EQ(pas.vector[1].fieldWeight, 100u);
+ EXPECT_EQ(pas.vector[3].fieldWeight, 0u);
+ EXPECT_EQ(pas.vector[0].field, true);
+ EXPECT_EQ(pas.vector[1].field, false); // only 'foo' and 'baz' are specified explicit
+ EXPECT_EQ(pas.vector[2].field, false); // 'qux' is an attribute
+ EXPECT_EQ(pas.vector[3].field, false); // fieldWeight == 0 -> do not consider this field
+ EXPECT_EQ(pas.vector[4].field, false); // filter field
+ EXPECT_EQ(pas.slidingWindow, 2u);
+ EXPECT_EQ(pas.vector[0].proximityImportance, 0.6);
+ EXPECT_EQ(pas.vector[3].proximityImportance, 0.8);
}
{
@@ -549,34 +557,34 @@ Test::testNativeProximity()
NativeProximityExecutor::FieldSetup setup(0);
NativeProximityExecutorSharedState::TermPairVector & pairs = setup.pairs;
NativeProximityExecutorSharedState::generateTermPairs(env, terms, 0, setup);
- EXPECT_EQUAL(pairs.size(), 0u);
+ EXPECT_EQ(pairs.size(), 0u);
NativeProximityExecutorSharedState::generateTermPairs(env, terms, 1, setup);
- EXPECT_EQUAL(pairs.size(), 0u);
+ EXPECT_EQ(pairs.size(), 0u);
NativeProximityExecutorSharedState::generateTermPairs(env, terms, 2, setup);
- EXPECT_EQUAL(pairs.size(), 2u);
+ EXPECT_EQ(pairs.size(), 2u);
EXPECT_TRUE(pairs[0].first.termData() == &a);
EXPECT_TRUE(pairs[0].second.termData() == &b);
- EXPECT_EQUAL(pairs[0].connectedness, 0.8);
+ EXPECT_EQ(pairs[0].connectedness, 0.8);
EXPECT_TRUE(pairs[1].first.termData() == &b);
EXPECT_TRUE(pairs[1].second.termData() == &c);
- EXPECT_EQUAL(pairs[1].connectedness, 0.6);
- EXPECT_EQUAL(setup.divisor, 118); // (10 + 40)*0.8 + (40 + 90)*0.6
+ EXPECT_EQ(pairs[1].connectedness, 0.6);
+ EXPECT_EQ(setup.divisor, 118); // (10 + 40)*0.8 + (40 + 90)*0.6
pairs.clear();
setup.divisor = 0;
NativeProximityExecutorSharedState::generateTermPairs(env, terms, 3, setup);
- EXPECT_EQUAL(pairs.size(), 3u);
+ EXPECT_EQ(pairs.size(), 3u);
EXPECT_TRUE(pairs[0].first.termData() == &a);
EXPECT_TRUE(pairs[0].second.termData() == &b);
- EXPECT_EQUAL(pairs[0].connectedness, 0.8);
+ EXPECT_EQ(pairs[0].connectedness, 0.8);
EXPECT_TRUE(pairs[1].first.termData() == &a);
EXPECT_TRUE(pairs[1].second.termData() == &c);
- EXPECT_EQUAL(pairs[1].connectedness, 0.3);
+ EXPECT_EQ(pairs[1].connectedness, 0.3);
EXPECT_TRUE(pairs[2].first.termData() == &b);
EXPECT_TRUE(pairs[2].second.termData() == &c);
- EXPECT_EQUAL(pairs[2].connectedness, 0.6);
- EXPECT_EQUAL(setup.divisor, 148); // (10 + 40)*0.8 + (10 + 90)*0.3 + (40 + 90)*0.6
+ EXPECT_EQ(pairs[2].connectedness, 0.6);
+ EXPECT_EQ(setup.divisor, 148); // (10 + 40)*0.8 + (10 + 90)*0.3 + (40 + 90)*0.6
pairs.clear();
setup.divisor = 0;
@@ -585,10 +593,10 @@ Test::testNativeProximity()
// test that (ab) is filtered away
NativeProximityExecutorSharedState::generateTermPairs(env, terms, 2, setup);
- EXPECT_EQUAL(pairs.size(), 1u);
+ EXPECT_EQ(pairs.size(), 1u);
EXPECT_TRUE(pairs[0].first.termData() == &b);
EXPECT_TRUE(pairs[0].second.termData() == &c);
- EXPECT_EQUAL(pairs[0].connectedness, 0.6);
+ EXPECT_EQ(pairs[0].connectedness, 0.6);
}
}
@@ -659,11 +667,11 @@ Test::testNativeProximity()
}
bool
-Test::assertNativeProximity(feature_t score,
- const vespalib::string & query,
- const vespalib::string & field,
- const Properties & props,
- uint32_t docId)
+NativeRankTest::assertNativeProximity(feature_t score,
+ const vespalib::string & query,
+ const vespalib::string & field,
+ const Properties & props,
+ uint32_t docId)
{
LOG(info, "assertNativeProximity(%f, '%s', '%s')", score, query.c_str(), field.c_str());
@@ -683,14 +691,15 @@ Test::assertNativeProximity(feature_t score,
FT_SETUP(ft, FtUtil::toQuery(query), index, 1);
// Execute and compare results.
- if (!EXPECT_TRUE(ft.execute(score, EPS, docId))) {
+ bool failure = false;
+ EXPECT_TRUE(ft.execute(score, EPS, docId)) << (failure = true, "");
+ if (failure) {
return false;
}
return true;
}
-void
-Test::testNativeRank()
+TEST_F(NativeRankTest, test_native_rank)
{
{ // test blueprint
NativeRankBlueprint pt;
@@ -710,9 +719,9 @@ Test::testNativeRank()
DummyDependencyHandler deps(*bp);
bp->setup(ft.getIndexEnv(), params);
const NativeRankParams & pas = (dynamic_cast<NativeRankBlueprint *>(bp.get()))->getParams();
- EXPECT_EQUAL(pas.fieldMatchWeight, 100u);
- EXPECT_EQUAL(pas.attributeMatchWeight, 100u);
- EXPECT_EQUAL(pas.proximityWeight, 25u);
+ EXPECT_EQ(pas.fieldMatchWeight, 100u);
+ EXPECT_EQ(pas.attributeMatchWeight, 100u);
+ EXPECT_EQ(pas.proximityWeight, 25u);
}
{
Properties & p = ft.getIndexEnv().getProperties();
@@ -721,7 +730,7 @@ Test::testNativeRank()
DummyDependencyHandler deps(*bp);
bp->setup(ft.getIndexEnv(), params);
const NativeRankParams & pas = (dynamic_cast<NativeRankBlueprint *>(bp.get()))->getParams();
- EXPECT_EQUAL(pas.proximityWeight, 100u);
+ EXPECT_EQ(pas.proximityWeight, 100u);
p.clear();
}
{
@@ -734,9 +743,9 @@ Test::testNativeRank()
DummyDependencyHandler deps(*bp);
bp->setup(ft.getIndexEnv(), params);
const NativeRankParams & pas = (dynamic_cast<NativeRankBlueprint *>(bp.get()))->getParams();
- EXPECT_EQUAL(pas.fieldMatchWeight, 200u);
- EXPECT_EQUAL(pas.attributeMatchWeight, 300u);
- EXPECT_EQUAL(pas.proximityWeight, 400u);
+ EXPECT_EQ(pas.fieldMatchWeight, 200u);
+ EXPECT_EQ(pas.attributeMatchWeight, 300u);
+ EXPECT_EQ(pas.proximityWeight, 400u);
}
FT_DUMP(_factory, "nativeRank", ft.getIndexEnv(), StringList().add("nativeRank"));
@@ -776,10 +785,10 @@ Test::testNativeRank()
}
bool
-Test::assertNativeRank(feature_t score,
- feature_t fieldMatchWeight,
- feature_t attributeMatchWeight,
- feature_t proximityWeight)
+NativeRankTest::assertNativeRank(feature_t score,
+ feature_t fieldMatchWeight,
+ feature_t attributeMatchWeight,
+ feature_t proximityWeight)
{
LOG(info, "assertNativeRank(%f, %f, %f, %f)", score, fieldMatchWeight, attributeMatchWeight, proximityWeight);
@@ -798,39 +807,20 @@ Test::assertNativeRank(feature_t score,
ft.getOverrides().add("nativeAttributeMatch", "60");
ft.getOverrides().add("nativeProximity", "30");
- if (!EXPECT_TRUE(ft.setup())) {
+ bool failure = false;
+ EXPECT_TRUE(ft.setup()) << (failure = true, "");
+ if (failure) {
return false;
}
// Execute and compare results.
- if (!EXPECT_TRUE(ft.execute(score, EPS))) {
+ EXPECT_TRUE(ft.execute(score, EPS)) << (failure = true, "");
+ if (failure) {
return false;
}
return true;
}
-
-
-int
-Test::Main()
-{
- TEST_INIT("nativerank_test");
-
- // Configure factory with all known blueprints.
- setup_fef_test_plugin(_factory);
- setup_search_features(_factory);
-
- testNativeFieldMatch();
- testNativeAttributeMatch();
- testNativeProximity();
- testNativeRank();
-
- TEST_DONE();
- return 0;
-}
-
-}
}
-TEST_APPHOOK(search::features::Test);
-
+GTEST_MAIN_RUN_ALL_TESTS()