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"