diff --git a/autotests/unit/lib/advancedqueryparsertest.cpp b/autotests/unit/lib/advancedqueryparsertest.cpp --- a/autotests/unit/lib/advancedqueryparsertest.cpp +++ b/autotests/unit/lib/advancedqueryparsertest.cpp @@ -22,6 +22,7 @@ #include +Q_DECLARE_METATYPE(Baloo::Term) using namespace Baloo; class AdvancedQueryParserTest : public QObject @@ -37,6 +38,10 @@ void testDateTime(); void testOperators(); void testBinaryOperatorMissingFirstArg(); + void testNestedParentheses(); + void testNestedParentheses_data(); + void testOptimizedLogic(); + void testOptimizedLogic_data(); }; void AdvancedQueryParserTest::testSimpleProperty() @@ -199,6 +204,109 @@ QCOMPARE(term, expectedTerm); } +void AdvancedQueryParserTest::testNestedParentheses() +{ + QFETCH(QString, searchInput); + QFETCH(QString, failmessage); + QFETCH(Term, expected); + + AdvancedQueryParser parser; + const auto term = parser.parse(searchInput); + qDebug() << " result term" << term; + qDebug() << "expected term" << expected; + if (!failmessage.isEmpty()) { + QEXPECT_FAIL("", qPrintable(failmessage), Continue); + } + + QCOMPARE(term, expected); +} + +void AdvancedQueryParserTest::testNestedParentheses_data() +{ + QTest::addColumn("searchInput"); + QTest::addColumn("expected"); + QTest::addColumn("failmessage"); + const QString nofail; + QString searchInput; + searchInput = QStringLiteral("a AND b AND c AND d"); + QTest::newRow(qPrintable(searchInput)) + << searchInput + << Term{Term::And, QList{ + Term{QStringLiteral(""), QStringLiteral("a"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("b"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("c"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("d"), Term::Contains}, + }} + << nofail + ; + searchInput = QStringLiteral("(a AND b) AND (c OR d)"); + QTest::newRow(qPrintable(searchInput)) + << searchInput + << Term{Term::And, QList{ + Term{QStringLiteral(""), QStringLiteral("a"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("b"), Term::Contains}, + Term{Term::Or, QList{ + Term{QStringLiteral(""), QStringLiteral("c"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("d"), Term::Contains}, + }} + }} + << nofail + ; + searchInput = QStringLiteral("(a AND (b AND (c AND d)))"); + QTest::newRow(qPrintable(searchInput)) + << searchInput + << Term{Term::And, QList{ + Term{QStringLiteral(""), QStringLiteral("a"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("b"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("c"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("d"), Term::Contains}, + }} + << QStringLiteral("no optimization") + ; + + searchInput = QStringLiteral("(a AND (b AND (c AND d)))"); + QTest::newRow(qPrintable(searchInput)) + << searchInput + << Term{Term::And, QList{ + Term{QStringLiteral(""), QStringLiteral("a"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("b"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("c"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("d"), Term::Contains}, + }} + << QStringLiteral("no optimization") + ; +} + +void AdvancedQueryParserTest::testOptimizedLogic() +{ + QFETCH(Term, testTerm); + QFETCH(Term, expectedTerm); + QFETCH(QString, failmessage); + if (!failmessage.isEmpty()) { + QEXPECT_FAIL("", qPrintable(failmessage), Continue); + } + QCOMPARE(testTerm, expectedTerm); +} + +void AdvancedQueryParserTest::testOptimizedLogic_data() +{ + QTest::addColumn("testTerm"); + QTest::addColumn("expectedTerm"); + QTest::addColumn("failmessage"); + + QTest::addRow("&&") + << (Term{QStringLiteral(""), QStringLiteral("a"), Term::Contains} + && Term{QStringLiteral(""), QStringLiteral("b"), Term::Contains} + && Term{QStringLiteral(""), QStringLiteral("c"), Term::Contains} + && Term{QStringLiteral(""), QStringLiteral("d"), Term::Contains}) + << Term{Term::And, QList{ + Term{QStringLiteral(""), QStringLiteral("a"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("b"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("c"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("d"), Term::Contains}, + }} + << QStringLiteral("No optimization"); +} QTEST_MAIN(AdvancedQueryParserTest)