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


Ignore:
Timestamp:
Mar 22, 2010, 7:37:53 AM (15 years ago)
Author:
[email protected]
Message:

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

Reviewed by Kenneth Rohde Christiansen.

Add support for syntax checking in the QtScript API.

New class was created; the QScriptSyntaxCheckResult which main
responsibility is to provide results of the ECMA Script code
syntax check. The class is not fully functional as the JSC C API
doesn't expose an error column number, but it is a good start point
for a future development.

[Qt] QtScript functionality should be extended by syntax checking.
https://bugs.webkit.org/show_bug.cgi?id=36123

  • qt/api/QtScript.pro:
  • qt/api/qscriptengine.cpp: (QScriptEngine::checkSyntax):
  • qt/api/qscriptengine.h:
  • qt/api/qscriptengine_p.cpp: (QScriptEnginePrivate::checkSyntax):
  • qt/api/qscriptengine_p.h:
  • qt/api/qscriptsyntaxcheckresult.cpp: Added. (QScriptSyntaxCheckResult::QScriptSyntaxCheckResult): (QScriptSyntaxCheckResult::~QScriptSyntaxCheckResult): (QScriptSyntaxCheckResult::operator=): (QScriptSyntaxCheckResult::state): (QScriptSyntaxCheckResult::errorLineNumber): (QScriptSyntaxCheckResult::errorColumnNumber): (QScriptSyntaxCheckResult::errorMessage):
  • qt/api/qscriptsyntaxcheckresult.h: Added.
  • qt/api/qscriptsyntaxcheckresult_p.cpp: Added. (QScriptSyntaxCheckResultPrivate::~QScriptSyntaxCheckResultPrivate): (QScriptSyntaxCheckResultPrivate::errorMessage): (QScriptSyntaxCheckResultPrivate::errorLineNumber):
  • qt/api/qscriptsyntaxcheckresult_p.h: Added. (QScriptSyntaxCheckResultPrivate::get): (QScriptSyntaxCheckResultPrivate::QScriptSyntaxCheckResultPrivate): (QScriptSyntaxCheckResultPrivate::state): (QScriptSyntaxCheckResultPrivate::errorColumnNumber):
  • qt/tests/qscriptengine/tst_qscriptengine.cpp: (tst_QScriptEngine::checkSyntax_data): (tst_QScriptEngine::checkSyntax):
File:
1 edited

Legend:

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

    r56320 r56333  
    2020#include "qscriptengine.h"
    2121#include "qscriptprogram.h"
     22#include "qscriptsyntaxcheckresult.h"
    2223#include "qscriptvalue.h"
    2324#include <QtTest/qtest.h>
     
    4041    void undefinedValue();
    4142    void evaluateProgram();
     43    void checkSyntax_data();
     44    void checkSyntax();
    4245};
    4346
     
    176179}
    177180
     181void tst_QScriptEngine::checkSyntax_data()
     182{
     183    QTest::addColumn<QString>("code");
     184    QTest::addColumn<int>("expectedState");
     185    QTest::addColumn<int>("errorLineNumber");
     186    QTest::addColumn<int>("errorColumnNumber");
     187    QTest::addColumn<QString>("errorMessage");
     188
     189    QTest::newRow("0")
     190        << QString("0") << int(QScriptSyntaxCheckResult::Valid)
     191        << -1 << -1 << "";
     192    QTest::newRow("if (")
     193        << QString("if (\n") << int(QScriptSyntaxCheckResult::Intermediate)
     194        << 1 << 4 << "";
     195    QTest::newRow("if else")
     196        << QString("\nif else") << int(QScriptSyntaxCheckResult::Error)
     197        << 2 << 4 << "SyntaxError: Parse error";
     198    QTest::newRow("{if}")
     199            << QString("{\n{\nif\n}\n") << int(QScriptSyntaxCheckResult::Error)
     200        << 4 << 1 << "SyntaxError: Parse error";
     201    QTest::newRow("foo[")
     202        << QString("foo[") << int(QScriptSyntaxCheckResult::Error)
     203        << 1 << 4 << "SyntaxError: Parse error";
     204    QTest::newRow("foo['bar']")
     205        << QString("foo['bar']") << int(QScriptSyntaxCheckResult::Valid)
     206        << -1 << -1 << "";
     207
     208    QTest::newRow("/*")
     209        << QString("/*") << int(QScriptSyntaxCheckResult::Intermediate)
     210        << 1 << 1 << "Unclosed comment at end of file";
     211    QTest::newRow("/*\nMy comment")
     212        << QString("/*\nMy comment") << int(QScriptSyntaxCheckResult::Intermediate)
     213        << 1 << 1 << "Unclosed comment at end of file";
     214    QTest::newRow("/*\nMy comment */\nfoo = 10")
     215        << QString("/*\nMy comment */\nfoo = 10") << int(QScriptSyntaxCheckResult::Valid)
     216        << -1 << -1 << "";
     217    QTest::newRow("foo = 10 /*")
     218        << QString("foo = 10 /*") << int(QScriptSyntaxCheckResult::Intermediate)
     219        << -1 << -1 << "";
     220    QTest::newRow("foo = 10; /*")
     221        << QString("foo = 10; /*") << int(QScriptSyntaxCheckResult::Intermediate)
     222        << 1 << 11 << "Expected `end of file'";
     223    QTest::newRow("foo = 10 /* My comment */")
     224        << QString("foo = 10 /* My comment */") << int(QScriptSyntaxCheckResult::Valid)
     225        << -1 << -1 << "";
     226
     227    QTest::newRow("/=/")
     228        << QString("/=/") << int(QScriptSyntaxCheckResult::Valid) << -1 << -1 << "";
     229    QTest::newRow("/=/g")
     230        << QString("/=/g") << int(QScriptSyntaxCheckResult::Valid) << -1 << -1 << "";
     231    QTest::newRow("/a/")
     232        << QString("/a/") << int(QScriptSyntaxCheckResult::Valid) << -1 << -1 << "";
     233    QTest::newRow("/a/g")
     234        << QString("/a/g") << int(QScriptSyntaxCheckResult::Valid) << -1 << -1 << "";
     235}
     236
     237void tst_QScriptEngine::checkSyntax()
     238{
     239    QFETCH(QString, code);
     240    QFETCH(int, expectedState);
     241    QFETCH(int, errorLineNumber);
     242    QFETCH(int, errorColumnNumber);
     243    QFETCH(QString, errorMessage);
     244
     245    QScriptSyntaxCheckResult result = QScriptEngine::checkSyntax(code);
     246
     247    // assignment
     248    {
     249        QScriptSyntaxCheckResult copy = result;
     250        QCOMPARE(copy.state(), result.state());
     251        QCOMPARE(copy.errorLineNumber(), result.errorLineNumber());
     252        QCOMPARE(copy.errorColumnNumber(), result.errorColumnNumber());
     253        QCOMPARE(copy.errorMessage(), result.errorMessage());
     254    }
     255    {
     256        QScriptSyntaxCheckResult copy(result);
     257        QCOMPARE(copy.state(), result.state());
     258        QCOMPARE(copy.errorLineNumber(), result.errorLineNumber());
     259        QCOMPARE(copy.errorColumnNumber(), result.errorColumnNumber());
     260        QCOMPARE(copy.errorMessage(), result.errorMessage());
     261    }
     262
     263    if (expectedState == QScriptSyntaxCheckResult::Intermediate)
     264        QEXPECT_FAIL("", "QScriptSyntaxCheckResult::state() doesn't return the Intermediate state", Abort);
     265    QCOMPARE(result.state(), QScriptSyntaxCheckResult::State(expectedState));
     266    QCOMPARE(result.errorLineNumber(), errorLineNumber);
     267    if (expectedState != QScriptSyntaxCheckResult::Valid && errorColumnNumber != 1)
     268            QEXPECT_FAIL("", "QScriptSyntaxCheckResult::errorColumnNumber() doesn't return correct value", Continue);
     269    QCOMPARE(result.errorColumnNumber(), errorColumnNumber);
     270    QCOMPARE(result.errorMessage(), errorMessage);
     271}
     272
     273
    178274QTEST_MAIN(tst_QScriptEngine)
    179275#include "tst_qscriptengine.moc"
Note: See TracChangeset for help on using the changeset viewer.