Changeset 56320 in webkit for trunk/JavaScriptCore/qt/tests


Ignore:
Timestamp:
Mar 21, 2010, 3:30:22 PM (15 years ago)
Author:
[email protected]
Message:

2010-03-21 Jedrzej Nowacki <[email protected]>

Reviewed by Simon Hausmann.

New class; QScriptProgram.

The class should be used to evaluate the same script multiple times
more efficiently.

[Qt] QtScript should have QScriptProgram class
https://bugs.webkit.org/show_bug.cgi?id=36008

  • qt/api/QtScript.pro:
  • qt/api/qscriptengine.cpp: (QScriptEngine::evaluate):
  • qt/api/qscriptengine.h:
  • qt/api/qscriptengine_p.cpp: (QScriptEnginePrivate::evaluate):
  • qt/api/qscriptengine_p.h: (QScriptEnginePrivate::evaluate):
  • qt/api/qscriptprogram.cpp: Added. (QScriptProgram::QScriptProgram): (QScriptProgram::~QScriptProgram): (QScriptProgram::operator=): (QScriptProgram::isNull): (QScriptProgram::sourceCode): (QScriptProgram::fileName): (QScriptProgram::firstLineNumber): (QScriptProgram::operator==): (QScriptProgram::operator!=):
  • qt/api/qscriptprogram.h: Added.
  • qt/api/qscriptprogram_p.h: Added. (QScriptProgramPrivate::get): (QScriptProgramPrivate::QScriptProgramPrivate): (QScriptProgramPrivate::~QScriptProgramPrivate): (QScriptProgramPrivate::isNull): (QScriptProgramPrivate::sourceCode): (QScriptProgramPrivate::fileName): (QScriptProgramPrivate::firstLineNumber): (QScriptProgramPrivate::operator==): (QScriptProgramPrivate::operator!=): (QScriptProgramPrivate::program): (QScriptProgramPrivate::file): (QScriptProgramPrivate::line):
  • qt/tests/qscriptengine/tst_qscriptengine.cpp: (tst_QScriptEngine::evaluateProgram):
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/qt/tests/qscriptengine/tst_qscriptengine.cpp

    r54580 r56320  
    1919
    2020#include "qscriptengine.h"
     21#include "qscriptprogram.h"
    2122#include "qscriptvalue.h"
    2223#include <QtTest/qtest.h>
     
    3839    void nullValue();
    3940    void undefinedValue();
     41    void evaluateProgram();
    4042};
    4143
     
    7476}
    7577
     78void tst_QScriptEngine::evaluateProgram()
     79{
     80    QScriptEngine eng;
     81    {
     82        QString code("1 + 2");
     83        QString fileName("hello.js");
     84        int lineNumber = 123;
     85        QScriptProgram program(code, fileName, lineNumber);
     86        QVERIFY(!program.isNull());
     87        QCOMPARE(program.sourceCode(), code);
     88        QCOMPARE(program.fileName(), fileName);
     89        QCOMPARE(program.firstLineNumber(), lineNumber);
     90
     91        QScriptValue expected = eng.evaluate(code);
     92        for (int x = 0; x < 10; ++x) {
     93            QScriptValue ret = eng.evaluate(program);
     94            QVERIFY(ret.equals(expected));
     95        }
     96
     97        // operator=
     98        QScriptProgram sameProgram = program;
     99        QVERIFY(sameProgram == program);
     100        QVERIFY(eng.evaluate(sameProgram).equals(expected));
     101
     102        // copy constructor
     103        QScriptProgram sameProgram2(program);
     104        QVERIFY(sameProgram2 == program);
     105        QVERIFY(eng.evaluate(sameProgram2).equals(expected));
     106
     107        QScriptProgram differentProgram("2 + 3");
     108        QVERIFY(differentProgram != program);
     109        QVERIFY(!eng.evaluate(differentProgram).equals(expected));
     110    }
     111
     112    // Program that accesses variable in the scope
     113    {
     114        QScriptProgram program("a");
     115        QVERIFY(!program.isNull());
     116        {
     117            QScriptValue ret = eng.evaluate(program);
     118            QVERIFY(ret.isError());
     119            QCOMPARE(ret.toString(), QString::fromLatin1("ReferenceError: Can't find variable: a"));
     120        }
     121        {
     122            QScriptValue ret = eng.evaluate(program);
     123            QVERIFY(ret.isError());
     124        }
     125        eng.evaluate("a = 456");
     126        {
     127            QScriptValue ret = eng.evaluate(program);
     128            QVERIFY(!ret.isError());
     129            QCOMPARE(ret.toNumber(), 456.0);
     130        }
     131    }
     132
     133    // Program that creates closure
     134    {
     135        QScriptProgram program("(function() { var count = 0; return function() { return count++; }; })");
     136        QVERIFY(!program.isNull());
     137        QScriptValue createCounter = eng.evaluate(program);
     138        QVERIFY(createCounter.isFunction());
     139        QScriptValue counter = createCounter.call();
     140        QVERIFY(counter.isFunction());
     141        {
     142            QScriptValue ret = counter.call();
     143            QVERIFY(ret.isNumber());
     144        }
     145        QScriptValue counter2 = createCounter.call();
     146        QVERIFY(counter2.isFunction());
     147        QVERIFY(!counter2.equals(counter));
     148        {
     149            QScriptValue ret = counter2.call();
     150            QVERIFY(ret.isNumber());
     151        }
     152    }
     153
     154    // Same program run in different engines
     155    {
     156        QString code("1 + 2");
     157        QScriptProgram program(code);
     158        QVERIFY(!program.isNull());
     159        double expected = eng.evaluate(program).toNumber();
     160        for (int x = 0; x < 2; ++x) {
     161            QScriptEngine eng2;
     162            for (int y = 0; y < 2; ++y) {
     163                double ret = eng2.evaluate(program).toNumber();
     164                QCOMPARE(ret, expected);
     165            }
     166        }
     167    }
     168
     169    // No program
     170    {
     171        QScriptProgram program;
     172        QVERIFY(program.isNull());
     173        QScriptValue ret = eng.evaluate(program);
     174        QVERIFY(!ret.isValid());
     175    }
     176}
     177
    76178QTEST_MAIN(tst_QScriptEngine)
    77179#include "tst_qscriptengine.moc"
Note: See TracChangeset for help on using the changeset viewer.