File indexing completed on 2024-05-19 04:01:10

0001 /*
0002     SPDX-FileCopyrightText: 2017 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: MIT
0005 */
0006 
0007 #include <common/surveytargetexpression.h>
0008 #include <common/surveytargetexpressionevaluator.h>
0009 #include <common/surveytargetexpressionparser.h>
0010 
0011 #include <QDebug>
0012 #include <QtTest/qtest.h>
0013 #include <QObject>
0014 
0015 using namespace KUserFeedback;
0016 
0017 class SurveyTargetExpressionTest: public QObject, public SurveyTargetExpressionDataProvider
0018 {
0019     Q_OBJECT
0020 private:
0021     QHash<QString, QVariant> m_sourceData;
0022     QVariant sourceData(const QString &sourceName) const override
0023     {
0024         return m_sourceData.value(sourceName);
0025     }
0026 
0027 private Q_SLOTS:
0028     void testValidParse_data()
0029     {
0030         QTest::addColumn<QString>("input");
0031         QTest::newRow("01") << QStringLiteral("true == 12.3");
0032         QTest::newRow("02") << QStringLiteral("42 >= false");
0033         QTest::newRow("03") << QStringLiteral("(42 >= 12.3)");
0034         QTest::newRow("04") << QStringLiteral("(42 >= 12.3) && (42 < 23)");
0035         QTest::newRow("05") << QStringLiteral("(42 >= 12.3 && 42 < 23) || true != false");
0036         QTest::newRow("06") << QStringLiteral("42 >= 12.3E-1 && 42 < 23.1e12 || true != false && -3.2 == .3");
0037         QTest::newRow("07") << QStringLiteral("\"a\" == \"\\\"b\\\"\"");
0038         QTest::newRow("08") << QStringLiteral("\"true\" == \"\" || \"&&\" != \"()\"");
0039         QTest::newRow("09") << QStringLiteral("usageTime.value > 3600");
0040         QTest::newRow("10") << QStringLiteral("3600 <= usageTime.value");
0041         QTest::newRow("11") << QStringLiteral("startCount.value != usageTime.value");
0042         QTest::newRow("12") << QStringLiteral("screens[0].dpi <= 240");
0043         QTest::newRow("13") << QStringLiteral("views[\"view1\"].ratio > 1");
0044     }
0045 
0046     void testValidParse()
0047     {
0048         QFETCH(QString, input);
0049 
0050         SurveyTargetExpressionParser p;
0051         QVERIFY(p.parse(input));
0052         QVERIFY(p.expression());
0053         qDebug() << p.expression();
0054     }
0055 
0056     void testInvalidParse_data()
0057     {
0058         QTest::addColumn<QString>("input");
0059         QTest::newRow("01") << QStringLiteral("true && 12.3");
0060         QTest::newRow("02") << QStringLiteral("42 || false");
0061         QTest::newRow("03") << QStringLiteral("(42)");
0062         QTest::newRow("04") << QStringLiteral("true == 12.3 >= 24 < (false)");
0063         QTest::newRow("05") << QStringLiteral("screen[0] == 4");
0064         QTest::newRow("06") << QStringLiteral("screen[false] == 4");
0065         QTest::newRow("07") << QStringLiteral("screen[false].dpi == 4");
0066         QTest::newRow("08") << QStringLiteral("screen[].dpi == 4");
0067         QTest::newRow("08") << QStringLiteral("screen[].dpi == 4");
0068         QTest::newRow("09") << QStringLiteral("screen[\"key\"] == 4");
0069         QTest::newRow("10") << QStringLiteral("\"\\\"\" == \"\\\"");
0070     }
0071 
0072     void testInvalidParse()
0073     {
0074         QFETCH(QString, input);
0075         SurveyTargetExpressionParser p;
0076         QVERIFY(!p.parse(input));
0077     }
0078 
0079     void testEval_data()
0080     {
0081         QTest::addColumn<QString>("input");
0082         QTest::addColumn<bool>("expected");
0083         QTest::newRow("01") << QStringLiteral("1 >= 2") << false;
0084         QTest::newRow("02") << QStringLiteral("1 < 2.0") << true;
0085         QTest::newRow("03") << QStringLiteral("true != false") << true;
0086         QTest::newRow("04") << QStringLiteral("\"abc\" == \"abc\"") << true;
0087         QTest::newRow("05") << QStringLiteral("1.0 > 1.5 || 1.0 <= 1.5") << true;
0088         QTest::newRow("06") << QStringLiteral("1.0 >= 1.5 && 1.0 < 1.5") << false;
0089         QTest::newRow("07") << QStringLiteral("3600 <= usageTime.value") << true;
0090         QTest::newRow("08") << QStringLiteral("3600 <= usageTime.value || 42 < lazy_eval.non_existing") << true;
0091         QTest::newRow("09") << QStringLiteral("screens[1].dpi <= 240") << true;
0092         QTest::newRow("10") << QStringLiteral("screens[2].dpi <= 240") << false;
0093         QTest::newRow("11") << QStringLiteral("screens.size == 2") << true;
0094         QTest::newRow("12") << QStringLiteral("1 == \"1\"") << false;
0095         QTest::newRow("13") << QStringLiteral("\"1\" == 1") << false;
0096         QTest::newRow("14") << QStringLiteral("screens[0].size == 1920") << true;
0097         QTest::newRow("15") << QStringLiteral("views[\"view2\"].ratio > 0.35") << true;
0098         QTest::newRow("16") << QStringLiteral("views[\"view3\"].size == \"???\"") << true;
0099         QTest::newRow("17") << QStringLiteral("views[\"view4\"].ratio > 0.35") << false;
0100         QTest::newRow("18") << QStringLiteral("views.size == 3") << true;
0101         QTest::newRow("19") << QStringLiteral("test.string == \"a\\\"b\\nc\\\\d\\te\\\\f\"") << true;
0102         QTest::newRow("20") << QStringLiteral("views[\"\"].ratio > 0.35") << false;
0103         QTest::newRow("21") << QStringLiteral("\"\" == \"\"") << true;
0104         QTest::newRow("22") << QStringLiteral("views.view1 == 2") << false;
0105         QTest::newRow("23") << QStringLiteral("views.non_existing == false") << false;
0106         QTest::newRow("24") << QStringLiteral("1 == 1 || 2 == 2 && 3 != 3") << true;
0107         QTest::newRow("25") << QStringLiteral("(1 == 1 || 2 == 2) && 3 != 3") << false;
0108         QTest::newRow("26") << QStringLiteral("1 == 1 && 2 == 2 || 3 != 3") << true;
0109         QTest::newRow("27") << QStringLiteral("1 == 1 && 2 == 2 || 3 == 3 &&  4!=4") << true;
0110     }
0111 
0112     void testEval()
0113     {
0114         QFETCH(QString, input);
0115         QFETCH(bool, expected);
0116 
0117         QVariantMap m;
0118         m.insert(QLatin1String("value"), 3600);
0119         m_sourceData.insert(QLatin1String("usageTime"), m);
0120 
0121         m.clear();
0122         m.insert(QLatin1String("dpi"), 200);
0123         m.insert(QLatin1String("size"), 1920);
0124         QVariantList l;
0125         l.push_back(m);
0126         l.push_back(m);
0127         m_sourceData.insert(QLatin1String("screens"), l);
0128 
0129         m.clear();
0130         m.insert(QLatin1String("ratio"), 0.4);
0131         m.insert(QLatin1String("size"), QLatin1String("???"));
0132         QVariantMap m2;
0133         m2.insert(QLatin1String("view1"), m);
0134         m2.insert(QLatin1String("view2"), m);
0135         m2.insert(QLatin1String("view3"), m);
0136         m_sourceData.insert(QLatin1String("views"), m2);
0137 
0138         m.clear();
0139         m.insert(QLatin1String("string"), QLatin1String("a\"b\nc\\d\te\\f"));
0140         m_sourceData.insert(QLatin1String("test"), m);
0141 
0142         SurveyTargetExpressionParser p;
0143         QVERIFY(p.parse(input));
0144         QVERIFY(p.expression());
0145         qDebug() << p.expression();
0146         SurveyTargetExpressionEvaluator eval;
0147         eval.setDataProvider(this);
0148         QCOMPARE(eval.evaluate(p.expression()), expected);
0149     }
0150 };
0151 
0152 QTEST_GUILESS_MAIN(SurveyTargetExpressionTest)
0153 
0154 #include "surveytargetexpressiontest.moc"