diff options
Diffstat (limited to 'tests/auto/qaxscriptmanager/tst_qaxscriptmanager.cpp')
-rw-r--r-- | tests/auto/qaxscriptmanager/tst_qaxscriptmanager.cpp | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/tests/auto/qaxscriptmanager/tst_qaxscriptmanager.cpp b/tests/auto/qaxscriptmanager/tst_qaxscriptmanager.cpp new file mode 100644 index 0000000..5c92bdf --- /dev/null +++ b/tests/auto/qaxscriptmanager/tst_qaxscriptmanager.cpp @@ -0,0 +1,188 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + + +#include <QtTest/QtTest> +#include <QAxScriptManager> +#include <QAxScript> + +using namespace Qt::StringLiterals; + +class tst_QAxScriptManager : public QObject +{ + Q_OBJECT + +public: + struct Script { + QString language; + QString name; + QString code; + }; + +private slots: + void functions_data(); + void functions(); + + void scriptNames_data(); + void scriptNames(); + + void script_data(); + void script(); + + void call_data(); + void call(); +}; + +void tst_QAxScriptManager::functions_data() +{ + const auto scriptCode_js = Script{u"JScript"_s, u"test1"_s, uR"JS( + function js1() { + return 'JScript 1'; + } + function js2(value) { + return 'JScript 2'; + } + )JS"_s}; + const auto scriptCode_vb = Script{u"VBScript"_s, u"test2"_s, uR"VB( + Function vb1() + vb1 = "VBScript 1" + End Function + + Function vb2(value) + vb2 = "VBScript 2" + End Function + )VB"_s}; + + QTest::addColumn<QList<Script>>("scripts"); + QTest::addColumn<QStringList>("functions"); + QTest::addColumn<QStringList>("signatures"); + + QTest::addRow("js") << QList{scriptCode_js} + << QStringList{"js1", "js2"} + << QStringList{"js1()", "js2(QVariant)"}; + QTest::addRow("vb") << QList{scriptCode_vb} + << QStringList{"vb1", "vb2"} + << QStringList{"vb1()", "vb2(QVariant)"}; + QTest::addRow("both") << QList{scriptCode_js, scriptCode_vb} + << QStringList{"js1", "js2", "vb1", "vb2"} + << QStringList{"js1()", "js2(QVariant)", "vb1()", "vb2(QVariant)"}; +} + +void tst_QAxScriptManager::functions() +{ + // QStringList functions(QAxScript::FunctionFlags = QAxScript::FunctionNames) const; + + QFETCH(QList<Script>, scripts); + QFETCH(QStringList, functions); + QFETCH(QStringList, signatures); + + QAxScriptManager scriptManager; + for (const auto &script : scripts) { + QVERIFY2(scriptManager.load(script.code, script.name, script.language), + "Unable to load script (CoInitializeEx() called?)"); + } + functions.sort(); + QStringList actualFunctions = scriptManager.functions(); + actualFunctions.sort(); + QCOMPARE(actualFunctions, functions); + + QStringList actualSignatures = scriptManager.functions(QAxScript::FunctionSignatures); + actualSignatures.sort(); + QCOMPARE(actualSignatures, signatures); +} + +void tst_QAxScriptManager::scriptNames_data() +{ + functions_data(); +} + +void tst_QAxScriptManager::scriptNames() +{ + // QStringList scriptNames() const; + QFETCH(QList<Script>, scripts); + QFETCH(QStringList, functions); + + QAxScriptManager scriptManager; + QStringList expectedNames; + for (const auto &script : scripts) { + expectedNames << script.name; + QVERIFY2(scriptManager.load(script.code, script.name, script.language), + "Unable to load script (CoInitializeEx() called?)"); + } + expectedNames.sort(); + QStringList actualNames = scriptManager.scriptNames(); + actualNames.sort(); + QCOMPARE(actualNames, expectedNames); +} + +void tst_QAxScriptManager::script_data() +{ + functions_data(); +} + +void tst_QAxScriptManager::script() +{ + QFETCH(QList<Script>, scripts); + QFETCH(QStringList, functions); + + QAxScriptManager scriptManager; + QStringList expectedNames; + for (const auto &script : scripts) { + expectedNames << script.name; + QVERIFY2(scriptManager.load(script.code, script.name, script.language), + "Unable to load script (CoInitializeEx() called?)"); + } + + for (const auto &script : scripts) { + QAxScript *axscript = scriptManager.script(script.name); + QVERIFY(axscript); + QVERIFY(axscript->scriptEngine()); + QVERIFY(axscript->scriptEngine()->isValid()); + const auto scriptFunctions = axscript->functions(); + for (const auto &scriptFunction : scriptFunctions) { + auto index = functions.indexOf(scriptFunction); + QCOMPARE_NE(index, -1); + functions.remove(index); + } + + QCOMPARE(axscript->scriptEngine()->scriptLanguage(), script.language); + } + + // verify that all functions were found across the different QAxScript objects + QVERIFY(functions.isEmpty()); +} + +void tst_QAxScriptManager::call_data() +{ + functions_data(); +} + +void tst_QAxScriptManager::call() +{ + QFETCH(QList<Script>, scripts); + QFETCH(QStringList, functions); + QFETCH(QStringList, signatures); + + QAxScriptManager scriptManager; + for (const auto &script : scripts) { + QAxScript *axScript = scriptManager.load(script.code, script.name, script.language); + + QVERIFY2(axScript, "Unable to load script (CoInitializeEx() called?)"); + QVERIFY(axScript->scriptEngine()); + QVERIFY(axScript->scriptEngine()->hasIntrospection()); + } + + // QAxScriptManager::call finds the script based on function name... + for (const auto &function : std::as_const(functions)) { + QVariant result = scriptManager.call(function); + QCOMPARE(result.metaType(), QMetaType::fromType<QString>()); + } + // ...or fully qualified function signature + for (const auto &function : std::as_const(signatures)) { + QVariant result = scriptManager.call(function); + QCOMPARE(result.metaType(), QMetaType::fromType<QString>()); + } +} + +QTEST_MAIN(tst_QAxScriptManager) +#include "tst_qaxscriptmanager.moc" |