summaryrefslogtreecommitdiffstats
path: root/tests/benchmarks/script
diff options
context:
space:
mode:
authorAaron McCarthy <aaron.mccarthy@nokia.com>2010-02-11 06:09:18 (GMT)
committerAaron McCarthy <aaron.mccarthy@nokia.com>2010-02-11 06:09:18 (GMT)
commit9a76a90b1944db52bd4180d27c01781fbb3499d4 (patch)
tree46ac1557761e30127330520d2fa6412305e07443 /tests/benchmarks/script
parentb5fe99c0105a9791e34a8b959822430497a4aeb9 (diff)
parentb9907e309885b4b8ce280c721231a56a583b51d0 (diff)
downloadQt-9a76a90b1944db52bd4180d27c01781fbb3499d4.zip
Qt-9a76a90b1944db52bd4180d27c01781fbb3499d4.tar.gz
Qt-9a76a90b1944db52bd4180d27c01781fbb3499d4.tar.bz2
Merge remote branch 'origin/4.6' into bearermanagement/integration
Conflicts: src/s60installs/s60installs.pro
Diffstat (limited to 'tests/benchmarks/script')
-rw-r--r--tests/benchmarks/script/qscriptclass/qscriptclass.pro7
-rw-r--r--tests/benchmarks/script/qscriptclass/tst_qscriptclass.cpp285
-rw-r--r--tests/benchmarks/script/qscriptengine/qscriptengine.pro12
-rw-r--r--tests/benchmarks/script/qscriptengine/tst_qscriptengine.cpp289
-rw-r--r--tests/benchmarks/script/qscriptvalue/qscriptvalue.pro7
-rw-r--r--tests/benchmarks/script/qscriptvalue/tst_qscriptvalue.cpp205
-rw-r--r--tests/benchmarks/script/script.pro5
7 files changed, 810 insertions, 0 deletions
diff --git a/tests/benchmarks/script/qscriptclass/qscriptclass.pro b/tests/benchmarks/script/qscriptclass/qscriptclass.pro
new file mode 100644
index 0000000..f0ffeb7
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass/qscriptclass.pro
@@ -0,0 +1,7 @@
+load(qttest_p4)
+TEMPLATE = app
+TARGET = tst_qscriptclass
+
+SOURCES += tst_qscriptclass.cpp
+
+QT += script
diff --git a/tests/benchmarks/script/qscriptclass/tst_qscriptclass.cpp b/tests/benchmarks/script/qscriptclass/tst_qscriptclass.cpp
new file mode 100644
index 0000000..6ab78b1
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass/tst_qscriptclass.cpp
@@ -0,0 +1,285 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtest.h>
+#include <QtScript>
+
+Q_DECLARE_METATYPE(QScriptContext*)
+Q_DECLARE_METATYPE(QScriptValue)
+Q_DECLARE_METATYPE(QScriptValueList)
+
+// We want reliable numbers so we don't want to rely too much
+// on the number of iterations done by testlib.
+// this also make the results of valgrind more interesting
+const int iterationNumber = 5000;
+
+class tst_QScriptClass : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void noSuchProperty();
+ void property();
+ void setProperty();
+ void propertyFlags();
+ void call();
+ void hasInstance();
+ void iterate();
+};
+
+// Test the overhead of checking for an inexisting property of a QScriptClass
+void tst_QScriptClass::noSuchProperty()
+{
+ QScriptEngine eng;
+ QScriptClass cls(&eng);
+ QScriptValue obj = eng.newObject(&cls);
+ QString propertyName = QString::fromLatin1("foo");
+ QBENCHMARK {
+ for (int i = 0; i < iterationNumber; ++i)
+ (void)obj.property(propertyName);
+ }
+ Q_ASSERT(!obj.property(propertyName).isValid());
+}
+
+
+class FooScriptClass : public QScriptClass
+{
+public:
+ FooScriptClass(QScriptEngine *engine)
+ : QScriptClass(engine)
+ {
+ foo = engine->toStringHandle("foo");
+ }
+
+ QueryFlags queryProperty(const QScriptValue &,
+ const QScriptString &,
+ QueryFlags flags,
+ uint *id)
+ {
+ *id = 1;
+ return flags;
+ }
+
+ QScriptValue property(const QScriptValue &,
+ const QScriptString &,
+ uint)
+ {
+ return QScriptValue(engine(), 35);
+ }
+
+ void setProperty(QScriptValue &, const QScriptString &,
+ uint, const QScriptValue &)
+ {}
+
+ QScriptValue::PropertyFlags propertyFlags(const QScriptValue &, const QScriptString &, uint)
+ {
+ return QScriptValue::Undeletable;
+ }
+private:
+ QScriptString foo;
+};
+
+// Test the overhead of getting a value of QScriptClass accross the Javascript engine
+void tst_QScriptClass::property()
+{
+ QScriptEngine eng;
+ FooScriptClass cls(&eng);
+ QScriptValue obj = eng.newObject(&cls);
+ QScriptString foo = eng.toStringHandle("foo");
+ QBENCHMARK {
+ for (int i = 0; i < iterationNumber; ++i)
+ (void)obj.property(foo);
+ }
+}
+
+// Test the overhead of setting a value on QScriptClass accross the Javascript engine
+void tst_QScriptClass::setProperty()
+{
+ QScriptEngine eng;
+ FooScriptClass cls(&eng);
+ QScriptValue obj = eng.newObject(&cls);
+ QScriptValue value(456);
+ QScriptString foo = eng.toStringHandle("foo");
+ QBENCHMARK {
+ for (int i = 0; i < iterationNumber; ++i)
+ obj.setProperty(foo, value);
+ }
+}
+
+// Test the time taken to get the propeties flags accross the engine
+void tst_QScriptClass::propertyFlags()
+{
+ QScriptEngine eng;
+ FooScriptClass cls(&eng);
+ QScriptValue obj = eng.newObject(&cls);
+ QScriptString foo = eng.toStringHandle("foo");
+ QBENCHMARK {
+ for (int i = 0; i < iterationNumber; ++i)
+ (void)obj.propertyFlags(foo);
+ }
+}
+
+
+
+class ExtensionScriptClass : public QScriptClass
+{
+public:
+ ExtensionScriptClass(QScriptEngine *engine)
+ : QScriptClass(engine)
+ {
+ }
+
+ bool supportsExtension(Extension) const
+ {
+ return true;
+ }
+
+ QVariant extension(Extension, const QVariant &argument = QVariant())
+ {
+ Q_UNUSED(argument);
+ return QVariant();
+ }
+};
+
+// Check the overhead of the extension "call"
+void tst_QScriptClass::call()
+{
+ QScriptEngine eng;
+ ExtensionScriptClass cls(&eng);
+ QScriptValue obj = eng.newObject(&cls);
+ QScriptValue thisObject;
+ QScriptValueList args;
+ args.append(123);
+ QBENCHMARK {
+ for (int i = 0; i < iterationNumber; ++i)
+ (void)obj.call(thisObject, args);
+ }
+}
+
+// Check the overhead of the extension "instanceOf"
+void tst_QScriptClass::hasInstance()
+{
+ QScriptEngine eng;
+ ExtensionScriptClass cls(&eng);
+ QScriptValue obj = eng.newObject(&cls);
+ obj.setProperty("foo", 123);
+ QScriptValue plain = eng.newObject();
+ plain.setProperty("foo", obj.property("foo"));
+ QBENCHMARK {
+ for (int i = 0; i < iterationNumber; ++i)
+ (void)plain.instanceOf(obj);
+ }
+}
+
+
+
+static const int iteratorValuesNumber = 100;
+class TestClassPropertyIterator : public QScriptClassPropertyIterator
+{
+public:
+ TestClassPropertyIterator(const QScriptValue &object, QVector<QScriptString> names)
+ : QScriptClassPropertyIterator(object)
+ , m_index(0)
+ , names(names)
+ {
+ }
+
+ bool hasNext() const
+ {
+ return m_index < iteratorValuesNumber - 1;
+ }
+ void next() { ++m_index; }
+
+ bool hasPrevious() const { return m_index > 0; }
+ void previous() { --m_index; }
+
+ void toFront() { m_index = 0; }
+ void toBack() { m_index = iteratorValuesNumber - 1; }
+
+ QScriptString name() const { return names[m_index]; }
+ uint id() const { return m_index; }
+ QScriptValue::PropertyFlags flags() const { return 0; }
+
+private:
+ int m_index;
+ QVector<QScriptString> names;
+};
+
+
+class IteratorScriptClass : public QScriptClass
+{
+public:
+ IteratorScriptClass(QScriptEngine *engine)
+ : QScriptClass(engine)
+ {
+ for (int i = 0; i < iteratorValuesNumber; ++i)
+ names.append(engine->toStringHandle(QString("property%1").arg(i)));
+ }
+
+ QScriptClassPropertyIterator *newIterator(const QScriptValue &object)
+ {
+ return new TestClassPropertyIterator(object, names);
+ }
+private:
+ QVector<QScriptString> names;
+ friend class TestClassPropertyIterator;
+};
+
+// Measure the performance of the interface to iterate over QScriptClassPropertyIterator
+void tst_QScriptClass::iterate()
+{
+ QScriptEngine eng;
+ IteratorScriptClass cls(&eng);
+ QScriptValue obj = eng.newObject(&cls);
+ int iterationNumberIterate = iterationNumber / iteratorValuesNumber;
+ QBENCHMARK {
+ for (int i = 0; i < iterationNumberIterate; ++i) {
+ QScriptValueIterator it(obj);
+ while (it.hasNext()) {
+ it.next();
+ (void)it.scriptName();
+ }
+ }
+ }
+}
+
+QTEST_MAIN(tst_QScriptClass)
+#include "tst_qscriptclass.moc"
diff --git a/tests/benchmarks/script/qscriptengine/qscriptengine.pro b/tests/benchmarks/script/qscriptengine/qscriptengine.pro
new file mode 100644
index 0000000..df6dbb3
--- /dev/null
+++ b/tests/benchmarks/script/qscriptengine/qscriptengine.pro
@@ -0,0 +1,12 @@
+load(qttest_p4)
+TEMPLATE = app
+TARGET = tst_qscriptengine
+
+SOURCES += tst_qscriptengine.cpp
+
+QT += script
+
+symbian* {
+ TARGET.EPOCHEAPSIZE = 0x20000 0x2000000 // Min 128kB, Max 32MB
+ TARGET.EPOCSTACKSIZE = 0x14000
+}
diff --git a/tests/benchmarks/script/qscriptengine/tst_qscriptengine.cpp b/tests/benchmarks/script/qscriptengine/tst_qscriptengine.cpp
new file mode 100644
index 0000000..6c6f0b1
--- /dev/null
+++ b/tests/benchmarks/script/qscriptengine/tst_qscriptengine.cpp
@@ -0,0 +1,289 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtest.h>
+#include <QtScript>
+
+//TESTED_FILES=
+
+class tst_QScriptEngine : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_QScriptEngine();
+ virtual ~tst_QScriptEngine();
+
+public slots:
+ void init();
+ void cleanup();
+
+private slots:
+ void constructor();
+ void evaluate_data();
+ void evaluate();
+ void evaluateProgram_data();
+ void evaluateProgram();
+ void connectAndDisconnect();
+ void newObject();
+ void newQObject();
+ void newFunction();
+ void newVariant();
+ void collectGarbage();
+ void pushAndPopContext();
+ void toStringHandle();
+ void castValueToQreal();
+ void nativeCall();
+ void translation_data();
+ void translation();
+};
+
+tst_QScriptEngine::tst_QScriptEngine()
+{
+}
+
+tst_QScriptEngine::~tst_QScriptEngine()
+{
+}
+
+void tst_QScriptEngine::init()
+{
+}
+
+void tst_QScriptEngine::cleanup()
+{
+}
+
+void tst_QScriptEngine::constructor()
+{
+ QBENCHMARK {
+ QScriptEngine engine;
+ (void)engine.parent();
+ }
+}
+
+void tst_QScriptEngine::evaluate_data()
+{
+ QTest::addColumn<QString>("code");
+ QTest::newRow("empty script") << QString::fromLatin1("");
+ QTest::newRow("number literal") << QString::fromLatin1("123");
+ QTest::newRow("string literal") << QString::fromLatin1("'ciao'");
+ QTest::newRow("regexp literal") << QString::fromLatin1("/foo/gim");
+ QTest::newRow("null literal") << QString::fromLatin1("null");
+ QTest::newRow("undefined literal") << QString::fromLatin1("undefined");
+ QTest::newRow("null literal") << QString::fromLatin1("null");
+ QTest::newRow("empty object literal") << QString::fromLatin1("{}");
+ QTest::newRow("this") << QString::fromLatin1("this");
+ QTest::newRow("object literal with one property") << QString::fromLatin1("{ foo: 123 }");
+ QTest::newRow("object literal with two properties") << QString::fromLatin1("{ foo: 123, bar: 456 }");
+ QTest::newRow("object literal with many properties") << QString::fromLatin1("{ a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7, h: 8, i: 9, j: 10 }");
+ QTest::newRow("empty array literal") << QString::fromLatin1("[]");
+ QTest::newRow("array literal with one element") << QString::fromLatin1("[1]");
+ QTest::newRow("array literal with two elements") << QString::fromLatin1("[1,2]");
+ QTest::newRow("array literal with many elements") << QString::fromLatin1("[1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1]");
+ QTest::newRow("empty function definition") << QString::fromLatin1("function foo() { }");
+ QTest::newRow("function definition") << QString::fromLatin1("function foo() { return 123; }");
+ QTest::newRow("for loop with empty body (1000 iterations)") << QString::fromLatin1("for (i = 0; i < 1000; ++i) {}");
+ QTest::newRow("for loop with empty body (10000 iterations)") << QString::fromLatin1("for (i = 0; i < 10000; ++i) {}");
+ QTest::newRow("for loop with empty body (100000 iterations)") << QString::fromLatin1("for (i = 0; i < 100000; ++i) {}");
+ QTest::newRow("for loop with empty body (1000000 iterations)") << QString::fromLatin1("for (i = 0; i < 1000000; ++i) {}");
+ QTest::newRow("for loop (1000 iterations)") << QString::fromLatin1("j = 0; for (i = 0; i < 1000; ++i) { j += i; }; j");
+ QTest::newRow("for loop (10000 iterations)") << QString::fromLatin1("j = 0; for (i = 0; i < 10000; ++i) { j += i; }; j");
+ QTest::newRow("for loop (100000 iterations)") << QString::fromLatin1("j = 0; for (i = 0; i < 100000; ++i) { j += i; }; j");
+ QTest::newRow("for loop (1000000 iterations)") << QString::fromLatin1("j = 0; for (i = 0; i < 1000000; ++i) { j += i; }; j");
+ QTest::newRow("assignments") << QString::fromLatin1("a = 1; b = 2; c = 3; d = 4");
+ QTest::newRow("while loop (1000 iterations)") << QString::fromLatin1("i = 0; while (i < 1000) { ++i; }; i");
+ QTest::newRow("while loop (10000 iterations)") << QString::fromLatin1("i = 0; while (i < 10000) { ++i; }; i");
+ QTest::newRow("while loop (100000 iterations)") << QString::fromLatin1("i = 0; while (i < 100000) { ++i; }; i");
+ QTest::newRow("while loop (1000000 iterations)") << QString::fromLatin1("i = 0; while (i < 1000000) { ++i; }; i");
+ QTest::newRow("function expression") << QString::fromLatin1("(function(a, b, c){ return a + b + c; })(1, 2, 3)");
+}
+
+void tst_QScriptEngine::evaluate()
+{
+ QFETCH(QString, code);
+ QScriptEngine engine;
+
+ QBENCHMARK {
+ (void)engine.evaluate(code);
+ }
+}
+
+void tst_QScriptEngine::connectAndDisconnect()
+{
+ QScriptEngine engine;
+ QScriptValue fun = engine.evaluate("(function() { })");
+ QBENCHMARK {
+ qScriptConnect(&engine, SIGNAL(destroyed()), QScriptValue(), fun);
+ qScriptDisconnect(&engine, SIGNAL(destroyed()), QScriptValue(), fun);
+ }
+}
+
+void tst_QScriptEngine::evaluateProgram_data()
+{
+ evaluate_data();
+}
+
+void tst_QScriptEngine::evaluateProgram()
+{
+ QFETCH(QString, code);
+ QScriptEngine engine;
+ QScriptProgram program(code);
+
+ QBENCHMARK {
+ (void)engine.evaluate(program);
+ }
+}
+
+void tst_QScriptEngine::newObject()
+{
+ QScriptEngine engine;
+ QBENCHMARK {
+ (void)engine.newObject();
+ }
+}
+
+void tst_QScriptEngine::newQObject()
+{
+ QScriptEngine engine;
+ QBENCHMARK {
+ (void)engine.newQObject(QCoreApplication::instance());
+ }
+}
+
+static QScriptValue testFunction(QScriptContext *, QScriptEngine *)
+{
+ return 0;
+}
+
+void tst_QScriptEngine::newFunction()
+{
+ QScriptEngine engine;
+ QBENCHMARK {
+ (void)engine.newFunction(testFunction);
+ }
+}
+
+void tst_QScriptEngine::newVariant()
+{
+ QScriptEngine engine;
+ QVariant var(123);
+ QBENCHMARK {
+ (void)engine.newVariant(var);
+ }
+}
+
+void tst_QScriptEngine::collectGarbage()
+{
+ QScriptEngine engine;
+ QBENCHMARK {
+ engine.collectGarbage();
+ }
+}
+
+void tst_QScriptEngine::pushAndPopContext()
+{
+ QScriptEngine engine;
+ QBENCHMARK {
+ (void)engine.pushContext();
+ engine.popContext();
+ }
+}
+
+void tst_QScriptEngine::toStringHandle()
+{
+ QScriptEngine engine;
+ QString str = QString::fromLatin1("foobarbaz");
+ QBENCHMARK {
+ (void)engine.toStringHandle(str);
+ }
+}
+
+void tst_QScriptEngine::castValueToQreal()
+{
+ QScriptEngine engine;
+ QScriptValue val(123);
+ QBENCHMARK {
+ (void)qscriptvalue_cast<qreal>(val);
+ }
+}
+
+static QScriptValue native_function(QScriptContext *, QScriptEngine *)
+{
+ return 42;
+}
+
+void tst_QScriptEngine::nativeCall()
+{
+ QScriptEngine eng;
+ eng.globalObject().setProperty("fun", eng.newFunction(native_function));
+ QBENCHMARK{
+#if !defined(Q_OS_SYMBIAN)
+ eng.evaluate("var w = 0; for (i = 0; i < 100000; ++i) {\n"
+ " w += fun() + fun(); w -= fun(); fun(); w -= fun(); }");
+#else
+ eng.evaluate("var w = 0; for (i = 0; i < 25000; ++i) {\n"
+ " w += fun() + fun(); w -= fun(); fun(); w -= fun(); }");
+#endif
+ }
+}
+
+void tst_QScriptEngine::translation_data()
+{
+ QTest::addColumn<QString>("text");
+ QTest::newRow("no translation") << "\"hello world\"";
+ QTest::newRow("qsTr") << "qsTr(\"hello world\")";
+ QTest::newRow("qsTranslate") << "qsTranslate(\"\", \"hello world\")";
+}
+
+void tst_QScriptEngine::translation()
+{
+ QFETCH(QString, text);
+ QScriptEngine engine;
+ engine.installTranslatorFunctions();
+
+ QBENCHMARK {
+ (void)engine.evaluate(text);
+ }
+}
+
+QTEST_MAIN(tst_QScriptEngine)
+#include "tst_qscriptengine.moc"
diff --git a/tests/benchmarks/script/qscriptvalue/qscriptvalue.pro b/tests/benchmarks/script/qscriptvalue/qscriptvalue.pro
new file mode 100644
index 0000000..04ea324
--- /dev/null
+++ b/tests/benchmarks/script/qscriptvalue/qscriptvalue.pro
@@ -0,0 +1,7 @@
+load(qttest_p4)
+TEMPLATE = app
+TARGET = tst_qscriptvalue
+
+SOURCES += tst_qscriptvalue.cpp
+
+QT += script
diff --git a/tests/benchmarks/script/qscriptvalue/tst_qscriptvalue.cpp b/tests/benchmarks/script/qscriptvalue/tst_qscriptvalue.cpp
new file mode 100644
index 0000000..3bfc21c
--- /dev/null
+++ b/tests/benchmarks/script/qscriptvalue/tst_qscriptvalue.cpp
@@ -0,0 +1,205 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtest.h>
+#include <QtScript>
+
+//TESTED_FILES=
+
+class tst_QScriptValue : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_QScriptValue();
+ virtual ~tst_QScriptValue();
+
+public slots:
+ void init();
+ void cleanup();
+
+private slots:
+ void numberConstructor();
+ void stringConstructor();
+ void call_data();
+ void call();
+ void construct_data();
+ void construct();
+ void toString_data();
+ void toString();
+ void toQObject();
+ void property();
+ void setProperty();
+ void propertyFlags();
+};
+
+tst_QScriptValue::tst_QScriptValue()
+{
+}
+
+tst_QScriptValue::~tst_QScriptValue()
+{
+}
+
+void tst_QScriptValue::init()
+{
+}
+
+void tst_QScriptValue::cleanup()
+{
+}
+
+void tst_QScriptValue::numberConstructor()
+{
+ QBENCHMARK {
+ (void)QScriptValue(123);
+ }
+}
+
+void tst_QScriptValue::stringConstructor()
+{
+ QString str = QString::fromLatin1("ciao");
+ QBENCHMARK {
+ (void)QScriptValue(str);
+ }
+}
+
+void tst_QScriptValue::call_data()
+{
+ QTest::addColumn<QString>("code");
+ QTest::newRow("empty function") << QString::fromLatin1("(function(){})");
+ QTest::newRow("function returning number") << QString::fromLatin1("(function(){ return 123; })");
+ QTest::newRow("closure") << QString::fromLatin1("(function(a, b){ return function() { return a + b; }; })(1, 2)");
+}
+
+void tst_QScriptValue::call()
+{
+ QFETCH(QString, code);
+ QScriptEngine engine;
+ QScriptValue fun = engine.evaluate(code);
+ QVERIFY(fun.isFunction());
+ QBENCHMARK {
+ (void)fun.call();
+ }
+}
+
+void tst_QScriptValue::construct_data()
+{
+ QTest::addColumn<QString>("code");
+ QTest::newRow("empty function") << QString::fromLatin1("(function(){})");
+ QTest::newRow("simple constructor") << QString::fromLatin1("(function(){ this.x = 10; this.y = 20; })");
+}
+
+void tst_QScriptValue::construct()
+{
+ QFETCH(QString, code);
+ QScriptEngine engine;
+ QScriptValue fun = engine.evaluate(code);
+ QVERIFY(fun.isFunction());
+ QBENCHMARK {
+ (void)fun.construct();
+ }
+}
+
+void tst_QScriptValue::toString_data()
+{
+ QTest::addColumn<QString>("code");
+ QTest::newRow("number") << QString::fromLatin1("123");
+ QTest::newRow("string") << QString::fromLatin1("'ciao'");
+ QTest::newRow("null") << QString::fromLatin1("null");
+ QTest::newRow("undefined") << QString::fromLatin1("undefined");
+ QTest::newRow("function") << QString::fromLatin1("(function foo(a, b, c) { return a + b + c; })");
+}
+
+void tst_QScriptValue::toString()
+{
+ QFETCH(QString, code);
+ QScriptEngine engine;
+ QScriptValue val = engine.evaluate(code);
+ QBENCHMARK {
+ (void)val.toString();
+ }
+}
+
+void tst_QScriptValue::toQObject()
+{
+ QScriptEngine engine;
+ QScriptValue obj = engine.newQObject(QCoreApplication::instance());
+ QBENCHMARK {
+ (void)obj.toQObject();
+ }
+}
+
+void tst_QScriptValue::property()
+{
+ QScriptEngine engine;
+ QScriptValue obj = engine.newObject();
+ QString propertyName = QString::fromLatin1("foo");
+ obj.setProperty(propertyName, 123);
+ QBENCHMARK {
+ (void)obj.property(propertyName);
+ }
+}
+
+void tst_QScriptValue::setProperty()
+{
+ QScriptEngine engine;
+ QScriptValue obj = engine.newObject();
+ QString propertyName = QString::fromLatin1("foo");
+ QScriptValue val(123);
+ QBENCHMARK {
+ obj.setProperty(propertyName, val);
+ }
+}
+
+void tst_QScriptValue::propertyFlags()
+{
+ QScriptEngine engine;
+ QScriptValue obj = engine.newObject();
+ QString propertyName = QString::fromLatin1("foo");
+ obj.setProperty(propertyName, 123, QScriptValue::SkipInEnumeration | QScriptValue::ReadOnly);
+ QBENCHMARK {
+ (void)obj.propertyFlags(propertyName);
+ }
+}
+
+QTEST_MAIN(tst_QScriptValue)
+#include "tst_qscriptvalue.moc"
diff --git a/tests/benchmarks/script/script.pro b/tests/benchmarks/script/script.pro
new file mode 100644
index 0000000..8d689b6
--- /dev/null
+++ b/tests/benchmarks/script/script.pro
@@ -0,0 +1,5 @@
+TEMPLATE = subdirs
+SUBDIRS = \
+ qscriptclass \
+ qscriptengine \
+ qscriptvalue