aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorMitch Curtis <mitch.curtis@theqtcompany.com>2015-09-10 09:11:13 +0200
committerMitch Curtis <mitch.curtis@theqtcompany.com>2015-09-25 14:26:43 +0000
commit9d58167d352b2f860f473fd74b63541d7659b811 (patch)
tree6f69490043ce13db25130af2d75600f6fe1ea48d /tests
parent0220163ca27c3f97e623591a231473c42b907012 (diff)
Add extension API to QJSEngine
This allows users in a JavaScript-only environment to install extensions including: - Translation functions (qsTr(), etc.) - The console object (console.log(), print(), etc.) - Garbage collection functions (gc()) This deprecates installTranslatorFunctions(). This API results in less clutter in the API, as we'd otherwise need to have several functions for each type of extension. [ChangeLog][QJSEngine] Introduced an extension API that allows installing various function and object extensions (qsTr(), console.log(), etc.) to QJSEngine. [ChangeLog][QJSEngine] installTranslatorFunctions() was deprecated in favor of the new extension API (see installExtensions()). Change-Id: I4d6eb2097c3eda6810e967b2e8f6441c28c91a16 Task-number: QTBUG-40772 Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/qml/qjsengine/tst_qjsengine.cpp119
1 files changed, 116 insertions, 3 deletions
diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
index 4c7dba9f90..39bc8b2e5f 100644
--- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp
+++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
@@ -155,7 +155,7 @@ private slots:
void callConstants();
- void installTranslatorFunctions();
+ void installTranslationFunctions();
void translateScript_data();
void translateScript();
void translateScript_crossScript();
@@ -172,6 +172,16 @@ private slots:
void translateScriptUnicodeIdBased();
void translateFromBuiltinCallback();
+ void installConsoleFunctions();
+ void logging();
+ void tracing();
+ void asserts();
+ void exceptions();
+
+ void installGarbageCollectionFunctions();
+
+ void installAllExtensions();
+
void privateMethods();
void engineForObject();
@@ -1480,6 +1490,8 @@ void tst_QJSEngine::gcWithNestedDataStructure()
// The GC must be able to traverse deeply nested objects, otherwise this
// test would crash.
QJSEngine eng;
+ eng.installExtensions(QJSEngine::GarbageCollectionExtension);
+
QJSValue ret = eng.evaluate(
"function makeList(size)"
"{"
@@ -3171,7 +3183,7 @@ void tst_QJSEngine::callConstants()
QCOMPARE(exceptionResult.toString(), QString("TypeError: true is not a function"));
}
-void tst_QJSEngine::installTranslatorFunctions()
+void tst_QJSEngine::installTranslationFunctions()
{
QJSEngine eng;
QJSValue global = eng.globalObject();
@@ -3182,7 +3194,7 @@ void tst_QJSEngine::installTranslatorFunctions()
QVERIFY(global.property("qsTrId").isUndefined());
QVERIFY(global.property("QT_TRID_NOOP").isUndefined());
- eng.installTranslatorFunctions();
+ eng.installExtensions(QJSEngine::TranslationExtension);
QVERIFY(global.property("qsTranslate").isCallable());
QVERIFY(global.property("QT_TRANSLATE_NOOP").isCallable());
QVERIFY(global.property("qsTr").isCallable());
@@ -3597,6 +3609,107 @@ void tst_QJSEngine::translateFromBuiltinCallback()
eng.evaluate("[10,20].forEach(foo)", "script.js");
}
+void tst_QJSEngine::installConsoleFunctions()
+{
+ QJSEngine engine;
+ QJSValue global = engine.globalObject();
+ QVERIFY(global.property("console").isUndefined());
+ QVERIFY(global.property("print").isUndefined());
+
+ engine.installExtensions(QJSEngine::ConsoleExtension);
+ QVERIFY(global.property("console").isObject());
+ QVERIFY(global.property("print").isCallable());
+}
+
+void tst_QJSEngine::logging()
+{
+ QLoggingCategory loggingCategory("js");
+ QVERIFY(loggingCategory.isDebugEnabled());
+ QVERIFY(loggingCategory.isWarningEnabled());
+ QVERIFY(loggingCategory.isCriticalEnabled());
+
+ QJSEngine engine;
+ engine.installExtensions(QJSEngine::ConsoleExtension);
+
+ QTest::ignoreMessage(QtDebugMsg, "console.debug");
+ engine.evaluate("console.debug('console.debug')");
+ QTest::ignoreMessage(QtDebugMsg, "console.log");
+ engine.evaluate("console.log('console.log')");
+ QTest::ignoreMessage(QtInfoMsg, "console.info");
+ engine.evaluate("console.info('console.info')");
+ QTest::ignoreMessage(QtWarningMsg, "console.warn");
+ engine.evaluate("console.warn('console.warn')");
+ QTest::ignoreMessage(QtCriticalMsg, "console.error");
+ engine.evaluate("console.error('console.error')");
+
+ QTest::ignoreMessage(QtDebugMsg, ": 1");
+ engine.evaluate("console.count()");
+
+ QTest::ignoreMessage(QtDebugMsg, ": 2");
+ engine.evaluate("console.count()");
+}
+
+void tst_QJSEngine::tracing()
+{
+ QJSEngine engine;
+ engine.installExtensions(QJSEngine::ConsoleExtension);
+
+ QTest::ignoreMessage(QtDebugMsg, "%entry (:1)");
+ engine.evaluate("console.trace()");
+
+ QTest::ignoreMessage(QtDebugMsg, "a (:1)\nb (:1)\nc (:1)\n%entry (:1)");
+ engine.evaluate("function a() { console.trace(); } function b() { a(); } function c() { b(); }");
+ engine.evaluate("c()");
+}
+
+void tst_QJSEngine::asserts()
+{
+ QJSEngine engine;
+ engine.installExtensions(QJSEngine::ConsoleExtension);
+
+ QTest::ignoreMessage(QtCriticalMsg, "This will fail\n%entry (:1)");
+ engine.evaluate("console.assert(0, 'This will fail')");
+
+ QTest::ignoreMessage(QtCriticalMsg, "This will fail too\n%entry (:1)");
+ engine.evaluate("console.assert(1 > 2, 'This will fail too')");
+}
+
+void tst_QJSEngine::exceptions()
+{
+ QJSEngine engine;
+ engine.installExtensions(QJSEngine::ConsoleExtension);
+
+ QTest::ignoreMessage(QtCriticalMsg, "Exception 1\n%entry (:1)");
+ engine.evaluate("console.exception('Exception 1')");
+}
+
+void tst_QJSEngine::installGarbageCollectionFunctions()
+{
+ QJSEngine engine;
+ QJSValue global = engine.globalObject();
+ QVERIFY(global.property("gc").isUndefined());
+
+ engine.installExtensions(QJSEngine::GarbageCollectionExtension);
+ QVERIFY(global.property("gc").isCallable());
+}
+
+void tst_QJSEngine::installAllExtensions()
+{
+ QJSEngine engine;
+ QJSValue global = engine.globalObject();
+ // Pick out a few properties from each extension and check that they're there.
+ QVERIFY(global.property("qsTranslate").isUndefined());
+ QVERIFY(global.property("console").isUndefined());
+ QVERIFY(global.property("print").isUndefined());
+ QVERIFY(global.property("gc").isUndefined());
+
+ engine.installExtensions(QJSEngine::AllExtensions);
+ QVERIFY(global.property("qsTranslate").isCallable());
+ QVERIFY(global.property("console").isObject());
+ QVERIFY(global.property("print").isCallable());
+ QVERIFY(global.property("gc").isCallable());
+}
+
class ObjectWithPrivateMethods : public QObject
{
Q_OBJECT