// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. // Unit tests for customtypevisitor. #include #include #include #include #include #include LOG_SETUP("customtypevisitor_test"); using std::string; using namespace search::query; namespace { template struct InitTerm : Base { InitTerm() : Base(typename Base::Type(), "view", 0, Weight(0)) {} }; struct MyAnd : And {}; struct MyAndNot : AndNot {}; struct MyEquiv : Equiv {}; struct MyNear : Near { MyNear() : Near(1) {} }; struct MyONear : ONear { MyONear() : ONear(1) {} }; struct MyOr : Or {}; struct MyPhrase : Phrase { MyPhrase() : Phrase("view", 0, Weight(42)) {} }; struct MySameElement : SameElement { MySameElement() : SameElement("view", 0, Weight(42)) {} }; struct MyRank : Rank {}; struct MyNumberTerm : InitTerm {}; struct MyLocationTerm : InitTerm {}; struct MyPrefixTerm : InitTerm {}; struct MyRangeTerm : InitTerm {}; struct MyStringTerm : InitTerm {}; struct MySubstrTerm : InitTerm {}; struct MySuffixTerm : InitTerm {}; struct MyFuzzyTerm : FuzzyTerm { MyFuzzyTerm(): FuzzyTerm("term", "view", 0, Weight(0), 2, 0) {} }; struct MyWeakAnd : WeakAnd { MyWeakAnd() : WeakAnd(1234, "view") {} }; struct MyWeightedSetTerm : WeightedSetTerm { MyWeightedSetTerm() : WeightedSetTerm(0, "view", 0, Weight(42)) {} }; struct MyDotProduct : DotProduct { MyDotProduct() : DotProduct(0, "view", 0, Weight(42)) {} }; struct MyWandTerm : WandTerm { MyWandTerm() : WandTerm(0, "view", 0, Weight(42), 57, 67, 77.7) {} }; struct MyPredicateQuery : InitTerm {}; struct MyRegExpTerm : InitTerm {}; struct MyNearestNeighborTerm : NearestNeighborTerm { MyNearestNeighborTerm() : NearestNeighborTerm("qt", "fn", 0, Weight(42), 10, true, 666, 1234.5) {} }; struct MyTrue : TrueQueryNode {}; struct MyFalse : FalseQueryNode {}; struct MyInTerm : InTerm { MyInTerm() : InTerm(std::make_unique(0), MultiTerm::Type::STRING, "view", 0, Weight(0)) { } }; struct MyQueryNodeTypes { using And = MyAnd; using AndNot = MyAndNot; using Equiv = MyEquiv; using NumberTerm = MyNumberTerm; using LocationTerm = MyLocationTerm; using Near = MyNear; using ONear = MyONear; using Or = MyOr; using Phrase = MyPhrase; using SameElement = MySameElement; using PrefixTerm = MyPrefixTerm; using RangeTerm = MyRangeTerm; using Rank = MyRank; using StringTerm = MyStringTerm; using SubstringTerm = MySubstrTerm; using SuffixTerm = MySuffixTerm; using FuzzyTerm = MyFuzzyTerm; using WeakAnd = MyWeakAnd; using WeightedSetTerm = MyWeightedSetTerm; using DotProduct = MyDotProduct; using WandTerm = MyWandTerm; using PredicateQuery = MyPredicateQuery; using RegExpTerm = MyRegExpTerm; using NearestNeighborTerm = MyNearestNeighborTerm; using FalseQueryNode = MyFalse; using TrueQueryNode = MyTrue; using InTerm = MyInTerm; }; class MyCustomVisitor : public CustomTypeVisitor { public: template bool &isVisited() { static bool b; return b; } template void setVisited() { isVisited() = true; } void visit(MyAnd &) override { setVisited(); } void visit(MyAndNot &) override { setVisited(); } void visit(MyEquiv &) override { setVisited(); } void visit(MyNumberTerm &) override { setVisited(); } void visit(MyLocationTerm &) override { setVisited(); } void visit(MyNear &) override { setVisited(); } void visit(MyONear &) override { setVisited(); } void visit(MyOr &) override { setVisited(); } void visit(MyPhrase &) override { setVisited(); } void visit(MySameElement &) override { setVisited(); } void visit(MyPrefixTerm &) override { setVisited(); } void visit(MyRangeTerm &) override { setVisited(); } void visit(MyRank &) override { setVisited(); } void visit(MyStringTerm &) override { setVisited(); } void visit(MySubstrTerm &) override { setVisited(); } void visit(MySuffixTerm &) override { setVisited(); } void visit(MyWeakAnd &) override { setVisited(); } void visit(MyWeightedSetTerm &) override { setVisited(); } void visit(MyDotProduct &) override { setVisited(); } void visit(MyWandTerm &) override { setVisited(); } void visit(MyPredicateQuery &) override { setVisited(); } void visit(MyRegExpTerm &) override { setVisited(); } void visit(MyNearestNeighborTerm &) override { setVisited(); } void visit(MyTrue &) override { setVisited(); } void visit(MyFalse &) override { setVisited(); } void visit(MyFuzzyTerm &) override { setVisited(); } void visit(MyInTerm&) override { setVisited(); } }; template void requireThatNodeIsVisited() { MyCustomVisitor visitor; Node::UP query(new T); visitor.isVisited() = false; query->accept(visitor); ASSERT_TRUE(visitor.isVisited()); } TEST("customtypevisitor_test") { requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); requireThatNodeIsVisited(); } } // namespace TEST_MAIN() { TEST_RUN_ALL(); }