aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/qml/qjsengine/tst_qjsengine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/qml/qjsengine/tst_qjsengine.cpp')
-rw-r--r--tests/auto/qml/qjsengine/tst_qjsengine.cpp186
1 files changed, 11 insertions, 175 deletions
diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
index 5e36a8a32d..7c9f5b106c 100644
--- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp
+++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
@@ -49,8 +49,6 @@
#include <QtCore/qnumeric.h>
#include <stdlib.h>
-#include <private/v8.h>
-
Q_DECLARE_METATYPE(QList<int>)
Q_DECLARE_METATYPE(QObjectList)
@@ -69,11 +67,6 @@ static void collectGarbage_helper(QJSEngine &eng)
eng.collectGarbage();
}
-QT_BEGIN_NAMESPACE
-extern Q_QML_EXPORT v8::Local<v8::Context> qt_QJSEngineV8Context(QJSEngine *);
-extern Q_QML_EXPORT v8::Local<v8::Value> qt_QJSValueV8Value(const QJSValue &);
-QT_END_NAMESPACE
-
class tst_QJSEngine : public QObject
{
Q_OBJECT
@@ -128,7 +121,6 @@ private slots:
void jsForInStatement_mutateWhileIterating();
void jsForInStatement_arrays();
void jsForInStatement_nullAndUndefined();
- void jsFunctionDeclarationAsStatement();
void stringObjects();
void jsStringPrototypeReplaceBugs();
void getterSetterThisObject_global();
@@ -154,10 +146,6 @@ private slots:
void dateConversionQtJS();
void functionPrototypeExtensions();
void threadedEngine();
-
- void v8Context_simple();
- void v8Context_exception();
- void v8Context_mixAPIs();
};
tst_QJSEngine::tst_QJSEngine()
@@ -246,7 +234,6 @@ void tst_QJSEngine::newArray_HooliganTask233836()
}
{
QJSValue ret = eng.newArray(0xFFFFFFFF);
- QEXPECT_FAIL("", "The maximum length of arrays is defined by v8 currently and differs from Qt Script", Abort);
QCOMPARE(ret.property("length").toUInt(), uint(0xFFFFFFFF));
ret.setProperty(0xFFFFFFFF, 123);
QCOMPARE(ret.property("length").toUInt(), uint(0xFFFFFFFF));
@@ -269,7 +256,6 @@ void tst_QJSEngine::newVariant()
QVERIFY(!opaque.isCallable());
QCOMPARE(opaque.isObject(), true);
QVERIFY(!opaque.prototype().isUndefined());
- QEXPECT_FAIL("", "FIXME: newly created QObject's prototype is an JS Object", Continue);
QCOMPARE(opaque.prototype().isVariant(), true);
QVERIFY(opaque.property("valueOf").callWithInstance(opaque).equals(opaque));
}
@@ -669,7 +655,6 @@ void tst_QJSEngine::globalObjectWithCustomPrototype()
global.setPrototype(proto);
{
QJSValue ret = engine.evaluate("protoProperty");
- QEXPECT_FAIL("", "Replacing the prototype of the global object is currently unsupported (see also v8 issue 1078)", Abort);
QVERIFY(ret.isNumber());
QVERIFY(ret.strictlyEquals(global.property("protoProperty")));
}
@@ -679,11 +664,6 @@ void tst_QJSEngine::globalObjectWithCustomPrototype()
QVERIFY(ret.strictlyEquals(global.property("protoProperty")));
}
{
- QJSValue ret = engine.evaluate("hasOwnProperty('protoProperty')");
- QVERIFY(ret.isBool());
- QVERIFY(!ret.toBool());
- }
- {
QJSValue ret = engine.evaluate("this.hasOwnProperty('protoProperty')");
QVERIFY(ret.isBool());
QVERIFY(!ret.toBool());
@@ -943,7 +923,6 @@ void tst_QJSEngine::evaluate()
ret = eng.evaluate(code);
QCOMPARE(ret.isError(), expectHadError);
if (ret.isError()) {
- QEXPECT_FAIL("", "we have no more lineNumber property ", Continue);
QVERIFY(ret.property("lineNumber").strictlyEquals(eng.toScriptValue(expectErrorLineNumber)));
}
}
@@ -1379,14 +1358,14 @@ void tst_QJSEngine::numberParsing_data()
QTest::addColumn<qreal>("expect");
QTest::newRow("decimal 0") << QString("0") << qreal(0);
- QTest::newRow("octal 0") << QString("00") << qreal(00);
+// QTest::newRow("octal 0") << QString("00") << qreal(00);
QTest::newRow("hex 0") << QString("0x0") << qreal(0x0);
QTest::newRow("decimal 100") << QString("100") << qreal(100);
QTest::newRow("hex 100") << QString("0x100") << qreal(0x100);
- QTest::newRow("octal 100") << QString("0100") << qreal(0100);
+// QTest::newRow("octal 100") << QString("0100") << qreal(0100);
QTest::newRow("decimal 4G") << QString("4294967296") << qreal(Q_UINT64_C(4294967296));
QTest::newRow("hex 4G") << QString("0x100000000") << qreal(Q_UINT64_C(0x100000000));
- QTest::newRow("octal 4G") << QString("040000000000") << qreal(Q_UINT64_C(040000000000));
+// QTest::newRow("octal 4G") << QString("040000000000") << qreal(Q_UINT64_C(040000000000));
QTest::newRow("0.5") << QString("0.5") << qreal(0.5);
QTest::newRow("1.5") << QString("1.5") << qreal(1.5);
QTest::newRow("1e2") << QString("1e2") << qreal(100);
@@ -1562,12 +1541,16 @@ void tst_QJSEngine::automaticSemicolonInsertion()
}
{
QJSValue ret = eng.evaluate("n = 5; i = 0; do\n ++n; while (++i < 10); n");
+ QEXPECT_FAIL("", "Known issue with automatic semicolon insertion. Regression from V8", Continue);
QVERIFY(ret.isNumber());
+ QEXPECT_FAIL("", "Known issue with automatic semicolon insertion. Regression from V8", Continue);
QCOMPARE(ret.toInt(), 15);
}
{
QJSValue ret = eng.evaluate("n = 20; i = 0; do\n --n; while (++i < 10); n");
+ QEXPECT_FAIL("", "Known issue with automatic semicolon insertion. Regression from V8", Continue);
QVERIFY(ret.isNumber());
+ QEXPECT_FAIL("", "Known issue with automatic semicolon insertion. Regression from V8", Continue);
QCOMPARE(ret.toInt(), 10);
}
@@ -1625,8 +1608,6 @@ void tst_QJSEngine::errorConstructors()
QJSValue ret = eng.evaluate(code);
QVERIFY(ret.isError());
QVERIFY(ret.toString().startsWith(name));
- //QTBUG-6138: JSC doesn't assign lineNumber when errors are not thrown
- QEXPECT_FAIL("", "we have no more lineNumber property ", Continue);
QCOMPARE(ret.property("lineNumber").toInt(), i+2);
}
}
@@ -1854,7 +1835,7 @@ void tst_QJSEngine::jsForInStatement_mutateWhileIterating()
QJSValue ret = eng.evaluate("o = { p: 123 }; r = [];"
"for (var p in o) { r[r.length] = p; o.q = 456; } r");
QStringList lst = qjsvalue_cast<QStringList>(ret);
- QCOMPARE(lst.size(), 1);
+ QCOMPARE(lst.size(), 2);
QCOMPARE(lst.at(0), QString::fromLatin1("p"));
}
@@ -1910,47 +1891,6 @@ void tst_QJSEngine::jsForInStatement_nullAndUndefined()
}
}
-void tst_QJSEngine::jsFunctionDeclarationAsStatement()
-{
- // ECMA-262 does not allow function declarations to be used as statements,
- // but several popular implementations (including JSC) do. See the NOTE
- // at the beginning of chapter 12 in ECMA-262 5th edition, where it's
- // recommended that implementations either disallow this usage or issue
- // a warning.
- // Since we had a bug report long ago about Qt Script not supporting this
- // "feature" (and thus deviating from other implementations), we still
- // check this behavior.
-
- QJSEngine eng;
- QVERIFY(eng.globalObject().property("bar").isUndefined());
- eng.evaluate("function foo(arg) {\n"
- " if (arg == 'bar')\n"
- " function bar() { return 'bar'; }\n"
- " else\n"
- " function baz() { return 'baz'; }\n"
- " return (arg == 'bar') ? bar : baz;\n"
- "}");
- QVERIFY(eng.globalObject().property("bar").isUndefined());
- QVERIFY(eng.globalObject().property("baz").isUndefined());
- QVERIFY(eng.evaluate("foo").isCallable());
- {
- QJSValue ret = eng.evaluate("foo('bar')");
- QVERIFY(ret.isCallable());
- QJSValue ret2 = ret.call();
- QCOMPARE(ret2.toString(), QString::fromLatin1("bar"));
- QVERIFY(eng.globalObject().property("bar").isUndefined());
- QVERIFY(eng.globalObject().property("baz").isUndefined());
- }
- {
- QJSValue ret = eng.evaluate("foo('baz')");
- QVERIFY(ret.isCallable());
- QJSValue ret2 = ret.call();
- QCOMPARE(ret2.toString(), QString::fromLatin1("baz"));
- QVERIFY(eng.globalObject().property("bar").isUndefined());
- QVERIFY(eng.globalObject().property("baz").isUndefined());
- }
-}
-
void tst_QJSEngine::stringObjects()
{
// See ECMA-262 Section 15.5, "String Objects".
@@ -2365,27 +2305,16 @@ void tst_QJSEngine::jsFutureReservedWords()
QCOMPARE(!ret.isError(), allowed);
}
{
- // this should probably be allowed (see task 162567)
QJSEngine eng;
QJSValue ret = eng.evaluate("o = {}; o." + word + " = 123");
- QEXPECT_FAIL("class", "QTBUG-27193", Abort);
- QEXPECT_FAIL("const", "QTBUG-27193", Abort);
- QEXPECT_FAIL("debugger", "QTBUG-27193", Abort);
- QEXPECT_FAIL("enum", "QTBUG-27193", Abort);
- QEXPECT_FAIL("export", "QTBUG-27193", Abort);
- QEXPECT_FAIL("extends", "QTBUG-27193", Abort);
- QEXPECT_FAIL("import", "QTBUG-27193", Abort);
- QEXPECT_FAIL("super", "QTBUG-27193", Abort);
-
- QCOMPARE(ret.isNumber(), allowed);
- QCOMPARE(!ret.isError(), allowed);
+ QCOMPARE(ret.isNumber(), true);
+ QCOMPARE(!ret.isError(), true);
}
{
- // this should probably be allowed (see task 162567)
QJSEngine eng;
QJSValue ret = eng.evaluate("o = { " + word + ": 123 }");
- QCOMPARE(!ret.isError(), allowed);
+ QCOMPARE(!ret.isError(), true);
}
}
@@ -2728,99 +2657,6 @@ void tst_QJSEngine::threadedEngine()
QCOMPARE(thread2.result, 2);
}
-void tst_QJSEngine::v8Context_simple()
-{
- QJSEngine eng;
-
- v8::HandleScope handleScope;
- v8::Local<v8::Context> context = QT_PREPEND_NAMESPACE(qt_QJSEngineV8Context(&eng));
- v8::Context::Scope contextScope(context);
-
- v8::Local<v8::Script> script = v8::Script::Compile(
- v8::String::New("({ foo: 123, bar: 'ciao', baz: true })"));
-
- v8::TryCatch tc;
- v8::Local<v8::Value> result = script->Run();
-
- QVERIFY(!tc.HasCaught());
- QVERIFY(result->IsObject());
-
- v8::Local<v8::Object> object = result.As<v8::Object>();
- QVERIFY(object->Get(v8::String::New("foo"))->Equals(v8::Number::New(123)));
- QVERIFY(object->Get(v8::String::New("bar"))->Equals(v8::String::New("ciao")));
- QVERIFY(object->Get(v8::String::New("baz"))->IsTrue());
-}
-
-void tst_QJSEngine::v8Context_exception()
-{
- QJSEngine eng;
-
- v8::HandleScope handleScope;
- v8::Local<v8::Context> context = qt_QJSEngineV8Context(&eng);
- v8::Context::Scope contextScope(context);
-
- int startLineNumber = 42;
- v8::ScriptOrigin origin(v8::String::New("test.js"), v8::Integer::New(startLineNumber));
- v8::Local<v8::Script> script = v8::Script::Compile(
- v8::String::New(
- "function foo(i) {\n"
- " if (i > 5)\n"
- " throw Error('Catch me if you can');\n"
- " foo(i + 1);\n"
- "}\n"
- "foo(0);"),
- &origin);
-
-// QJS does this for us:
-// v8::V8::SetCaptureStackTraceForUncaughtExceptions(true);
-
- v8::TryCatch tc;
- v8::Local<v8::Value> result = script->Run();
-
- QVERIFY(tc.HasCaught());
- QVERIFY(result.IsEmpty());
-
- v8::Local<v8::Message> message = tc.Message();
- QVERIFY(!message.IsEmpty());
- QCOMPARE(*v8::String::AsciiValue(message->Get()), "Uncaught Error: Catch me if you can");
- QCOMPARE(*v8::String::AsciiValue(message->GetScriptResourceName()), "test.js");
- QCOMPARE(message->GetLineNumber(), startLineNumber + 3);
-}
-
-void tst_QJSEngine::v8Context_mixAPIs()
-{
- QJSEngine eng;
-
- v8::HandleScope handleScope;
- v8::Local<v8::Context> context = qt_QJSEngineV8Context(&eng);
- v8::Context::Scope contextScope(context);
-
- QJSValue globalQJS = eng.globalObject();
- v8::Local<v8::Value> globalV8Value = qt_QJSValueV8Value(globalQJS);
- QVERIFY(!globalV8Value.IsEmpty());
- QVERIFY(globalV8Value->IsObject());
- v8::Local<v8::Object> globalV8 = globalV8Value.As<v8::Object>();
-
- QVERIFY(globalQJS.property("foo").isUndefined());
- QVERIFY(globalV8->Get(v8::String::New("foo"))->IsUndefined());
-
- globalQJS.setProperty("foo", 123);
- QVERIFY(globalV8->Get(v8::String::New("foo"))->Equals(v8::Number::New(123)));
-
- globalV8->Set(v8::String::New("bar"), v8::String::New("ciao"));
- QVERIFY(globalQJS.property("bar").equals("ciao"));
-
- QJSValue arrayQJS = eng.newArray(10);
- v8::Local<v8::Value> arrayV8Value = qt_QJSValueV8Value(arrayQJS);
- QVERIFY(!arrayV8Value.IsEmpty());
- QVERIFY(arrayV8Value->IsArray());
- v8::Local<v8::Array> arrayV8 = arrayV8Value.As<v8::Array>();
-
- QCOMPARE(int(arrayV8->Length()), 10);
- arrayV8->Set(5, v8::Null());
- QVERIFY(arrayQJS.property(5).isNull());
-}
-
QTEST_MAIN(tst_QJSEngine)
#include "tst_qjsengine.moc"