diff options
Diffstat (limited to 'JavaScriptCore/qt/tests')
10 files changed, 1444 insertions, 22 deletions
diff --git a/JavaScriptCore/qt/tests/qscriptengine/qscriptengine.pro b/JavaScriptCore/qt/tests/qscriptengine/qscriptengine.pro index 0dc0902..d521dd8 100644 --- a/JavaScriptCore/qt/tests/qscriptengine/qscriptengine.pro +++ b/JavaScriptCore/qt/tests/qscriptengine/qscriptengine.pro @@ -1,6 +1,7 @@ TEMPLATE = app TARGET = tst_qscriptengine QT += testlib +isEmpty(OUTPUT_DIR): OUTPUT_DIR = ../../../.. include(../tests.pri) SOURCES += tst_qscriptengine.cpp diff --git a/JavaScriptCore/qt/tests/qscriptengine/tst_qscriptengine.cpp b/JavaScriptCore/qt/tests/qscriptengine/tst_qscriptengine.cpp index b36e364..1ec9ad3 100644 --- a/JavaScriptCore/qt/tests/qscriptengine/tst_qscriptengine.cpp +++ b/JavaScriptCore/qt/tests/qscriptengine/tst_qscriptengine.cpp @@ -18,6 +18,8 @@ */ #include "qscriptengine.h" +#include "qscriptprogram.h" +#include "qscriptsyntaxcheckresult.h" #include "qscriptvalue.h" #include <QtTest/qtest.h> @@ -33,10 +35,15 @@ public slots: void cleanup() {} private slots: + void globalObject(); void evaluate(); void collectGarbage(); + void reportAdditionalMemoryCost(); void nullValue(); void undefinedValue(); + void evaluateProgram(); + void checkSyntax_data(); + void checkSyntax(); }; /* Evaluating a script that throw an unhandled exception should return an invalid value. */ @@ -47,6 +54,17 @@ void tst_QScriptEngine::evaluate() QVERIFY2(engine.evaluate("ping").isValid(), "Script throwing an unhandled exception should return an exception value"); } +void tst_QScriptEngine::globalObject() +{ + QScriptEngine engine; + QScriptValue global = engine.globalObject(); + QScriptValue self = engine.evaluate("this"); + QVERIFY(global.isObject()); + QVERIFY(engine.globalObject().equals(engine.evaluate("this"))); + QEXPECT_FAIL("", "strictlyEquals is broken - bug 36600 in bugs.webkit.org", Continue); + QVERIFY(engine.globalObject().strictlyEquals(self)); +} + /* Test garbage collection, at least try to not crash. */ void tst_QScriptEngine::collectGarbage() { @@ -57,6 +75,26 @@ void tst_QScriptEngine::collectGarbage() QCOMPARE(foo.call().toString(), QString::fromAscii("pong")); } +void tst_QScriptEngine::reportAdditionalMemoryCost() +{ + // There isn't any easy way to test the responsiveness of the GC; + // just try to call the function a few times with various sizes. + QScriptEngine eng; + for (int i = 0; i < 100; ++i) { + eng.reportAdditionalMemoryCost(0); + eng.reportAdditionalMemoryCost(10); + eng.reportAdditionalMemoryCost(1000); + eng.reportAdditionalMemoryCost(10000); + eng.reportAdditionalMemoryCost(100000); + eng.reportAdditionalMemoryCost(1000000); + eng.reportAdditionalMemoryCost(10000000); + eng.reportAdditionalMemoryCost(-1); + eng.reportAdditionalMemoryCost(-1000); + QScriptValue obj = eng.evaluate("new Object"); + eng.collectGarbage(); + } +} + void tst_QScriptEngine::nullValue() { QScriptEngine engine; @@ -73,5 +111,198 @@ void tst_QScriptEngine::undefinedValue() QVERIFY(value.isUndefined()); } +void tst_QScriptEngine::evaluateProgram() +{ + QScriptEngine eng; + { + QString code("1 + 2"); + QString fileName("hello.js"); + int lineNumber = 123; + QScriptProgram program(code, fileName, lineNumber); + QVERIFY(!program.isNull()); + QCOMPARE(program.sourceCode(), code); + QCOMPARE(program.fileName(), fileName); + QCOMPARE(program.firstLineNumber(), lineNumber); + + QScriptValue expected = eng.evaluate(code); + for (int x = 0; x < 10; ++x) { + QScriptValue ret = eng.evaluate(program); + QVERIFY(ret.equals(expected)); + } + + // operator= + QScriptProgram sameProgram = program; + QVERIFY(sameProgram == program); + QVERIFY(eng.evaluate(sameProgram).equals(expected)); + + // copy constructor + QScriptProgram sameProgram2(program); + QVERIFY(sameProgram2 == program); + QVERIFY(eng.evaluate(sameProgram2).equals(expected)); + + QScriptProgram differentProgram("2 + 3"); + QVERIFY(differentProgram != program); + QVERIFY(!eng.evaluate(differentProgram).equals(expected)); + } + + // Program that accesses variable in the scope + { + QScriptProgram program("a"); + QVERIFY(!program.isNull()); + { + QScriptValue ret = eng.evaluate(program); + QVERIFY(ret.isError()); + QCOMPARE(ret.toString(), QString::fromLatin1("ReferenceError: Can't find variable: a")); + } + { + QScriptValue ret = eng.evaluate(program); + QVERIFY(ret.isError()); + } + eng.evaluate("a = 456"); + { + QScriptValue ret = eng.evaluate(program); + QVERIFY(!ret.isError()); + QCOMPARE(ret.toNumber(), 456.0); + } + } + + // Program that creates closure + { + 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(); + QVERIFY(counter.isFunction()); + { + QScriptValue ret = counter.call(); + QVERIFY(ret.isNumber()); + } + QScriptValue counter2 = createCounter.call(); + QVERIFY(counter2.isFunction()); + QVERIFY(!counter2.equals(counter)); + { + QScriptValue ret = counter2.call(); + 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()); + } +} + +void tst_QScriptEngine::checkSyntax_data() +{ + QTest::addColumn<QString>("code"); + QTest::addColumn<int>("expectedState"); + QTest::addColumn<int>("errorLineNumber"); + QTest::addColumn<int>("errorColumnNumber"); + QTest::addColumn<QString>("errorMessage"); + + QTest::newRow("0") + << QString("0") << int(QScriptSyntaxCheckResult::Valid) + << -1 << -1 << ""; + QTest::newRow("if (") + << QString("if (\n") << int(QScriptSyntaxCheckResult::Intermediate) + << 1 << 4 << ""; + QTest::newRow("if else") + << QString("\nif else") << int(QScriptSyntaxCheckResult::Error) + << 2 << 4 << "SyntaxError: Parse error"; + QTest::newRow("{if}") + << QString("{\n{\nif\n}\n") << int(QScriptSyntaxCheckResult::Error) + << 4 << 1 << "SyntaxError: Parse error"; + QTest::newRow("foo[") + << QString("foo[") << int(QScriptSyntaxCheckResult::Error) + << 1 << 4 << "SyntaxError: Parse error"; + QTest::newRow("foo['bar']") + << QString("foo['bar']") << int(QScriptSyntaxCheckResult::Valid) + << -1 << -1 << ""; + + QTest::newRow("/*") + << QString("/*") << int(QScriptSyntaxCheckResult::Intermediate) + << 1 << 1 << "Unclosed comment at end of file"; + QTest::newRow("/*\nMy comment") + << QString("/*\nMy comment") << int(QScriptSyntaxCheckResult::Intermediate) + << 1 << 1 << "Unclosed comment at end of file"; + QTest::newRow("/*\nMy comment */\nfoo = 10") + << QString("/*\nMy comment */\nfoo = 10") << int(QScriptSyntaxCheckResult::Valid) + << -1 << -1 << ""; + QTest::newRow("foo = 10 /*") + << QString("foo = 10 /*") << int(QScriptSyntaxCheckResult::Intermediate) + << -1 << -1 << ""; + QTest::newRow("foo = 10; /*") + << QString("foo = 10; /*") << int(QScriptSyntaxCheckResult::Intermediate) + << 1 << 11 << "Expected `end of file'"; + QTest::newRow("foo = 10 /* My comment */") + << QString("foo = 10 /* My comment */") << int(QScriptSyntaxCheckResult::Valid) + << -1 << -1 << ""; + + QTest::newRow("/=/") + << QString("/=/") << int(QScriptSyntaxCheckResult::Valid) << -1 << -1 << ""; + QTest::newRow("/=/g") + << QString("/=/g") << int(QScriptSyntaxCheckResult::Valid) << -1 << -1 << ""; + QTest::newRow("/a/") + << QString("/a/") << int(QScriptSyntaxCheckResult::Valid) << -1 << -1 << ""; + QTest::newRow("/a/g") + << QString("/a/g") << int(QScriptSyntaxCheckResult::Valid) << -1 << -1 << ""; +} + +void tst_QScriptEngine::checkSyntax() +{ + QFETCH(QString, code); + QFETCH(int, expectedState); + QFETCH(int, errorLineNumber); + QFETCH(int, errorColumnNumber); + QFETCH(QString, errorMessage); + + QScriptSyntaxCheckResult result = QScriptEngine::checkSyntax(code); + + // assignment + { + QScriptSyntaxCheckResult copy = result; + QCOMPARE(copy.state(), result.state()); + QCOMPARE(copy.errorLineNumber(), result.errorLineNumber()); + QCOMPARE(copy.errorColumnNumber(), result.errorColumnNumber()); + QCOMPARE(copy.errorMessage(), result.errorMessage()); + } + { + QScriptSyntaxCheckResult copy(result); + QCOMPARE(copy.state(), result.state()); + QCOMPARE(copy.errorLineNumber(), result.errorLineNumber()); + QCOMPARE(copy.errorColumnNumber(), result.errorColumnNumber()); + QCOMPARE(copy.errorMessage(), result.errorMessage()); + } + + if (expectedState == QScriptSyntaxCheckResult::Intermediate) + QEXPECT_FAIL("", "QScriptSyntaxCheckResult::state() doesn't return the Intermediate state", Abort); + QCOMPARE(result.state(), QScriptSyntaxCheckResult::State(expectedState)); + QCOMPARE(result.errorLineNumber(), errorLineNumber); + if (expectedState != QScriptSyntaxCheckResult::Valid && errorColumnNumber != 1) + QEXPECT_FAIL("", "QScriptSyntaxCheckResult::errorColumnNumber() doesn't return correct value", Continue); + QCOMPARE(result.errorColumnNumber(), errorColumnNumber); + QCOMPARE(result.errorMessage(), errorMessage); +} + + QTEST_MAIN(tst_QScriptEngine) #include "tst_qscriptengine.moc" diff --git a/JavaScriptCore/qt/tests/qscriptstring/qscriptstring.pro b/JavaScriptCore/qt/tests/qscriptstring/qscriptstring.pro new file mode 100644 index 0000000..5ad9b7c --- /dev/null +++ b/JavaScriptCore/qt/tests/qscriptstring/qscriptstring.pro @@ -0,0 +1,7 @@ +TEMPLATE = app +TARGET = tst_qscriptstring +QT += testlib +include(../tests.pri) + +SOURCES += tst_qscriptstring.cpp + diff --git a/JavaScriptCore/qt/tests/qscriptstring/tst_qscriptstring.cpp b/JavaScriptCore/qt/tests/qscriptstring/tst_qscriptstring.cpp new file mode 100644 index 0000000..ff31835 --- /dev/null +++ b/JavaScriptCore/qt/tests/qscriptstring/tst_qscriptstring.cpp @@ -0,0 +1,175 @@ +/* + Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef tst_qscriptstring_h +#define tst_qscriptstring_h + +#include "qscriptengine.h" +#include "qscriptstring.h" +#include <QtCore/qhash.h> +#include <QtTest/QtTest> + +class tst_QScriptString : public QObject { + Q_OBJECT + +public: + tst_QScriptString(); + virtual ~tst_QScriptString(); + +private slots: + void test(); + void hash(); + void toArrayIndex_data(); + void toArrayIndex(); +}; + +tst_QScriptString::tst_QScriptString() +{ +} + +tst_QScriptString::~tst_QScriptString() +{ +} + +void tst_QScriptString::test() +{ + QScriptEngine eng; + { + QScriptString str; + QVERIFY(!str.isValid()); + QVERIFY(str == str); + QVERIFY(!(str != str)); + QVERIFY(str.toString().isNull()); + + QScriptString str1(str); + QVERIFY(!str1.isValid()); + + QScriptString str2 = str; + QVERIFY(!str2.isValid()); + + QCOMPARE(str.toArrayIndex(), quint32(0xffffffff)); + } + for (int x = 0; x < 2; ++x) { + QString ciao = QString::fromLatin1("ciao"); + QScriptString str = eng.toStringHandle(ciao); + QVERIFY(str.isValid()); + QVERIFY(str == str); + QVERIFY(!(str != str)); + QCOMPARE(str.toString(), ciao); + + QScriptString str1(str); + QCOMPARE(str, str1); + + QScriptString str2 = str; + QCOMPARE(str, str2); + + QScriptString str3 = eng.toStringHandle(ciao); + QVERIFY(str3.isValid()); + QCOMPARE(str, str3); + + eng.collectGarbage(); + + QVERIFY(str.isValid()); + QCOMPARE(str.toString(), ciao); + QVERIFY(str1.isValid()); + QCOMPARE(str1.toString(), ciao); + QVERIFY(str2.isValid()); + QCOMPARE(str2.toString(), ciao); + QVERIFY(str3.isValid()); + QCOMPARE(str3.toString(), ciao); + } + { + QScriptEngine* eng2 = new QScriptEngine; + QString one = QString::fromLatin1("one"); + QString two = QString::fromLatin1("two"); + QScriptString oneInterned = eng2->toStringHandle(one); + QCOMPARE(oneInterned.toString(), one); + QScriptString twoInterned = eng2->toStringHandle(two); + QCOMPARE(twoInterned.toString(), two); + QVERIFY(oneInterned != twoInterned); + QVERIFY(!(oneInterned == twoInterned)); + + delete eng2; + } +} + +void tst_QScriptString::hash() +{ + QScriptEngine engine; + QHash<QScriptString, int> stringToInt; + QScriptString foo = engine.toStringHandle("foo"); + + QScriptString bar = engine.toStringHandle("bar"); + QVERIFY(!stringToInt.contains(foo)); + for (int i = 0; i < 1000000; ++i) + stringToInt.insert(foo, 123); + QCOMPARE(stringToInt.value(foo), 123); + QVERIFY(!stringToInt.contains(bar)); + stringToInt.insert(bar, 456); + QCOMPARE(stringToInt.value(bar), 456); + QCOMPARE(stringToInt.value(foo), 123); +} + +void tst_QScriptString::toArrayIndex_data() +{ + QTest::addColumn<QString>("input"); + QTest::addColumn<bool>("expectSuccess"); + QTest::addColumn<quint32>("expectedIndex"); + QTest::newRow("foo") << QString::fromLatin1("foo") << false << quint32(0xffffffff); + QTest::newRow("empty") << QString::fromLatin1("") << false << quint32(0xffffffff); + QTest::newRow("0") << QString::fromLatin1("0") << true << quint32(0); + QTest::newRow("00") << QString::fromLatin1("00") << false << quint32(0xffffffff); + QTest::newRow("1") << QString::fromLatin1("1") << true << quint32(1); + QTest::newRow("123") << QString::fromLatin1("123") << true << quint32(123); + QTest::newRow("-1") << QString::fromLatin1("-1") << false << quint32(0xffffffff); + QTest::newRow("0a") << QString::fromLatin1("0a") << false << quint32(0xffffffff); + QTest::newRow("0x1") << QString::fromLatin1("0x1") << false << quint32(0xffffffff); + QTest::newRow("01") << QString::fromLatin1("01") << false << quint32(0xffffffff); + QTest::newRow("101a") << QString::fromLatin1("101a") << false << quint32(0xffffffff); + QTest::newRow("4294967294") << QString::fromLatin1("4294967294") << true << quint32(0xfffffffe); + QTest::newRow("4294967295") << QString::fromLatin1("4294967295") << false << quint32(0xffffffff); + QTest::newRow("11111111111") << QString::fromLatin1("11111111111") << false << quint32(0xffffffff); + QTest::newRow("0.0") << QString::fromLatin1("0.0") << false << quint32(0xffffffff); + QTest::newRow("1.0") << QString::fromLatin1("1.0") << false << quint32(0xffffffff); + QTest::newRow("1.5") << QString::fromLatin1("1.5") << false << quint32(0xffffffff); + QTest::newRow("1.") << QString::fromLatin1("1.") << false << quint32(0xffffffff); + QTest::newRow(".1") << QString::fromLatin1(".1") << false << quint32(0xffffffff); + QTest::newRow("1e0") << QString::fromLatin1("1e0") << false << quint32(0xffffffff); +} + +void tst_QScriptString::toArrayIndex() +{ + QFETCH(QString, input); + QFETCH(bool, expectSuccess); + QFETCH(quint32, expectedIndex); + QScriptEngine engine; + for (int x = 0; x < 2; ++x) { + bool isArrayIndex; + bool* ptr = (!x) ? &isArrayIndex : (bool*)0; + quint32 result = engine.toStringHandle(input).toArrayIndex(ptr); + if (!x) + QCOMPARE(isArrayIndex, expectSuccess); + QCOMPARE(result, expectedIndex); + } +} + +QTEST_MAIN(tst_QScriptString) +#include "tst_qscriptstring.moc" + +#endif // tst_qscriptstring_h diff --git a/JavaScriptCore/qt/tests/qscriptvalue/qscriptvalue.pro b/JavaScriptCore/qt/tests/qscriptvalue/qscriptvalue.pro index b12337f..35cc17d 100644 --- a/JavaScriptCore/qt/tests/qscriptvalue/qscriptvalue.pro +++ b/JavaScriptCore/qt/tests/qscriptvalue/qscriptvalue.pro @@ -1,6 +1,7 @@ TEMPLATE = app TARGET = tst_qscriptvalue QT += testlib +isEmpty(OUTPUT_DIR): OUTPUT_DIR = ../../../.. include(../tests.pri) SOURCES += \ diff --git a/JavaScriptCore/qt/tests/qscriptvalue/tst_qscriptvalue.cpp b/JavaScriptCore/qt/tests/qscriptvalue/tst_qscriptvalue.cpp index b44c5ca..82f0901 100644 --- a/JavaScriptCore/qt/tests/qscriptvalue/tst_qscriptvalue.cpp +++ b/JavaScriptCore/qt/tests/qscriptvalue/tst_qscriptvalue.cpp @@ -274,7 +274,7 @@ void tst_QScriptValue::ctor() QVERIFY(QScriptValue(0, QString("ciao")).isString()); } -void tst_QScriptValue::toString_data() +void tst_QScriptValue::toStringSimple_data() { QTest::addColumn<QString>("code"); QTest::addColumn<QString>("result"); @@ -289,7 +289,7 @@ void tst_QScriptValue::toString_data() } /* Test conversion to string from different JSC types */ -void tst_QScriptValue::toString() +void tst_QScriptValue::toStringSimple() { QFETCH(QString, code); QFETCH(QString, result); diff --git a/JavaScriptCore/qt/tests/qscriptvalue/tst_qscriptvalue.h b/JavaScriptCore/qt/tests/qscriptvalue/tst_qscriptvalue.h index 828ef96..28154a9 100644 --- a/JavaScriptCore/qt/tests/qscriptvalue/tst_qscriptvalue.h +++ b/JavaScriptCore/qt/tests/qscriptvalue/tst_qscriptvalue.h @@ -36,8 +36,8 @@ public: virtual ~tst_QScriptValue(); private slots: - void toString_data(); - void toString(); + void toStringSimple_data(); + void toStringSimple(); void copyConstructor_data(); void copyConstructor(); void assignOperator_data(); @@ -76,6 +76,9 @@ private slots: void isValid_data(); void isValid(); + void toString_data(); + void toString(); + void toNumber_data(); void toNumber(); @@ -85,6 +88,18 @@ private slots: void toBoolean_data(); void toBoolean(); + void toInteger_data(); + void toInteger(); + + void toInt32_data(); + void toInt32(); + + void toUInt32_data(); + void toUInt32(); + + void toUInt16_data(); + void toUInt16(); + private: typedef void (tst_QScriptValue::*InitDataFunction)(); typedef void (tst_QScriptValue::*DefineDataFunction)(const char*); @@ -134,6 +149,10 @@ private: void isValid_makeData(const char* expr); void isValid_test(const char* expr, const QScriptValue& value); + void toString_initData(); + void toString_makeData(const char*); + void toString_test(const char*, const QScriptValue&); + void toNumber_initData(); void toNumber_makeData(const char*); void toNumber_test(const char*, const QScriptValue&); @@ -146,6 +165,22 @@ private: void toBoolean_makeData(const char*); void toBoolean_test(const char*, const QScriptValue&); + void toInteger_initData(); + void toInteger_makeData(const char*); + void toInteger_test(const char*, const QScriptValue&); + + void toInt32_initData(); + void toInt32_makeData(const char*); + void toInt32_test(const char*, const QScriptValue&); + + void toUInt32_initData(); + void toUInt32_makeData(const char*); + void toUInt32_test(const char*, const QScriptValue&); + + void toUInt16_initData(); + void toUInt16_makeData(const char*); + void toUInt16_test(const char*, const QScriptValue&); + private: QScriptEngine* engine; QHash<QString, QScriptValue> m_values; diff --git a/JavaScriptCore/qt/tests/qscriptvalue/tst_qscriptvalue_generated.cpp b/JavaScriptCore/qt/tests/qscriptvalue/tst_qscriptvalue_generated.cpp index f9891a6..970c960 100644 --- a/JavaScriptCore/qt/tests/qscriptvalue/tst_qscriptvalue_generated.cpp +++ b/JavaScriptCore/qt/tests/qscriptvalue/tst_qscriptvalue_generated.cpp @@ -130,6 +130,35 @@ void tst_QScriptValue::initScriptValues() DEFINE_TEST_VALUE(engine->evaluate("new Object()")); DEFINE_TEST_VALUE(engine->evaluate("new Array()")); DEFINE_TEST_VALUE(engine->evaluate("new Error()")); + DEFINE_TEST_VALUE(engine->evaluate("a = new Object(); a.foo = 22; a.foo")); + DEFINE_TEST_VALUE(engine->evaluate("Undefined")); + DEFINE_TEST_VALUE(engine->evaluate("Null")); + DEFINE_TEST_VALUE(engine->evaluate("True")); + DEFINE_TEST_VALUE(engine->evaluate("False")); + DEFINE_TEST_VALUE(engine->evaluate("undefined")); + DEFINE_TEST_VALUE(engine->evaluate("null")); + DEFINE_TEST_VALUE(engine->evaluate("true")); + DEFINE_TEST_VALUE(engine->evaluate("false")); + DEFINE_TEST_VALUE(engine->evaluate("122")); + DEFINE_TEST_VALUE(engine->evaluate("124")); + DEFINE_TEST_VALUE(engine->evaluate("0")); + DEFINE_TEST_VALUE(engine->evaluate("0.0")); + DEFINE_TEST_VALUE(engine->evaluate("123.0")); + DEFINE_TEST_VALUE(engine->evaluate("6.37e-8")); + DEFINE_TEST_VALUE(engine->evaluate("-6.37e-8")); + DEFINE_TEST_VALUE(engine->evaluate("0x43211234")); + DEFINE_TEST_VALUE(engine->evaluate("0x10000")); + DEFINE_TEST_VALUE(engine->evaluate("0x10001")); + DEFINE_TEST_VALUE(engine->evaluate("NaN")); + DEFINE_TEST_VALUE(engine->evaluate("Infinity")); + DEFINE_TEST_VALUE(engine->evaluate("-Infinity")); + DEFINE_TEST_VALUE(engine->evaluate("'ciao'")); + DEFINE_TEST_VALUE(engine->evaluate("''")); + DEFINE_TEST_VALUE(engine->evaluate("'0'")); + DEFINE_TEST_VALUE(engine->evaluate("'123'")); + DEFINE_TEST_VALUE(engine->evaluate("'12.4'")); + DEFINE_TEST_VALUE(engine->nullValue()); + DEFINE_TEST_VALUE(engine->undefinedValue()); } @@ -244,7 +273,36 @@ void tst_QScriptValue::isValid_makeData(const char* expr) << "engine->evaluate(\"/foo/\")" << "engine->evaluate(\"new Object()\")" << "engine->evaluate(\"new Array()\")" - << "engine->evaluate(\"new Error()\")"; + << "engine->evaluate(\"new Error()\")" + << "engine->evaluate(\"a = new Object(); a.foo = 22; a.foo\")" + << "engine->evaluate(\"Undefined\")" + << "engine->evaluate(\"Null\")" + << "engine->evaluate(\"True\")" + << "engine->evaluate(\"False\")" + << "engine->evaluate(\"undefined\")" + << "engine->evaluate(\"null\")" + << "engine->evaluate(\"true\")" + << "engine->evaluate(\"false\")" + << "engine->evaluate(\"122\")" + << "engine->evaluate(\"124\")" + << "engine->evaluate(\"0\")" + << "engine->evaluate(\"0.0\")" + << "engine->evaluate(\"123.0\")" + << "engine->evaluate(\"6.37e-8\")" + << "engine->evaluate(\"-6.37e-8\")" + << "engine->evaluate(\"0x43211234\")" + << "engine->evaluate(\"0x10000\")" + << "engine->evaluate(\"0x10001\")" + << "engine->evaluate(\"NaN\")" + << "engine->evaluate(\"Infinity\")" + << "engine->evaluate(\"-Infinity\")" + << "engine->evaluate(\"'ciao'\")" + << "engine->evaluate(\"''\")" + << "engine->evaluate(\"'0'\")" + << "engine->evaluate(\"'123'\")" + << "engine->evaluate(\"'12.4'\")" + << "engine->nullValue()" + << "engine->undefinedValue()"; } newRow(expr) << isValid.contains(expr); } @@ -253,6 +311,7 @@ void tst_QScriptValue::isValid_test(const char*, const QScriptValue& value) { QFETCH(bool, expected); QCOMPARE(value.isValid(), expected); + QCOMPARE(value.isValid(), expected); } DEFINE_TEST_FUNCTION(isValid) @@ -273,7 +332,9 @@ void tst_QScriptValue::isBool_makeData(const char* expr) << "QScriptValue(0, true)" << "QScriptValue(0, false)" << "QScriptValue(engine, true)" - << "QScriptValue(engine, false)"; + << "QScriptValue(engine, false)" + << "engine->evaluate(\"true\")" + << "engine->evaluate(\"false\")"; } newRow(expr) << isBool.contains(expr); } @@ -282,6 +343,7 @@ void tst_QScriptValue::isBool_test(const char*, const QScriptValue& value) { QFETCH(bool, expected); QCOMPARE(value.isBool(), expected); + QCOMPARE(value.isBool(), expected); } DEFINE_TEST_FUNCTION(isBool) @@ -302,7 +364,9 @@ void tst_QScriptValue::isBoolean_makeData(const char* expr) << "QScriptValue(0, true)" << "QScriptValue(0, false)" << "QScriptValue(engine, true)" - << "QScriptValue(engine, false)"; + << "QScriptValue(engine, false)" + << "engine->evaluate(\"true\")" + << "engine->evaluate(\"false\")"; } newRow(expr) << isBoolean.contains(expr); } @@ -311,10 +375,12 @@ void tst_QScriptValue::isBoolean_test(const char*, const QScriptValue& value) { QFETCH(bool, expected); QCOMPARE(value.isBoolean(), expected); + QCOMPARE(value.isBoolean(), expected); } DEFINE_TEST_FUNCTION(isBoolean) + void tst_QScriptValue::isNumber_initData() { QTest::addColumn<bool>("expected"); @@ -366,7 +432,21 @@ void tst_QScriptValue::isNumber_makeData(const char* expr) << "QScriptValue(engine, qSNaN())" << "QScriptValue(engine, qQNaN())" << "QScriptValue(engine, qInf())" - << "QScriptValue(engine, -qInf())"; + << "QScriptValue(engine, -qInf())" + << "engine->evaluate(\"a = new Object(); a.foo = 22; a.foo\")" + << "engine->evaluate(\"122\")" + << "engine->evaluate(\"124\")" + << "engine->evaluate(\"0\")" + << "engine->evaluate(\"0.0\")" + << "engine->evaluate(\"123.0\")" + << "engine->evaluate(\"6.37e-8\")" + << "engine->evaluate(\"-6.37e-8\")" + << "engine->evaluate(\"0x43211234\")" + << "engine->evaluate(\"0x10000\")" + << "engine->evaluate(\"0x10001\")" + << "engine->evaluate(\"NaN\")" + << "engine->evaluate(\"Infinity\")" + << "engine->evaluate(\"-Infinity\")"; } newRow(expr) << isNumber.contains(expr); } @@ -375,6 +455,7 @@ void tst_QScriptValue::isNumber_test(const char*, const QScriptValue& value) { QFETCH(bool, expected); QCOMPARE(value.isNumber(), expected); + QCOMPARE(value.isNumber(), expected); } DEFINE_TEST_FUNCTION(isNumber) @@ -407,6 +488,7 @@ void tst_QScriptValue::isFunction_test(const char*, const QScriptValue& value) { QFETCH(bool, expected); QCOMPARE(value.isFunction(), expected); + QCOMPARE(value.isFunction(), expected); } DEFINE_TEST_FUNCTION(isFunction) @@ -424,7 +506,9 @@ void tst_QScriptValue::isNull_makeData(const char* expr) if (isNull.isEmpty()) { isNull << "QScriptValue(QScriptValue::NullValue)" << "QScriptValue(0, QScriptValue::NullValue)" - << "QScriptValue(engine, QScriptValue::NullValue)"; + << "QScriptValue(engine, QScriptValue::NullValue)" + << "engine->evaluate(\"null\")" + << "engine->nullValue()"; } newRow(expr) << isNull.contains(expr); } @@ -433,6 +517,7 @@ void tst_QScriptValue::isNull_test(const char*, const QScriptValue& value) { QFETCH(bool, expected); QCOMPARE(value.isNull(), expected); + QCOMPARE(value.isNull(), expected); } DEFINE_TEST_FUNCTION(isNull) @@ -477,7 +562,12 @@ void tst_QScriptValue::isString_makeData(const char* expr) << "QScriptValue(engine, QString())" << "QScriptValue(engine, QString(\"0\"))" << "QScriptValue(engine, QString(\"123\"))" - << "QScriptValue(engine, QString(\"1.23\"))"; + << "QScriptValue(engine, QString(\"1.23\"))" + << "engine->evaluate(\"'ciao'\")" + << "engine->evaluate(\"''\")" + << "engine->evaluate(\"'0'\")" + << "engine->evaluate(\"'123'\")" + << "engine->evaluate(\"'12.4'\")"; } newRow(expr) << isString.contains(expr); } @@ -486,6 +576,7 @@ void tst_QScriptValue::isString_test(const char*, const QScriptValue& value) { QFETCH(bool, expected); QCOMPARE(value.isString(), expected); + QCOMPARE(value.isString(), expected); } DEFINE_TEST_FUNCTION(isString) @@ -504,7 +595,9 @@ void tst_QScriptValue::isUndefined_makeData(const char* expr) isUndefined << "QScriptValue(QScriptValue::UndefinedValue)" << "QScriptValue(0, QScriptValue::UndefinedValue)" << "QScriptValue(engine, QScriptValue::UndefinedValue)" - << "engine->evaluate(\"{}\")"; + << "engine->evaluate(\"{}\")" + << "engine->evaluate(\"undefined\")" + << "engine->undefinedValue()"; } newRow(expr) << isUndefined.contains(expr); } @@ -513,10 +606,15 @@ void tst_QScriptValue::isUndefined_test(const char*, const QScriptValue& value) { QFETCH(bool, expected); QCOMPARE(value.isUndefined(), expected); + QCOMPARE(value.isUndefined(), expected); } DEFINE_TEST_FUNCTION(isUndefined) + + + + void tst_QScriptValue::isObject_initData() { QTest::addColumn<bool>("expected"); @@ -543,7 +641,11 @@ void tst_QScriptValue::isObject_makeData(const char* expr) << "engine->evaluate(\"/foo/\")" << "engine->evaluate(\"new Object()\")" << "engine->evaluate(\"new Array()\")" - << "engine->evaluate(\"new Error()\")"; + << "engine->evaluate(\"new Error()\")" + << "engine->evaluate(\"Undefined\")" + << "engine->evaluate(\"Null\")" + << "engine->evaluate(\"True\")" + << "engine->evaluate(\"False\")"; } newRow(expr) << isObject.contains(expr); } @@ -552,10 +654,168 @@ void tst_QScriptValue::isObject_test(const char*, const QScriptValue& value) { QFETCH(bool, expected); QCOMPARE(value.isObject(), expected); + QCOMPARE(value.isObject(), expected); } DEFINE_TEST_FUNCTION(isObject) + +void tst_QScriptValue::toString_initData() +{ + QTest::addColumn<QString>("expected"); + initScriptValues(); +} + +void tst_QScriptValue::toString_makeData(const char* expr) +{ + static QHash<QString, QString> toString; + if (toString.isEmpty()) { + toString.insert("QScriptValue()", ""); + toString.insert("QScriptValue(QScriptValue::UndefinedValue)", "undefined"); + toString.insert("QScriptValue(QScriptValue::NullValue)", "null"); + toString.insert("QScriptValue(true)", "true"); + toString.insert("QScriptValue(false)", "false"); + toString.insert("QScriptValue(int(122))", "122"); + toString.insert("QScriptValue(uint(124))", "124"); + toString.insert("QScriptValue(0)", "0"); + toString.insert("QScriptValue(0.0)", "0"); + toString.insert("QScriptValue(123.0)", "123"); + toString.insert("QScriptValue(6.37e-8)", "6.37e-8"); + toString.insert("QScriptValue(-6.37e-8)", "-6.37e-8"); + toString.insert("QScriptValue(0x43211234)", "1126240820"); + toString.insert("QScriptValue(0x10000)", "65536"); + toString.insert("QScriptValue(0x10001)", "65537"); + toString.insert("QScriptValue(qSNaN())", "NaN"); + toString.insert("QScriptValue(qQNaN())", "NaN"); + toString.insert("QScriptValue(qInf())", "Infinity"); + toString.insert("QScriptValue(-qInf())", "-Infinity"); + toString.insert("QScriptValue(\"NaN\")", "NaN"); + toString.insert("QScriptValue(\"Infinity\")", "Infinity"); + toString.insert("QScriptValue(\"-Infinity\")", "-Infinity"); + toString.insert("QScriptValue(\"ciao\")", "ciao"); + toString.insert("QScriptValue(QString::fromLatin1(\"ciao\"))", "ciao"); + toString.insert("QScriptValue(QString(\"\"))", ""); + toString.insert("QScriptValue(QString())", ""); + toString.insert("QScriptValue(QString(\"0\"))", "0"); + toString.insert("QScriptValue(QString(\"123\"))", "123"); + toString.insert("QScriptValue(QString(\"12.4\"))", "12.4"); + toString.insert("QScriptValue(0, QScriptValue::UndefinedValue)", "undefined"); + toString.insert("QScriptValue(0, QScriptValue::NullValue)", "null"); + toString.insert("QScriptValue(0, true)", "true"); + toString.insert("QScriptValue(0, false)", "false"); + toString.insert("QScriptValue(0, int(122))", "122"); + toString.insert("QScriptValue(0, uint(124))", "124"); + toString.insert("QScriptValue(0, 0)", "0"); + toString.insert("QScriptValue(0, 0.0)", "0"); + toString.insert("QScriptValue(0, 123.0)", "123"); + toString.insert("QScriptValue(0, 6.37e-8)", "6.37e-8"); + toString.insert("QScriptValue(0, -6.37e-8)", "-6.37e-8"); + toString.insert("QScriptValue(0, 0x43211234)", "1126240820"); + toString.insert("QScriptValue(0, 0x10000)", "65536"); + toString.insert("QScriptValue(0, 0x10001)", "65537"); + toString.insert("QScriptValue(0, qSNaN())", "NaN"); + toString.insert("QScriptValue(0, qQNaN())", "NaN"); + toString.insert("QScriptValue(0, qInf())", "Infinity"); + toString.insert("QScriptValue(0, -qInf())", "-Infinity"); + toString.insert("QScriptValue(0, \"NaN\")", "NaN"); + toString.insert("QScriptValue(0, \"Infinity\")", "Infinity"); + toString.insert("QScriptValue(0, \"-Infinity\")", "-Infinity"); + toString.insert("QScriptValue(0, \"ciao\")", "ciao"); + toString.insert("QScriptValue(0, QString::fromLatin1(\"ciao\"))", "ciao"); + toString.insert("QScriptValue(0, QString(\"\"))", ""); + toString.insert("QScriptValue(0, QString())", ""); + toString.insert("QScriptValue(0, QString(\"0\"))", "0"); + toString.insert("QScriptValue(0, QString(\"123\"))", "123"); + toString.insert("QScriptValue(0, QString(\"12.3\"))", "12.3"); + toString.insert("QScriptValue(engine, QScriptValue::UndefinedValue)", "undefined"); + toString.insert("QScriptValue(engine, QScriptValue::NullValue)", "null"); + toString.insert("QScriptValue(engine, true)", "true"); + toString.insert("QScriptValue(engine, false)", "false"); + toString.insert("QScriptValue(engine, int(122))", "122"); + toString.insert("QScriptValue(engine, uint(124))", "124"); + toString.insert("QScriptValue(engine, 0)", "0"); + toString.insert("QScriptValue(engine, 0.0)", "0"); + toString.insert("QScriptValue(engine, 123.0)", "123"); + toString.insert("QScriptValue(engine, 6.37e-8)", "6.37e-8"); + toString.insert("QScriptValue(engine, -6.37e-8)", "-6.37e-8"); + toString.insert("QScriptValue(engine, 0x43211234)", "1126240820"); + toString.insert("QScriptValue(engine, 0x10000)", "65536"); + toString.insert("QScriptValue(engine, 0x10001)", "65537"); + toString.insert("QScriptValue(engine, qSNaN())", "NaN"); + toString.insert("QScriptValue(engine, qQNaN())", "NaN"); + toString.insert("QScriptValue(engine, qInf())", "Infinity"); + toString.insert("QScriptValue(engine, -qInf())", "-Infinity"); + toString.insert("QScriptValue(engine, \"NaN\")", "NaN"); + toString.insert("QScriptValue(engine, \"Infinity\")", "Infinity"); + toString.insert("QScriptValue(engine, \"-Infinity\")", "-Infinity"); + toString.insert("QScriptValue(engine, \"ciao\")", "ciao"); + toString.insert("QScriptValue(engine, QString::fromLatin1(\"ciao\"))", "ciao"); + toString.insert("QScriptValue(engine, QString(\"\"))", ""); + toString.insert("QScriptValue(engine, QString())", ""); + toString.insert("QScriptValue(engine, QString(\"0\"))", "0"); + toString.insert("QScriptValue(engine, QString(\"123\"))", "123"); + toString.insert("QScriptValue(engine, QString(\"1.23\"))", "1.23"); + toString.insert("engine->evaluate(\"[]\")", ""); + toString.insert("engine->evaluate(\"{}\")", "undefined"); + toString.insert("engine->evaluate(\"Object.prototype\")", "[object Object]"); + toString.insert("engine->evaluate(\"Date.prototype\")", "Invalid Date"); + toString.insert("engine->evaluate(\"Array.prototype\")", ""); + toString.insert("engine->evaluate(\"Function.prototype\")", "function () {\n [native code]\n}"); + toString.insert("engine->evaluate(\"Error.prototype\")", "Error: Unknown error"); + toString.insert("engine->evaluate(\"Object\")", "function Object() {\n [native code]\n}"); + toString.insert("engine->evaluate(\"Array\")", "function Array() {\n [native code]\n}"); + toString.insert("engine->evaluate(\"Number\")", "function Number() {\n [native code]\n}"); + toString.insert("engine->evaluate(\"Function\")", "function Function() {\n [native code]\n}"); + toString.insert("engine->evaluate(\"(function() { return 1; })\")", "function () { return 1; }"); + toString.insert("engine->evaluate(\"(function() { return 'ciao'; })\")", "function () { return 'ciao'; }"); + toString.insert("engine->evaluate(\"(function() { throw new Error('foo'); })\")", "function () { throw new Error('foo'); }"); + toString.insert("engine->evaluate(\"/foo/\")", "/foo/"); + toString.insert("engine->evaluate(\"new Object()\")", "[object Object]"); + toString.insert("engine->evaluate(\"new Array()\")", ""); + toString.insert("engine->evaluate(\"new Error()\")", "Error: Unknown error"); + toString.insert("engine->evaluate(\"a = new Object(); a.foo = 22; a.foo\")", "22"); + toString.insert("engine->evaluate(\"Undefined\")", "ReferenceError: Can't find variable: Undefined"); + toString.insert("engine->evaluate(\"Null\")", "ReferenceError: Can't find variable: Null"); + toString.insert("engine->evaluate(\"True\")", "ReferenceError: Can't find variable: True"); + toString.insert("engine->evaluate(\"False\")", "ReferenceError: Can't find variable: False"); + toString.insert("engine->evaluate(\"undefined\")", "undefined"); + toString.insert("engine->evaluate(\"null\")", "null"); + toString.insert("engine->evaluate(\"true\")", "true"); + toString.insert("engine->evaluate(\"false\")", "false"); + toString.insert("engine->evaluate(\"122\")", "122"); + toString.insert("engine->evaluate(\"124\")", "124"); + toString.insert("engine->evaluate(\"0\")", "0"); + toString.insert("engine->evaluate(\"0.0\")", "0"); + toString.insert("engine->evaluate(\"123.0\")", "123"); + toString.insert("engine->evaluate(\"6.37e-8\")", "6.37e-8"); + toString.insert("engine->evaluate(\"-6.37e-8\")", "-6.37e-8"); + toString.insert("engine->evaluate(\"0x43211234\")", "1126240820"); + toString.insert("engine->evaluate(\"0x10000\")", "65536"); + toString.insert("engine->evaluate(\"0x10001\")", "65537"); + toString.insert("engine->evaluate(\"NaN\")", "NaN"); + toString.insert("engine->evaluate(\"Infinity\")", "Infinity"); + toString.insert("engine->evaluate(\"-Infinity\")", "-Infinity"); + toString.insert("engine->evaluate(\"'ciao'\")", "ciao"); + toString.insert("engine->evaluate(\"''\")", ""); + toString.insert("engine->evaluate(\"'0'\")", "0"); + toString.insert("engine->evaluate(\"'123'\")", "123"); + toString.insert("engine->evaluate(\"'12.4'\")", "12.4"); + toString.insert("engine->nullValue()", "null"); + toString.insert("engine->undefinedValue()", "undefined"); + } + newRow(expr) << toString.value(expr); +} + +void tst_QScriptValue::toString_test(const char*, const QScriptValue& value) +{ + QFETCH(QString, expected); + QCOMPARE(value.toString(), expected); + QCOMPARE(value.toString(), expected); +} + +DEFINE_TEST_FUNCTION(toString) + + void tst_QScriptValue::toNumber_initData() { QTest::addColumn<qsreal>("expected"); @@ -669,6 +929,35 @@ void tst_QScriptValue::toNumber_makeData(const char* expr) toNumber.insert("engine->evaluate(\"new Object()\")", qQNaN()); toNumber.insert("engine->evaluate(\"new Array()\")", 0); toNumber.insert("engine->evaluate(\"new Error()\")", qQNaN()); + toNumber.insert("engine->evaluate(\"a = new Object(); a.foo = 22; a.foo\")", 22); + toNumber.insert("engine->evaluate(\"Undefined\")", qQNaN()); + toNumber.insert("engine->evaluate(\"Null\")", qQNaN()); + toNumber.insert("engine->evaluate(\"True\")", qQNaN()); + toNumber.insert("engine->evaluate(\"False\")", qQNaN()); + toNumber.insert("engine->evaluate(\"undefined\")", qQNaN()); + toNumber.insert("engine->evaluate(\"null\")", 0); + toNumber.insert("engine->evaluate(\"true\")", 1); + toNumber.insert("engine->evaluate(\"false\")", 0); + toNumber.insert("engine->evaluate(\"122\")", 122); + toNumber.insert("engine->evaluate(\"124\")", 124); + toNumber.insert("engine->evaluate(\"0\")", 0); + toNumber.insert("engine->evaluate(\"0.0\")", 0); + toNumber.insert("engine->evaluate(\"123.0\")", 123); + toNumber.insert("engine->evaluate(\"6.37e-8\")", 6.369999999999999e-08); + toNumber.insert("engine->evaluate(\"-6.37e-8\")", -6.369999999999999e-08); + toNumber.insert("engine->evaluate(\"0x43211234\")", 1126240820); + toNumber.insert("engine->evaluate(\"0x10000\")", 65536); + toNumber.insert("engine->evaluate(\"0x10001\")", 65537); + toNumber.insert("engine->evaluate(\"NaN\")", qQNaN()); + toNumber.insert("engine->evaluate(\"Infinity\")", qInf()); + toNumber.insert("engine->evaluate(\"-Infinity\")", qInf()); + toNumber.insert("engine->evaluate(\"'ciao'\")", qQNaN()); + toNumber.insert("engine->evaluate(\"''\")", 0); + toNumber.insert("engine->evaluate(\"'0'\")", 0); + toNumber.insert("engine->evaluate(\"'123'\")", 123); + toNumber.insert("engine->evaluate(\"'12.4'\")", 12.4); + toNumber.insert("engine->nullValue()", 0); + toNumber.insert("engine->undefinedValue()", qQNaN()); } newRow(expr) << toNumber.value(expr); } @@ -682,9 +971,11 @@ void tst_QScriptValue::toNumber_test(const char*, const QScriptValue& value) } if (qIsInf(expected)) { QVERIFY(qIsInf(value.toNumber())); + QVERIFY(qIsInf(value.toNumber())); return; } QCOMPARE(value.toNumber(), expected); + QCOMPARE(value.toNumber(), expected); } DEFINE_TEST_FUNCTION(toNumber) @@ -803,6 +1094,35 @@ void tst_QScriptValue::toBool_makeData(const char* expr) toBool.insert("engine->evaluate(\"new Object()\")", true); toBool.insert("engine->evaluate(\"new Array()\")", true); toBool.insert("engine->evaluate(\"new Error()\")", true); + toBool.insert("engine->evaluate(\"a = new Object(); a.foo = 22; a.foo\")", true); + toBool.insert("engine->evaluate(\"Undefined\")", true); + toBool.insert("engine->evaluate(\"Null\")", true); + toBool.insert("engine->evaluate(\"True\")", true); + toBool.insert("engine->evaluate(\"False\")", true); + toBool.insert("engine->evaluate(\"undefined\")", false); + toBool.insert("engine->evaluate(\"null\")", false); + toBool.insert("engine->evaluate(\"true\")", true); + toBool.insert("engine->evaluate(\"false\")", false); + toBool.insert("engine->evaluate(\"122\")", true); + toBool.insert("engine->evaluate(\"124\")", true); + toBool.insert("engine->evaluate(\"0\")", false); + toBool.insert("engine->evaluate(\"0.0\")", false); + toBool.insert("engine->evaluate(\"123.0\")", true); + toBool.insert("engine->evaluate(\"6.37e-8\")", true); + toBool.insert("engine->evaluate(\"-6.37e-8\")", true); + toBool.insert("engine->evaluate(\"0x43211234\")", true); + toBool.insert("engine->evaluate(\"0x10000\")", true); + toBool.insert("engine->evaluate(\"0x10001\")", true); + toBool.insert("engine->evaluate(\"NaN\")", false); + toBool.insert("engine->evaluate(\"Infinity\")", true); + toBool.insert("engine->evaluate(\"-Infinity\")", true); + toBool.insert("engine->evaluate(\"'ciao'\")", true); + toBool.insert("engine->evaluate(\"''\")", false); + toBool.insert("engine->evaluate(\"'0'\")", true); + toBool.insert("engine->evaluate(\"'123'\")", true); + toBool.insert("engine->evaluate(\"'12.4'\")", true); + toBool.insert("engine->nullValue()", false); + toBool.insert("engine->undefinedValue()", false); } newRow(expr) << toBool.value(expr); } @@ -811,6 +1131,7 @@ void tst_QScriptValue::toBool_test(const char*, const QScriptValue& value) { QFETCH(bool, expected); QCOMPARE(value.toBool(), expected); + QCOMPARE(value.toBool(), expected); } DEFINE_TEST_FUNCTION(toBool) @@ -929,6 +1250,35 @@ void tst_QScriptValue::toBoolean_makeData(const char* expr) toBoolean.insert("engine->evaluate(\"new Object()\")", true); toBoolean.insert("engine->evaluate(\"new Array()\")", true); toBoolean.insert("engine->evaluate(\"new Error()\")", true); + toBoolean.insert("engine->evaluate(\"a = new Object(); a.foo = 22; a.foo\")", true); + toBoolean.insert("engine->evaluate(\"Undefined\")", true); + toBoolean.insert("engine->evaluate(\"Null\")", true); + toBoolean.insert("engine->evaluate(\"True\")", true); + toBoolean.insert("engine->evaluate(\"False\")", true); + toBoolean.insert("engine->evaluate(\"undefined\")", false); + toBoolean.insert("engine->evaluate(\"null\")", false); + toBoolean.insert("engine->evaluate(\"true\")", true); + toBoolean.insert("engine->evaluate(\"false\")", false); + toBoolean.insert("engine->evaluate(\"122\")", true); + toBoolean.insert("engine->evaluate(\"124\")", true); + toBoolean.insert("engine->evaluate(\"0\")", false); + toBoolean.insert("engine->evaluate(\"0.0\")", false); + toBoolean.insert("engine->evaluate(\"123.0\")", true); + toBoolean.insert("engine->evaluate(\"6.37e-8\")", true); + toBoolean.insert("engine->evaluate(\"-6.37e-8\")", true); + toBoolean.insert("engine->evaluate(\"0x43211234\")", true); + toBoolean.insert("engine->evaluate(\"0x10000\")", true); + toBoolean.insert("engine->evaluate(\"0x10001\")", true); + toBoolean.insert("engine->evaluate(\"NaN\")", false); + toBoolean.insert("engine->evaluate(\"Infinity\")", true); + toBoolean.insert("engine->evaluate(\"-Infinity\")", true); + toBoolean.insert("engine->evaluate(\"'ciao'\")", true); + toBoolean.insert("engine->evaluate(\"''\")", false); + toBoolean.insert("engine->evaluate(\"'0'\")", true); + toBoolean.insert("engine->evaluate(\"'123'\")", true); + toBoolean.insert("engine->evaluate(\"'12.4'\")", true); + toBoolean.insert("engine->nullValue()", false); + toBoolean.insert("engine->undefinedValue()", false); } newRow(expr) << toBoolean.value(expr); } @@ -937,6 +1287,636 @@ void tst_QScriptValue::toBoolean_test(const char*, const QScriptValue& value) { QFETCH(bool, expected); QCOMPARE(value.toBoolean(), expected); + QCOMPARE(value.toBoolean(), expected); } DEFINE_TEST_FUNCTION(toBoolean) + + +void tst_QScriptValue::toInteger_initData() +{ + QTest::addColumn<qsreal>("expected"); + initScriptValues(); +} + +void tst_QScriptValue::toInteger_makeData(const char* expr) +{ + static QHash<QString, qsreal> toInteger; + if (toInteger.isEmpty()) { + toInteger.insert("QScriptValue()", 0); + toInteger.insert("QScriptValue(QScriptValue::UndefinedValue)", 0); + toInteger.insert("QScriptValue(QScriptValue::NullValue)", 0); + toInteger.insert("QScriptValue(true)", 1); + toInteger.insert("QScriptValue(false)", 0); + toInteger.insert("QScriptValue(int(122))", 122); + toInteger.insert("QScriptValue(uint(124))", 124); + toInteger.insert("QScriptValue(0)", 0); + toInteger.insert("QScriptValue(0.0)", 0); + toInteger.insert("QScriptValue(123.0)", 123); + toInteger.insert("QScriptValue(6.37e-8)", 0); + toInteger.insert("QScriptValue(-6.37e-8)", 0); + toInteger.insert("QScriptValue(0x43211234)", 1126240820); + toInteger.insert("QScriptValue(0x10000)", 65536); + toInteger.insert("QScriptValue(0x10001)", 65537); + toInteger.insert("QScriptValue(qSNaN())", 0); + toInteger.insert("QScriptValue(qQNaN())", 0); + toInteger.insert("QScriptValue(qInf())", qInf()); + toInteger.insert("QScriptValue(-qInf())", qInf()); + toInteger.insert("QScriptValue(\"NaN\")", 0); + toInteger.insert("QScriptValue(\"Infinity\")", qInf()); + toInteger.insert("QScriptValue(\"-Infinity\")", qInf()); + toInteger.insert("QScriptValue(\"ciao\")", 0); + toInteger.insert("QScriptValue(QString::fromLatin1(\"ciao\"))", 0); + toInteger.insert("QScriptValue(QString(\"\"))", 0); + toInteger.insert("QScriptValue(QString())", 0); + toInteger.insert("QScriptValue(QString(\"0\"))", 0); + toInteger.insert("QScriptValue(QString(\"123\"))", 123); + toInteger.insert("QScriptValue(QString(\"12.4\"))", 12); + toInteger.insert("QScriptValue(0, QScriptValue::UndefinedValue)", 0); + toInteger.insert("QScriptValue(0, QScriptValue::NullValue)", 0); + toInteger.insert("QScriptValue(0, true)", 1); + toInteger.insert("QScriptValue(0, false)", 0); + toInteger.insert("QScriptValue(0, int(122))", 122); + toInteger.insert("QScriptValue(0, uint(124))", 124); + toInteger.insert("QScriptValue(0, 0)", 0); + toInteger.insert("QScriptValue(0, 0.0)", 0); + toInteger.insert("QScriptValue(0, 123.0)", 123); + toInteger.insert("QScriptValue(0, 6.37e-8)", 0); + toInteger.insert("QScriptValue(0, -6.37e-8)", 0); + toInteger.insert("QScriptValue(0, 0x43211234)", 1126240820); + toInteger.insert("QScriptValue(0, 0x10000)", 65536); + toInteger.insert("QScriptValue(0, 0x10001)", 65537); + toInteger.insert("QScriptValue(0, qSNaN())", 0); + toInteger.insert("QScriptValue(0, qQNaN())", 0); + toInteger.insert("QScriptValue(0, qInf())", qInf()); + toInteger.insert("QScriptValue(0, -qInf())", qInf()); + toInteger.insert("QScriptValue(0, \"NaN\")", 0); + toInteger.insert("QScriptValue(0, \"Infinity\")", qInf()); + toInteger.insert("QScriptValue(0, \"-Infinity\")", qInf()); + toInteger.insert("QScriptValue(0, \"ciao\")", 0); + toInteger.insert("QScriptValue(0, QString::fromLatin1(\"ciao\"))", 0); + toInteger.insert("QScriptValue(0, QString(\"\"))", 0); + toInteger.insert("QScriptValue(0, QString())", 0); + toInteger.insert("QScriptValue(0, QString(\"0\"))", 0); + toInteger.insert("QScriptValue(0, QString(\"123\"))", 123); + toInteger.insert("QScriptValue(0, QString(\"12.3\"))", 12); + toInteger.insert("QScriptValue(engine, QScriptValue::UndefinedValue)", 0); + toInteger.insert("QScriptValue(engine, QScriptValue::NullValue)", 0); + toInteger.insert("QScriptValue(engine, true)", 1); + toInteger.insert("QScriptValue(engine, false)", 0); + toInteger.insert("QScriptValue(engine, int(122))", 122); + toInteger.insert("QScriptValue(engine, uint(124))", 124); + toInteger.insert("QScriptValue(engine, 0)", 0); + toInteger.insert("QScriptValue(engine, 0.0)", 0); + toInteger.insert("QScriptValue(engine, 123.0)", 123); + toInteger.insert("QScriptValue(engine, 6.37e-8)", 0); + toInteger.insert("QScriptValue(engine, -6.37e-8)", 0); + toInteger.insert("QScriptValue(engine, 0x43211234)", 1126240820); + toInteger.insert("QScriptValue(engine, 0x10000)", 65536); + toInteger.insert("QScriptValue(engine, 0x10001)", 65537); + toInteger.insert("QScriptValue(engine, qSNaN())", 0); + toInteger.insert("QScriptValue(engine, qQNaN())", 0); + toInteger.insert("QScriptValue(engine, qInf())", qInf()); + toInteger.insert("QScriptValue(engine, -qInf())", qInf()); + toInteger.insert("QScriptValue(engine, \"NaN\")", 0); + toInteger.insert("QScriptValue(engine, \"Infinity\")", qInf()); + toInteger.insert("QScriptValue(engine, \"-Infinity\")", qInf()); + toInteger.insert("QScriptValue(engine, \"ciao\")", 0); + toInteger.insert("QScriptValue(engine, QString::fromLatin1(\"ciao\"))", 0); + toInteger.insert("QScriptValue(engine, QString(\"\"))", 0); + toInteger.insert("QScriptValue(engine, QString())", 0); + toInteger.insert("QScriptValue(engine, QString(\"0\"))", 0); + toInteger.insert("QScriptValue(engine, QString(\"123\"))", 123); + toInteger.insert("QScriptValue(engine, QString(\"1.23\"))", 1); + toInteger.insert("engine->evaluate(\"[]\")", 0); + toInteger.insert("engine->evaluate(\"{}\")", 0); + toInteger.insert("engine->evaluate(\"Object.prototype\")", 0); + toInteger.insert("engine->evaluate(\"Date.prototype\")", 0); + toInteger.insert("engine->evaluate(\"Array.prototype\")", 0); + toInteger.insert("engine->evaluate(\"Function.prototype\")", 0); + toInteger.insert("engine->evaluate(\"Error.prototype\")", 0); + toInteger.insert("engine->evaluate(\"Object\")", 0); + toInteger.insert("engine->evaluate(\"Array\")", 0); + toInteger.insert("engine->evaluate(\"Number\")", 0); + toInteger.insert("engine->evaluate(\"Function\")", 0); + toInteger.insert("engine->evaluate(\"(function() { return 1; })\")", 0); + toInteger.insert("engine->evaluate(\"(function() { return 'ciao'; })\")", 0); + toInteger.insert("engine->evaluate(\"(function() { throw new Error('foo'); })\")", 0); + toInteger.insert("engine->evaluate(\"/foo/\")", 0); + toInteger.insert("engine->evaluate(\"new Object()\")", 0); + toInteger.insert("engine->evaluate(\"new Array()\")", 0); + toInteger.insert("engine->evaluate(\"new Error()\")", 0); + toInteger.insert("engine->evaluate(\"a = new Object(); a.foo = 22; a.foo\")", 22); + toInteger.insert("engine->evaluate(\"Undefined\")", 0); + toInteger.insert("engine->evaluate(\"Null\")", 0); + toInteger.insert("engine->evaluate(\"True\")", 0); + toInteger.insert("engine->evaluate(\"False\")", 0); + toInteger.insert("engine->evaluate(\"undefined\")", 0); + toInteger.insert("engine->evaluate(\"null\")", 0); + toInteger.insert("engine->evaluate(\"true\")", 1); + toInteger.insert("engine->evaluate(\"false\")", 0); + toInteger.insert("engine->evaluate(\"122\")", 122); + toInteger.insert("engine->evaluate(\"124\")", 124); + toInteger.insert("engine->evaluate(\"0\")", 0); + toInteger.insert("engine->evaluate(\"0.0\")", 0); + toInteger.insert("engine->evaluate(\"123.0\")", 123); + toInteger.insert("engine->evaluate(\"6.37e-8\")", 0); + toInteger.insert("engine->evaluate(\"-6.37e-8\")", 0); + toInteger.insert("engine->evaluate(\"0x43211234\")", 1126240820); + toInteger.insert("engine->evaluate(\"0x10000\")", 65536); + toInteger.insert("engine->evaluate(\"0x10001\")", 65537); + toInteger.insert("engine->evaluate(\"NaN\")", 0); + toInteger.insert("engine->evaluate(\"Infinity\")", qInf()); + toInteger.insert("engine->evaluate(\"-Infinity\")", qInf()); + toInteger.insert("engine->evaluate(\"'ciao'\")", 0); + toInteger.insert("engine->evaluate(\"''\")", 0); + toInteger.insert("engine->evaluate(\"'0'\")", 0); + toInteger.insert("engine->evaluate(\"'123'\")", 123); + toInteger.insert("engine->evaluate(\"'12.4'\")", 12); + toInteger.insert("engine->nullValue()", 0); + toInteger.insert("engine->undefinedValue()", 0); + } + newRow(expr) << toInteger.value(expr); +} + +void tst_QScriptValue::toInteger_test(const char*, const QScriptValue& value) +{ + QFETCH(qsreal, expected); + if (qIsInf(expected)) { + QVERIFY(qIsInf(value.toInteger())); + QVERIFY(qIsInf(value.toInteger())); + return; + } + QCOMPARE(value.toInteger(), expected); + QCOMPARE(value.toInteger(), expected); +} + +DEFINE_TEST_FUNCTION(toInteger) + + +void tst_QScriptValue::toInt32_initData() +{ + QTest::addColumn<qint32>("expected"); + initScriptValues(); +} + +void tst_QScriptValue::toInt32_makeData(const char* expr) +{ + static QHash<QString, qint32> toInt32; + if (toInt32.isEmpty()) { + toInt32.insert("QScriptValue()", 0); + toInt32.insert("QScriptValue(QScriptValue::UndefinedValue)", 0); + toInt32.insert("QScriptValue(QScriptValue::NullValue)", 0); + toInt32.insert("QScriptValue(true)", 1); + toInt32.insert("QScriptValue(false)", 0); + toInt32.insert("QScriptValue(int(122))", 122); + toInt32.insert("QScriptValue(uint(124))", 124); + toInt32.insert("QScriptValue(0)", 0); + toInt32.insert("QScriptValue(0.0)", 0); + toInt32.insert("QScriptValue(123.0)", 123); + toInt32.insert("QScriptValue(6.37e-8)", 0); + toInt32.insert("QScriptValue(-6.37e-8)", 0); + toInt32.insert("QScriptValue(0x43211234)", 1126240820); + toInt32.insert("QScriptValue(0x10000)", 65536); + toInt32.insert("QScriptValue(0x10001)", 65537); + toInt32.insert("QScriptValue(qSNaN())", 0); + toInt32.insert("QScriptValue(qQNaN())", 0); + toInt32.insert("QScriptValue(qInf())", 0); + toInt32.insert("QScriptValue(-qInf())", 0); + toInt32.insert("QScriptValue(\"NaN\")", 0); + toInt32.insert("QScriptValue(\"Infinity\")", 0); + toInt32.insert("QScriptValue(\"-Infinity\")", 0); + toInt32.insert("QScriptValue(\"ciao\")", 0); + toInt32.insert("QScriptValue(QString::fromLatin1(\"ciao\"))", 0); + toInt32.insert("QScriptValue(QString(\"\"))", 0); + toInt32.insert("QScriptValue(QString())", 0); + toInt32.insert("QScriptValue(QString(\"0\"))", 0); + toInt32.insert("QScriptValue(QString(\"123\"))", 123); + toInt32.insert("QScriptValue(QString(\"12.4\"))", 12); + toInt32.insert("QScriptValue(0, QScriptValue::UndefinedValue)", 0); + toInt32.insert("QScriptValue(0, QScriptValue::NullValue)", 0); + toInt32.insert("QScriptValue(0, true)", 1); + toInt32.insert("QScriptValue(0, false)", 0); + toInt32.insert("QScriptValue(0, int(122))", 122); + toInt32.insert("QScriptValue(0, uint(124))", 124); + toInt32.insert("QScriptValue(0, 0)", 0); + toInt32.insert("QScriptValue(0, 0.0)", 0); + toInt32.insert("QScriptValue(0, 123.0)", 123); + toInt32.insert("QScriptValue(0, 6.37e-8)", 0); + toInt32.insert("QScriptValue(0, -6.37e-8)", 0); + toInt32.insert("QScriptValue(0, 0x43211234)", 1126240820); + toInt32.insert("QScriptValue(0, 0x10000)", 65536); + toInt32.insert("QScriptValue(0, 0x10001)", 65537); + toInt32.insert("QScriptValue(0, qSNaN())", 0); + toInt32.insert("QScriptValue(0, qQNaN())", 0); + toInt32.insert("QScriptValue(0, qInf())", 0); + toInt32.insert("QScriptValue(0, -qInf())", 0); + toInt32.insert("QScriptValue(0, \"NaN\")", 0); + toInt32.insert("QScriptValue(0, \"Infinity\")", 0); + toInt32.insert("QScriptValue(0, \"-Infinity\")", 0); + toInt32.insert("QScriptValue(0, \"ciao\")", 0); + toInt32.insert("QScriptValue(0, QString::fromLatin1(\"ciao\"))", 0); + toInt32.insert("QScriptValue(0, QString(\"\"))", 0); + toInt32.insert("QScriptValue(0, QString())", 0); + toInt32.insert("QScriptValue(0, QString(\"0\"))", 0); + toInt32.insert("QScriptValue(0, QString(\"123\"))", 123); + toInt32.insert("QScriptValue(0, QString(\"12.3\"))", 12); + toInt32.insert("QScriptValue(engine, QScriptValue::UndefinedValue)", 0); + toInt32.insert("QScriptValue(engine, QScriptValue::NullValue)", 0); + toInt32.insert("QScriptValue(engine, true)", 1); + toInt32.insert("QScriptValue(engine, false)", 0); + toInt32.insert("QScriptValue(engine, int(122))", 122); + toInt32.insert("QScriptValue(engine, uint(124))", 124); + toInt32.insert("QScriptValue(engine, 0)", 0); + toInt32.insert("QScriptValue(engine, 0.0)", 0); + toInt32.insert("QScriptValue(engine, 123.0)", 123); + toInt32.insert("QScriptValue(engine, 6.37e-8)", 0); + toInt32.insert("QScriptValue(engine, -6.37e-8)", 0); + toInt32.insert("QScriptValue(engine, 0x43211234)", 1126240820); + toInt32.insert("QScriptValue(engine, 0x10000)", 65536); + toInt32.insert("QScriptValue(engine, 0x10001)", 65537); + toInt32.insert("QScriptValue(engine, qSNaN())", 0); + toInt32.insert("QScriptValue(engine, qQNaN())", 0); + toInt32.insert("QScriptValue(engine, qInf())", 0); + toInt32.insert("QScriptValue(engine, -qInf())", 0); + toInt32.insert("QScriptValue(engine, \"NaN\")", 0); + toInt32.insert("QScriptValue(engine, \"Infinity\")", 0); + toInt32.insert("QScriptValue(engine, \"-Infinity\")", 0); + toInt32.insert("QScriptValue(engine, \"ciao\")", 0); + toInt32.insert("QScriptValue(engine, QString::fromLatin1(\"ciao\"))", 0); + toInt32.insert("QScriptValue(engine, QString(\"\"))", 0); + toInt32.insert("QScriptValue(engine, QString())", 0); + toInt32.insert("QScriptValue(engine, QString(\"0\"))", 0); + toInt32.insert("QScriptValue(engine, QString(\"123\"))", 123); + toInt32.insert("QScriptValue(engine, QString(\"1.23\"))", 1); + toInt32.insert("engine->evaluate(\"[]\")", 0); + toInt32.insert("engine->evaluate(\"{}\")", 0); + toInt32.insert("engine->evaluate(\"Object.prototype\")", 0); + toInt32.insert("engine->evaluate(\"Date.prototype\")", 0); + toInt32.insert("engine->evaluate(\"Array.prototype\")", 0); + toInt32.insert("engine->evaluate(\"Function.prototype\")", 0); + toInt32.insert("engine->evaluate(\"Error.prototype\")", 0); + toInt32.insert("engine->evaluate(\"Object\")", 0); + toInt32.insert("engine->evaluate(\"Array\")", 0); + toInt32.insert("engine->evaluate(\"Number\")", 0); + toInt32.insert("engine->evaluate(\"Function\")", 0); + toInt32.insert("engine->evaluate(\"(function() { return 1; })\")", 0); + toInt32.insert("engine->evaluate(\"(function() { return 'ciao'; })\")", 0); + toInt32.insert("engine->evaluate(\"(function() { throw new Error('foo'); })\")", 0); + toInt32.insert("engine->evaluate(\"/foo/\")", 0); + toInt32.insert("engine->evaluate(\"new Object()\")", 0); + toInt32.insert("engine->evaluate(\"new Array()\")", 0); + toInt32.insert("engine->evaluate(\"new Error()\")", 0); + toInt32.insert("engine->evaluate(\"a = new Object(); a.foo = 22; a.foo\")", 22); + toInt32.insert("engine->evaluate(\"Undefined\")", 0); + toInt32.insert("engine->evaluate(\"Null\")", 0); + toInt32.insert("engine->evaluate(\"True\")", 0); + toInt32.insert("engine->evaluate(\"False\")", 0); + toInt32.insert("engine->evaluate(\"undefined\")", 0); + toInt32.insert("engine->evaluate(\"null\")", 0); + toInt32.insert("engine->evaluate(\"true\")", 1); + toInt32.insert("engine->evaluate(\"false\")", 0); + toInt32.insert("engine->evaluate(\"122\")", 122); + toInt32.insert("engine->evaluate(\"124\")", 124); + toInt32.insert("engine->evaluate(\"0\")", 0); + toInt32.insert("engine->evaluate(\"0.0\")", 0); + toInt32.insert("engine->evaluate(\"123.0\")", 123); + toInt32.insert("engine->evaluate(\"6.37e-8\")", 0); + toInt32.insert("engine->evaluate(\"-6.37e-8\")", 0); + toInt32.insert("engine->evaluate(\"0x43211234\")", 1126240820); + toInt32.insert("engine->evaluate(\"0x10000\")", 65536); + toInt32.insert("engine->evaluate(\"0x10001\")", 65537); + toInt32.insert("engine->evaluate(\"NaN\")", 0); + toInt32.insert("engine->evaluate(\"Infinity\")", 0); + toInt32.insert("engine->evaluate(\"-Infinity\")", 0); + toInt32.insert("engine->evaluate(\"'ciao'\")", 0); + toInt32.insert("engine->evaluate(\"''\")", 0); + toInt32.insert("engine->evaluate(\"'0'\")", 0); + toInt32.insert("engine->evaluate(\"'123'\")", 123); + toInt32.insert("engine->evaluate(\"'12.4'\")", 12); + toInt32.insert("engine->nullValue()", 0); + toInt32.insert("engine->undefinedValue()", 0); + } + newRow(expr) << toInt32.value(expr); +} + +void tst_QScriptValue::toInt32_test(const char*, const QScriptValue& value) +{ + QFETCH(qint32, expected); + QCOMPARE(value.toInt32(), expected); + QCOMPARE(value.toInt32(), expected); +} + +DEFINE_TEST_FUNCTION(toInt32) + + +void tst_QScriptValue::toUInt32_initData() +{ + QTest::addColumn<quint32>("expected"); + initScriptValues(); +} + +void tst_QScriptValue::toUInt32_makeData(const char* expr) +{ + static QHash<QString, quint32> toUInt32; + if (toUInt32.isEmpty()) { + toUInt32.insert("QScriptValue()", 0); + toUInt32.insert("QScriptValue(QScriptValue::UndefinedValue)", 0); + toUInt32.insert("QScriptValue(QScriptValue::NullValue)", 0); + toUInt32.insert("QScriptValue(true)", 1); + toUInt32.insert("QScriptValue(false)", 0); + toUInt32.insert("QScriptValue(int(122))", 122); + toUInt32.insert("QScriptValue(uint(124))", 124); + toUInt32.insert("QScriptValue(0)", 0); + toUInt32.insert("QScriptValue(0.0)", 0); + toUInt32.insert("QScriptValue(123.0)", 123); + toUInt32.insert("QScriptValue(6.37e-8)", 0); + toUInt32.insert("QScriptValue(-6.37e-8)", 0); + toUInt32.insert("QScriptValue(0x43211234)", 1126240820); + toUInt32.insert("QScriptValue(0x10000)", 65536); + toUInt32.insert("QScriptValue(0x10001)", 65537); + toUInt32.insert("QScriptValue(qSNaN())", 0); + toUInt32.insert("QScriptValue(qQNaN())", 0); + toUInt32.insert("QScriptValue(qInf())", 0); + toUInt32.insert("QScriptValue(-qInf())", 0); + toUInt32.insert("QScriptValue(\"NaN\")", 0); + toUInt32.insert("QScriptValue(\"Infinity\")", 0); + toUInt32.insert("QScriptValue(\"-Infinity\")", 0); + toUInt32.insert("QScriptValue(\"ciao\")", 0); + toUInt32.insert("QScriptValue(QString::fromLatin1(\"ciao\"))", 0); + toUInt32.insert("QScriptValue(QString(\"\"))", 0); + toUInt32.insert("QScriptValue(QString())", 0); + toUInt32.insert("QScriptValue(QString(\"0\"))", 0); + toUInt32.insert("QScriptValue(QString(\"123\"))", 123); + toUInt32.insert("QScriptValue(QString(\"12.4\"))", 12); + toUInt32.insert("QScriptValue(0, QScriptValue::UndefinedValue)", 0); + toUInt32.insert("QScriptValue(0, QScriptValue::NullValue)", 0); + toUInt32.insert("QScriptValue(0, true)", 1); + toUInt32.insert("QScriptValue(0, false)", 0); + toUInt32.insert("QScriptValue(0, int(122))", 122); + toUInt32.insert("QScriptValue(0, uint(124))", 124); + toUInt32.insert("QScriptValue(0, 0)", 0); + toUInt32.insert("QScriptValue(0, 0.0)", 0); + toUInt32.insert("QScriptValue(0, 123.0)", 123); + toUInt32.insert("QScriptValue(0, 6.37e-8)", 0); + toUInt32.insert("QScriptValue(0, -6.37e-8)", 0); + toUInt32.insert("QScriptValue(0, 0x43211234)", 1126240820); + toUInt32.insert("QScriptValue(0, 0x10000)", 65536); + toUInt32.insert("QScriptValue(0, 0x10001)", 65537); + toUInt32.insert("QScriptValue(0, qSNaN())", 0); + toUInt32.insert("QScriptValue(0, qQNaN())", 0); + toUInt32.insert("QScriptValue(0, qInf())", 0); + toUInt32.insert("QScriptValue(0, -qInf())", 0); + toUInt32.insert("QScriptValue(0, \"NaN\")", 0); + toUInt32.insert("QScriptValue(0, \"Infinity\")", 0); + toUInt32.insert("QScriptValue(0, \"-Infinity\")", 0); + toUInt32.insert("QScriptValue(0, \"ciao\")", 0); + toUInt32.insert("QScriptValue(0, QString::fromLatin1(\"ciao\"))", 0); + toUInt32.insert("QScriptValue(0, QString(\"\"))", 0); + toUInt32.insert("QScriptValue(0, QString())", 0); + toUInt32.insert("QScriptValue(0, QString(\"0\"))", 0); + toUInt32.insert("QScriptValue(0, QString(\"123\"))", 123); + toUInt32.insert("QScriptValue(0, QString(\"12.3\"))", 12); + toUInt32.insert("QScriptValue(engine, QScriptValue::UndefinedValue)", 0); + toUInt32.insert("QScriptValue(engine, QScriptValue::NullValue)", 0); + toUInt32.insert("QScriptValue(engine, true)", 1); + toUInt32.insert("QScriptValue(engine, false)", 0); + toUInt32.insert("QScriptValue(engine, int(122))", 122); + toUInt32.insert("QScriptValue(engine, uint(124))", 124); + toUInt32.insert("QScriptValue(engine, 0)", 0); + toUInt32.insert("QScriptValue(engine, 0.0)", 0); + toUInt32.insert("QScriptValue(engine, 123.0)", 123); + toUInt32.insert("QScriptValue(engine, 6.37e-8)", 0); + toUInt32.insert("QScriptValue(engine, -6.37e-8)", 0); + toUInt32.insert("QScriptValue(engine, 0x43211234)", 1126240820); + toUInt32.insert("QScriptValue(engine, 0x10000)", 65536); + toUInt32.insert("QScriptValue(engine, 0x10001)", 65537); + toUInt32.insert("QScriptValue(engine, qSNaN())", 0); + toUInt32.insert("QScriptValue(engine, qQNaN())", 0); + toUInt32.insert("QScriptValue(engine, qInf())", 0); + toUInt32.insert("QScriptValue(engine, -qInf())", 0); + toUInt32.insert("QScriptValue(engine, \"NaN\")", 0); + toUInt32.insert("QScriptValue(engine, \"Infinity\")", 0); + toUInt32.insert("QScriptValue(engine, \"-Infinity\")", 0); + toUInt32.insert("QScriptValue(engine, \"ciao\")", 0); + toUInt32.insert("QScriptValue(engine, QString::fromLatin1(\"ciao\"))", 0); + toUInt32.insert("QScriptValue(engine, QString(\"\"))", 0); + toUInt32.insert("QScriptValue(engine, QString())", 0); + toUInt32.insert("QScriptValue(engine, QString(\"0\"))", 0); + toUInt32.insert("QScriptValue(engine, QString(\"123\"))", 123); + toUInt32.insert("QScriptValue(engine, QString(\"1.23\"))", 1); + toUInt32.insert("engine->evaluate(\"[]\")", 0); + toUInt32.insert("engine->evaluate(\"{}\")", 0); + toUInt32.insert("engine->evaluate(\"Object.prototype\")", 0); + toUInt32.insert("engine->evaluate(\"Date.prototype\")", 0); + toUInt32.insert("engine->evaluate(\"Array.prototype\")", 0); + toUInt32.insert("engine->evaluate(\"Function.prototype\")", 0); + toUInt32.insert("engine->evaluate(\"Error.prototype\")", 0); + toUInt32.insert("engine->evaluate(\"Object\")", 0); + toUInt32.insert("engine->evaluate(\"Array\")", 0); + toUInt32.insert("engine->evaluate(\"Number\")", 0); + toUInt32.insert("engine->evaluate(\"Function\")", 0); + toUInt32.insert("engine->evaluate(\"(function() { return 1; })\")", 0); + toUInt32.insert("engine->evaluate(\"(function() { return 'ciao'; })\")", 0); + toUInt32.insert("engine->evaluate(\"(function() { throw new Error('foo'); })\")", 0); + toUInt32.insert("engine->evaluate(\"/foo/\")", 0); + toUInt32.insert("engine->evaluate(\"new Object()\")", 0); + toUInt32.insert("engine->evaluate(\"new Array()\")", 0); + toUInt32.insert("engine->evaluate(\"new Error()\")", 0); + toUInt32.insert("engine->evaluate(\"a = new Object(); a.foo = 22; a.foo\")", 22); + toUInt32.insert("engine->evaluate(\"Undefined\")", 0); + toUInt32.insert("engine->evaluate(\"Null\")", 0); + toUInt32.insert("engine->evaluate(\"True\")", 0); + toUInt32.insert("engine->evaluate(\"False\")", 0); + toUInt32.insert("engine->evaluate(\"undefined\")", 0); + toUInt32.insert("engine->evaluate(\"null\")", 0); + toUInt32.insert("engine->evaluate(\"true\")", 1); + toUInt32.insert("engine->evaluate(\"false\")", 0); + toUInt32.insert("engine->evaluate(\"122\")", 122); + toUInt32.insert("engine->evaluate(\"124\")", 124); + toUInt32.insert("engine->evaluate(\"0\")", 0); + toUInt32.insert("engine->evaluate(\"0.0\")", 0); + toUInt32.insert("engine->evaluate(\"123.0\")", 123); + toUInt32.insert("engine->evaluate(\"6.37e-8\")", 0); + toUInt32.insert("engine->evaluate(\"-6.37e-8\")", 0); + toUInt32.insert("engine->evaluate(\"0x43211234\")", 1126240820); + toUInt32.insert("engine->evaluate(\"0x10000\")", 65536); + toUInt32.insert("engine->evaluate(\"0x10001\")", 65537); + toUInt32.insert("engine->evaluate(\"NaN\")", 0); + toUInt32.insert("engine->evaluate(\"Infinity\")", 0); + toUInt32.insert("engine->evaluate(\"-Infinity\")", 0); + toUInt32.insert("engine->evaluate(\"'ciao'\")", 0); + toUInt32.insert("engine->evaluate(\"''\")", 0); + toUInt32.insert("engine->evaluate(\"'0'\")", 0); + toUInt32.insert("engine->evaluate(\"'123'\")", 123); + toUInt32.insert("engine->evaluate(\"'12.4'\")", 12); + toUInt32.insert("engine->nullValue()", 0); + toUInt32.insert("engine->undefinedValue()", 0); + } + newRow(expr) << toUInt32.value(expr); +} + +void tst_QScriptValue::toUInt32_test(const char*, const QScriptValue& value) +{ + QFETCH(quint32, expected); + QCOMPARE(value.toUInt32(), expected); + QCOMPARE(value.toUInt32(), expected); +} + +DEFINE_TEST_FUNCTION(toUInt32) + + +void tst_QScriptValue::toUInt16_initData() +{ + QTest::addColumn<quint16>("expected"); + initScriptValues(); +} + +void tst_QScriptValue::toUInt16_makeData(const char* expr) +{ + static QHash<QString, quint16> toUInt16; + if (toUInt16.isEmpty()) { + toUInt16.insert("QScriptValue()", 0); + toUInt16.insert("QScriptValue(QScriptValue::UndefinedValue)", 0); + toUInt16.insert("QScriptValue(QScriptValue::NullValue)", 0); + toUInt16.insert("QScriptValue(true)", 1); + toUInt16.insert("QScriptValue(false)", 0); + toUInt16.insert("QScriptValue(int(122))", 122); + toUInt16.insert("QScriptValue(uint(124))", 124); + toUInt16.insert("QScriptValue(0)", 0); + toUInt16.insert("QScriptValue(0.0)", 0); + toUInt16.insert("QScriptValue(123.0)", 123); + toUInt16.insert("QScriptValue(6.37e-8)", 0); + toUInt16.insert("QScriptValue(-6.37e-8)", 0); + toUInt16.insert("QScriptValue(0x43211234)", 4660); + toUInt16.insert("QScriptValue(0x10000)", 0); + toUInt16.insert("QScriptValue(0x10001)", 1); + toUInt16.insert("QScriptValue(qSNaN())", 0); + toUInt16.insert("QScriptValue(qQNaN())", 0); + toUInt16.insert("QScriptValue(qInf())", 0); + toUInt16.insert("QScriptValue(-qInf())", 0); + toUInt16.insert("QScriptValue(\"NaN\")", 0); + toUInt16.insert("QScriptValue(\"Infinity\")", 0); + toUInt16.insert("QScriptValue(\"-Infinity\")", 0); + toUInt16.insert("QScriptValue(\"ciao\")", 0); + toUInt16.insert("QScriptValue(QString::fromLatin1(\"ciao\"))", 0); + toUInt16.insert("QScriptValue(QString(\"\"))", 0); + toUInt16.insert("QScriptValue(QString())", 0); + toUInt16.insert("QScriptValue(QString(\"0\"))", 0); + toUInt16.insert("QScriptValue(QString(\"123\"))", 123); + toUInt16.insert("QScriptValue(QString(\"12.4\"))", 12); + toUInt16.insert("QScriptValue(0, QScriptValue::UndefinedValue)", 0); + toUInt16.insert("QScriptValue(0, QScriptValue::NullValue)", 0); + toUInt16.insert("QScriptValue(0, true)", 1); + toUInt16.insert("QScriptValue(0, false)", 0); + toUInt16.insert("QScriptValue(0, int(122))", 122); + toUInt16.insert("QScriptValue(0, uint(124))", 124); + toUInt16.insert("QScriptValue(0, 0)", 0); + toUInt16.insert("QScriptValue(0, 0.0)", 0); + toUInt16.insert("QScriptValue(0, 123.0)", 123); + toUInt16.insert("QScriptValue(0, 6.37e-8)", 0); + toUInt16.insert("QScriptValue(0, -6.37e-8)", 0); + toUInt16.insert("QScriptValue(0, 0x43211234)", 4660); + toUInt16.insert("QScriptValue(0, 0x10000)", 0); + toUInt16.insert("QScriptValue(0, 0x10001)", 1); + toUInt16.insert("QScriptValue(0, qSNaN())", 0); + toUInt16.insert("QScriptValue(0, qQNaN())", 0); + toUInt16.insert("QScriptValue(0, qInf())", 0); + toUInt16.insert("QScriptValue(0, -qInf())", 0); + toUInt16.insert("QScriptValue(0, \"NaN\")", 0); + toUInt16.insert("QScriptValue(0, \"Infinity\")", 0); + toUInt16.insert("QScriptValue(0, \"-Infinity\")", 0); + toUInt16.insert("QScriptValue(0, \"ciao\")", 0); + toUInt16.insert("QScriptValue(0, QString::fromLatin1(\"ciao\"))", 0); + toUInt16.insert("QScriptValue(0, QString(\"\"))", 0); + toUInt16.insert("QScriptValue(0, QString())", 0); + toUInt16.insert("QScriptValue(0, QString(\"0\"))", 0); + toUInt16.insert("QScriptValue(0, QString(\"123\"))", 123); + toUInt16.insert("QScriptValue(0, QString(\"12.3\"))", 12); + toUInt16.insert("QScriptValue(engine, QScriptValue::UndefinedValue)", 0); + toUInt16.insert("QScriptValue(engine, QScriptValue::NullValue)", 0); + toUInt16.insert("QScriptValue(engine, true)", 1); + toUInt16.insert("QScriptValue(engine, false)", 0); + toUInt16.insert("QScriptValue(engine, int(122))", 122); + toUInt16.insert("QScriptValue(engine, uint(124))", 124); + toUInt16.insert("QScriptValue(engine, 0)", 0); + toUInt16.insert("QScriptValue(engine, 0.0)", 0); + toUInt16.insert("QScriptValue(engine, 123.0)", 123); + toUInt16.insert("QScriptValue(engine, 6.37e-8)", 0); + toUInt16.insert("QScriptValue(engine, -6.37e-8)", 0); + toUInt16.insert("QScriptValue(engine, 0x43211234)", 4660); + toUInt16.insert("QScriptValue(engine, 0x10000)", 0); + toUInt16.insert("QScriptValue(engine, 0x10001)", 1); + toUInt16.insert("QScriptValue(engine, qSNaN())", 0); + toUInt16.insert("QScriptValue(engine, qQNaN())", 0); + toUInt16.insert("QScriptValue(engine, qInf())", 0); + toUInt16.insert("QScriptValue(engine, -qInf())", 0); + toUInt16.insert("QScriptValue(engine, \"NaN\")", 0); + toUInt16.insert("QScriptValue(engine, \"Infinity\")", 0); + toUInt16.insert("QScriptValue(engine, \"-Infinity\")", 0); + toUInt16.insert("QScriptValue(engine, \"ciao\")", 0); + toUInt16.insert("QScriptValue(engine, QString::fromLatin1(\"ciao\"))", 0); + toUInt16.insert("QScriptValue(engine, QString(\"\"))", 0); + toUInt16.insert("QScriptValue(engine, QString())", 0); + toUInt16.insert("QScriptValue(engine, QString(\"0\"))", 0); + toUInt16.insert("QScriptValue(engine, QString(\"123\"))", 123); + toUInt16.insert("QScriptValue(engine, QString(\"1.23\"))", 1); + toUInt16.insert("engine->evaluate(\"[]\")", 0); + toUInt16.insert("engine->evaluate(\"{}\")", 0); + toUInt16.insert("engine->evaluate(\"Object.prototype\")", 0); + toUInt16.insert("engine->evaluate(\"Date.prototype\")", 0); + toUInt16.insert("engine->evaluate(\"Array.prototype\")", 0); + toUInt16.insert("engine->evaluate(\"Function.prototype\")", 0); + toUInt16.insert("engine->evaluate(\"Error.prototype\")", 0); + toUInt16.insert("engine->evaluate(\"Object\")", 0); + toUInt16.insert("engine->evaluate(\"Array\")", 0); + toUInt16.insert("engine->evaluate(\"Number\")", 0); + toUInt16.insert("engine->evaluate(\"Function\")", 0); + toUInt16.insert("engine->evaluate(\"(function() { return 1; })\")", 0); + toUInt16.insert("engine->evaluate(\"(function() { return 'ciao'; })\")", 0); + toUInt16.insert("engine->evaluate(\"(function() { throw new Error('foo'); })\")", 0); + toUInt16.insert("engine->evaluate(\"/foo/\")", 0); + toUInt16.insert("engine->evaluate(\"new Object()\")", 0); + toUInt16.insert("engine->evaluate(\"new Array()\")", 0); + toUInt16.insert("engine->evaluate(\"new Error()\")", 0); + toUInt16.insert("engine->evaluate(\"a = new Object(); a.foo = 22; a.foo\")", 22); + toUInt16.insert("engine->evaluate(\"Undefined\")", 0); + toUInt16.insert("engine->evaluate(\"Null\")", 0); + toUInt16.insert("engine->evaluate(\"True\")", 0); + toUInt16.insert("engine->evaluate(\"False\")", 0); + toUInt16.insert("engine->evaluate(\"undefined\")", 0); + toUInt16.insert("engine->evaluate(\"null\")", 0); + toUInt16.insert("engine->evaluate(\"true\")", 1); + toUInt16.insert("engine->evaluate(\"false\")", 0); + toUInt16.insert("engine->evaluate(\"122\")", 122); + toUInt16.insert("engine->evaluate(\"124\")", 124); + toUInt16.insert("engine->evaluate(\"0\")", 0); + toUInt16.insert("engine->evaluate(\"0.0\")", 0); + toUInt16.insert("engine->evaluate(\"123.0\")", 123); + toUInt16.insert("engine->evaluate(\"6.37e-8\")", 0); + toUInt16.insert("engine->evaluate(\"-6.37e-8\")", 0); + toUInt16.insert("engine->evaluate(\"0x43211234\")", 4660); + toUInt16.insert("engine->evaluate(\"0x10000\")", 0); + toUInt16.insert("engine->evaluate(\"0x10001\")", 1); + toUInt16.insert("engine->evaluate(\"NaN\")", 0); + toUInt16.insert("engine->evaluate(\"Infinity\")", 0); + toUInt16.insert("engine->evaluate(\"-Infinity\")", 0); + toUInt16.insert("engine->evaluate(\"'ciao'\")", 0); + toUInt16.insert("engine->evaluate(\"''\")", 0); + toUInt16.insert("engine->evaluate(\"'0'\")", 0); + toUInt16.insert("engine->evaluate(\"'123'\")", 123); + toUInt16.insert("engine->evaluate(\"'12.4'\")", 12); + toUInt16.insert("engine->nullValue()", 0); + toUInt16.insert("engine->undefinedValue()", 0); + } + newRow(expr) << toUInt16.value(expr); +} + +void tst_QScriptValue::toUInt16_test(const char*, const QScriptValue& value) +{ + QFETCH(quint16, expected); + QCOMPARE(value.toUInt16(), expected); + QCOMPARE(value.toUInt16(), expected); +} + +DEFINE_TEST_FUNCTION(toUInt16) diff --git a/JavaScriptCore/qt/tests/tests.pri b/JavaScriptCore/qt/tests/tests.pri index 1ce238f..5af3383 100644 --- a/JavaScriptCore/qt/tests/tests.pri +++ b/JavaScriptCore/qt/tests/tests.pri @@ -1,12 +1,3 @@ -isEmpty(OUTPUT_DIR) { - CONFIG(debug, debug|release) { - OUTPUT_DIR=$$PWD/WebKitBuild/Debug - } else { # Release - OUTPUT_DIR=$$PWD/WebKitBuild/Release - } -} - - QMAKE_RPATHDIR = $$OUTPUT_DIR/lib $$QMAKE_RPATHDIR QMAKE_LIBDIR = $$OUTPUT_DIR/lib $$QMAKE_LIBDIR mac:!static:contains(QT_CONFIG, qt_framework):!CONFIG(webkit_no_framework) { diff --git a/JavaScriptCore/qt/tests/tests.pro b/JavaScriptCore/qt/tests/tests.pro index 6e5edb1..7c3f590 100644 --- a/JavaScriptCore/qt/tests/tests.pro +++ b/JavaScriptCore/qt/tests/tests.pro @@ -1,3 +1,4 @@ TEMPLATE = subdirs SUBDIRS = qscriptengine \ - qscriptvalue + qscriptvalue \ + qscriptstring |