summaryrefslogtreecommitdiffstats
path: root/tests/auto
diff options
context:
space:
mode:
authorKent Hansen <khansen@trolltech.com>2009-10-23 12:45:13 (GMT)
committerKent Hansen <khansen@trolltech.com>2009-10-23 12:45:13 (GMT)
commitc21d3a0094b0692f2f888b04e258229234200e3c (patch)
treef34338ec27f2c4ef5d7294f04d4ab7dac6283f02 /tests/auto
parentb824fc37d618e55bd128bacebb78dc3770c73264 (diff)
downloadQt-c21d3a0094b0692f2f888b04e258229234200e3c.zip
Qt-c21d3a0094b0692f2f888b04e258229234200e3c.tar.gz
Qt-c21d3a0094b0692f2f888b04e258229234200e3c.tar.bz2
Refactor QScriptProgram and related API
Get rid of QScriptEngine::compile(); you pass arguments to the QScriptProgram constructor instead. evaluate() will lazily compile the program the first time it is evaluated, then use the cached, compiled form on subsequent calls.
Diffstat (limited to 'tests/auto')
-rw-r--r--tests/auto/qscriptengine/tst_qscriptengine.cpp45
-rw-r--r--tests/auto/qscriptengineagent/tst_qscriptengineagent.cpp87
2 files changed, 122 insertions, 10 deletions
diff --git a/tests/auto/qscriptengine/tst_qscriptengine.cpp b/tests/auto/qscriptengine/tst_qscriptengine.cpp
index c00bde6..062cbfa 100644
--- a/tests/auto/qscriptengine/tst_qscriptengine.cpp
+++ b/tests/auto/qscriptengine/tst_qscriptengine.cpp
@@ -152,7 +152,7 @@ private slots:
void installTranslatorFunctions();
void functionScopes();
void nativeFunctionScopes();
- void compileAndEvaluate();
+ void evaluateProgram();
void qRegExpInport_data();
void qRegExpInport();
@@ -4291,7 +4291,7 @@ void tst_QScriptEngine::nativeFunctionScopes()
}
}
-void tst_QScriptEngine::compileAndEvaluate()
+void tst_QScriptEngine::evaluateProgram()
{
QScriptEngine eng;
@@ -4299,21 +4299,23 @@ void tst_QScriptEngine::compileAndEvaluate()
QString code("1 + 2");
QString fileName("hello.js");
int lineNumber(123);
- QScriptProgram program = eng.compile(code, fileName, lineNumber);
- QVERIFY(program.isValid());
+ QScriptProgram program(code, fileName, lineNumber);
+ QVERIFY(!program.isNull());
QCOMPARE(program.sourceCode(), code);
QCOMPARE(program.fileName(), fileName);
QCOMPARE(program.lineNumber(), lineNumber);
QScriptValue expected = eng.evaluate(code);
- QScriptValue ret = eng.evaluate(program);
- QVERIFY(ret.equals(expected));
+ for (int x = 0; x < 10; ++x) {
+ QScriptValue ret = eng.evaluate(program);
+ QVERIFY(ret.equals(expected));
+ }
}
// Program that accesses variable in the scope
{
- QScriptProgram program = eng.compile("a");
- QVERIFY(program.isValid());
+ QScriptProgram program("a");
+ QVERIFY(!program.isNull());
{
QScriptValue ret = eng.evaluate(program);
QVERIFY(ret.isError());
@@ -4350,8 +4352,8 @@ void tst_QScriptEngine::compileAndEvaluate()
// Program that creates closure
{
- QScriptProgram program = eng.compile("(function() { var count = 0; return function() { return count++; }; })");
- QVERIFY(program.isValid());
+ QScriptProgram program("(function() { var count = 0; return function() { return count++; }; })");
+ QVERIFY(!program.isNull());
QScriptValue createCounter = eng.evaluate(program);
QVERIFY(createCounter.isFunction());
QScriptValue counter = createCounter.call();
@@ -4368,6 +4370,29 @@ void tst_QScriptEngine::compileAndEvaluate()
QVERIFY(ret.isNumber());
}
}
+
+ // Same program run in different engines
+ {
+ QString code("1 + 2");
+ QScriptProgram program(code);
+ QVERIFY(!program.isNull());
+ double expected = eng.evaluate(program).toNumber();
+ for (int x = 0; x < 2; ++x) {
+ QScriptEngine eng2;
+ for (int y = 0; y < 2; ++y) {
+ double ret = eng2.evaluate(program).toNumber();
+ QCOMPARE(ret, expected);
+ }
+ }
+ }
+
+ // No program
+ {
+ QScriptProgram program;
+ QVERIFY(program.isNull());
+ QScriptValue ret = eng.evaluate(program);
+ QVERIFY(!ret.isValid());
+ }
}
static QRegExp minimal(QRegExp r) { r.setMinimal(true); return r; }
diff --git a/tests/auto/qscriptengineagent/tst_qscriptengineagent.cpp b/tests/auto/qscriptengineagent/tst_qscriptengineagent.cpp
index 283e489..bdb0414 100644
--- a/tests/auto/qscriptengineagent/tst_qscriptengineagent.cpp
+++ b/tests/auto/qscriptengineagent/tst_qscriptengineagent.cpp
@@ -44,6 +44,7 @@
#include <QtScript/qscriptengineagent.h>
#include <QtScript/qscriptengine.h>
+#include <QtScript/qscriptprogram.h>
#include <qscriptvalueiterator.h>
//TESTED_CLASS=
@@ -109,6 +110,9 @@ private slots:
void extension_invoctaion();
void extension();
void isEvaluatingInExtension();
+ void evaluateProgram();
+ void evaluateProgram_SyntaxError();
+ void evaluateNullProgram();
private:
double m_testProperty;
@@ -2182,5 +2186,88 @@ void tst_QScriptEngineAgent::isEvaluatingInExtension()
QVERIFY(spy->wasEvaluating);
}
+void tst_QScriptEngineAgent::evaluateProgram()
+{
+ QScriptEngine eng;
+ QScriptProgram program("1 + 2", "foo.js", 123);
+ ScriptEngineSpy *spy = new ScriptEngineSpy(&eng);
+ qint64 scriptId = -1;
+ for (int x = 0; x < 10; ++x) {
+ spy->clear();
+ (void)eng.evaluate(program);
+ QCOMPARE(spy->count(), (x == 0) ? 4 : 3);
+
+ if (x == 0) {
+ // script is only loaded on first execution
+ QCOMPARE(spy->at(0).type, ScriptEngineEvent::ScriptLoad);
+ scriptId = spy->at(0).scriptId;
+ QVERIFY(scriptId != -1);
+ QCOMPARE(spy->at(0).script, program.sourceCode());
+ QCOMPARE(spy->at(0).fileName, program.fileName());
+ QCOMPARE(spy->at(0).lineNumber, program.lineNumber());
+ spy->removeFirst();
+ }
+
+ QCOMPARE(spy->at(0).type, ScriptEngineEvent::FunctionEntry); // evaluate()
+ QCOMPARE(spy->at(0).scriptId, scriptId);
+
+ QCOMPARE(spy->at(1).type, ScriptEngineEvent::PositionChange);
+ QCOMPARE(spy->at(1).scriptId, scriptId);
+ QCOMPARE(spy->at(1).lineNumber, program.lineNumber());
+
+ QCOMPARE(spy->at(2).type, ScriptEngineEvent::FunctionExit); // evaluate()
+ QCOMPARE(spy->at(2).scriptId, scriptId);
+ QVERIFY(spy->at(2).value.isNumber());
+ QCOMPARE(spy->at(2).value.toNumber(), qsreal(3));
+ }
+}
+
+void tst_QScriptEngineAgent::evaluateProgram_SyntaxError()
+{
+ QScriptEngine eng;
+ QScriptProgram program("this is not valid syntax", "foo.js", 123);
+ ScriptEngineSpy *spy = new ScriptEngineSpy(&eng);
+ qint64 scriptId = -1;
+ for (int x = 0; x < 10; ++x) {
+ spy->clear();
+ (void)eng.evaluate(program);
+ QCOMPARE(spy->count(), (x == 0) ? 8 : 7);
+
+ if (x == 0) {
+ // script is only loaded on first execution
+ QCOMPARE(spy->at(0).type, ScriptEngineEvent::ScriptLoad);
+ scriptId = spy->at(0).scriptId;
+ QVERIFY(scriptId != -1);
+ QCOMPARE(spy->at(0).script, program.sourceCode());
+ QCOMPARE(spy->at(0).fileName, program.fileName());
+ QCOMPARE(spy->at(0).lineNumber, program.lineNumber());
+ spy->removeFirst();
+ }
+
+ QCOMPARE(spy->at(0).type, ScriptEngineEvent::FunctionEntry); // evaluate()
+ QCOMPARE(spy->at(0).scriptId, scriptId);
+
+ QCOMPARE(spy->at(1).type, ScriptEngineEvent::ContextPush); // SyntaxError constructor
+ QCOMPARE(spy->at(2).type, ScriptEngineEvent::FunctionEntry); // SyntaxError constructor
+ QCOMPARE(spy->at(3).type, ScriptEngineEvent::FunctionExit); // SyntaxError constructor
+ QCOMPARE(spy->at(4).type, ScriptEngineEvent::ContextPop); // SyntaxError constructor
+
+ QCOMPARE(spy->at(5).type, ScriptEngineEvent::ExceptionThrow);
+ QVERIFY(spy->at(5).value.isError());
+ QCOMPARE(spy->at(5).value.toString(), QString::fromLatin1("SyntaxError: Parse error"));
+
+ QCOMPARE(spy->at(6).type, ScriptEngineEvent::FunctionExit); // evaluate()
+ QCOMPARE(spy->at(6).scriptId, scriptId);
+ }
+}
+
+void tst_QScriptEngineAgent::evaluateNullProgram()
+{
+ QScriptEngine eng;
+ ScriptEngineSpy *spy = new ScriptEngineSpy(&eng);
+ (void)eng.evaluate(QScriptProgram());
+ QCOMPARE(spy->count(), 0);
+}
+
QTEST_MAIN(tst_QScriptEngineAgent)
#include "tst_qscriptengineagent.moc"