/****************************************************************************
**
** Copyright (C) 2018 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include "tst_qscriptvalue.h"
#include <QtWidgets/QPushButton>

QT_BEGIN_NAMESPACE
extern bool qt_script_isJITEnabled();
QT_END_NAMESPACE

tst_QScriptValue::tst_QScriptValue()
    : engine(0)
{
}

tst_QScriptValue::~tst_QScriptValue()
{
    if (engine)
        delete engine;
}

void tst_QScriptValue::ctor_invalid()
{
    QScriptEngine eng;
    {
        QScriptValue v;
        QCOMPARE(v.isValid(), false);
        QCOMPARE(v.engine(), (QScriptEngine *)0);
    }
}

void tst_QScriptValue::ctor_undefinedWithEngine()
{
    QScriptEngine eng;
    {
        QScriptValue v(&eng, QScriptValue::UndefinedValue);
        QCOMPARE(v.isValid(), true);
        QCOMPARE(v.isUndefined(), true);
        QCOMPARE(v.isObject(), false);
        QCOMPARE(v.engine(), &eng);
    }
}

void tst_QScriptValue::ctor_nullWithEngine()
{
    QScriptEngine eng;
    {
        QScriptValue v(&eng, QScriptValue::NullValue);
        QCOMPARE(v.isValid(), true);
        QCOMPARE(v.isNull(), true);
        QCOMPARE(v.isObject(), false);
        QCOMPARE(v.engine(), &eng);
    }
}

void tst_QScriptValue::ctor_boolWithEngine()
{
    QScriptEngine eng;
    {
        QScriptValue v(&eng, false);
        QCOMPARE(v.isValid(), true);
        QCOMPARE(v.isBoolean(), true);
        QCOMPARE(v.isBool(), true);
        QCOMPARE(v.isObject(), false);
        QCOMPARE(v.toBoolean(), false);
        QCOMPARE(v.engine(), &eng);
    }
}

void tst_QScriptValue::ctor_intWithEngine()
{
    QScriptEngine eng;
    {
        QScriptValue v(&eng, int(1));
        QCOMPARE(v.isValid(), true);
        QCOMPARE(v.isNumber(), true);
        QCOMPARE(v.isObject(), false);
        QCOMPARE(v.toNumber(), 1.0);
        QCOMPARE(v.engine(), &eng);
    }
}

void tst_QScriptValue::ctor_int()
{
    {
        QScriptValue v(int(0x43211234));
        QVERIFY(v.isNumber());
        QCOMPARE(v.toInt32(), 0x43211234);
    }
    {
        QScriptValue v(int(1));
        QCOMPARE(v.isValid(), true);
        QCOMPARE(v.isNumber(), true);
        QCOMPARE(v.isObject(), false);
        QCOMPARE(v.toNumber(), 1.0);
        QCOMPARE(v.engine(), (QScriptEngine *)0);
    }
}

void tst_QScriptValue::ctor_uintWithEngine()
{
    QScriptEngine eng;
    {
        QScriptValue v(&eng, uint(1));
        QCOMPARE(v.isValid(), true);
        QCOMPARE(v.isNumber(), true);
        QCOMPARE(v.isObject(), false);
        QCOMPARE(v.toNumber(), 1.0);
        QCOMPARE(v.engine(), &eng);
    }
}

void tst_QScriptValue::ctor_uint()
{
    {
        QScriptValue v(uint(0x43211234));
        QVERIFY(v.isNumber());
        QCOMPARE(v.toUInt32(), uint(0x43211234));
    }
    {
        QScriptValue v(uint(1));
        QCOMPARE(v.isValid(), true);
        QCOMPARE(v.isNumber(), true);
        QCOMPARE(v.isObject(), false);
        QCOMPARE(v.toNumber(), 1.0);
        QCOMPARE(v.engine(), (QScriptEngine *)0);
    }
}

void tst_QScriptValue::ctor_floatWithEngine()
{
    QScriptEngine eng;
    {
        QScriptValue v(&eng, 1.0);
        QCOMPARE(v.isValid(), true);
        QCOMPARE(v.isNumber(), true);
        QCOMPARE(v.isObject(), false);
        QCOMPARE(v.toNumber(), 1.0);
        QCOMPARE(v.engine(), &eng);
    }
}

void tst_QScriptValue::ctor_float()
{
    {
        QScriptValue v(12345678910.5);
        QVERIFY(v.isNumber());
        QCOMPARE(v.toNumber(), 12345678910.5);
    }
    {
        QScriptValue v(1.0);
        QCOMPARE(v.isValid(), true);
        QCOMPARE(v.isNumber(), true);
        QCOMPARE(v.isObject(), false);
        QCOMPARE(v.toNumber(), 1.0);
        QCOMPARE(v.engine(), (QScriptEngine *)0);
    }
}

void tst_QScriptValue::ctor_stringWithEngine()
{
    QScriptEngine eng;
    {
        QScriptValue v(&eng, "ciao");
        QCOMPARE(v.isValid(), true);
        QCOMPARE(v.isString(), true);
        QCOMPARE(v.isObject(), false);
        QCOMPARE(v.toString(), QLatin1String("ciao"));
        QCOMPARE(v.engine(), &eng);
    }
}

void tst_QScriptValue::ctor_string()
{
    {
        QScriptValue v(QString("ciao"));
        QCOMPARE(v.isValid(), true);
        QCOMPARE(v.isString(), true);
        QCOMPARE(v.isObject(), false);
        QCOMPARE(v.toString(), QLatin1String("ciao"));
        QCOMPARE(v.engine(), (QScriptEngine *)0);
    }
    {
        QScriptValue v("ciao");
        QCOMPARE(v.isValid(), true);
        QCOMPARE(v.isString(), true);
        QCOMPARE(v.isObject(), false);
        QCOMPARE(v.toString(), QLatin1String("ciao"));
        QCOMPARE(v.engine(), (QScriptEngine *)0);
    }
}

void tst_QScriptValue::ctor_copyAndAssignWithEngine()
{
    QScriptEngine eng;
    // copy constructor, operator=
    {
        QScriptValue v(&eng, 1.0);
        QScriptValue v2(v);
        QCOMPARE(v2.strictlyEquals(v), true);
        QCOMPARE(v2.engine(), &eng);

        QScriptValue v3(v);
        QCOMPARE(v3.strictlyEquals(v), true);
        QCOMPARE(v3.strictlyEquals(v2), true);
        QCOMPARE(v3.engine(), &eng);

        QScriptValue v4(&eng, 2.0);
        QCOMPARE(v4.strictlyEquals(v), false);
        v3 = v4;
        QCOMPARE(v3.strictlyEquals(v), false);
        QCOMPARE(v3.strictlyEquals(v4), true);

        v2 = QScriptValue();
        QCOMPARE(v2.strictlyEquals(v), false);
        QCOMPARE(v.toNumber(), 1.0);

        QScriptValue v5(v);
        QCOMPARE(v5.strictlyEquals(v), true);
        v = QScriptValue();
        QCOMPARE(v5.strictlyEquals(v), false);
        QCOMPARE(v5.toNumber(), 1.0);
    }
}

void tst_QScriptValue::ctor_undefined()
{
    QScriptValue v(QScriptValue::UndefinedValue);
    QCOMPARE(v.isValid(), true);
    QCOMPARE(v.isUndefined(), true);
    QCOMPARE(v.isObject(), false);
    QCOMPARE(v.engine(), (QScriptEngine *)0);
}

void tst_QScriptValue::ctor_null()
{
    QScriptValue v(QScriptValue::NullValue);
    QCOMPARE(v.isValid(), true);
    QCOMPARE(v.isNull(), true);
    QCOMPARE(v.isObject(), false);
    QCOMPARE(v.engine(), (QScriptEngine *)0);
}

void tst_QScriptValue::ctor_bool()
{
    QScriptValue v(false);
    QCOMPARE(v.isValid(), true);
    QCOMPARE(v.isBoolean(), true);
    QCOMPARE(v.isBool(), true);
    QCOMPARE(v.isObject(), false);
    QCOMPARE(v.toBoolean(), false);
    QCOMPARE(v.engine(), (QScriptEngine *)0);
}

void tst_QScriptValue::ctor_copyAndAssign()
{
    QScriptValue v(1.0);
    QScriptValue v2(v);
    QCOMPARE(v2.strictlyEquals(v), true);
    QCOMPARE(v2.engine(), (QScriptEngine *)0);

    QScriptValue v3(v);
    QCOMPARE(v3.strictlyEquals(v), true);
    QCOMPARE(v3.strictlyEquals(v2), true);
    QCOMPARE(v3.engine(), (QScriptEngine *)0);

    QScriptValue v4(2.0);
    QCOMPARE(v4.strictlyEquals(v), false);
    v3 = v4;
    QCOMPARE(v3.strictlyEquals(v), false);
    QCOMPARE(v3.strictlyEquals(v4), true);

    v2 = QScriptValue();
    QCOMPARE(v2.strictlyEquals(v), false);
    QCOMPARE(v.toNumber(), 1.0);

    QScriptValue v5(v);
    QCOMPARE(v5.strictlyEquals(v), true);
    v = QScriptValue();
    QCOMPARE(v5.strictlyEquals(v), false);
    QCOMPARE(v5.toNumber(), 1.0);
}

void tst_QScriptValue::ctor_nullEngine()
{
    // 0 engine
    QVERIFY(QScriptValue(0, QScriptValue::UndefinedValue).isUndefined());
    QVERIFY(QScriptValue(0, QScriptValue::NullValue).isNull());
    QVERIFY(QScriptValue(0, false).isBool());
    QVERIFY(QScriptValue(0, int(1)).isNumber());
    QVERIFY(QScriptValue(0, uint(1)).isNumber());
    QVERIFY(QScriptValue(0, 1.0).isNumber());
    QVERIFY(QScriptValue(0, "ciao").isString());
    QVERIFY(QScriptValue(0, QString("ciao")).isString());
}

static QScriptValue myFunction(QScriptContext *, QScriptEngine *eng)
{
    return eng->undefinedValue();
}

void tst_QScriptValue::toString()
{
    QScriptEngine eng;

    QScriptValue undefined = eng.undefinedValue();
    QCOMPARE(undefined.toString(), QString("undefined"));
    QCOMPARE(qscriptvalue_cast<QString>(undefined), QString());

    QScriptValue null = eng.nullValue();
    QCOMPARE(null.toString(), QString("null"));
    QCOMPARE(qscriptvalue_cast<QString>(null), QString());

    {
        QScriptValue falskt = QScriptValue(&eng, false);
        QCOMPARE(falskt.toString(), QString("false"));
        QCOMPARE(qscriptvalue_cast<QString>(falskt), QString("false"));

        QScriptValue sant = QScriptValue(&eng, true);
        QCOMPARE(sant.toString(), QString("true"));
        QCOMPARE(qscriptvalue_cast<QString>(sant), QString("true"));
    }
    {
        QScriptValue number = QScriptValue(&eng, 123);
        QCOMPARE(number.toString(), QString("123"));
        QCOMPARE(qscriptvalue_cast<QString>(number), QString("123"));
    }
    {
        QScriptValue number = QScriptValue(&eng, 6.37e-8);
        QCOMPARE(number.toString(), QString("6.37e-8"));
    }
    {
        QScriptValue number = QScriptValue(&eng, -6.37e-8);
        QCOMPARE(number.toString(), QString("-6.37e-8"));

        QScriptValue str = QScriptValue(&eng, QString("ciao"));
        QCOMPARE(str.toString(), QString("ciao"));
        QCOMPARE(qscriptvalue_cast<QString>(str), QString("ciao"));
    }

    QScriptValue object = eng.newObject();
    QCOMPARE(object.toString(), QString("[object Object]"));
    QCOMPARE(qscriptvalue_cast<QString>(object), QString("[object Object]"));

    QScriptValue fun = eng.newFunction(myFunction);
    QCOMPARE(fun.toString(), QString("function () {\n    [native code]\n}"));
    QCOMPARE(qscriptvalue_cast<QString>(fun), QString("function () {\n    [native code]\n}"));

    // toString() that throws exception
    {
        QScriptValue objectObject = eng.evaluate(
            "(function(){"
            "  o = { };"
            "  o.toString = function() { throw new Error('toString'); };"
            "  return o;"
            "})()");
        QCOMPARE(objectObject.toString(), QLatin1String("Error: toString"));
        QVERIFY(eng.hasUncaughtException());
        QCOMPARE(eng.uncaughtException().toString(), QLatin1String("Error: toString"));
    }
    {
        eng.clearExceptions();
        QScriptValue objectObject = eng.evaluate(
            "(function(){"
            "  var f = function() {};"
            "  f.prototype = Date;"
            "  return new f;"
            "})()");
        QVERIFY(!eng.hasUncaughtException());
        QVERIFY(objectObject.isObject());
        QCOMPARE(objectObject.toString(), QString::fromLatin1("TypeError: Function.prototype.toString called on incompatible object"));
        QVERIFY(eng.hasUncaughtException());
        eng.clearExceptions();
    }

    QScriptValue inv = QScriptValue();
    QCOMPARE(inv.toString(), QString());

    // V2 constructors
    {
        QScriptValue falskt = QScriptValue(false);
        QCOMPARE(falskt.toString(), QString("false"));
        QCOMPARE(qscriptvalue_cast<QString>(falskt), QString("false"));

        QScriptValue sant = QScriptValue(true);
        QCOMPARE(sant.toString(), QString("true"));
        QCOMPARE(qscriptvalue_cast<QString>(sant), QString("true"));

        QScriptValue number = QScriptValue(123);
        QCOMPARE(number.toString(), QString("123"));
        QCOMPARE(qscriptvalue_cast<QString>(number), QString("123"));

        QScriptValue number2(int(0x43211234));
        QCOMPARE(number2.toString(), QString("1126240820"));

        QScriptValue str = QScriptValue(QString("ciao"));
        QCOMPARE(str.toString(), QString("ciao"));
        QCOMPARE(qscriptvalue_cast<QString>(str), QString("ciao"));
    }

    // variant should use internal valueOf(), then fall back to QVariant::toString(),
    // then fall back to "QVariant(typename)"
    QScriptValue variant = eng.newVariant(123);
    QVERIFY(variant.isVariant());
    QCOMPARE(variant.toString(), QString::fromLatin1("123"));
    variant = eng.newVariant(QByteArray("hello"));
    QVERIFY(variant.isVariant());
    QCOMPARE(variant.toString(), QString::fromLatin1("hello"));
    variant = eng.newVariant(QVariant(QPoint(10, 20)));
    QVERIFY(variant.isVariant());
    QCOMPARE(variant.toString(), QString::fromLatin1("QVariant(QPoint)"));
    variant = eng.newVariant(QUrl());
    QVERIFY(variant.toString().isEmpty());
}

void tst_QScriptValue::toNumber()
{
    QScriptEngine eng;

    QScriptValue undefined = eng.undefinedValue();
    QCOMPARE(qIsNaN(undefined.toNumber()), true);
    QCOMPARE(qIsNaN(qscriptvalue_cast<qsreal>(undefined)), true);

    QScriptValue null = eng.nullValue();
    QCOMPARE(null.toNumber(), 0.0);
    QCOMPARE(qscriptvalue_cast<qsreal>(null), 0.0);

    {
        QScriptValue falskt = QScriptValue(&eng, false);
        QCOMPARE(falskt.toNumber(), 0.0);
        QCOMPARE(qscriptvalue_cast<qsreal>(falskt), 0.0);

        QScriptValue sant = QScriptValue(&eng, true);
        QCOMPARE(sant.toNumber(), 1.0);
        QCOMPARE(qscriptvalue_cast<qsreal>(sant), 1.0);

        QScriptValue number = QScriptValue(&eng, 123.0);
        QCOMPARE(number.toNumber(), 123.0);
        QCOMPARE(qscriptvalue_cast<qsreal>(number), 123.0);

        QScriptValue str = QScriptValue(&eng, QString("ciao"));
        QCOMPARE(qIsNaN(str.toNumber()), true);
        QCOMPARE(qIsNaN(qscriptvalue_cast<qsreal>(str)), true);

        QScriptValue str2 = QScriptValue(&eng, QString("123"));
        QCOMPARE(str2.toNumber(), 123.0);
        QCOMPARE(qscriptvalue_cast<qsreal>(str2), 123.0);
    }

    QScriptValue object = eng.newObject();
    QCOMPARE(qIsNaN(object.toNumber()), true);
    QCOMPARE(qIsNaN(qscriptvalue_cast<qsreal>(object)), true);

    QScriptValue fun = eng.newFunction(myFunction);
    QCOMPARE(qIsNaN(fun.toNumber()), true);
    QCOMPARE(qIsNaN(qscriptvalue_cast<qsreal>(fun)), true);

    QScriptValue inv = QScriptValue();
    QCOMPARE(inv.toNumber(), 0.0);
    QCOMPARE(qscriptvalue_cast<qsreal>(inv), 0.0);

    // V2 constructors
    {
        QScriptValue falskt = QScriptValue(false);
        QCOMPARE(falskt.toNumber(), 0.0);
        QCOMPARE(qscriptvalue_cast<qsreal>(falskt), 0.0);

        QScriptValue sant = QScriptValue(true);
        QCOMPARE(sant.toNumber(), 1.0);
        QCOMPARE(qscriptvalue_cast<qsreal>(sant), 1.0);

        QScriptValue number = QScriptValue(123.0);
        QCOMPARE(number.toNumber(), 123.0);
        QCOMPARE(qscriptvalue_cast<qsreal>(number), 123.0);

        QScriptValue number2(int(0x43211234));
        QCOMPARE(number2.toNumber(), 1126240820.0);

        QScriptValue str = QScriptValue(QString("ciao"));
        QCOMPARE(qIsNaN(str.toNumber()), true);
        QCOMPARE(qIsNaN(qscriptvalue_cast<qsreal>(str)), true);

        QScriptValue str2 = QScriptValue(QString("123"));
        QCOMPARE(str2.toNumber(), 123.0);
        QCOMPARE(qscriptvalue_cast<qsreal>(str2), 123.0);
    }
}

void tst_QScriptValue::toBoolean() // deprecated
{
    QScriptEngine eng;

    QScriptValue undefined = eng.undefinedValue();
    QCOMPARE(undefined.toBoolean(), false);
    QCOMPARE(qscriptvalue_cast<bool>(undefined), false);

    QScriptValue null = eng.nullValue();
    QCOMPARE(null.toBoolean(), false);
    QCOMPARE(qscriptvalue_cast<bool>(null), false);

    {
        QScriptValue falskt = QScriptValue(&eng, false);
        QCOMPARE(falskt.toBoolean(), false);
        QCOMPARE(qscriptvalue_cast<bool>(falskt), false);

        QScriptValue sant = QScriptValue(&eng, true);
        QCOMPARE(sant.toBoolean(), true);
        QCOMPARE(qscriptvalue_cast<bool>(sant), true);

        QScriptValue number = QScriptValue(&eng, 0.0);
        QCOMPARE(number.toBoolean(), false);
        QCOMPARE(qscriptvalue_cast<bool>(number), false);

        QScriptValue number2 = QScriptValue(&eng, qSNaN());
        QCOMPARE(number2.toBoolean(), false);
        QCOMPARE(qscriptvalue_cast<bool>(number2), false);

        QScriptValue number3 = QScriptValue(&eng, 123.0);
        QCOMPARE(number3.toBoolean(), true);
        QCOMPARE(qscriptvalue_cast<bool>(number3), true);

        QScriptValue number4 = QScriptValue(&eng, -456.0);
        QCOMPARE(number4.toBoolean(), true);
        QCOMPARE(qscriptvalue_cast<bool>(number4), true);

        QScriptValue str = QScriptValue(&eng, QString(""));
        QCOMPARE(str.toBoolean(), false);
        QCOMPARE(qscriptvalue_cast<bool>(str), false);

        QScriptValue str2 = QScriptValue(&eng, QString("123"));
        QCOMPARE(str2.toBoolean(), true);
        QCOMPARE(qscriptvalue_cast<bool>(str2), true);
    }

    QScriptValue object = eng.newObject();
    QCOMPARE(object.toBoolean(), true);
    QCOMPARE(qscriptvalue_cast<bool>(object), true);

    QScriptValue fun = eng.newFunction(myFunction);
    QCOMPARE(fun.toBoolean(), true);
    QCOMPARE(qscriptvalue_cast<bool>(fun), true);

    QScriptValue inv = QScriptValue();
    QCOMPARE(inv.toBoolean(), false);
    QCOMPARE(qscriptvalue_cast<bool>(inv), false);

    // V2 constructors
    {
        QScriptValue falskt = QScriptValue(false);
        QCOMPARE(falskt.toBoolean(), false);
        QCOMPARE(qscriptvalue_cast<bool>(falskt), false);

        QScriptValue sant = QScriptValue(true);
        QCOMPARE(sant.toBoolean(), true);
        QCOMPARE(qscriptvalue_cast<bool>(sant), true);

        QScriptValue number = QScriptValue(0.0);
        QCOMPARE(number.toBoolean(), false);
        QCOMPARE(qscriptvalue_cast<bool>(number), false);

        QScriptValue number2 = QScriptValue(qSNaN());
        QCOMPARE(number2.toBoolean(), false);
        QCOMPARE(qscriptvalue_cast<bool>(number2), false);

        QScriptValue number3 = QScriptValue(123.0);
        QCOMPARE(number3.toBoolean(), true);
        QCOMPARE(qscriptvalue_cast<bool>(number3), true);

        QScriptValue number4 = QScriptValue(-456.0);
        QCOMPARE(number4.toBoolean(), true);
        QCOMPARE(qscriptvalue_cast<bool>(number4), true);

        QScriptValue number5 = QScriptValue(0x43211234);
        QCOMPARE(number5.toBoolean(), true);

        QScriptValue str = QScriptValue(QString(""));
        QCOMPARE(str.toBoolean(), false);
        QCOMPARE(qscriptvalue_cast<bool>(str), false);

        QScriptValue str2 = QScriptValue(QString("123"));
        QCOMPARE(str2.toBoolean(), true);
        QCOMPARE(qscriptvalue_cast<bool>(str2), true);
    }
}

void tst_QScriptValue::toBool()
{
    QScriptEngine eng;

    QScriptValue undefined = eng.undefinedValue();
    QCOMPARE(undefined.toBool(), false);
    QCOMPARE(qscriptvalue_cast<bool>(undefined), false);

    QScriptValue null = eng.nullValue();
    QCOMPARE(null.toBool(), false);
    QCOMPARE(qscriptvalue_cast<bool>(null), false);

    {
        QScriptValue falskt = QScriptValue(&eng, false);
        QCOMPARE(falskt.toBool(), false);
        QCOMPARE(qscriptvalue_cast<bool>(falskt), false);

        QScriptValue sant = QScriptValue(&eng, true);
        QCOMPARE(sant.toBool(), true);
        QCOMPARE(qscriptvalue_cast<bool>(sant), true);

        QScriptValue number = QScriptValue(&eng, 0.0);
        QCOMPARE(number.toBool(), false);
        QCOMPARE(qscriptvalue_cast<bool>(number), false);

        QScriptValue number2 = QScriptValue(&eng, qSNaN());
        QCOMPARE(number2.toBool(), false);
        QCOMPARE(qscriptvalue_cast<bool>(number2), false);

        QScriptValue number3 = QScriptValue(&eng, 123.0);
        QCOMPARE(number3.toBool(), true);
        QCOMPARE(qscriptvalue_cast<bool>(number3), true);

        QScriptValue number4 = QScriptValue(&eng, -456.0);
        QCOMPARE(number4.toBool(), true);
        QCOMPARE(qscriptvalue_cast<bool>(number4), true);

        QScriptValue str = QScriptValue(&eng, QString(""));
        QCOMPARE(str.toBool(), false);
        QCOMPARE(qscriptvalue_cast<bool>(str), false);

        QScriptValue str2 = QScriptValue(&eng, QString("123"));
        QCOMPARE(str2.toBool(), true);
        QCOMPARE(qscriptvalue_cast<bool>(str2), true);
    }

    QScriptValue object = eng.newObject();
    QCOMPARE(object.toBool(), true);
    QCOMPARE(qscriptvalue_cast<bool>(object), true);

    QScriptValue fun = eng.newFunction(myFunction);
    QCOMPARE(fun.toBool(), true);
    QCOMPARE(qscriptvalue_cast<bool>(fun), true);

    QScriptValue inv = QScriptValue();
    QCOMPARE(inv.toBool(), false);
    QCOMPARE(qscriptvalue_cast<bool>(inv), false);

    // V2 constructors
    {
        QScriptValue falskt = QScriptValue(false);
        QCOMPARE(falskt.toBool(), false);
        QCOMPARE(qscriptvalue_cast<bool>(falskt), false);

        QScriptValue sant = QScriptValue(true);
        QCOMPARE(sant.toBool(), true);
        QCOMPARE(qscriptvalue_cast<bool>(sant), true);

        QScriptValue number = QScriptValue(0.0);
        QCOMPARE(number.toBool(), false);
        QCOMPARE(qscriptvalue_cast<bool>(number), false);

        QScriptValue number2 = QScriptValue(qSNaN());
        QCOMPARE(number2.toBool(), false);
        QCOMPARE(qscriptvalue_cast<bool>(number2), false);

        QScriptValue number3 = QScriptValue(123.0);
        QCOMPARE(number3.toBool(), true);
        QCOMPARE(qscriptvalue_cast<bool>(number3), true);

        QScriptValue number4 = QScriptValue(-456.0);
        QCOMPARE(number4.toBool(), true);
        QCOMPARE(qscriptvalue_cast<bool>(number4), true);

        QScriptValue number5 = QScriptValue(0x43211234);
        QCOMPARE(number5.toBool(), true);

        QScriptValue str = QScriptValue(QString(""));
        QCOMPARE(str.toBool(), false);
        QCOMPARE(qscriptvalue_cast<bool>(str), false);

        QScriptValue str2 = QScriptValue(QString("123"));
        QCOMPARE(str2.toBool(), true);
        QCOMPARE(qscriptvalue_cast<bool>(str2), true);
    }
}

void tst_QScriptValue::toInteger()
{
    QScriptEngine eng;

    {
        QScriptValue number = QScriptValue(&eng, 123.0);
        QCOMPARE(number.toInteger(), 123.0);

        QScriptValue number2 = QScriptValue(&eng, qSNaN());
        QCOMPARE(number2.toInteger(), 0.0);

        QScriptValue number3 = QScriptValue(&eng, qInf());
        QCOMPARE(qIsInf(number3.toInteger()), true);

        QScriptValue number4 = QScriptValue(&eng, 0.5);
        QCOMPARE(number4.toInteger(), 0.0);

        QScriptValue number5 = QScriptValue(&eng, 123.5);
        QCOMPARE(number5.toInteger(), 123.0);

        QScriptValue number6 = QScriptValue(&eng, -456.5);
        QCOMPARE(number6.toInteger(), -456.0);

        QScriptValue str = QScriptValue(&eng, "123.0");
        QCOMPARE(str.toInteger(), 123.0);

        QScriptValue str2 = QScriptValue(&eng, "NaN");
        QCOMPARE(str2.toInteger(), 0.0);

        QScriptValue str3 = QScriptValue(&eng, "Infinity");
        QCOMPARE(qIsInf(str3.toInteger()), true);

        QScriptValue str4 = QScriptValue(&eng, "0.5");
        QCOMPARE(str4.toInteger(), 0.0);

        QScriptValue str5 = QScriptValue(&eng, "123.5");
        QCOMPARE(str5.toInteger(), 123.0);

        QScriptValue str6 = QScriptValue(&eng, "-456.5");
        QCOMPARE(str6.toInteger(), -456.0);
    }
    // V2 constructors
    {
        QScriptValue number = QScriptValue(123.0);
        QCOMPARE(number.toInteger(), 123.0);

        QScriptValue number2 = QScriptValue(qSNaN());
        QCOMPARE(number2.toInteger(), 0.0);

        QScriptValue number3 = QScriptValue(qInf());
        QCOMPARE(qIsInf(number3.toInteger()), true);

        QScriptValue number4 = QScriptValue(0.5);
        QCOMPARE(number4.toInteger(), 0.0);

        QScriptValue number5 = QScriptValue(123.5);
        QCOMPARE(number5.toInteger(), 123.0);

        QScriptValue number6 = QScriptValue(-456.5);
        QCOMPARE(number6.toInteger(), -456.0);

        QScriptValue number7 = QScriptValue(0x43211234);
        QCOMPARE(number7.toInteger(), qsreal(0x43211234));

        QScriptValue str = QScriptValue("123.0");
        QCOMPARE(str.toInteger(), 123.0);

        QScriptValue str2 = QScriptValue("NaN");
        QCOMPARE(str2.toInteger(), 0.0);

        QScriptValue str3 = QScriptValue("Infinity");
        QCOMPARE(qIsInf(str3.toInteger()), true);

        QScriptValue str4 = QScriptValue("0.5");
        QCOMPARE(str4.toInteger(), 0.0);

        QScriptValue str5 = QScriptValue("123.5");
        QCOMPARE(str5.toInteger(), 123.0);

        QScriptValue str6 = QScriptValue("-456.5");
        QCOMPARE(str6.toInteger(), -456.0);
    }

    QScriptValue inv;
    QCOMPARE(inv.toInteger(), 0.0);
}

void tst_QScriptValue::toInt32()
{
    QScriptEngine eng;

    {
        QScriptValue zer0 = QScriptValue(&eng, 0.0);
        QCOMPARE(zer0.toInt32(), 0);
        QCOMPARE(qscriptvalue_cast<qint32>(zer0), 0);

        QScriptValue number = QScriptValue(&eng, 123.0);
        QCOMPARE(number.toInt32(), 123);
        QCOMPARE(qscriptvalue_cast<qint32>(number), 123);

        QScriptValue number2 = QScriptValue(&eng, qSNaN());
        QCOMPARE(number2.toInt32(), 0);
        QCOMPARE(qscriptvalue_cast<qint32>(number2), 0);

        QScriptValue number3 = QScriptValue(&eng, +qInf());
        QCOMPARE(number3.toInt32(), 0);
        QCOMPARE(qscriptvalue_cast<qint32>(number3), 0);

        QScriptValue number3_2 = QScriptValue(&eng, -qInf());
        QCOMPARE(number3_2.toInt32(), 0);
        QCOMPARE(qscriptvalue_cast<qint32>(number3_2), 0);

        QScriptValue number4 = QScriptValue(&eng, 0.5);
        QCOMPARE(number4.toInt32(), 0);
        QCOMPARE(qscriptvalue_cast<qint32>(number4), 0);

        QScriptValue number5 = QScriptValue(&eng, 123.5);
        QCOMPARE(number5.toInt32(), 123);
        QCOMPARE(qscriptvalue_cast<qint32>(number5), 123);

        QScriptValue number6 = QScriptValue(&eng, -456.5);
        QCOMPARE(number6.toInt32(), -456);
        QCOMPARE(qscriptvalue_cast<qint32>(number6), -456);

        QScriptValue str = QScriptValue(&eng, "123.0");
        QCOMPARE(str.toInt32(), 123);
        QCOMPARE(qscriptvalue_cast<qint32>(str), 123);

        QScriptValue str2 = QScriptValue(&eng, "NaN");
        QCOMPARE(str2.toInt32(), 0);
        QCOMPARE(qscriptvalue_cast<qint32>(str2), 0);

        QScriptValue str3 = QScriptValue(&eng, "Infinity");
        QCOMPARE(str3.toInt32(), 0);
        QCOMPARE(qscriptvalue_cast<qint32>(str3), 0);

        QScriptValue str3_2 = QScriptValue(&eng, "-Infinity");
        QCOMPARE(str3_2.toInt32(), 0);
        QCOMPARE(qscriptvalue_cast<qint32>(str3_2), 0);

        QScriptValue str4 = QScriptValue(&eng, "0.5");
        QCOMPARE(str4.toInt32(), 0);
        QCOMPARE(qscriptvalue_cast<qint32>(str4), 0);

        QScriptValue str5 = QScriptValue(&eng, "123.5");
        QCOMPARE(str5.toInt32(), 123);
        QCOMPARE(qscriptvalue_cast<qint32>(str5), 123);

        QScriptValue str6 = QScriptValue(&eng, "-456.5");
        QCOMPARE(str6.toInt32(), -456);
        QCOMPARE(qscriptvalue_cast<qint32>(str6), -456);
    }
    // V2 constructors
    {
        QScriptValue zer0 = QScriptValue(0.0);
        QCOMPARE(zer0.toInt32(), 0);
        QCOMPARE(qscriptvalue_cast<qint32>(zer0), 0);

        QScriptValue number = QScriptValue(123.0);
        QCOMPARE(number.toInt32(), 123);
        QCOMPARE(qscriptvalue_cast<qint32>(number), 123);

        QScriptValue number2 = QScriptValue(qSNaN());
        QCOMPARE(number2.toInt32(), 0);
        QCOMPARE(qscriptvalue_cast<qint32>(number2), 0);

        QScriptValue number3 = QScriptValue(+qInf());
        QCOMPARE(number3.toInt32(), 0);
        QCOMPARE(qscriptvalue_cast<qint32>(number3), 0);

        QScriptValue number3_2 = QScriptValue(-qInf());
        QCOMPARE(number3_2.toInt32(), 0);
        QCOMPARE(qscriptvalue_cast<qint32>(number3_2), 0);

        QScriptValue number4 = QScriptValue(0.5);
        QCOMPARE(number4.toInt32(), 0);
        QCOMPARE(qscriptvalue_cast<qint32>(number4), 0);

        QScriptValue number5 = QScriptValue(123.5);
        QCOMPARE(number5.toInt32(), 123);
        QCOMPARE(qscriptvalue_cast<qint32>(number5), 123);

        QScriptValue number6 = QScriptValue(-456.5);
        QCOMPARE(number6.toInt32(), -456);
        QCOMPARE(qscriptvalue_cast<qint32>(number6), -456);

        QScriptValue number7 = QScriptValue(0x43211234);
        QCOMPARE(number7.toInt32(), 0x43211234);

        QScriptValue str = QScriptValue("123.0");
        QCOMPARE(str.toInt32(), 123);
        QCOMPARE(qscriptvalue_cast<qint32>(str), 123);

        QScriptValue str2 = QScriptValue("NaN");
        QCOMPARE(str2.toInt32(), 0);
        QCOMPARE(qscriptvalue_cast<qint32>(str2), 0);

        QScriptValue str3 = QScriptValue("Infinity");
        QCOMPARE(str3.toInt32(), 0);
        QCOMPARE(qscriptvalue_cast<qint32>(str3), 0);

        QScriptValue str3_2 = QScriptValue("-Infinity");
        QCOMPARE(str3_2.toInt32(), 0);
        QCOMPARE(qscriptvalue_cast<qint32>(str3_2), 0);

        QScriptValue str4 = QScriptValue("0.5");
        QCOMPARE(str4.toInt32(), 0);
        QCOMPARE(qscriptvalue_cast<qint32>(str4), 0);

        QScriptValue str5 = QScriptValue("123.5");
        QCOMPARE(str5.toInt32(), 123);
        QCOMPARE(qscriptvalue_cast<qint32>(str5), 123);

        QScriptValue str6 = QScriptValue("-456.5");
        QCOMPARE(str6.toInt32(), -456);
        QCOMPARE(qscriptvalue_cast<qint32>(str6), -456);
    }

    QScriptValue inv;
    QCOMPARE(inv.toInt32(), 0);
    QCOMPARE(qscriptvalue_cast<qint32>(inv), 0);
}

void tst_QScriptValue::toUInt32()
{
    QScriptEngine eng;

    {
        QScriptValue zer0 = QScriptValue(&eng, 0.0);
        QCOMPARE(zer0.toUInt32(), quint32(0));
        QCOMPARE(qscriptvalue_cast<quint32>(zer0), quint32(0));

        QScriptValue number = QScriptValue(&eng, 123.0);
        QCOMPARE(number.toUInt32(), quint32(123));
        QCOMPARE(qscriptvalue_cast<quint32>(number), quint32(123));

        QScriptValue number2 = QScriptValue(&eng, qSNaN());
        QCOMPARE(number2.toUInt32(), quint32(0));
        QCOMPARE(qscriptvalue_cast<quint32>(number2), quint32(0));

        QScriptValue number3 = QScriptValue(&eng, +qInf());
        QCOMPARE(number3.toUInt32(), quint32(0));
        QCOMPARE(qscriptvalue_cast<quint32>(number3), quint32(0));

        QScriptValue number3_2 = QScriptValue(&eng, -qInf());
        QCOMPARE(number3_2.toUInt32(), quint32(0));
        QCOMPARE(qscriptvalue_cast<quint32>(number3_2), quint32(0));

        QScriptValue number4 = QScriptValue(&eng, 0.5);
        QCOMPARE(number4.toUInt32(), quint32(0));

        QScriptValue number5 = QScriptValue(&eng, 123.5);
        QCOMPARE(number5.toUInt32(), quint32(123));

        QScriptValue number6 = QScriptValue(&eng, -456.5);
        QCOMPARE(number6.toUInt32(), quint32(-456));
        QCOMPARE(qscriptvalue_cast<quint32>(number6), quint32(-456));

        QScriptValue str = QScriptValue(&eng, "123.0");
        QCOMPARE(str.toUInt32(), quint32(123));
        QCOMPARE(qscriptvalue_cast<quint32>(str), quint32(123));

        QScriptValue str2 = QScriptValue(&eng, "NaN");
        QCOMPARE(str2.toUInt32(), quint32(0));
        QCOMPARE(qscriptvalue_cast<quint32>(str2), quint32(0));

        QScriptValue str3 = QScriptValue(&eng, "Infinity");
        QCOMPARE(str3.toUInt32(), quint32(0));
        QCOMPARE(qscriptvalue_cast<quint32>(str3), quint32(0));

        QScriptValue str3_2 = QScriptValue(&eng, "-Infinity");
        QCOMPARE(str3_2.toUInt32(), quint32(0));
        QCOMPARE(qscriptvalue_cast<quint32>(str3_2), quint32(0));

        QScriptValue str4 = QScriptValue(&eng, "0.5");
        QCOMPARE(str4.toUInt32(), quint32(0));
        QCOMPARE(qscriptvalue_cast<quint32>(str4), quint32(0));

        QScriptValue str5 = QScriptValue(&eng, "123.5");
        QCOMPARE(str5.toUInt32(), quint32(123));
        QCOMPARE(qscriptvalue_cast<quint32>(str5), quint32(123));

        QScriptValue str6 = QScriptValue(&eng, "-456.5");
        QCOMPARE(str6.toUInt32(), quint32(-456));
        QCOMPARE(qscriptvalue_cast<quint32>(str6), quint32(-456));
    }
    // V2 constructors
    {
        QScriptValue zer0 = QScriptValue(0.0);
        QCOMPARE(zer0.toUInt32(), quint32(0));
        QCOMPARE(qscriptvalue_cast<quint32>(zer0), quint32(0));

        QScriptValue number = QScriptValue(123.0);
        QCOMPARE(number.toUInt32(), quint32(123));
        QCOMPARE(qscriptvalue_cast<quint32>(number), quint32(123));

        QScriptValue number2 = QScriptValue(qSNaN());
        QCOMPARE(number2.toUInt32(), quint32(0));
        QCOMPARE(qscriptvalue_cast<quint32>(number2), quint32(0));

        QScriptValue number3 = QScriptValue(+qInf());
        QCOMPARE(number3.toUInt32(), quint32(0));
        QCOMPARE(qscriptvalue_cast<quint32>(number3), quint32(0));

        QScriptValue number3_2 = QScriptValue(-qInf());
        QCOMPARE(number3_2.toUInt32(), quint32(0));
        QCOMPARE(qscriptvalue_cast<quint32>(number3_2), quint32(0));

        QScriptValue number4 = QScriptValue(0.5);
        QCOMPARE(number4.toUInt32(), quint32(0));

        QScriptValue number5 = QScriptValue(123.5);
        QCOMPARE(number5.toUInt32(), quint32(123));

        QScriptValue number6 = QScriptValue(-456.5);
        QCOMPARE(number6.toUInt32(), quint32(-456));
        QCOMPARE(qscriptvalue_cast<quint32>(number6), quint32(-456));

        QScriptValue number7 = QScriptValue(0x43211234);
        QCOMPARE(number7.toUInt32(), quint32(0x43211234));

        QScriptValue str = QScriptValue("123.0");
        QCOMPARE(str.toUInt32(), quint32(123));
        QCOMPARE(qscriptvalue_cast<quint32>(str), quint32(123));

        QScriptValue str2 = QScriptValue("NaN");
        QCOMPARE(str2.toUInt32(), quint32(0));
        QCOMPARE(qscriptvalue_cast<quint32>(str2), quint32(0));

        QScriptValue str3 = QScriptValue("Infinity");
        QCOMPARE(str3.toUInt32(), quint32(0));
        QCOMPARE(qscriptvalue_cast<quint32>(str3), quint32(0));

        QScriptValue str3_2 = QScriptValue("-Infinity");
        QCOMPARE(str3_2.toUInt32(), quint32(0));
        QCOMPARE(qscriptvalue_cast<quint32>(str3_2), quint32(0));

        QScriptValue str4 = QScriptValue("0.5");
        QCOMPARE(str4.toUInt32(), quint32(0));
        QCOMPARE(qscriptvalue_cast<quint32>(str4), quint32(0));

        QScriptValue str5 = QScriptValue("123.5");
        QCOMPARE(str5.toUInt32(), quint32(123));
        QCOMPARE(qscriptvalue_cast<quint32>(str5), quint32(123));

        QScriptValue str6 = QScriptValue("-456.5");
        QCOMPARE(str6.toUInt32(), quint32(-456));
        QCOMPARE(qscriptvalue_cast<quint32>(str6), quint32(-456));
    }

    QScriptValue inv;
    QCOMPARE(inv.toUInt32(), quint32(0));
    QCOMPARE(qscriptvalue_cast<quint32>(inv), quint32(0));
}

void tst_QScriptValue::toUInt16()
{
    QScriptEngine eng;

    {
        QScriptValue zer0 = QScriptValue(&eng, 0.0);
        QCOMPARE(zer0.toUInt16(), quint16(0));
        QCOMPARE(qscriptvalue_cast<quint16>(zer0), quint16(0));

        QScriptValue number = QScriptValue(&eng, 123.0);
        QCOMPARE(number.toUInt16(), quint16(123));
        QCOMPARE(qscriptvalue_cast<quint16>(number), quint16(123));

        QScriptValue number2 = QScriptValue(&eng, qSNaN());
        QCOMPARE(number2.toUInt16(), quint16(0));
        QCOMPARE(qscriptvalue_cast<quint16>(number2), quint16(0));

        QScriptValue number3 = QScriptValue(&eng, +qInf());
        QCOMPARE(number3.toUInt16(), quint16(0));
        QCOMPARE(qscriptvalue_cast<quint16>(number3), quint16(0));

        QScriptValue number3_2 = QScriptValue(&eng, -qInf());
        QCOMPARE(number3_2.toUInt16(), quint16(0));
        QCOMPARE(qscriptvalue_cast<quint16>(number3_2), quint16(0));

        QScriptValue number4 = QScriptValue(&eng, 0.5);
        QCOMPARE(number4.toUInt16(), quint16(0));

        QScriptValue number5 = QScriptValue(&eng, 123.5);
        QCOMPARE(number5.toUInt16(), quint16(123));

        QScriptValue number6 = QScriptValue(&eng, -456.5);
        QCOMPARE(number6.toUInt16(), quint16(-456));
        QCOMPARE(qscriptvalue_cast<quint16>(number6), quint16(-456));

        QScriptValue number7 = QScriptValue(&eng, 0x10000);
        QCOMPARE(number7.toUInt16(), quint16(0));
        QCOMPARE(qscriptvalue_cast<quint16>(number7), quint16(0));

        QScriptValue number8 = QScriptValue(&eng, 0x10001);
        QCOMPARE(number8.toUInt16(), quint16(1));
        QCOMPARE(qscriptvalue_cast<quint16>(number8), quint16(1));

        QScriptValue str = QScriptValue(&eng, "123.0");
        QCOMPARE(str.toUInt16(), quint16(123));
        QCOMPARE(qscriptvalue_cast<quint16>(str), quint16(123));

        QScriptValue str2 = QScriptValue(&eng, "NaN");
        QCOMPARE(str2.toUInt16(), quint16(0));
        QCOMPARE(qscriptvalue_cast<quint16>(str2), quint16(0));

        QScriptValue str3 = QScriptValue(&eng, "Infinity");
        QCOMPARE(str3.toUInt16(), quint16(0));
        QCOMPARE(qscriptvalue_cast<quint16>(str3), quint16(0));

        QScriptValue str3_2 = QScriptValue(&eng, "-Infinity");
        QCOMPARE(str3_2.toUInt16(), quint16(0));
        QCOMPARE(qscriptvalue_cast<quint16>(str3_2), quint16(0));

        QScriptValue str4 = QScriptValue(&eng, "0.5");
        QCOMPARE(str4.toUInt16(), quint16(0));

        QScriptValue str5 = QScriptValue(&eng, "123.5");
        QCOMPARE(str5.toUInt16(), quint16(123));

        QScriptValue str6 = QScriptValue(&eng, "-456.5");
        QCOMPARE(str6.toUInt16(), quint16(-456));
        QCOMPARE(qscriptvalue_cast<quint16>(str6), quint16(-456));

        QScriptValue str7 = QScriptValue(&eng, "0x10000");
        QCOMPARE(str7.toUInt16(), quint16(0));
        QCOMPARE(qscriptvalue_cast<quint16>(str7), quint16(0));

        QScriptValue str8 = QScriptValue(&eng, "0x10001");
        QCOMPARE(str8.toUInt16(), quint16(1));
        QCOMPARE(qscriptvalue_cast<quint16>(str8), quint16(1));
    }
    // V2 constructors
    {
        QScriptValue zer0 = QScriptValue(0.0);
        QCOMPARE(zer0.toUInt16(), quint16(0));
        QCOMPARE(qscriptvalue_cast<quint16>(zer0), quint16(0));

        QScriptValue number = QScriptValue(123.0);
        QCOMPARE(number.toUInt16(), quint16(123));
        QCOMPARE(qscriptvalue_cast<quint16>(number), quint16(123));

        QScriptValue number2 = QScriptValue(qSNaN());
        QCOMPARE(number2.toUInt16(), quint16(0));
        QCOMPARE(qscriptvalue_cast<quint16>(number2), quint16(0));

        QScriptValue number3 = QScriptValue(+qInf());
        QCOMPARE(number3.toUInt16(), quint16(0));
        QCOMPARE(qscriptvalue_cast<quint16>(number3), quint16(0));

        QScriptValue number3_2 = QScriptValue(-qInf());
        QCOMPARE(number3_2.toUInt16(), quint16(0));
        QCOMPARE(qscriptvalue_cast<quint16>(number3_2), quint16(0));

        QScriptValue number4 = QScriptValue(0.5);
        QCOMPARE(number4.toUInt16(), quint16(0));

        QScriptValue number5 = QScriptValue(123.5);
        QCOMPARE(number5.toUInt16(), quint16(123));

        QScriptValue number6 = QScriptValue(-456.5);
        QCOMPARE(number6.toUInt16(), quint16(-456));
        QCOMPARE(qscriptvalue_cast<quint16>(number6), quint16(-456));

        QScriptValue number7 = QScriptValue(0x10000);
        QCOMPARE(number7.toUInt16(), quint16(0));
        QCOMPARE(qscriptvalue_cast<quint16>(number7), quint16(0));

        QScriptValue number8 = QScriptValue(0x10001);
        QCOMPARE(number8.toUInt16(), quint16(1));
        QCOMPARE(qscriptvalue_cast<quint16>(number8), quint16(1));

        QScriptValue str = QScriptValue("123.0");
        QCOMPARE(str.toUInt16(), quint16(123));
        QCOMPARE(qscriptvalue_cast<quint16>(str), quint16(123));

        QScriptValue str2 = QScriptValue("NaN");
        QCOMPARE(str2.toUInt16(), quint16(0));
        QCOMPARE(qscriptvalue_cast<quint16>(str2), quint16(0));

        QScriptValue str3 = QScriptValue("Infinity");
        QCOMPARE(str3.toUInt16(), quint16(0));
        QCOMPARE(qscriptvalue_cast<quint16>(str3), quint16(0));

        QScriptValue str3_2 = QScriptValue("-Infinity");
        QCOMPARE(str3_2.toUInt16(), quint16(0));
        QCOMPARE(qscriptvalue_cast<quint16>(str3_2), quint16(0));

        QScriptValue str4 = QScriptValue("0.5");
        QCOMPARE(str4.toUInt16(), quint16(0));

        QScriptValue str5 = QScriptValue("123.5");
        QCOMPARE(str5.toUInt16(), quint16(123));

        QScriptValue str6 = QScriptValue("-456.5");
        QCOMPARE(str6.toUInt16(), quint16(-456));
        QCOMPARE(qscriptvalue_cast<quint16>(str6), quint16(-456));

        QScriptValue str7 = QScriptValue("0x10000");
        QCOMPARE(str7.toUInt16(), quint16(0));
        QCOMPARE(qscriptvalue_cast<quint16>(str7), quint16(0));

        QScriptValue str8 = QScriptValue("0x10001");
        QCOMPARE(str8.toUInt16(), quint16(1));
        QCOMPARE(qscriptvalue_cast<quint16>(str8), quint16(1));
    }

    QScriptValue inv;
    QCOMPARE(inv.toUInt16(), quint16(0));
    QCOMPARE(qscriptvalue_cast<quint16>(inv), quint16(0));
}

#if defined Q_CC_MSVC && _MSC_VER < 1300
Q_DECLARE_METATYPE(QVariant)
#endif

void tst_QScriptValue::toVariant()
{
    QScriptEngine eng;

    QScriptValue undefined = eng.undefinedValue();
    QCOMPARE(undefined.toVariant(), QVariant());
    QCOMPARE(qscriptvalue_cast<QVariant>(undefined), QVariant());

    QScriptValue null = eng.nullValue();
    QCOMPARE(null.toVariant(), QVariant());
    QCOMPARE(qscriptvalue_cast<QVariant>(null), QVariant());

    {
        QScriptValue number = QScriptValue(&eng, 123.0);
        QCOMPARE(number.toVariant(), QVariant(123.0));
        QCOMPARE(qscriptvalue_cast<QVariant>(number), QVariant(123.0));

        QScriptValue intNumber = QScriptValue(&eng, (qint32)123);
        QCOMPARE(intNumber.toVariant().type(), QVariant((qint32)123).type());
        QCOMPARE((qscriptvalue_cast<QVariant>(number)).type(), QVariant((qint32)123).type());

        QScriptValue falskt = QScriptValue(&eng, false);
        QCOMPARE(falskt.toVariant(), QVariant(false));
        QCOMPARE(qscriptvalue_cast<QVariant>(falskt), QVariant(false));

        QScriptValue sant = QScriptValue(&eng, true);
        QCOMPARE(sant.toVariant(), QVariant(true));
        QCOMPARE(qscriptvalue_cast<QVariant>(sant), QVariant(true));

        QScriptValue str = QScriptValue(&eng, QString("ciao"));
        QCOMPARE(str.toVariant(), QVariant(QString("ciao")));
        QCOMPARE(qscriptvalue_cast<QVariant>(str), QVariant(QString("ciao")));
    }

    QVariant var(QChar(0x007A));
    QScriptValue opaque = eng.newVariant(var);
    QVERIFY(opaque.isVariant());
    QCOMPARE(opaque.toVariant(), var);

    QScriptValue object = eng.newObject();
    QCOMPARE(object.toVariant(), QVariant(QVariantMap()));

    QScriptValue qobject = eng.newQObject(this);
    {
        QVariant var = qobject.toVariant();
        QCOMPARE(var.userType(), int(QMetaType::QObjectStar));
        QCOMPARE(qvariant_cast<QObject*>(var), (QObject *)this);
    }

    {
        QDateTime dateTime = QDateTime(QDate(1980, 10, 4));
        QScriptValue dateObject = eng.newDate(dateTime);
        QVariant var = dateObject.toVariant();
        QCOMPARE(var, QVariant(dateTime));
    }

    {
        QRegExp rx = QRegExp("[0-9a-z]+", Qt::CaseSensitive, QRegExp::RegExp2);
        QScriptValue rxObject = eng.newRegExp(rx);
        QVariant var = rxObject.toVariant();
        QCOMPARE(var, QVariant(rx));
    }

    QScriptValue inv;
    QCOMPARE(inv.toVariant(), QVariant());
    QCOMPARE(qscriptvalue_cast<QVariant>(inv), QVariant());

    // V2 constructors
    {
        QScriptValue number = QScriptValue(123.0);
        QCOMPARE(number.toVariant(), QVariant(123.0));
        QCOMPARE(qscriptvalue_cast<QVariant>(number), QVariant(123.0));

        QScriptValue falskt = QScriptValue(false);
        QCOMPARE(falskt.toVariant(), QVariant(false));
        QCOMPARE(qscriptvalue_cast<QVariant>(falskt), QVariant(false));

        QScriptValue sant = QScriptValue(true);
        QCOMPARE(sant.toVariant(), QVariant(true));
        QCOMPARE(qscriptvalue_cast<QVariant>(sant), QVariant(true));

        QScriptValue str = QScriptValue(QString("ciao"));
        QCOMPARE(str.toVariant(), QVariant(QString("ciao")));
        QCOMPARE(qscriptvalue_cast<QVariant>(str), QVariant(QString("ciao")));
    }

    // array
    {
        QVariantList listIn;
        listIn << 123 << "hello";
        QScriptValue array = qScriptValueFromValue(&eng, listIn);
        QVERIFY(array.isArray());
        QCOMPARE(array.property("length").toInt32(), 2);
        QVariant ret = array.toVariant();
        QCOMPARE(ret.type(), QVariant::List);
        QVariantList listOut = ret.toList();
        QCOMPARE(listOut.size(), listIn.size());
        for (int i = 0; i < listIn.size(); ++i)
            QVERIFY(listOut.at(i) == listIn.at(i));
        // round-trip conversion
        QScriptValue array2 = qScriptValueFromValue(&eng, ret);
        QVERIFY(array2.isArray());
        QCOMPARE(array2.property("length").toInt32(), array.property("length").toInt32());
        for (int i = 0; i < array.property("length").toInt32(); ++i)
            QVERIFY(array2.property(i).strictlyEquals(array.property(i)));
    }
}

void tst_QScriptValue::toQObject_nonQObject_data()
{
    newEngine();
    QTest::addColumn<QScriptValue>("value");

    QTest::newRow("invalid") << QScriptValue();
    QTest::newRow("bool(false)") << QScriptValue(false);
    QTest::newRow("bool(true)") << QScriptValue(true);
    QTest::newRow("int") << QScriptValue(123);
    QTest::newRow("string") << QScriptValue(QString::fromLatin1("ciao"));
    QTest::newRow("undefined") << QScriptValue(QScriptValue::UndefinedValue);
    QTest::newRow("null") << QScriptValue(QScriptValue::NullValue);

    QTest::newRow("bool bound(false)") << QScriptValue(engine, false);
    QTest::newRow("bool bound(true)") << QScriptValue(engine, true);
    QTest::newRow("int bound") << QScriptValue(engine, 123);
    QTest::newRow("string bound") << QScriptValue(engine, QString::fromLatin1("ciao"));
    QTest::newRow("undefined bound") << engine->undefinedValue();
    QTest::newRow("null bound") << engine->nullValue();
    QTest::newRow("object") << engine->newObject();
    QTest::newRow("array") << engine->newArray();
    QTest::newRow("date") << engine->newDate(124);
    QTest::newRow("variant(12345)") << engine->newVariant(12345);
    QTest::newRow("variant((QObject*)0)") << engine->newVariant(QVariant::fromValue((QObject*)0));
    QTest::newRow("newQObject(0)") << engine->newQObject(0);
}


void tst_QScriptValue::toQObject_nonQObject()
{
    QFETCH(QScriptValue, value);
    QCOMPARE(value.toQObject(), (QObject *)0);
    QCOMPARE(qscriptvalue_cast<QObject*>(value), (QObject *)0);
}

// unfortunately, this is necessary in order to do qscriptvalue_cast<QPushButton*>(...)
Q_DECLARE_METATYPE(QPushButton*);

void tst_QScriptValue::toQObject()
{
    QScriptEngine eng;

    QScriptValue qobject = eng.newQObject(this);
    QCOMPARE(qobject.toQObject(), (QObject *)this);
    QCOMPARE(qscriptvalue_cast<QObject*>(qobject), (QObject *)this);
    QCOMPARE(qscriptvalue_cast<QWidget*>(qobject), (QWidget *)0);

    QWidget widget;
    QScriptValue qwidget = eng.newQObject(&widget);
    QCOMPARE(qwidget.toQObject(), (QObject *)&widget);
    QCOMPARE(qscriptvalue_cast<QObject*>(qwidget), (QObject *)&widget);
    QCOMPARE(qscriptvalue_cast<QWidget*>(qwidget), &widget);

    QPushButton button;
    QScriptValue qbutton = eng.newQObject(&button);
    QCOMPARE(qbutton.toQObject(), (QObject *)&button);
    QCOMPARE(qscriptvalue_cast<QObject*>(qbutton), (QObject *)&button);
    QCOMPARE(qscriptvalue_cast<QWidget*>(qbutton), (QWidget *)&button);
    QCOMPARE(qscriptvalue_cast<QPushButton*>(qbutton), &button);

    // wrapping a QObject* as variant
    QScriptValue variant = eng.newVariant(QVariant::fromValue((QObject*)&button));
    QCOMPARE(variant.toQObject(), (QObject*)&button);
    QCOMPARE(qscriptvalue_cast<QObject*>(variant), (QObject*)&button);
    QCOMPARE(qscriptvalue_cast<QWidget*>(variant), (QWidget*)&button);
    QCOMPARE(qscriptvalue_cast<QPushButton*>(variant), &button);

    QScriptValue variant2 = eng.newVariant(QVariant::fromValue((QWidget*)&button));
    QCOMPARE(variant2.toQObject(), (QObject*)&button);
    QCOMPARE(qscriptvalue_cast<QObject*>(variant2), (QObject*)&button);
    QCOMPARE(qscriptvalue_cast<QWidget*>(variant2), (QWidget*)&button);
    QCOMPARE(qscriptvalue_cast<QPushButton*>(variant2), &button);

    QScriptValue variant3 = eng.newVariant(QVariant::fromValue(&button));
    QVERIFY(variant3.isQObject());
    QCOMPARE(variant3.toQObject(), (QObject*)&button);
    QCOMPARE(qscriptvalue_cast<QObject*>(variant3), (QObject*)&button);
    QCOMPARE(qscriptvalue_cast<QWidget*>(variant3), (QWidget*)&button);
    QCOMPARE(qscriptvalue_cast<QPushButton*>(variant3), &button);
}

void tst_QScriptValue::toObject()
{
    QScriptEngine eng;

    QScriptValue undefined = eng.undefinedValue();
    QCOMPARE(undefined.toObject().isValid(), false);
    QVERIFY(undefined.isUndefined());

    QScriptValue null = eng.nullValue();
    QCOMPARE(null.toObject().isValid(), false);
    QVERIFY(null.isNull());

    {
        QScriptValue falskt = QScriptValue(&eng, false);
        {
            QScriptValue tmp = falskt.toObject();
            QCOMPARE(tmp.isObject(), true);
            QCOMPARE(tmp.toNumber(), falskt.toNumber());
        }
        QVERIFY(falskt.isBool());

        QScriptValue sant = QScriptValue(&eng, true);
        {
            QScriptValue tmp = sant.toObject();
            QCOMPARE(tmp.isObject(), true);
            QCOMPARE(tmp.toNumber(), sant.toNumber());
        }
        QVERIFY(sant.isBool());

        QScriptValue number = QScriptValue(&eng, 123.0);
        {
            QScriptValue tmp = number.toObject();
            QCOMPARE(tmp.isObject(), true);
            QCOMPARE(tmp.toNumber(), number.toNumber());
        }
        QVERIFY(number.isNumber());

        QScriptValue str = QScriptValue(&eng, QString("ciao"));
        {
            QScriptValue tmp = str.toObject();
            QCOMPARE(tmp.isObject(), true);
            QCOMPARE(tmp.toString(), str.toString());
        }
        QVERIFY(str.isString());
    }

    QScriptValue object = eng.newObject();
    {
        QScriptValue tmp = object.toObject();
        QCOMPARE(tmp.isObject(), true);
    }

    QScriptValue qobject = eng.newQObject(this);
    QCOMPARE(qobject.toObject().isValid(), true);

    QScriptValue inv;
    QCOMPARE(inv.toObject().isValid(), false);

    // V2 constructors: in this case, you have to use QScriptEngine::toObject()
    {
        QScriptValue undefined = QScriptValue(QScriptValue::UndefinedValue);
        QVERIFY(!undefined.toObject().isValid());
        QVERIFY(!eng.toObject(undefined).isValid());
        QVERIFY(undefined.isUndefined());

        QScriptValue null = QScriptValue(QScriptValue::NullValue);
        QVERIFY(!null.toObject().isValid());
        QVERIFY(!eng.toObject(null).isValid());
        QVERIFY(null.isNull());

        QScriptValue falskt = QScriptValue(false);
        QVERIFY(!falskt.toObject().isValid());
        {
            QScriptValue tmp = eng.toObject(falskt);
            QVERIFY(tmp.isObject());
            QVERIFY(tmp.toBool());
        }
        QVERIFY(falskt.isBool());

        QScriptValue sant = QScriptValue(true);
        QVERIFY(!sant.toObject().isValid());
        {
            QScriptValue tmp = eng.toObject(sant);
            QVERIFY(tmp.isObject());
            QVERIFY(tmp.toBool());
        }
        QVERIFY(sant.isBool());

        QScriptValue number = QScriptValue(123.0);
        QVERIFY(!number.toObject().isValid());
        {
            QScriptValue tmp = eng.toObject(number);
            QVERIFY(tmp.isObject());
            QCOMPARE(tmp.toInt32(), number.toInt32());
        }
        QVERIFY(number.isNumber());

        QScriptValue str = QScriptValue(QString::fromLatin1("ciao"));
        QVERIFY(!str.toObject().isValid());
        {
            QScriptValue tmp = eng.toObject(str);
            QVERIFY(tmp.isObject());
            QCOMPARE(tmp.toString(), QString::fromLatin1("ciao"));
        }
        QVERIFY(str.isString());
    }
}

void tst_QScriptValue::toDateTime()
{
    QScriptEngine eng;
    QDateTime dt = eng.evaluate("new Date(0)").toDateTime();
    QVERIFY(dt.isValid());
    QCOMPARE(dt.timeSpec(), Qt::LocalTime);
    QCOMPARE(dt.toUTC(), QDateTime::fromMSecsSinceEpoch(0, Qt::UTC));

    QVERIFY(!eng.evaluate("[]").toDateTime().isValid());
    QVERIFY(!eng.evaluate("{}").toDateTime().isValid());
    QVERIFY(!eng.globalObject().toDateTime().isValid());
    QVERIFY(!QScriptValue().toDateTime().isValid());
    QVERIFY(!QScriptValue(123).toDateTime().isValid());
    QVERIFY(!QScriptValue(false).toDateTime().isValid());
    QVERIFY(!eng.nullValue().toDateTime().isValid());
    QVERIFY(!eng.undefinedValue().toDateTime().isValid());
}

void tst_QScriptValue::toRegExp()
{
    QScriptEngine eng;
    {
        QRegExp rx = eng.evaluate("/foo/").toRegExp();
        QVERIFY(rx.isValid());
        QCOMPARE(rx.patternSyntax(), QRegExp::RegExp2);
        QCOMPARE(rx.pattern(), QString::fromLatin1("foo"));
        QCOMPARE(rx.caseSensitivity(), Qt::CaseSensitive);
        QVERIFY(!rx.isMinimal());
    }
    {
        QRegExp rx = eng.evaluate("/bar/gi").toRegExp();
        QVERIFY(rx.isValid());
        QCOMPARE(rx.patternSyntax(), QRegExp::RegExp2);
        QCOMPARE(rx.pattern(), QString::fromLatin1("bar"));
        QCOMPARE(rx.caseSensitivity(), Qt::CaseInsensitive);
        QVERIFY(!rx.isMinimal());
    }

    QVERIFY(eng.evaluate("[]").toRegExp().isEmpty());
    QVERIFY(eng.evaluate("{}").toRegExp().isEmpty());
    QVERIFY(eng.globalObject().toRegExp().isEmpty());
    QVERIFY(QScriptValue().toRegExp().isEmpty());
    QVERIFY(QScriptValue(123).toRegExp().isEmpty());
    QVERIFY(QScriptValue(false).toRegExp().isEmpty());
    QVERIFY(eng.nullValue().toRegExp().isEmpty());
    QVERIFY(eng.undefinedValue().toRegExp().isEmpty());
}

void tst_QScriptValue::instanceOf_twoEngines()
{
    QScriptEngine eng;
    QScriptValue obj = eng.newObject();
    QScriptEngine otherEngine;
    QTest::ignoreMessage(QtWarningMsg, "QScriptValue::instanceof: cannot perform operation on a value created in a different engine");
    QCOMPARE(obj.instanceOf(otherEngine.globalObject().property("Object")), false);
}

void tst_QScriptValue::instanceOf()
{
    QScriptEngine eng;
    QScriptValue obj = eng.newObject();
    QCOMPARE(obj.instanceOf(eng.evaluate("Object.prototype")), false);
    QCOMPARE(obj.instanceOf(eng.evaluate("Array.prototype")), false);
    QCOMPARE(obj.instanceOf(eng.evaluate("Function.prototype")), false);
    QCOMPARE(obj.instanceOf(eng.evaluate("QObject.prototype")), false);
    QCOMPARE(obj.instanceOf(QScriptValue(&eng, 123)), false);
    QCOMPARE(obj.instanceOf(eng.undefinedValue()), false);
    QCOMPARE(obj.instanceOf(eng.nullValue()), false);
    QCOMPARE(obj.instanceOf(QScriptValue()), false);

    QCOMPARE(obj.instanceOf(eng.evaluate("Object")), true);
    QCOMPARE(obj.instanceOf(eng.evaluate("Array")), false);
    QCOMPARE(obj.instanceOf(eng.evaluate("Function")), false);
    QCOMPARE(obj.instanceOf(eng.evaluate("QObject")), false);

    QScriptValue arr = eng.newArray();
    QVERIFY(arr.isArray());
    QCOMPARE(arr.instanceOf(eng.evaluate("Object.prototype")), false);
    QCOMPARE(arr.instanceOf(eng.evaluate("Array.prototype")), false);
    QCOMPARE(arr.instanceOf(eng.evaluate("Function.prototype")), false);
    QCOMPARE(arr.instanceOf(eng.evaluate("QObject.prototype")), false);
    QCOMPARE(arr.instanceOf(eng.evaluate("Object")), true);
    QCOMPARE(arr.instanceOf(eng.evaluate("Array")), true);
    QCOMPARE(arr.instanceOf(eng.evaluate("Function")), false);
    QCOMPARE(arr.instanceOf(eng.evaluate("QObject")), false);

    QCOMPARE(QScriptValue().instanceOf(arr), false);
}

void tst_QScriptValue::isArray_data()
{
    newEngine();

    QTest::addColumn<QScriptValue>("value");
    QTest::addColumn<bool>("array");

    QTest::newRow("[]") << engine->evaluate("[]") << true;
    QTest::newRow("{}") << engine->evaluate("{}") << false;
    QTest::newRow("globalObject") << engine->globalObject() << false;
    QTest::newRow("invalid") << QScriptValue() << false;
    QTest::newRow("number") << QScriptValue(123) << false;
    QTest::newRow("bool") << QScriptValue(false) << false;
    QTest::newRow("null") << engine->nullValue() << false;
    QTest::newRow("undefined") << engine->undefinedValue() << false;
}

void tst_QScriptValue::isArray()
{
    QFETCH(QScriptValue, value);
    QFETCH(bool, array);

    QCOMPARE(value.isArray(), array);
}

void tst_QScriptValue::isDate_data()
{
    newEngine();

    QTest::addColumn<QScriptValue>("value");
    QTest::addColumn<bool>("date");

    QTest::newRow("date") << engine->evaluate("new Date()") << true;
    QTest::newRow("[]") << engine->evaluate("[]") << false;
    QTest::newRow("{}") << engine->evaluate("{}") << false;
    QTest::newRow("globalObject") << engine->globalObject() << false;
    QTest::newRow("invalid") << QScriptValue() << false;
    QTest::newRow("number") << QScriptValue(123) << false;
    QTest::newRow("bool") << QScriptValue(false) << false;
    QTest::newRow("null") << engine->nullValue() << false;
    QTest::newRow("undefined") << engine->undefinedValue() << false;
}

void tst_QScriptValue::isDate()
{
    QFETCH(QScriptValue, value);
    QFETCH(bool, date);

    QCOMPARE(value.isDate(), date);
}

void tst_QScriptValue::isError_propertiesOfGlobalObject()
{
    QStringList errors;
    errors << "Error"
           << "EvalError"
           << "RangeError"
           << "ReferenceError"
           << "SyntaxError"
           << "TypeError"
           << "URIError";
    QScriptEngine eng;
    for (int i = 0; i < errors.size(); ++i) {
        QScriptValue ctor = eng.globalObject().property(errors.at(i));
        QVERIFY(ctor.isFunction());
        QVERIFY(ctor.property("prototype").isError());
    }
}

void tst_QScriptValue::isError_data()
{
    newEngine();

    QTest::addColumn<QScriptValue>("value");
    QTest::addColumn<bool>("error");

    QTest::newRow("syntax error") << engine->evaluate("%fsdg's") << true;
    QTest::newRow("[]") << engine->evaluate("[]") << false;
    QTest::newRow("{}") << engine->evaluate("{}") << false;
    QTest::newRow("globalObject") << engine->globalObject() << false;
    QTest::newRow("invalid") << QScriptValue() << false;
    QTest::newRow("number") << QScriptValue(123) << false;
    QTest::newRow("bool") << QScriptValue(false) << false;
    QTest::newRow("null") << engine->nullValue() << false;
    QTest::newRow("undefined") << engine->undefinedValue() << false;
    QTest::newRow("newObject") << engine->newObject() << false;
    QTest::newRow("new Object") << engine->evaluate("new Object()") << false;
}

void tst_QScriptValue::isError()
{
    QFETCH(QScriptValue, value);
    QFETCH(bool, error);

    QCOMPARE(value.isError(), error);
}

void tst_QScriptValue::isRegExp_data()
{
    newEngine();

    QTest::addColumn<QScriptValue>("value");
    QTest::addColumn<bool>("regexp");

    QTest::newRow("/foo/") << engine->evaluate("/foo/") << true;
    QTest::newRow("[]") << engine->evaluate("[]") << false;
    QTest::newRow("{}") << engine->evaluate("{}") << false;
    QTest::newRow("globalObject") << engine->globalObject() << false;
    QTest::newRow("invalid") << QScriptValue() << false;
    QTest::newRow("number") << QScriptValue(123) << false;
    QTest::newRow("bool") << QScriptValue(false) << false;
    QTest::newRow("null") << engine->nullValue() << false;
    QTest::newRow("undefined") << engine->undefinedValue() << false;
}

void tst_QScriptValue::isRegExp()
{
    QFETCH(QScriptValue, value);
    QFETCH(bool, regexp);

    QCOMPARE(value.isRegExp(), regexp);
}

static QScriptValue getter(QScriptContext *ctx, QScriptEngine *)
{
    return ctx->thisObject().property("x");
}

static QScriptValue setter(QScriptContext *ctx, QScriptEngine *)
{
    ctx->thisObject().setProperty("x", ctx->argument(0));
    return ctx->argument(0);
}

static QScriptValue getterSetter(QScriptContext *ctx, QScriptEngine *)
{
    if (ctx->argumentCount() > 0)
        ctx->thisObject().setProperty("x", ctx->argument(0));
    return ctx->thisObject().property("x");
}

static QScriptValue getterSetterThrowingError(QScriptContext *ctx, QScriptEngine *)
{
    if (ctx->argumentCount() > 0)
        return ctx->throwError("set foo");
    else
        return ctx->throwError("get foo");
}

static QScriptValue getSet__proto__(QScriptContext *ctx, QScriptEngine *)
{
    if (ctx->argumentCount() > 0)
        ctx->callee().setProperty("value", ctx->argument(0));
    return ctx->callee().property("value");
}

void tst_QScriptValue::getSetProperty_HooliganTask162051()
{
    QScriptEngine eng;
    // task 162051 -- detecting whether the property is an array index or not
    QVERIFY(eng.evaluate("a = []; a['00'] = 123; a['00']").strictlyEquals(QScriptValue(&eng, 123)));
    QVERIFY(eng.evaluate("a.length").strictlyEquals(QScriptValue(&eng, 0)));
    QVERIFY(eng.evaluate("a.hasOwnProperty('00')").strictlyEquals(QScriptValue(&eng, true)));
    QVERIFY(eng.evaluate("a.hasOwnProperty('0')").strictlyEquals(QScriptValue(&eng, false)));
    QVERIFY(eng.evaluate("a[0]").isUndefined());
    QVERIFY(eng.evaluate("a[0.5] = 456; a[0.5]").strictlyEquals(QScriptValue(&eng, 456)));
    QVERIFY(eng.evaluate("a.length").strictlyEquals(QScriptValue(&eng, 0)));
    QVERIFY(eng.evaluate("a.hasOwnProperty('0.5')").strictlyEquals(QScriptValue(&eng, true)));
    QVERIFY(eng.evaluate("a[0]").isUndefined());
    QVERIFY(eng.evaluate("a[0] = 789; a[0]").strictlyEquals(QScriptValue(&eng, 789)));
    QVERIFY(eng.evaluate("a.length").strictlyEquals(QScriptValue(&eng, 1)));
}

void tst_QScriptValue::getSetProperty_HooliganTask183072()
{
    QScriptEngine eng;
    // task 183072 -- 0x800000000 is not an array index
    eng.evaluate("a = []; a[0x800000000] = 123");
    QVERIFY(eng.evaluate("a.length").strictlyEquals(QScriptValue(&eng, 0)));
    QVERIFY(eng.evaluate("a[0]").isUndefined());
    QVERIFY(eng.evaluate("a[0x800000000]").strictlyEquals(QScriptValue(&eng, 123)));
}

void tst_QScriptValue::getSetProperty_propertyRemoval()
{
    // test property removal (setProperty(QScriptValue()))
    QScriptEngine eng;
    QScriptValue object = eng.newObject();
    QScriptValue str = QScriptValue(&eng, "bar");
    QScriptValue num = QScriptValue(&eng, 123.0);

    object.setProperty("foo", num);
    QCOMPARE(object.property("foo").strictlyEquals(num), true);
    object.setProperty("bar", str);
    QCOMPARE(object.property("bar").strictlyEquals(str), true);
    object.setProperty("foo", QScriptValue());
    QCOMPARE(object.property("foo").isValid(), false);
    QCOMPARE(object.property("bar").strictlyEquals(str), true);
    object.setProperty("foo", num);
    QCOMPARE(object.property("foo").strictlyEquals(num), true);
    QCOMPARE(object.property("bar").strictlyEquals(str), true);
    object.setProperty("bar", QScriptValue());
    QCOMPARE(object.property("bar").isValid(), false);
    QCOMPARE(object.property("foo").strictlyEquals(num), true);
    object.setProperty("foo", QScriptValue());
    object.setProperty("foo", QScriptValue());

    eng.globalObject().setProperty("object3", object);
    QCOMPARE(eng.evaluate("object3.hasOwnProperty('foo')")
             .strictlyEquals(QScriptValue(&eng, false)), true);
    object.setProperty("foo", num);
    QCOMPARE(eng.evaluate("object3.hasOwnProperty('foo')")
             .strictlyEquals(QScriptValue(&eng, true)), true);
    eng.globalObject().setProperty("object3", QScriptValue());
    QCOMPARE(eng.evaluate("this.hasOwnProperty('object3')")
             .strictlyEquals(QScriptValue(&eng, false)), true);
}

void tst_QScriptValue::getSetProperty_resolveMode()
{
    // test ResolveMode
    QScriptEngine eng;
    QScriptValue object = eng.newObject();
    QScriptValue prototype = eng.newObject();
    object.setPrototype(prototype);
    QScriptValue num2 = QScriptValue(&eng, 456.0);
    prototype.setProperty("propertyInPrototype", num2);
    // default is ResolvePrototype
    QCOMPARE(object.property("propertyInPrototype")
             .strictlyEquals(num2), true);
    QCOMPARE(object.property("propertyInPrototype", QScriptValue::ResolvePrototype)
             .strictlyEquals(num2), true);
    QCOMPARE(object.property("propertyInPrototype", QScriptValue::ResolveLocal)
             .isValid(), false);
    QCOMPARE(object.property("propertyInPrototype", QScriptValue::ResolveScope)
             .strictlyEquals(num2), false);
    QCOMPARE(object.property("propertyInPrototype", QScriptValue::ResolveFull)
             .strictlyEquals(num2), true);
}

void tst_QScriptValue::getSetProperty_twoEngines()
{
    QScriptEngine engine;
    QScriptValue object = engine.newObject();

    QScriptEngine otherEngine;
    QScriptValue otherNum = QScriptValue(&otherEngine, 123);
    QTest::ignoreMessage(QtWarningMsg, "QScriptValue::setProperty(oof) failed: cannot set value created in a different engine");
    object.setProperty("oof", otherNum);
    QCOMPARE(object.property("oof").isValid(), false);
}


void tst_QScriptValue::getSetProperty_gettersAndSetters()
{
    QScriptEngine eng;
    QScriptValue str = QScriptValue(&eng, "bar");
    QScriptValue num = QScriptValue(&eng, 123.0);
    QScriptValue object = eng.newObject();
    for (int x = 0; x < 2; ++x) {
        object.setProperty("foo", QScriptValue());
        // getter() returns this.x
        object.setProperty("foo", eng.newFunction(getter),
                            QScriptValue::PropertyGetter | QScriptValue::UserRange);
        QCOMPARE(object.propertyFlags("foo") & ~QScriptValue::UserRange,
                 QScriptValue::PropertyGetter );

        QEXPECT_FAIL("", "QTBUG-17615: User-range flags are not retained for getter/setter properties", Continue);
        QCOMPARE(object.propertyFlags("foo"),
                 QScriptValue::PropertyGetter | QScriptValue::UserRange);
        object.setProperty("x", num);
        QCOMPARE(object.property("foo").strictlyEquals(num), true);

        // setter() sets this.x
        object.setProperty("foo", eng.newFunction(setter),
                            QScriptValue::PropertySetter);
        QCOMPARE(object.propertyFlags("foo") & ~QScriptValue::UserRange,
                 QScriptValue::PropertySetter | QScriptValue::PropertyGetter);

        QCOMPARE(object.propertyFlags("foo"),
                 QScriptValue::PropertySetter | QScriptValue::PropertyGetter);
        object.setProperty("foo", str);
        QCOMPARE(object.property("x").strictlyEquals(str), true);
        QCOMPARE(object.property("foo").strictlyEquals(str), true);

        // kill the getter
        object.setProperty("foo", QScriptValue(), QScriptValue::PropertyGetter);
        QVERIFY(!(object.propertyFlags("foo") & QScriptValue::PropertyGetter));
        QVERIFY(object.propertyFlags("foo") & QScriptValue::PropertySetter);
        QCOMPARE(object.property("foo").isUndefined(), true);

        // setter should still work
        object.setProperty("foo", num);
        QCOMPARE(object.property("x").strictlyEquals(num), true);

        // kill the setter too
        object.setProperty("foo", QScriptValue(), QScriptValue::PropertySetter);
        QVERIFY(!(object.propertyFlags("foo") & QScriptValue::PropertySetter));
        // now foo is just a regular property
        object.setProperty("foo", str);
        QCOMPARE(object.property("x").strictlyEquals(num), true);
        QCOMPARE(object.property("foo").strictlyEquals(str), true);
    }

    for (int x = 0; x < 2; ++x) {
        object.setProperty("foo", QScriptValue());
        // setter() sets this.x
        object.setProperty("foo", eng.newFunction(setter), QScriptValue::PropertySetter);
        object.setProperty("foo", str);
        QCOMPARE(object.property("x").strictlyEquals(str), true);
        QCOMPARE(object.property("foo").isUndefined(), true);

        // getter() returns this.x
        object.setProperty("foo", eng.newFunction(getter), QScriptValue::PropertyGetter);
        object.setProperty("x", num);
        QCOMPARE(object.property("foo").strictlyEquals(num), true);

        // kill the setter
        object.setProperty("foo", QScriptValue(), QScriptValue::PropertySetter);
        QTest::ignoreMessage(QtWarningMsg, "QScriptValue::setProperty() failed: property 'foo' has a getter but no setter");
        object.setProperty("foo", str);

        // getter should still work
        QCOMPARE(object.property("foo").strictlyEquals(num), true);

        // kill the getter too
        object.setProperty("foo", QScriptValue(), QScriptValue::PropertyGetter);
        // now foo is just a regular property
        object.setProperty("foo", str);
        QCOMPARE(object.property("x").strictlyEquals(num), true);
        QCOMPARE(object.property("foo").strictlyEquals(str), true);
    }

    // use a single function as both getter and setter
    object.setProperty("foo", QScriptValue());
    object.setProperty("foo", eng.newFunction(getterSetter),
                        QScriptValue::PropertyGetter | QScriptValue::PropertySetter);
    QCOMPARE(object.propertyFlags("foo"),
             QScriptValue::PropertyGetter | QScriptValue::PropertySetter);
    object.setProperty("x", num);
    QCOMPARE(object.property("foo").strictlyEquals(num), true);

    // killing the getter will preserve the setter, even though they are the same function
    object.setProperty("foo", QScriptValue(), QScriptValue::PropertyGetter);
    QVERIFY(object.propertyFlags("foo") & QScriptValue::PropertySetter);
    QCOMPARE(object.property("foo").isUndefined(), true);
}

void tst_QScriptValue::getSetProperty_gettersAndSettersThrowErrorNative()
{
    // getter/setter that throws an error
    QScriptEngine eng;
    QScriptValue str = QScriptValue(&eng, "bar");
    QScriptValue object = eng.newObject();

    object.setProperty("foo", eng.newFunction(getterSetterThrowingError),
                        QScriptValue::PropertyGetter | QScriptValue::PropertySetter);
    QVERIFY(!eng.hasUncaughtException());
    QScriptValue ret = object.property("foo");
    QVERIFY(ret.isError());
    QVERIFY(eng.hasUncaughtException());
    QVERIFY(ret.strictlyEquals(eng.uncaughtException()));
    QCOMPARE(ret.toString(), QLatin1String("Error: get foo"));
    eng.evaluate("Object"); // clear exception state...
    QVERIFY(!eng.hasUncaughtException());
    object.setProperty("foo", str);
    QVERIFY(eng.hasUncaughtException());
    QCOMPARE(eng.uncaughtException().toString(), QLatin1String("Error: set foo"));
}

void tst_QScriptValue::getSetProperty_gettersAndSettersThrowErrorJS()
{
    // getter/setter that throws an error (from js function)
    QScriptEngine eng;
    QScriptValue str = QScriptValue(&eng, "bar");

    eng.evaluate("o = new Object; "
                 "o.__defineGetter__('foo', function() { throw new Error('get foo') }); "
                 "o.__defineSetter__('foo', function() { throw new Error('set foo') }); ");
    QScriptValue object = eng.evaluate("o");
    QVERIFY(!eng.hasUncaughtException());
    QScriptValue ret = object.property("foo");
    QEXPECT_FAIL("", "QTBUG-17616: Exception thrown from js function are not returned by the JSC port", Continue);
    QVERIFY(ret.isError());
    QVERIFY(eng.hasUncaughtException());
    QEXPECT_FAIL("", "QTBUG-17616: Exception thrown from js function are not returned by the JSC port", Continue);
    QVERIFY(ret.strictlyEquals(eng.uncaughtException()));
    QCOMPARE(eng.uncaughtException().toString(), QLatin1String("Error: get foo"));
    eng.evaluate("Object"); // clear exception state...
    QVERIFY(!eng.hasUncaughtException());
    object.setProperty("foo", str);
    QVERIFY(eng.hasUncaughtException());
    QCOMPARE(eng.uncaughtException().toString(), QLatin1String("Error: set foo"));
}

void tst_QScriptValue::getSetProperty_gettersAndSettersOnNative()
{
    // attempt to install getter+setter on built-in (native) property
    QScriptEngine eng;
    QScriptValue object = eng.newObject();
    QVERIFY(object.property("__proto__").strictlyEquals(object.prototype()));

    QScriptValue fun = eng.newFunction(getSet__proto__);
    fun.setProperty("value", QScriptValue(&eng, "boo"));
    QTest::ignoreMessage(QtWarningMsg, "QScriptValue::setProperty() failed: "
                         "cannot set getter or setter of native property "
                         "`__proto__'");
    object.setProperty("__proto__", fun,
                        QScriptValue::PropertyGetter | QScriptValue::PropertySetter
                        | QScriptValue::UserRange);
    QVERIFY(object.property("__proto__").strictlyEquals(object.prototype()));

    object.setProperty("__proto__", QScriptValue(),
                        QScriptValue::PropertyGetter | QScriptValue::PropertySetter);
    QVERIFY(object.property("__proto__").strictlyEquals(object.prototype()));
}

void tst_QScriptValue::getSetProperty_gettersAndSettersOnGlobalObject()
{
    // global property that's a getter+setter
    QScriptEngine eng;
    eng.globalObject().setProperty("globalGetterSetterProperty", eng.newFunction(getterSetter),
                                   QScriptValue::PropertyGetter | QScriptValue::PropertySetter);
    eng.evaluate("globalGetterSetterProperty = 123");
    {
        QScriptValue ret = eng.evaluate("globalGetterSetterProperty");
        QVERIFY(ret.isNumber());
        QVERIFY(ret.strictlyEquals(QScriptValue(&eng, 123)));
    }
    QCOMPARE(eng.evaluate("typeof globalGetterSetterProperty").toString(),
             QString::fromLatin1("number"));
    {
        QScriptValue ret = eng.evaluate("this.globalGetterSetterProperty()");
        QVERIFY(ret.isError());
        QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'this.globalGetterSetterProperty' [123] is not a function."));
    }
    {
        QScriptValue ret = eng.evaluate("new this.globalGetterSetterProperty()");
        QVERIFY(ret.isError());
        QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'this.globalGetterSetterProperty' [123] is not a constructor."));
    }
}

void tst_QScriptValue::getSetProperty_gettersAndSettersChange()
{
    // "upgrading" an existing property to become a getter+setter
    QScriptEngine eng;
    QScriptValue object = eng.newObject();
    QScriptValue num(&eng, 123);
    object.setProperty("foo", num);
    object.setProperty("foo", eng.newFunction(getterSetter),
                        QScriptValue::PropertyGetter | QScriptValue::PropertySetter);
    QVERIFY(!object.property("x").isValid());
    object.setProperty("foo", num);
    QVERIFY(object.property("x").equals(num));

    eng.globalObject().setProperty("object", object);
    QScriptValue res = eng.evaluate("object.x = 89; var a = object.foo; object.foo = 65; a");
    QCOMPARE(res.toInt32(), 89);
    QCOMPARE(object.property("x").toInt32(), 65);
    QCOMPARE(object.property("foo").toInt32(), 65);
}

void tst_QScriptValue::getSetProperty_array()
{
    QScriptEngine eng;
    QScriptValue str = QScriptValue(&eng, "bar");
    QScriptValue num = QScriptValue(&eng, 123.0);
    QScriptValue array = eng.newArray();

    QVERIFY(array.isArray());
    array.setProperty(0, num);
    QCOMPARE(array.property(0).toNumber(), num.toNumber());
    QCOMPARE(array.property("0").toNumber(), num.toNumber());
    QCOMPARE(array.property("length").toUInt32(), quint32(1));
    array.setProperty(1, str);
    QCOMPARE(array.property(1).toString(), str.toString());
    QCOMPARE(array.property("1").toString(), str.toString());
    QCOMPARE(array.property("length").toUInt32(), quint32(2));
    array.setProperty("length", QScriptValue(&eng, 1));
    QCOMPARE(array.property("length").toUInt32(), quint32(1));
    QCOMPARE(array.property(1).isValid(), false);
}

void tst_QScriptValue::getSetProperty()
{
    QScriptEngine eng;

    QScriptValue object = eng.newObject();

    QScriptValue str = QScriptValue(&eng, "bar");
    object.setProperty("foo", str);
    QCOMPARE(object.property("foo").toString(), str.toString());

    QScriptValue num = QScriptValue(&eng, 123.0);
    object.setProperty("baz", num);
    QCOMPARE(object.property("baz").toNumber(), num.toNumber());

    QScriptValue strstr = QScriptValue("bar");
    QCOMPARE(strstr.engine(), (QScriptEngine *)0);
    object.setProperty("foo", strstr);
    QCOMPARE(object.property("foo").toString(), strstr.toString());
    QCOMPARE(strstr.engine(), &eng); // the value has been bound to the engine

    QScriptValue numnum = QScriptValue(123.0);
    object.setProperty("baz", numnum);
    QCOMPARE(object.property("baz").toNumber(), numnum.toNumber());

    QScriptValue inv;
    inv.setProperty("foo", num);
    QCOMPARE(inv.property("foo").isValid(), false);

    eng.globalObject().setProperty("object", object);

  // ReadOnly
    object.setProperty("readOnlyProperty", num, QScriptValue::ReadOnly);
    QCOMPARE(object.propertyFlags("readOnlyProperty"), QScriptValue::ReadOnly);
    QCOMPARE(object.property("readOnlyProperty").strictlyEquals(num), true);
    eng.evaluate("object.readOnlyProperty = !object.readOnlyProperty");
    QCOMPARE(object.property("readOnlyProperty").strictlyEquals(num), true);
    // should still be part of enumeration
    {
        QScriptValue ret = eng.evaluate(
            "found = false;"
            "for (var p in object) {"
            "  if (p == 'readOnlyProperty') {"
            "    found = true; break;"
            "  }"
            "} found");
        QCOMPARE(ret.strictlyEquals(QScriptValue(&eng, true)), true);
    }
    // should still be deletable
    {
        QScriptValue ret = eng.evaluate("delete object.readOnlyProperty");
        QCOMPARE(ret.strictlyEquals(QScriptValue(&eng, true)), true);
        QCOMPARE(object.property("readOnlyProperty").isValid(), false);
    }

  // Undeletable
    object.setProperty("undeletableProperty", num, QScriptValue::Undeletable);
    QCOMPARE(object.propertyFlags("undeletableProperty"), QScriptValue::Undeletable);
    QCOMPARE(object.property("undeletableProperty").strictlyEquals(num), true);
    {
        QScriptValue ret = eng.evaluate("delete object.undeletableProperty");
        QCOMPARE(ret.strictlyEquals(QScriptValue(&eng, true)), false);
        QCOMPARE(object.property("undeletableProperty").strictlyEquals(num), true);
    }
    // should still be writable
    eng.evaluate("object.undeletableProperty = object.undeletableProperty + 1");
    QCOMPARE(object.property("undeletableProperty").toNumber(), num.toNumber() + 1);
    // should still be part of enumeration
    {
        QScriptValue ret = eng.evaluate(
            "found = false;"
            "for (var p in object) {"
            "  if (p == 'undeletableProperty') {"
            "    found = true; break;"
            "  }"
            "} found");
        QCOMPARE(ret.strictlyEquals(QScriptValue(&eng, true)), true);
    }
    // should still be deletable from C++
    object.setProperty("undeletableProperty", QScriptValue());
    QEXPECT_FAIL("", "QTBUG-17617: With JSC-based back-end, undeletable properties can't be deleted from C++", Continue);
    QVERIFY(!object.property("undeletableProperty").isValid());
    QEXPECT_FAIL("", "QTBUG-17617: With JSC-based back-end, undeletable properties can't be deleted from C++", Continue);
    QCOMPARE(object.propertyFlags("undeletableProperty"), 0);

  // SkipInEnumeration
    object.setProperty("dontEnumProperty", num, QScriptValue::SkipInEnumeration);
    QCOMPARE(object.propertyFlags("dontEnumProperty"), QScriptValue::SkipInEnumeration);
    QCOMPARE(object.property("dontEnumProperty").strictlyEquals(num), true);
    // should not be part of enumeration
    {
        QScriptValue ret = eng.evaluate(
            "found = false;"
            "for (var p in object) {"
            "  if (p == 'dontEnumProperty') {"
            "    found = true; break;"
            "  }"
            "} found");
        QCOMPARE(ret.strictlyEquals(QScriptValue(&eng, false)), true);
    }
    // should still be writable
    eng.evaluate("object.dontEnumProperty = object.dontEnumProperty + 1");
    QCOMPARE(object.property("dontEnumProperty").toNumber(), num.toNumber() + 1);
    // should still be deletable
    {
        QScriptValue ret = eng.evaluate("delete object.dontEnumProperty");
        QCOMPARE(ret.strictlyEquals(QScriptValue(&eng, true)), true);
        QCOMPARE(object.property("dontEnumProperty").isValid(), false);
    }

    // change flags
    object.setProperty("flagProperty", str);
    QCOMPARE(object.propertyFlags("flagProperty"), static_cast<QScriptValue::PropertyFlags>(0));

    object.setProperty("flagProperty", str, QScriptValue::ReadOnly);
    QCOMPARE(object.propertyFlags("flagProperty"), QScriptValue::ReadOnly);

    object.setProperty("flagProperty", str, object.propertyFlags("flagProperty") | QScriptValue::SkipInEnumeration);
    QCOMPARE(object.propertyFlags("flagProperty"), QScriptValue::ReadOnly | QScriptValue::SkipInEnumeration);

    object.setProperty("flagProperty", str, QScriptValue::KeepExistingFlags);
    QCOMPARE(object.propertyFlags("flagProperty"), QScriptValue::ReadOnly | QScriptValue::SkipInEnumeration);

    object.setProperty("flagProperty", str, QScriptValue::UserRange);
    QCOMPARE(object.propertyFlags("flagProperty"), QScriptValue::UserRange);

    // flags of property in the prototype
    {
        QScriptValue object2 = eng.newObject();
        object2.setPrototype(object);
        QCOMPARE(object2.propertyFlags("flagProperty", QScriptValue::ResolveLocal), 0);
        QCOMPARE(object2.propertyFlags("flagProperty"), QScriptValue::UserRange);
    }

    // using interned strings
    QScriptString foo = eng.toStringHandle("foo");

    object.setProperty(foo, QScriptValue());
    QVERIFY(!object.property(foo).isValid());

    object.setProperty(foo, num);
    QVERIFY(object.property(foo).strictlyEquals(num));
    QVERIFY(object.property("foo").strictlyEquals(num));
    QVERIFY(object.propertyFlags(foo) == 0);

    // Setting index property on non-Array
    object.setProperty(13, num);
    QVERIFY(object.property(13).equals(num));
}

void tst_QScriptValue::arrayElementGetterSetter()
{
    QScriptEngine eng;
    QScriptValue obj = eng.newObject();
    obj.setProperty(1, eng.newFunction(getterSetter), QScriptValue::PropertyGetter|QScriptValue::PropertySetter);
    {
        QScriptValue num(123);
        obj.setProperty("x", num);
        QScriptValue ret = obj.property(1);
        QVERIFY(ret.isValid());
        QVERIFY(ret.equals(num));
    }
    {
        QScriptValue num(456);
        obj.setProperty(1, num);
        QScriptValue ret = obj.property(1);
        QVERIFY(ret.isValid());
        QVERIFY(ret.equals(num));
        QVERIFY(ret.equals(obj.property("1")));
    }
    QCOMPARE(obj.propertyFlags("1"), QScriptValue::PropertyGetter|QScriptValue::PropertySetter);

    obj.setProperty(1, QScriptValue(), QScriptValue::PropertyGetter|QScriptValue::PropertySetter);
    QVERIFY(obj.propertyFlags("1") == 0);
}

void tst_QScriptValue::getSetPrototype_cyclicPrototype()
{
    QScriptEngine eng;
    QScriptValue prototype = eng.newObject();
    QScriptValue object = eng.newObject();
    object.setPrototype(prototype);

    QScriptValue previousPrototype = prototype.prototype();
    QTest::ignoreMessage(QtWarningMsg, "QScriptValue::setPrototype() failed: cyclic prototype value");
    prototype.setPrototype(prototype);
    QCOMPARE(prototype.prototype().strictlyEquals(previousPrototype), true);

    object.setPrototype(prototype);
    QTest::ignoreMessage(QtWarningMsg, "QScriptValue::setPrototype() failed: cyclic prototype value");
    prototype.setPrototype(object);
    QCOMPARE(prototype.prototype().strictlyEquals(previousPrototype), true);

}

void tst_QScriptValue::getSetPrototype_evalCyclicPrototype()
{
    QScriptEngine eng;
    QScriptValue ret = eng.evaluate("o = { }; p = { }; o.__proto__ = p; p.__proto__ = o");
    QCOMPARE(eng.hasUncaughtException(), true);
    QVERIFY(ret.strictlyEquals(eng.uncaughtException()));
    QCOMPARE(ret.isError(), true);
    QCOMPARE(ret.toString(), QLatin1String("Error: cyclic __proto__ value"));
}

void tst_QScriptValue::getSetPrototype_eval()
{
    QScriptEngine eng;
    QScriptValue ret = eng.evaluate("p = { }; p.__proto__ = { }");
    QCOMPARE(eng.hasUncaughtException(), false);
    QCOMPARE(ret.isError(), false);
}

void tst_QScriptValue::getSetPrototype_invalidPrototype()
{
    QScriptEngine eng;
    QScriptValue inv;
    QScriptValue object = eng.newObject();
    QScriptValue proto = object.prototype();
    QVERIFY(object.prototype().strictlyEquals(proto));
    inv.setPrototype(object);
    QCOMPARE(inv.prototype().isValid(), false);
    object.setPrototype(inv);
    QVERIFY(object.prototype().strictlyEquals(proto));
}

void tst_QScriptValue::getSetPrototype_twoEngines()
{
    QScriptEngine eng;
    QScriptValue prototype = eng.newObject();
    QScriptValue object = eng.newObject();
    object.setPrototype(prototype);
    QScriptEngine otherEngine;
    QScriptValue newPrototype = otherEngine.newObject();
    QTest::ignoreMessage(QtWarningMsg, "QScriptValue::setPrototype() failed: cannot set a prototype created in a different engine");
    object.setPrototype(newPrototype);
    QCOMPARE(object.prototype().strictlyEquals(prototype), true);

}

void tst_QScriptValue::getSetPrototype_null()
{
    QScriptEngine eng;
    QScriptValue object = eng.newObject();
    object.setPrototype(QScriptValue(QScriptValue::NullValue));
    QVERIFY(object.prototype().isNull());

    QScriptValue newProto = eng.newObject();
    object.setPrototype(newProto);
    QVERIFY(object.prototype().equals(newProto));

    object.setPrototype(QScriptValue(&eng, QScriptValue::NullValue));
    QVERIFY(object.prototype().isNull());
}

void tst_QScriptValue::getSetPrototype_notObjectOrNull()
{
    QScriptEngine eng;
    QScriptValue object = eng.newObject();
    QScriptValue originalProto = object.prototype();

    // bool
    object.setPrototype(true);
    QVERIFY(object.prototype().equals(originalProto));
    object.setPrototype(QScriptValue(&eng, true));
    QVERIFY(object.prototype().equals(originalProto));

    // number
    object.setPrototype(123);
    QVERIFY(object.prototype().equals(originalProto));
    object.setPrototype(QScriptValue(&eng, 123));
    QVERIFY(object.prototype().equals(originalProto));

    // string
    object.setPrototype("foo");
    QVERIFY(object.prototype().equals(originalProto));
    object.setPrototype(QScriptValue(&eng, "foo"));
    QVERIFY(object.prototype().equals(originalProto));

    // undefined
    object.setPrototype(QScriptValue(QScriptValue::UndefinedValue));
    QVERIFY(object.prototype().equals(originalProto));
    object.setPrototype(QScriptValue(&eng, QScriptValue::UndefinedValue));
    QVERIFY(object.prototype().equals(originalProto));
}

void tst_QScriptValue::getSetPrototype()
{
    QScriptEngine eng;
    QScriptValue prototype = eng.newObject();
    QScriptValue object = eng.newObject();
    object.setPrototype(prototype);
    QCOMPARE(object.prototype().strictlyEquals(prototype), true);
}

void tst_QScriptValue::getSetScope()
{
    QScriptEngine eng;

    QScriptValue object = eng.newObject();
    QCOMPARE(object.scope().isValid(), false);

    QScriptValue object2 = eng.newObject();
    object2.setScope(object);

    QCOMPARE(object2.scope().strictlyEquals(object), true);

    object.setProperty("foo", 123);
    QVERIFY(!object2.property("foo").isValid());
    {
        QScriptValue ret = object2.property("foo", QScriptValue::ResolveScope);
        QVERIFY(ret.isNumber());
        QCOMPARE(ret.toInt32(), 123);
    }

    QScriptValue inv;
    inv.setScope(object);
    QCOMPARE(inv.scope().isValid(), false);

    QScriptEngine otherEngine;
    QScriptValue object3 = otherEngine.newObject();
    QTest::ignoreMessage(QtWarningMsg, "QScriptValue::setScope() failed: cannot set a scope object created in a different engine");
    object2.setScope(object3);
    QCOMPARE(object2.scope().strictlyEquals(object), true);

    object2.setScope(QScriptValue());
    QVERIFY(!object2.scope().isValid());
}

void tst_QScriptValue::getSetData_objects_data()
{
    newEngine();

    QTest::addColumn<QScriptValue>("object");

    QTest::newRow("object from evaluate") << engine->evaluate("new Object()");
    QTest::newRow("object from engine") << engine->newObject();
    QTest::newRow("Array") << engine->newArray();
    QTest::newRow("Date") << engine->newDate(12324);
    QTest::newRow("QObject") << engine->newQObject(this);
    QTest::newRow("RegExp") << engine->newRegExp(QRegExp());
}

void tst_QScriptValue::getSetData_objects()
{
    QFETCH(QScriptValue, object);

    QVERIFY(!object.data().isValid());
    QScriptValue v1(true);
    object.setData(v1);
    QVERIFY(object.data().strictlyEquals(v1));
    QScriptValue v2(123);
    object.setData(v2);
    QVERIFY(object.data().strictlyEquals(v2));
    QScriptValue v3 = engine->newObject();
    object.setData(v3);
    QVERIFY(object.data().strictlyEquals(v3));
    object.setData(QScriptValue());
    QVERIFY(!object.data().isValid());
}

void tst_QScriptValue::getSetData_nonObjects_data()
{
    newEngine();

    QTest::addColumn<QScriptValue>("value");

    QTest::newRow("undefined (bound)") << engine->undefinedValue();
    QTest::newRow("null (bound)") << engine->nullValue();
    QTest::newRow("string (bound)") << QScriptValue(engine, "Pong");
    QTest::newRow("bool (bound)") << QScriptValue(engine, false);

    QTest::newRow("undefined") << QScriptValue(QScriptValue::UndefinedValue);
    QTest::newRow("null") << QScriptValue(QScriptValue::NullValue);
    QTest::newRow("string") << QScriptValue("Pong");
    QTest::newRow("bool") << QScriptValue(true);
}

void tst_QScriptValue::getSetData_nonObjects()
{
    QFETCH(QScriptValue, value);

    QVERIFY(!value.data().isValid());
    QScriptValue v1(true);
    value.setData(v1);
    QVERIFY(!value.data().isValid());
    QScriptValue v2(123);
    value.setData(v2);
    QVERIFY(!value.data().isValid());
    QScriptValue v3 = engine->newObject();
    value.setData(v3);
    QVERIFY(!value.data().isValid());
    value.setData(QScriptValue());
    QVERIFY(!value.data().isValid());
}

void tst_QScriptValue::setData_QTBUG15144()
{
    QScriptEngine eng;
    QScriptValue obj = eng.newObject();
    for (int i = 0; i < 10000; ++i) {
        // Create an object with property 'fooN' on it, and immediately kill
        // the reference to the object so it and the property name become garbage.
        eng.evaluate(QString::fromLatin1("o = {}; o.foo%0 = 10; o = null;").arg(i));
        // Setting the data will cause a JS string to be allocated, which could
        // trigger a GC. This should not cause a crash.
        obj.setData("foodfight");
    }
}

class TestScriptClass : public QScriptClass
{
public:
    TestScriptClass(QScriptEngine *engine) : QScriptClass(engine) {}
};

void tst_QScriptValue::getSetScriptClass_emptyClass_data()
{
    newEngine();
    QTest::addColumn<QScriptValue>("value");

    QTest::newRow("invalid") << QScriptValue();
    QTest::newRow("number") << QScriptValue(123);
    QTest::newRow("string") << QScriptValue("pong");
    QTest::newRow("bool") << QScriptValue(false);
    QTest::newRow("null") << QScriptValue(QScriptValue::NullValue);
    QTest::newRow("undefined") << QScriptValue(QScriptValue::UndefinedValue);

    QTest::newRow("number") << QScriptValue(engine, 123);
    QTest::newRow("string") << QScriptValue(engine, "pong");
    QTest::newRow("bool") << QScriptValue(engine, true);
    QTest::newRow("null") << QScriptValue(engine->nullValue());
    QTest::newRow("undefined") << QScriptValue(engine->undefinedValue());
    QTest::newRow("object") << QScriptValue(engine->newObject());
    QTest::newRow("date") << QScriptValue(engine->evaluate("new Date()"));
    QTest::newRow("qobject") << QScriptValue(engine->newQObject(this));
}

void tst_QScriptValue::getSetScriptClass_emptyClass()
{
    QFETCH(QScriptValue, value);
    QCOMPARE(value.scriptClass(), (QScriptClass*)0);
}

void tst_QScriptValue::getSetScriptClass_JSObjectFromCpp()
{
    QScriptEngine eng;
    TestScriptClass testClass(&eng);
    // object created in C++ (newObject())
    {
        QScriptValue obj = eng.newObject();
        obj.setScriptClass(&testClass);
        QCOMPARE(obj.scriptClass(), (QScriptClass*)&testClass);
        obj.setScriptClass(0);
        QCOMPARE(obj.scriptClass(), (QScriptClass*)0);
    }
}

void tst_QScriptValue::getSetScriptClass_JSObjectFromJS()
{
    QScriptEngine eng;
    TestScriptClass testClass(&eng);
    // object created in JS
    {
        QScriptValue obj = eng.evaluate("new Object");
        QVERIFY(!eng.hasUncaughtException());
        QVERIFY(obj.isObject());
        QCOMPARE(obj.scriptClass(), (QScriptClass*)0);
        QTest::ignoreMessage(QtWarningMsg, "QScriptValue::setScriptClass() failed: cannot change class of non-QScriptObject");
        obj.setScriptClass(&testClass);
        QEXPECT_FAIL("", "With JSC back-end, the class of a plain object created in JS can't be changed", Continue);
        QCOMPARE(obj.scriptClass(), (QScriptClass*)&testClass);
        QTest::ignoreMessage(QtWarningMsg, "QScriptValue::setScriptClass() failed: cannot change class of non-QScriptObject");
        obj.setScriptClass(0);
        QCOMPARE(obj.scriptClass(), (QScriptClass*)0);
    }
}

void tst_QScriptValue::getSetScriptClass_QVariant()
{
    QScriptEngine eng;
    TestScriptClass testClass(&eng);
    // object that already has a(n internal) class
    {
        QScriptValue obj = eng.newVariant(QUrl("http://example.com"));
        QVERIFY(obj.isVariant());
        QCOMPARE(obj.scriptClass(), (QScriptClass*)0);
        obj.setScriptClass(&testClass);
        QCOMPARE(obj.scriptClass(), (QScriptClass*)&testClass);
        QVERIFY(obj.isObject());
        QVERIFY(!obj.isVariant());
        QCOMPARE(obj.toVariant(), QVariant(QVariantMap()));
    }
}

void tst_QScriptValue::getSetScriptClass_QObject()
{
    QScriptEngine eng;
    TestScriptClass testClass(&eng);
    {
        QScriptValue obj = eng.newQObject(this);
        QVERIFY(obj.isQObject());
        obj.setScriptClass(&testClass);
        QCOMPARE(obj.scriptClass(), (QScriptClass*)&testClass);
        QVERIFY(obj.isObject());
        QVERIFY(!obj.isQObject());
        QVERIFY(obj.toQObject() == 0);
    }
}

static QScriptValue getArg(QScriptContext *ctx, QScriptEngine *)
{
    return ctx->argument(0);
}

static QScriptValue evaluateArg(QScriptContext *, QScriptEngine *eng)
{
    return eng->evaluate("arguments[0]");
}

static QScriptValue addArgs(QScriptContext *, QScriptEngine *eng)
{
    return eng->evaluate("arguments[0] + arguments[1]");
}

static QScriptValue returnInvalidValue(QScriptContext *, QScriptEngine *)
{
    return QScriptValue();
}

void tst_QScriptValue::call_function()
{
    QScriptEngine eng;
    QScriptValue fun = eng.evaluate("(function() { return 1; })");
    QVERIFY(fun.isFunction());
    QScriptValue result = fun.call();
    QVERIFY(result.isNumber());
    QCOMPARE(result.toInt32(), 1);
}

void tst_QScriptValue::call_object()
{
    QScriptEngine eng;
    QScriptValue Object = eng.evaluate("Object");
    QCOMPARE(Object.isFunction(), true);
    QScriptValue result = Object.call(Object);
    QCOMPARE(result.isObject(), true);
}

void tst_QScriptValue::call_newObjects()
{
    QScriptEngine eng;
    // test that call() doesn't construct new objects
    QScriptValue Number = eng.evaluate("Number");
    QScriptValue Object = eng.evaluate("Object");
    QCOMPARE(Object.isFunction(), true);
    QScriptValueList args;
    args << QScriptValue(&eng, 123);
    QScriptValue result = Number.call(Object, args);
    QCOMPARE(result.strictlyEquals(args.at(0)), true);
}

void tst_QScriptValue::call_this()
{
    QScriptEngine eng;
    // test that correct "this" object is used
    QScriptValue fun = eng.evaluate("(function() { return this; })");
    QCOMPARE(fun.isFunction(), true);

    QScriptValue numberObject = QScriptValue(&eng, 123.0).toObject();
    QScriptValue result = fun.call(numberObject);
    QCOMPARE(result.isObject(), true);
    QCOMPARE(result.toNumber(), 123.0);
}

void tst_QScriptValue::call_arguments()
{
    QScriptEngine eng;
    // test that correct arguments are passed

    QScriptValue fun = eng.evaluate("(function() { return arguments[0]; })");
    QCOMPARE(fun.isFunction(), true);
    {
        QScriptValue result = fun.call(eng.undefinedValue());
        QCOMPARE(result.isUndefined(), true);
    }
    {
        QScriptValueList args;
        args << QScriptValue(&eng, 123.0);
        QScriptValue result = fun.call(eng.undefinedValue(), args);
        QCOMPARE(result.isNumber(), true);
        QCOMPARE(result.toNumber(), 123.0);
    }
    // V2 constructors
    {
        QScriptValueList args;
        args << QScriptValue(123.0);
        QScriptValue result = fun.call(eng.undefinedValue(), args);
        QCOMPARE(result.isNumber(), true);
        QCOMPARE(result.toNumber(), 123.0);
    }
    {
        QScriptValue args = eng.newArray();
        args.setProperty(0, 123);
        QScriptValue result = fun.call(eng.undefinedValue(), args);
        QVERIFY(result.isNumber());
        QCOMPARE(result.toNumber(), 123.0);
    }
}

void tst_QScriptValue::call()
{
    QScriptEngine eng;
    {
        QScriptValue fun = eng.evaluate("(function() { return arguments[1]; })");
        QCOMPARE(fun.isFunction(), true);

        {
            QScriptValueList args;
            args << QScriptValue(&eng, 123.0) << QScriptValue(&eng, 456.0);
            QScriptValue result = fun.call(eng.undefinedValue(), args);
            QCOMPARE(result.isNumber(), true);
            QCOMPARE(result.toNumber(), 456.0);
        }
        {
            QScriptValue args = eng.newArray();
            args.setProperty(0, 123);
            args.setProperty(1, 456);
            QScriptValue result = fun.call(eng.undefinedValue(), args);
            QVERIFY(result.isNumber());
            QCOMPARE(result.toNumber(), 456.0);
        }
    }
    {
        QScriptValue fun = eng.evaluate("(function() { throw new Error('foo'); })");
        QCOMPARE(fun.isFunction(), true);
        QVERIFY(!eng.hasUncaughtException());

        {
            QScriptValue result = fun.call();
            QCOMPARE(result.isError(), true);
            QCOMPARE(eng.hasUncaughtException(), true);
            QVERIFY(result.strictlyEquals(eng.uncaughtException()));
        }
    }
    {
        eng.clearExceptions();
        QScriptValue fun = eng.newFunction(getArg);
        {
            QScriptValueList args;
            args << QScriptValue(&eng, 123.0);
            QScriptValue result = fun.call(eng.undefinedValue(), args);
            QVERIFY(!eng.hasUncaughtException());
            QCOMPARE(result.isNumber(), true);
            QCOMPARE(result.toNumber(), 123.0);
        }
        // V2 constructors
        {
            QScriptValueList args;
            args << QScriptValue(123.0);
            QScriptValue result = fun.call(eng.undefinedValue(), args);
            QCOMPARE(result.isNumber(), true);
            QCOMPARE(result.toNumber(), 123.0);
        }
        {
            QScriptValue args = eng.newArray();
            args.setProperty(0, 123);
            QScriptValue result = fun.call(eng.undefinedValue(), args);
            QVERIFY(result.isNumber());
            QCOMPARE(result.toNumber(), 123.0);
        }
    }
    {
        QScriptValue fun = eng.newFunction(evaluateArg);
        {
            QScriptValueList args;
            args << QScriptValue(&eng, 123.0);
            QScriptValue result = fun.call(eng.undefinedValue(), args);
            QVERIFY(!eng.hasUncaughtException());
            QCOMPARE(result.isNumber(), true);
            QCOMPARE(result.toNumber(), 123.0);
        }
    }
}

void tst_QScriptValue::call_invalidArguments()
{
    // test that invalid arguments are handled gracefully
    QScriptEngine eng;
    {
        QScriptValue fun = eng.newFunction(getArg);
        {
            QScriptValueList args;
            args << QScriptValue();
            QScriptValue ret = fun.call(QScriptValue(), args);
            QVERIFY(!eng.hasUncaughtException());
            QCOMPARE(ret.isValid(), true);
            QCOMPARE(ret.isUndefined(), true);
        }
    }
    {
        QScriptValue fun = eng.newFunction(evaluateArg);
        {
            QScriptValueList args;
            args << QScriptValue();
            QScriptValue ret = fun.call(QScriptValue(), args);
            QCOMPARE(ret.isValid(), true);
            QCOMPARE(ret.isUndefined(), true);
        }
    }
    {
        QScriptValue fun = eng.newFunction(addArgs);
        {
            QScriptValueList args;
            args << QScriptValue() << QScriptValue();
            QScriptValue ret = fun.call(QScriptValue(), args);
            QCOMPARE(ret.isValid(), true);
            QCOMPARE(ret.isNumber(), true);
            QCOMPARE(qIsNaN(ret.toNumber()), true);
        }
    }
}

void tst_QScriptValue::call_invalidReturn()
{
    // test that invalid return value is handled gracefully
    QScriptEngine eng;
    QScriptValue fun = eng.newFunction(returnInvalidValue);
    eng.globalObject().setProperty("returnInvalidValue", fun);
    QScriptValue ret = eng.evaluate("returnInvalidValue() + returnInvalidValue()");
    QCOMPARE(ret.isValid(), true);
    QCOMPARE(ret.isNumber(), true);
    QCOMPARE(qIsNaN(ret.toNumber()), true);
}

void tst_QScriptValue::call_twoEngines()
{
    QScriptEngine eng;
    QScriptValue object = eng.evaluate("Object");
    QScriptEngine otherEngine;
    QScriptValue fun = otherEngine.evaluate("(function() { return 1; })");
    QVERIFY(fun.isFunction());
    QTest::ignoreMessage(QtWarningMsg, "QScriptValue::call() failed: "
                         "cannot call function with thisObject created in "
                         "a different engine");
    QCOMPARE(fun.call(object).isValid(), false);
    QTest::ignoreMessage(QtWarningMsg, "QScriptValue::call() failed: "
                         "cannot call function with argument created in "
                         "a different engine");
    QCOMPARE(fun.call(QScriptValue(), QScriptValueList() << QScriptValue(&eng, 123)).isValid(), false);
    {
        QScriptValue fun = eng.evaluate("Object");
        QVERIFY(fun.isFunction());
        QScriptEngine eng2;
        QScriptValue objectInDifferentEngine = eng2.newObject();
        QScriptValueList args;
        args << objectInDifferentEngine;
        QTest::ignoreMessage(QtWarningMsg, "QScriptValue::call() failed: cannot call function with argument created in a different engine");
        fun.call(QScriptValue(), args);
    }
}

void tst_QScriptValue::call_array()
{
    QScriptEngine eng;
    QScriptValue fun = eng.evaluate("(function() { return arguments; })");
    QVERIFY(fun.isFunction());
    QScriptValue array = eng.newArray(3);
    array.setProperty(0, QScriptValue(&eng, 123.0));
    array.setProperty(1, QScriptValue(&eng, 456.0));
    array.setProperty(2, QScriptValue(&eng, 789.0));
    // call with single array object as arguments
    QScriptValue ret = fun.call(QScriptValue(), array);
    QVERIFY(!eng.hasUncaughtException());
    QCOMPARE(ret.isError(), false);
    QCOMPARE(ret.property(0).strictlyEquals(array.property(0)), true);
    QCOMPARE(ret.property(1).strictlyEquals(array.property(1)), true);
    QCOMPARE(ret.property(2).strictlyEquals(array.property(2)), true);
    // call with arguments object as arguments
    QScriptValue ret2 = fun.call(QScriptValue(), ret);
    QCOMPARE(ret2.isError(), false);
    QCOMPARE(ret2.property(0).strictlyEquals(ret.property(0)), true);
    QCOMPARE(ret2.property(1).strictlyEquals(ret.property(1)), true);
    QCOMPARE(ret2.property(2).strictlyEquals(ret.property(2)), true);
    // call with null as arguments
    QScriptValue ret3 = fun.call(QScriptValue(), eng.nullValue());
    QCOMPARE(ret3.isError(), false);
    QCOMPARE(ret3.property("length").isNumber(), true);
    QCOMPARE(ret3.property("length").toNumber(), 0.0);
    // call with undefined as arguments
    QScriptValue ret4 = fun.call(QScriptValue(), eng.undefinedValue());
    QCOMPARE(ret4.isError(), false);
    QCOMPARE(ret4.property("length").isNumber(), true);
    QCOMPARE(ret4.property("length").toNumber(), 0.0);
    // call with something else as arguments
    QScriptValue ret5 = fun.call(QScriptValue(), QScriptValue(&eng, 123.0));
    QCOMPARE(ret5.isError(), true);
    // call with a non-array object as arguments
    QScriptValue ret6 = fun.call(QScriptValue(), eng.globalObject());
    QVERIFY(ret6.isError());
    QCOMPARE(ret6.toString(), QString::fromLatin1("TypeError: Arguments must be an array"));
}


void tst_QScriptValue::call_nonFunction_data()
{
    newEngine();
    QTest::addColumn<QScriptValue>("value");

    QTest::newRow("invalid") << QScriptValue();
    QTest::newRow("bool") << QScriptValue(false);
    QTest::newRow("int") << QScriptValue(123);
    QTest::newRow("string") << QScriptValue(QString::fromLatin1("ciao"));
    QTest::newRow("undefined") << QScriptValue(QScriptValue::UndefinedValue);
    QTest::newRow("null") << QScriptValue(QScriptValue::NullValue);

    QTest::newRow("bool bound") << QScriptValue(engine, false);
    QTest::newRow("int bound") << QScriptValue(engine, 123);
    QTest::newRow("string bound") << QScriptValue(engine, QString::fromLatin1("ciao"));
    QTest::newRow("undefined bound") << engine->undefinedValue();
    QTest::newRow("null bound") << engine->nullValue();
}

void tst_QScriptValue::call_nonFunction()
{
    // calling things that are not functions
    QFETCH(QScriptValue, value);
    QVERIFY(!value.call().isValid());
}

static QScriptValue ctorReturningUndefined(QScriptContext *ctx, QScriptEngine *)
{
    ctx->thisObject().setProperty("foo", 123);
    return QScriptValue(QScriptValue::UndefinedValue);
}

static QScriptValue ctorReturningNewObject(QScriptContext *, QScriptEngine *eng)
{
    QScriptValue result = eng->newObject();
    result.setProperty("bar", 456);
    return result;
}

void tst_QScriptValue::construct_nonFunction_data()
{
    newEngine();
    QTest::addColumn<QScriptValue>("value");

    QTest::newRow("invalid") << QScriptValue();
    QTest::newRow("bool") << QScriptValue(false);
    QTest::newRow("int") << QScriptValue(123);
    QTest::newRow("string") << QScriptValue(QString::fromLatin1("ciao"));
    QTest::newRow("undefined") << QScriptValue(QScriptValue::UndefinedValue);
    QTest::newRow("null") << QScriptValue(QScriptValue::NullValue);

    QTest::newRow("bool bound") << QScriptValue(engine, false);
    QTest::newRow("int bound") << QScriptValue(engine, 123);
    QTest::newRow("string bound") << QScriptValue(engine, QString::fromLatin1("ciao"));
    QTest::newRow("undefined bound") << engine->undefinedValue();
    QTest::newRow("null bound") << engine->nullValue();
}

void tst_QScriptValue::construct_nonFunction()
{
    QFETCH(QScriptValue, value);
    QVERIFY(!value.construct().isValid());
}

void tst_QScriptValue::construct_simple()
{
    QScriptEngine eng;
    QScriptValue fun = eng.evaluate("(function () { this.foo = 123; })");
    QVERIFY(fun.isFunction());
    QScriptValue ret = fun.construct();
    QVERIFY(ret.isObject());
    QVERIFY(ret.instanceOf(fun));
    QCOMPARE(ret.property("foo").toInt32(), 123);
}

void tst_QScriptValue::construct_newObjectJS()
{
    QScriptEngine eng;
    // returning a different object overrides the default-constructed one
    QScriptValue fun = eng.evaluate("(function () { return { bar: 456 }; })");
    QVERIFY(fun.isFunction());
    QScriptValue ret = fun.construct();
    QVERIFY(ret.isObject());
    QVERIFY(!ret.instanceOf(fun));
    QCOMPARE(ret.property("bar").toInt32(), 456);
}

void tst_QScriptValue::construct_undefined()
{
    QScriptEngine eng;
    QScriptValue fun = eng.newFunction(ctorReturningUndefined);
    QScriptValue ret = fun.construct();
    QVERIFY(ret.isObject());
    QVERIFY(ret.instanceOf(fun));
    QCOMPARE(ret.property("foo").toInt32(), 123);
}

void tst_QScriptValue::construct_newObjectCpp()
{
    QScriptEngine eng;
    QScriptValue fun = eng.newFunction(ctorReturningNewObject);
    QScriptValue ret = fun.construct();
    QVERIFY(ret.isObject());
    QVERIFY(!ret.instanceOf(fun));
    QCOMPARE(ret.property("bar").toInt32(), 456);
}

void tst_QScriptValue::construct_arg()
{
    QScriptEngine eng;
    QScriptValue Number = eng.evaluate("Number");
    QCOMPARE(Number.isFunction(), true);
    QScriptValueList args;
    args << QScriptValue(&eng, 123);
    QScriptValue ret = Number.construct(args);
    QCOMPARE(ret.isObject(), true);
    QCOMPARE(ret.toNumber(), args.at(0).toNumber());
}

void tst_QScriptValue::construct_proto()
{
    QScriptEngine eng;
    // test that internal prototype is set correctly
    QScriptValue fun = eng.evaluate("(function() { return this.__proto__; })");
    QCOMPARE(fun.isFunction(), true);
    QCOMPARE(fun.property("prototype").isObject(), true);
    QScriptValue ret = fun.construct();
    QCOMPARE(fun.property("prototype").strictlyEquals(ret), true);
}

void tst_QScriptValue::construct_returnInt()
{
    QScriptEngine eng;
    // test that we return the new object even if a non-object value is returned from the function
    QScriptValue fun = eng.evaluate("(function() { return 123; })");
    QCOMPARE(fun.isFunction(), true);
    QScriptValue ret = fun.construct();
    QCOMPARE(ret.isObject(), true);
}

void tst_QScriptValue::construct_throw()
{
    QScriptEngine eng;
    QScriptValue fun = eng.evaluate("(function() { throw new Error('foo'); })");
    QCOMPARE(fun.isFunction(), true);
    QScriptValue ret = fun.construct();
    QCOMPARE(ret.isError(), true);
    QCOMPARE(eng.hasUncaughtException(), true);
    QVERIFY(ret.strictlyEquals(eng.uncaughtException()));
}

void tst_QScriptValue::construct()
{
    QScriptEngine eng;
    QScriptValue fun = eng.evaluate("(function() { return arguments; })");
    QVERIFY(fun.isFunction());
    QScriptValue array = eng.newArray(3);
    array.setProperty(0, QScriptValue(&eng, 123.0));
    array.setProperty(1, QScriptValue(&eng, 456.0));
    array.setProperty(2, QScriptValue(&eng, 789.0));
    // construct with single array object as arguments
    QScriptValue ret = fun.construct(array);
    QVERIFY(!eng.hasUncaughtException());
    QVERIFY(ret.isValid());
    QVERIFY(ret.isObject());
    QCOMPARE(ret.property(0).strictlyEquals(array.property(0)), true);
    QCOMPARE(ret.property(1).strictlyEquals(array.property(1)), true);
    QCOMPARE(ret.property(2).strictlyEquals(array.property(2)), true);
    // construct with arguments object as arguments
    QScriptValue ret2 = fun.construct(ret);
    QCOMPARE(ret2.property(0).strictlyEquals(ret.property(0)), true);
    QCOMPARE(ret2.property(1).strictlyEquals(ret.property(1)), true);
    QCOMPARE(ret2.property(2).strictlyEquals(ret.property(2)), true);
    // construct with null as arguments
    QScriptValue ret3 = fun.construct(eng.nullValue());
    QCOMPARE(ret3.isError(), false);
    QCOMPARE(ret3.property("length").isNumber(), true);
    QCOMPARE(ret3.property("length").toNumber(), 0.0);
    // construct with undefined as arguments
    QScriptValue ret4 = fun.construct(eng.undefinedValue());
    QCOMPARE(ret4.isError(), false);
    QCOMPARE(ret4.property("length").isNumber(), true);
    QCOMPARE(ret4.property("length").toNumber(), 0.0);
    // construct with something else as arguments
    QScriptValue ret5 = fun.construct(QScriptValue(&eng, 123.0));
    QCOMPARE(ret5.isError(), true);
    // construct with a non-array object as arguments
    QScriptValue ret6 = fun.construct(eng.globalObject());
    QVERIFY(ret6.isError());
    QCOMPARE(ret6.toString(), QString::fromLatin1("TypeError: Arguments must be an array"));
}

void tst_QScriptValue::construct_twoEngines()
{
    QScriptEngine engine;
    QScriptEngine otherEngine;
    QScriptValue ctor = engine.evaluate("(function (a, b) { this.foo = 123; })");
    QScriptValue arg(&otherEngine, 124567);
    QTest::ignoreMessage(QtWarningMsg, "QScriptValue::construct() failed: cannot construct function with argument created in a different engine");
    QVERIFY(!ctor.construct(arg).isValid());
    QTest::ignoreMessage(QtWarningMsg, "QScriptValue::construct() failed: cannot construct function with argument created in a different engine");
    QVERIFY(!ctor.construct(QScriptValueList() << arg << otherEngine.newObject()).isValid());
}

void tst_QScriptValue::construct_constructorThrowsPrimitive()
{
    QScriptEngine eng;
    QScriptValue fun = eng.evaluate("(function() { throw 123; })");
    QVERIFY(fun.isFunction());
    // construct(QScriptValueList)
    {
        QScriptValue ret = fun.construct();
        QVERIFY(ret.isNumber());
        QCOMPARE(ret.toNumber(), 123.0);
        QVERIFY(eng.hasUncaughtException());
        QVERIFY(ret.strictlyEquals(eng.uncaughtException()));
        eng.clearExceptions();
    }
    // construct(QScriptValue)
    {
        QScriptValue ret = fun.construct(eng.newArray());
        QVERIFY(ret.isNumber());
        QCOMPARE(ret.toNumber(), 123.0);
        QVERIFY(eng.hasUncaughtException());
        QVERIFY(ret.strictlyEquals(eng.uncaughtException()));
        eng.clearExceptions();
    }
}

void tst_QScriptValue::lessThan()
{
    QScriptEngine eng;

    QVERIFY(!QScriptValue().lessThan(QScriptValue()));

    QScriptValue num = QScriptValue(&eng, 123);
    QCOMPARE(num.lessThan(QScriptValue(&eng, 124)), true);
    QCOMPARE(num.lessThan(QScriptValue(&eng, 122)), false);
    QCOMPARE(num.lessThan(QScriptValue(&eng, 123)), false);
    QCOMPARE(num.lessThan(QScriptValue(&eng, "124")), true);
    QCOMPARE(num.lessThan(QScriptValue(&eng, "122")), false);
    QCOMPARE(num.lessThan(QScriptValue(&eng, "123")), false);
    QCOMPARE(num.lessThan(QScriptValue(&eng, qSNaN())), false);
    QCOMPARE(num.lessThan(QScriptValue(&eng, +qInf())), true);
    QCOMPARE(num.lessThan(QScriptValue(&eng, -qInf())), false);
    QCOMPARE(num.lessThan(num), false);
    QCOMPARE(num.lessThan(QScriptValue(&eng, 124).toObject()), true);
    QCOMPARE(num.lessThan(QScriptValue(&eng, 122).toObject()), false);
    QCOMPARE(num.lessThan(QScriptValue(&eng, 123).toObject()), false);
    QCOMPARE(num.lessThan(QScriptValue(&eng, "124").toObject()), true);
    QCOMPARE(num.lessThan(QScriptValue(&eng, "122").toObject()), false);
    QCOMPARE(num.lessThan(QScriptValue(&eng, "123").toObject()), false);
    QCOMPARE(num.lessThan(QScriptValue(&eng, qSNaN()).toObject()), false);
    QCOMPARE(num.lessThan(QScriptValue(&eng, +qInf()).toObject()), true);
    QCOMPARE(num.lessThan(QScriptValue(&eng, -qInf()).toObject()), false);
    QCOMPARE(num.lessThan(num.toObject()), false);
    QCOMPARE(num.lessThan(QScriptValue()), false);

    QScriptValue str = QScriptValue(&eng, "123");
    QCOMPARE(str.lessThan(QScriptValue(&eng, "124")), true);
    QCOMPARE(str.lessThan(QScriptValue(&eng, "122")), false);
    QCOMPARE(str.lessThan(QScriptValue(&eng, "123")), false);
    QCOMPARE(str.lessThan(QScriptValue(&eng, 124)), true);
    QCOMPARE(str.lessThan(QScriptValue(&eng, 122)), false);
    QCOMPARE(str.lessThan(QScriptValue(&eng, 123)), false);
    QCOMPARE(str.lessThan(str), false);
    QCOMPARE(str.lessThan(QScriptValue(&eng, "124").toObject()), true);
    QCOMPARE(str.lessThan(QScriptValue(&eng, "122").toObject()), false);
    QCOMPARE(str.lessThan(QScriptValue(&eng, "123").toObject()), false);
    QCOMPARE(str.lessThan(QScriptValue(&eng, 124).toObject()), true);
    QCOMPARE(str.lessThan(QScriptValue(&eng, 122).toObject()), false);
    QCOMPARE(str.lessThan(QScriptValue(&eng, 123).toObject()), false);
    QCOMPARE(str.lessThan(str.toObject()), false);
    QCOMPARE(str.lessThan(QScriptValue()), false);

    // V2 constructors
    QScriptValue num2 = QScriptValue(123);
    QCOMPARE(num2.lessThan(QScriptValue(124)), true);
    QCOMPARE(num2.lessThan(QScriptValue(122)), false);
    QCOMPARE(num2.lessThan(QScriptValue(123)), false);
    QCOMPARE(num2.lessThan(QScriptValue("124")), true);
    QCOMPARE(num2.lessThan(QScriptValue("122")), false);
    QCOMPARE(num2.lessThan(QScriptValue("123")), false);
    QCOMPARE(num2.lessThan(QScriptValue(qSNaN())), false);
    QCOMPARE(num2.lessThan(QScriptValue(+qInf())), true);
    QCOMPARE(num2.lessThan(QScriptValue(-qInf())), false);
    QCOMPARE(num2.lessThan(num), false);
    QCOMPARE(num2.lessThan(QScriptValue()), false);

    QScriptValue str2 = QScriptValue("123");
    QCOMPARE(str2.lessThan(QScriptValue("124")), true);
    QCOMPARE(str2.lessThan(QScriptValue("122")), false);
    QCOMPARE(str2.lessThan(QScriptValue("123")), false);
    QCOMPARE(str2.lessThan(QScriptValue(124)), true);
    QCOMPARE(str2.lessThan(QScriptValue(122)), false);
    QCOMPARE(str2.lessThan(QScriptValue(123)), false);
    QCOMPARE(str2.lessThan(str), false);
    QCOMPARE(str2.lessThan(QScriptValue()), false);

    QScriptValue obj1 = eng.newObject();
    QScriptValue obj2 = eng.newObject();
    QCOMPARE(obj1.lessThan(obj2), false);
    QCOMPARE(obj2.lessThan(obj1), false);
    QCOMPARE(obj1.lessThan(obj1), false);
    QCOMPARE(obj2.lessThan(obj2), false);

    QScriptValue date1 = eng.newDate(QDateTime(QDate(2000, 1, 1)));
    QScriptValue date2 = eng.newDate(QDateTime(QDate(1999, 1, 1)));
    QCOMPARE(date1.lessThan(date2), false);
    QCOMPARE(date2.lessThan(date1), true);
    QCOMPARE(date1.lessThan(date1), false);
    QCOMPARE(date2.lessThan(date2), false);
    QCOMPARE(date1.lessThan(QScriptValue()), false);

    QCOMPARE(QScriptValue().lessThan(date2), false);

    QScriptEngine otherEngine;
    QTest::ignoreMessage(QtWarningMsg, "QScriptValue::lessThan: "
                         "cannot compare to a value created in "
                         "a different engine");
    QCOMPARE(date1.lessThan(QScriptValue(&otherEngine, 123)), false);
}

void tst_QScriptValue::equals()
{
    QScriptEngine eng;

    QVERIFY(QScriptValue().equals(QScriptValue()));

    QScriptValue num = QScriptValue(&eng, 123);
    QCOMPARE(num.equals(QScriptValue(&eng, 123)), true);
    QCOMPARE(num.equals(QScriptValue(&eng, 321)), false);
    QCOMPARE(num.equals(QScriptValue(&eng, "123")), true);
    QCOMPARE(num.equals(QScriptValue(&eng, "321")), false);
    QCOMPARE(num.equals(QScriptValue(&eng, 123).toObject()), true);
    QCOMPARE(num.equals(QScriptValue(&eng, 321).toObject()), false);
    QCOMPARE(num.equals(QScriptValue(&eng, "123").toObject()), true);
    QCOMPARE(num.equals(QScriptValue(&eng, "321").toObject()), false);
    QVERIFY(num.toObject().equals(num));
    QCOMPARE(num.equals(QScriptValue()), false);

    QScriptValue str = QScriptValue(&eng, "123");
    QCOMPARE(str.equals(QScriptValue(&eng, "123")), true);
    QCOMPARE(str.equals(QScriptValue(&eng, "321")), false);
    QCOMPARE(str.equals(QScriptValue(&eng, 123)), true);
    QCOMPARE(str.equals(QScriptValue(&eng, 321)), false);
    QCOMPARE(str.equals(QScriptValue(&eng, "123").toObject()), true);
    QCOMPARE(str.equals(QScriptValue(&eng, "321").toObject()), false);
    QCOMPARE(str.equals(QScriptValue(&eng, 123).toObject()), true);
    QCOMPARE(str.equals(QScriptValue(&eng, 321).toObject()), false);
    QVERIFY(str.toObject().equals(str));
    QCOMPARE(str.equals(QScriptValue()), false);

    QScriptValue num2 = QScriptValue(123);
    QCOMPARE(num2.equals(QScriptValue(123)), true);
    QCOMPARE(num2.equals(QScriptValue(321)), false);
    QCOMPARE(num2.equals(QScriptValue("123")), true);
    QCOMPARE(num2.equals(QScriptValue("321")), false);
    QCOMPARE(num2.equals(QScriptValue()), false);

    QScriptValue str2 = QScriptValue("123");
    QCOMPARE(str2.equals(QScriptValue("123")), true);
    QCOMPARE(str2.equals(QScriptValue("321")), false);
    QCOMPARE(str2.equals(QScriptValue(123)), true);
    QCOMPARE(str2.equals(QScriptValue(321)), false);
    QCOMPARE(str2.equals(QScriptValue()), false);

    QScriptValue date1 = eng.newDate(QDateTime(QDate(2000, 1, 1)));
    QScriptValue date2 = eng.newDate(QDateTime(QDate(1999, 1, 1)));
    QCOMPARE(date1.equals(date2), false);
    QCOMPARE(date1.equals(date1), true);
    QCOMPARE(date2.equals(date2), true);

    QScriptValue undefined = eng.undefinedValue();
    QScriptValue null = eng.nullValue();
    QCOMPARE(undefined.equals(undefined), true);
    QCOMPARE(null.equals(null), true);
    QCOMPARE(undefined.equals(null), true);
    QCOMPARE(null.equals(undefined), true);
    QCOMPARE(undefined.equals(QScriptValue()), false);
    QCOMPARE(null.equals(QScriptValue()), false);
    QVERIFY(!null.equals(num));
    QVERIFY(!undefined.equals(num));

    QScriptValue sant = QScriptValue(&eng, true);
    QVERIFY(sant.equals(QScriptValue(&eng, 1)));
    QVERIFY(sant.equals(QScriptValue(&eng, "1")));
    QVERIFY(sant.equals(sant));
    QVERIFY(sant.equals(QScriptValue(&eng, 1).toObject()));
    QVERIFY(sant.equals(QScriptValue(&eng, "1").toObject()));
    QVERIFY(sant.equals(sant.toObject()));
    QVERIFY(sant.toObject().equals(sant));
    QVERIFY(!sant.equals(QScriptValue(&eng, 0)));
    QVERIFY(!sant.equals(undefined));
    QVERIFY(!sant.equals(null));

    QScriptValue falskt = QScriptValue(&eng, false);
    QVERIFY(falskt.equals(QScriptValue(&eng, 0)));
    QVERIFY(falskt.equals(QScriptValue(&eng, "0")));
    QVERIFY(falskt.equals(falskt));
    QVERIFY(falskt.equals(QScriptValue(&eng, 0).toObject()));
    QVERIFY(falskt.equals(QScriptValue(&eng, "0").toObject()));
    QVERIFY(falskt.equals(falskt.toObject()));
    QVERIFY(falskt.toObject().equals(falskt));
    QVERIFY(!falskt.equals(sant));
    QVERIFY(!falskt.equals(undefined));
    QVERIFY(!falskt.equals(null));

    QScriptValue obj1 = eng.newObject();
    QScriptValue obj2 = eng.newObject();
    QCOMPARE(obj1.equals(obj2), false);
    QCOMPARE(obj2.equals(obj1), false);
    QCOMPARE(obj1.equals(obj1), true);
    QCOMPARE(obj2.equals(obj2), true);

    QScriptValue qobj1 = eng.newQObject(this);
    QScriptValue qobj2 = eng.newQObject(this);
    QScriptValue qobj3 = eng.newQObject(0);
    QScriptValue qobj4 = eng.newQObject(new QObject(), QScriptEngine::ScriptOwnership);
    QVERIFY(qobj1.equals(qobj2)); // compares the QObject pointers
    QVERIFY(!qobj2.equals(qobj4)); // compares the QObject pointers
    QVERIFY(!qobj2.equals(obj2)); // compares the QObject pointers

    QScriptValue compareFun = eng.evaluate("(function(a, b) { return a == b; })");
    QVERIFY(compareFun.isFunction());
    {
        QScriptValue ret = compareFun.call(QScriptValue(), QScriptValueList() << qobj1 << qobj2);
        QVERIFY(ret.isBool());
        QVERIFY(ret.toBool());
        ret = compareFun.call(QScriptValue(), QScriptValueList() << qobj1 << qobj3);
        QVERIFY(ret.isBool());
        QVERIFY(!ret.toBool());
        ret = compareFun.call(QScriptValue(), QScriptValueList() << qobj1 << qobj4);
        QVERIFY(ret.isBool());
        QVERIFY(!ret.toBool());
        ret = compareFun.call(QScriptValue(), QScriptValueList() << qobj1 << obj1);
        QVERIFY(ret.isBool());
        QVERIFY(!ret.toBool());
    }

    {
        QScriptValue var1 = eng.newVariant(QVariant(false));
        QScriptValue var2 = eng.newVariant(QVariant(false));
        QVERIFY(var1.equals(var2));
        {
            QScriptValue ret = compareFun.call(QScriptValue(), QScriptValueList() << var1 << var2);
            QVERIFY(ret.isBool());
            QVERIFY(ret.toBool());
        }
    }
    {
        QScriptValue var1 = eng.newVariant(QVariant(false));
        QScriptValue var2 = eng.newVariant(QVariant(0));
        // QVariant::operator==() performs type conversion
        QVERIFY(var1.equals(var2));
    }
    {
        QScriptValue var1 = eng.newVariant(QVariant(QStringList() << "a"));
        QScriptValue var2 = eng.newVariant(QVariant(QStringList() << "a"));
        QVERIFY(var1.equals(var2));
    }
    {
        QScriptValue var1 = eng.newVariant(QVariant(QStringList() << "a"));
        QScriptValue var2 = eng.newVariant(QVariant(QStringList() << "b"));
        QVERIFY(!var1.equals(var2));
    }
    {
        QScriptValue var1 = eng.newVariant(QVariant(QPoint(1, 2)));
        QScriptValue var2 = eng.newVariant(QVariant(QPoint(1, 2)));
        QVERIFY(var1.equals(var2));
    }
    {
        QScriptValue var1 = eng.newVariant(QVariant(QPoint(1, 2)));
        QScriptValue var2 = eng.newVariant(QVariant(QPoint(3, 4)));
        QVERIFY(!var1.equals(var2));
    }
    {
        QScriptValue var1 = eng.newVariant(QVariant(int(1)));
        QScriptValue var2 = eng.newVariant(QVariant(double(1)));
        // QVariant::operator==() performs type conversion
        QVERIFY(var1.equals(var2));
    }
    {
        QScriptValue var1 = eng.newVariant(QVariant(QString::fromLatin1("123")));
        QScriptValue var2 = eng.newVariant(QVariant(double(123)));
        QScriptValue var3(QString::fromLatin1("123"));
        QScriptValue var4(123);

        QVERIFY(var1.equals(var1));
        QVERIFY(var1.equals(var2));
        QVERIFY(var1.equals(var3));
        QVERIFY(var1.equals(var4));

        QVERIFY(var2.equals(var1));
        QVERIFY(var2.equals(var2));
        QVERIFY(var2.equals(var3));
        QVERIFY(var2.equals(var4));

        QVERIFY(var3.equals(var1));
        QVERIFY(var3.equals(var2));
        QVERIFY(var3.equals(var3));
        QVERIFY(var3.equals(var4));

        QVERIFY(var4.equals(var1));
        QVERIFY(var4.equals(var2));
        QVERIFY(var4.equals(var3));
        QVERIFY(var4.equals(var4));
    }

    QScriptEngine otherEngine;
    QTest::ignoreMessage(QtWarningMsg, "QScriptValue::equals: "
                         "cannot compare to a value created in "
                         "a different engine");
    QCOMPARE(date1.equals(QScriptValue(&otherEngine, 123)), false);
}

void tst_QScriptValue::strictlyEquals()
{
    QScriptEngine eng;

    QVERIFY(QScriptValue().strictlyEquals(QScriptValue()));

    QScriptValue num = QScriptValue(&eng, 123);
    QCOMPARE(num.strictlyEquals(QScriptValue(&eng, 123)), true);
    QCOMPARE(num.strictlyEquals(QScriptValue(&eng, 321)), false);
    QCOMPARE(num.strictlyEquals(QScriptValue(&eng, "123")), false);
    QCOMPARE(num.strictlyEquals(QScriptValue(&eng, "321")), false);
    QCOMPARE(num.strictlyEquals(QScriptValue(&eng, 123).toObject()), false);
    QCOMPARE(num.strictlyEquals(QScriptValue(&eng, 321).toObject()), false);
    QCOMPARE(num.strictlyEquals(QScriptValue(&eng, "123").toObject()), false);
    QCOMPARE(num.strictlyEquals(QScriptValue(&eng, "321").toObject()), false);
    QVERIFY(!num.toObject().strictlyEquals(num));
    QVERIFY(!num.strictlyEquals(QScriptValue()));
    QVERIFY(!QScriptValue().strictlyEquals(num));

    QScriptValue str = QScriptValue(&eng, "123");
    QCOMPARE(str.strictlyEquals(QScriptValue(&eng, "123")), true);
    QCOMPARE(str.strictlyEquals(QScriptValue(&eng, "321")), false);
    QCOMPARE(str.strictlyEquals(QScriptValue(&eng, 123)), false);
    QCOMPARE(str.strictlyEquals(QScriptValue(&eng, 321)), false);
    QCOMPARE(str.strictlyEquals(QScriptValue(&eng, "123").toObject()), false);
    QCOMPARE(str.strictlyEquals(QScriptValue(&eng, "321").toObject()), false);
    QCOMPARE(str.strictlyEquals(QScriptValue(&eng, 123).toObject()), false);
    QCOMPARE(str.strictlyEquals(QScriptValue(&eng, 321).toObject()), false);
    QVERIFY(!str.toObject().strictlyEquals(str));
    QVERIFY(!str.strictlyEquals(QScriptValue()));

    QScriptValue num2 = QScriptValue(123);
    QCOMPARE(num2.strictlyEquals(QScriptValue(123)), true);
    QCOMPARE(num2.strictlyEquals(QScriptValue(321)), false);
    QCOMPARE(num2.strictlyEquals(QScriptValue("123")), false);
    QCOMPARE(num2.strictlyEquals(QScriptValue("321")), false);
    QVERIFY(!num2.strictlyEquals(QScriptValue()));

    QScriptValue str2 = QScriptValue("123");
    QCOMPARE(str2.strictlyEquals(QScriptValue("123")), true);
    QCOMPARE(str2.strictlyEquals(QScriptValue("321")), false);
    QCOMPARE(str2.strictlyEquals(QScriptValue(123)), false);
    QCOMPARE(str2.strictlyEquals(QScriptValue(321)), false);
    QVERIFY(!str2.strictlyEquals(QScriptValue()));

    QScriptValue date1 = eng.newDate(QDateTime(QDate(2000, 1, 1)));
    QScriptValue date2 = eng.newDate(QDateTime(QDate(1999, 1, 1)));
    QCOMPARE(date1.strictlyEquals(date2), false);
    QCOMPARE(date1.strictlyEquals(date1), true);
    QCOMPARE(date2.strictlyEquals(date2), true);
    QVERIFY(!date1.strictlyEquals(QScriptValue()));

    QScriptValue undefined = eng.undefinedValue();
    QScriptValue null = eng.nullValue();
    QCOMPARE(undefined.strictlyEquals(undefined), true);
    QCOMPARE(null.strictlyEquals(null), true);
    QCOMPARE(undefined.strictlyEquals(null), false);
    QCOMPARE(null.strictlyEquals(undefined), false);
    QVERIFY(!null.strictlyEquals(QScriptValue()));

    QScriptValue sant = QScriptValue(&eng, true);
    QVERIFY(!sant.strictlyEquals(QScriptValue(&eng, 1)));
    QVERIFY(!sant.strictlyEquals(QScriptValue(&eng, "1")));
    QVERIFY(sant.strictlyEquals(sant));
    QVERIFY(!sant.strictlyEquals(QScriptValue(&eng, 1).toObject()));
    QVERIFY(!sant.strictlyEquals(QScriptValue(&eng, "1").toObject()));
    QVERIFY(!sant.strictlyEquals(sant.toObject()));
    QVERIFY(!sant.toObject().strictlyEquals(sant));
    QVERIFY(!sant.strictlyEquals(QScriptValue(&eng, 0)));
    QVERIFY(!sant.strictlyEquals(undefined));
    QVERIFY(!sant.strictlyEquals(null));
    QVERIFY(!sant.strictlyEquals(QScriptValue()));

    QScriptValue falskt = QScriptValue(&eng, false);
    QVERIFY(!falskt.strictlyEquals(QScriptValue(&eng, 0)));
    QVERIFY(!falskt.strictlyEquals(QScriptValue(&eng, "0")));
    QVERIFY(falskt.strictlyEquals(falskt));
    QVERIFY(!falskt.strictlyEquals(QScriptValue(&eng, 0).toObject()));
    QVERIFY(!falskt.strictlyEquals(QScriptValue(&eng, "0").toObject()));
    QVERIFY(!falskt.strictlyEquals(falskt.toObject()));
    QVERIFY(!falskt.toObject().strictlyEquals(falskt));
    QVERIFY(!falskt.strictlyEquals(sant));
    QVERIFY(!falskt.strictlyEquals(undefined));
    QVERIFY(!falskt.strictlyEquals(null));
    QVERIFY(!falskt.strictlyEquals(QScriptValue()));

    QVERIFY(!QScriptValue(false).strictlyEquals(123));
    QVERIFY(!QScriptValue(QScriptValue::UndefinedValue).strictlyEquals(123));
    QVERIFY(!QScriptValue(QScriptValue::NullValue).strictlyEquals(123));
    QVERIFY(!QScriptValue(false).strictlyEquals("ciao"));
    QVERIFY(!QScriptValue(QScriptValue::UndefinedValue).strictlyEquals("ciao"));
    QVERIFY(!QScriptValue(QScriptValue::NullValue).strictlyEquals("ciao"));
    QVERIFY(QScriptValue(&eng, "ciao").strictlyEquals("ciao"));
    QVERIFY(QScriptValue("ciao").strictlyEquals(QScriptValue(&eng, "ciao")));
    QVERIFY(!QScriptValue("ciao").strictlyEquals(123));
    QVERIFY(!QScriptValue("ciao").strictlyEquals(QScriptValue(&eng, 123)));
    QVERIFY(!QScriptValue(123).strictlyEquals("ciao"));
    QVERIFY(!QScriptValue(123).strictlyEquals(QScriptValue(&eng, "ciao")));
    QVERIFY(!QScriptValue(&eng, 123).strictlyEquals("ciao"));

    QScriptValue obj1 = eng.newObject();
    QScriptValue obj2 = eng.newObject();
    QCOMPARE(obj1.strictlyEquals(obj2), false);
    QCOMPARE(obj2.strictlyEquals(obj1), false);
    QCOMPARE(obj1.strictlyEquals(obj1), true);
    QCOMPARE(obj2.strictlyEquals(obj2), true);
    QVERIFY(!obj1.strictlyEquals(QScriptValue()));

    QScriptValue qobj1 = eng.newQObject(this);
    QScriptValue qobj2 = eng.newQObject(this);
    QVERIFY(!qobj1.strictlyEquals(qobj2));

    {
        QScriptValue var1 = eng.newVariant(QVariant(false));
        QScriptValue var2 = eng.newVariant(QVariant(false));
        QVERIFY(!var1.strictlyEquals(var2));
        QVERIFY(!var1.strictlyEquals(QScriptValue()));
    }
    {
        QScriptValue var1 = eng.newVariant(QVariant(false));
        QScriptValue var2 = eng.newVariant(QVariant(0));
        QVERIFY(!var1.strictlyEquals(var2));
    }
    {
        QScriptValue var1 = eng.newVariant(QVariant(QStringList() << "a"));
        QScriptValue var2 = eng.newVariant(QVariant(QStringList() << "a"));
        QVERIFY(!var1.strictlyEquals(var2));
    }
    {
        QScriptValue var1 = eng.newVariant(QVariant(QStringList() << "a"));
        QScriptValue var2 = eng.newVariant(QVariant(QStringList() << "b"));
        QVERIFY(!var1.strictlyEquals(var2));
    }
    {
        QScriptValue var1 = eng.newVariant(QVariant(QPoint(1, 2)));
        QScriptValue var2 = eng.newVariant(QVariant(QPoint(1, 2)));
        QVERIFY(!var1.strictlyEquals(var2));
    }
    {
        QScriptValue var1 = eng.newVariant(QVariant(QPoint(1, 2)));
        QScriptValue var2 = eng.newVariant(QVariant(QPoint(3, 4)));
        QVERIFY(!var1.strictlyEquals(var2));
    }

    QScriptEngine otherEngine;
    QTest::ignoreMessage(QtWarningMsg, "QScriptValue::strictlyEquals: "
                         "cannot compare to a value created in "
                         "a different engine");
    QCOMPARE(date1.strictlyEquals(QScriptValue(&otherEngine, 123)), false);
}

Q_DECLARE_METATYPE(int*)
Q_DECLARE_METATYPE(double*)
Q_DECLARE_METATYPE(QColor*)
Q_DECLARE_METATYPE(QBrush*)

void tst_QScriptValue::castToPointer()
{
    QScriptEngine eng;
    {
        QScriptValue v = eng.newVariant(int(123));
        int *ip = qscriptvalue_cast<int*>(v);
        QVERIFY(ip != 0);
        QCOMPARE(*ip, 123);
        *ip = 456;
        QCOMPARE(qscriptvalue_cast<int>(v), 456);

        double *dp = qscriptvalue_cast<double*>(v);
        QVERIFY(dp == 0);

        QScriptValue v2 = eng.newVariant(QVariant::fromValue(ip));
        QCOMPARE(qscriptvalue_cast<int*>(v2), ip);
    }
    {
        QColor c(123, 210, 231);
        QScriptValue v = eng.newVariant(c);
        QColor *cp = qscriptvalue_cast<QColor*>(v);
        QVERIFY(cp != 0);
        QCOMPARE(*cp, c);

        QBrush *bp = qscriptvalue_cast<QBrush*>(v);
        QVERIFY(bp == 0);

        QScriptValue v2 = eng.newVariant(QVariant::fromValue(cp));
        QCOMPARE(qscriptvalue_cast<QColor*>(v2), cp);
    }
}

void tst_QScriptValue::prettyPrinter_data()
{
    QTest::addColumn<QString>("function");
    QTest::addColumn<QString>("expected");
    QTest::newRow("function() { }") << QString("function() { }") << QString("function () { }");
    QTest::newRow("function foo() { }") << QString("(function foo() { })") << QString("function foo() { }");
    QTest::newRow("function foo(bar) { }") << QString("(function foo(bar) { })") << QString("function foo(bar) { }");
    QTest::newRow("function foo(bar, baz) { }") << QString("(function foo(bar, baz) { })") << QString("function foo(bar, baz) { }");
    QTest::newRow("this") << QString("function() { this; }") << QString("function () { this; }");
    QTest::newRow("identifier") << QString("function(a) { a; }") << QString("function (a) { a; }");
    QTest::newRow("null") << QString("function() { null; }") << QString("function () { null; }");
    QTest::newRow("true") << QString("function() { true; }") << QString("function () { true; }");
    QTest::newRow("false") << QString("function() { false; }") << QString("function () { false; }");
    QTest::newRow("string") << QString("function() { 'test'; }") << QString("function () { \'test\'; }");
    QTest::newRow("string") << QString("function() { \"test\"; }") << QString("function () { \"test\"; }");
    QTest::newRow("number") << QString("function() { 123; }") << QString("function () { 123; }");
    QTest::newRow("number") << QString("function() { 123.456; }") << QString("function () { 123.456; }");
    QTest::newRow("regexp") << QString("function() { /hello/; }") << QString("function () { /hello/; }");
    QTest::newRow("regexp") << QString("function() { /hello/gim; }") << QString("function () { /hello/gim; }");
    QTest::newRow("array") << QString("function() { []; }") << QString("function () { []; }");
    QTest::newRow("array") << QString("function() { [10]; }") << QString("function () { [10]; }");
    QTest::newRow("array") << QString("function() { [10, 20, 30]; }") << QString("function () { [10, 20, 30]; }");
    QTest::newRow("array") << QString("function() { [10, 20, , 40]; }") << QString("function () { [10, 20, , 40]; }");
    QTest::newRow("array") << QString("function() { [,]; }") << QString("function () { [,]; }");
    QTest::newRow("array") << QString("function() { [, 10]; }") << QString("function () { [, 10]; }");
    QTest::newRow("array") << QString("function() { [, 10, ]; }") << QString("function () { [, 10, ]; }");
    QTest::newRow("array") << QString("function() { [, 10, ,]; }") << QString("function () { [, 10, ,]; }");
    QTest::newRow("array") << QString("function() { [[10], [20]]; }") << QString("function () { [[10], [20]]; }");
    QTest::newRow("member") << QString("function() { a.b; }") << QString("function () { a.b; }");
    QTest::newRow("member") << QString("function() { a.b.c; }") << QString("function () { a.b.c; }");
    QTest::newRow("call") << QString("function() { f(); }") << QString("function () { f(); }");
    QTest::newRow("call") << QString("function() { f(a); }") << QString("function () { f(a); }");
    QTest::newRow("call") << QString("function() { f(a, b); }") << QString("function () { f(a, b); }");
    QTest::newRow("new") << QString("function() { new C(); }") << QString("function () { new C(); }");
    QTest::newRow("new") << QString("function() { new C(a); }") << QString("function () { new C(a); }");
    QTest::newRow("new") << QString("function() { new C(a, b); }") << QString("function () { new C(a, b); }");
    QTest::newRow("++") << QString("function() { a++; }") << QString("function () { a++; }");
    QTest::newRow("++") << QString("function() { ++a; }") << QString("function () { ++a; }");
    QTest::newRow("--") << QString("function() { a--; }") << QString("function () { a--; }");
    QTest::newRow("--") << QString("function() { --a; }") << QString("function () { --a; }");
    QTest::newRow("delete") << QString("function() { delete a; }") << QString("function () { delete a; }");
    QTest::newRow("void") << QString("function() { void a; }") << QString("function () { void a; }");
    QTest::newRow("typeof") << QString("function() { typeof a; }") << QString("function () { typeof a; }");
    QTest::newRow("+") << QString("function() { +a; }") << QString("function () { +a; }");
    QTest::newRow("-") << QString("function() { -a; }") << QString("function () { -a; }");
    QTest::newRow("~") << QString("function() { ~a; }") << QString("function () { ~a; }");
    QTest::newRow("!") << QString("function() { !a; }") << QString("function () { !a; }");
    QTest::newRow("+") << QString("function() { a + b; }") << QString("function () { a + b; }");
    QTest::newRow("&&") << QString("function() { a && b; }") << QString("function () { a && b; }");
    QTest::newRow("&=") << QString("function() { a &= b; }") << QString("function () { a &= b; }");
    QTest::newRow("=") << QString("function() { a = b; }") << QString("function () { a = b; }");
    QTest::newRow("&") << QString("function() { a & b; }") << QString("function () { a & b; }");
    QTest::newRow("|") << QString("function() { a | b; }") << QString("function () { a | b; }");
    QTest::newRow("^") << QString("function() { a ^ b; }") << QString("function () { a ^ b; }");
    QTest::newRow("-=") << QString("function() { a -= b; }") << QString("function () { a -= b; }");
    QTest::newRow("/") << QString("function() { a / b; }") << QString("function () { a / b; }");
    QTest::newRow("/=") << QString("function() { a /= b; }") << QString("function () { a /= b; }");
    QTest::newRow("==") << QString("function() { a == b; }") << QString("function () { a == b; }");
    QTest::newRow(">=") << QString("function() { a >= b; }") << QString("function () { a >= b; }");
    QTest::newRow(">") << QString("function() { a > b; }") << QString("function () { a > b; }");
    QTest::newRow("in") << QString("function() { a in b; }") << QString("function () { a in b; }");
    QTest::newRow("+=") << QString("function() { a += b; }") << QString("function () { a += b; }");
    QTest::newRow("instanceof") << QString("function() { a instanceof b; }") << QString("function () { a instanceof b; }");
    QTest::newRow("<=") << QString("function() { a <= b; }") << QString("function () { a <= b; }");
    QTest::newRow("<<") << QString("function() { a << b; }") << QString("function () { a << b; }");
    QTest::newRow("<<=") << QString("function() { a <<= b; }") << QString("function () { a <<= b; }");
    QTest::newRow("<") << QString("function() { a < b; }") << QString("function () { a < b; }");
    QTest::newRow("%") << QString("function() { a % b; }") << QString("function () { a % b; }");
    QTest::newRow("%=") << QString("function() { a %= b; }") << QString("function () { a %= b; }");
    QTest::newRow("*") << QString("function() { a * b; }") << QString("function () { a * b; }");
    QTest::newRow("*=") << QString("function() { a *= b; }") << QString("function () { a *= b; }");
    QTest::newRow("!=") << QString("function() { a != b; }") << QString("function () { a != b; }");
    QTest::newRow("||") << QString("function() { a || b; }") << QString("function () { a || b; }");
    QTest::newRow("|=") << QString("function() { a |= b; }") << QString("function () { a |= b; }");
    QTest::newRow(">>") << QString("function() { a >> b; }") << QString("function () { a >> b; }");
    QTest::newRow(">>=") << QString("function() { a >>= b; }") << QString("function () { a >>= b; }");
    QTest::newRow("===") << QString("function() { a === b; }") << QString("function () { a === b; }");
    QTest::newRow("!==") << QString("function() { a !== b; }") << QString("function () { a !== b; }");
    QTest::newRow("-") << QString("function() { a - b; }") << QString("function () { a - b; }");
    QTest::newRow(">>>") << QString("function() { a >>> b; }") << QString("function () { a >>> b; }");
    QTest::newRow(">>>=") << QString("function() { a >>>= b; }") << QString("function () { a >>>= b; }");
    QTest::newRow("^=") << QString("function() { a ^= b; }") << QString("function () { a ^= b; }");
    QTest::newRow("? :") << QString("function() { a ? b : c; }") << QString("function () { a ? b : c; }");
    QTest::newRow("a; b; c") << QString("function() { a; b; c; }") << QString("function () { a; b; c; }");
    QTest::newRow("var a;") << QString("function() { var a; }") << QString("function () { var a; }");
    QTest::newRow("var a, b;") << QString("function() { var a, b; }") << QString("function () { var a, b; }");
    QTest::newRow("var a = 10;") << QString("function() { var a = 10; }") << QString("function () { var a = 10; }");
    QTest::newRow("var a, b = 20;") << QString("function() { var a, b = 20; }") << QString("function () { var a, b = 20; }");
    QTest::newRow("var a = 10, b = 20;") << QString("function() { var a = 10, b = 20; }") << QString("function () { var a = 10, b = 20; }");
    QTest::newRow("if") << QString("function() { if (a) b; }") << QString("function () { if (a) b; }");
    QTest::newRow("if") << QString("function() { if (a) { b; c; } }") << QString("function () { if (a) { b; c; } }");
    QTest::newRow("if-else") << QString("function() { if (a) b; else c; }") << QString("function () { if (a) b; else c; }");
    QTest::newRow("if-else") << QString("function() { if (a) { b; c; } else { d; e; } }") << QString("function () { if (a) { b; c; } else { d; e; } }");
    QTest::newRow("do-while") << QString("function() { do { a; } while (b); }") << QString("function () { do { a; } while (b); }");
    QTest::newRow("do-while") << QString("function() { do { a; b; c; } while (d); }") << QString("function () { do { a; b; c; } while (d); }");
    QTest::newRow("while") << QString("function() { while (a) { b; } }") << QString("function () { while (a) { b; } }");
    QTest::newRow("while") << QString("function() { while (a) { b; c; } }") << QString("function () { while (a) { b; c; } }");
    QTest::newRow("for") << QString("function() { for (a; b; c) { } }") << QString("function () { for (a; b; c) { } }");
    QTest::newRow("for") << QString("function() { for (; a; b) { } }") << QString("function () { for (; a; b) { } }");
    QTest::newRow("for") << QString("function() { for (; ; a) { } }") << QString("function () { for (; ; a) { } }");
    QTest::newRow("for") << QString("function() { for (; ; ) { } }") << QString("function () { for (; ; ) { } }");
    QTest::newRow("for") << QString("function() { for (var a; b; c) { } }") << QString("function () { for (var a; b; c) { } }");
    QTest::newRow("for") << QString("function() { for (var a, b, c; d; e) { } }") << QString("function () { for (var a, b, c; d; e) { } }");
    QTest::newRow("continue") << QString("function() { for (; ; ) { continue; } }") << QString("function () { for (; ; ) { continue; } }");
    QTest::newRow("continue") << QString("function() { for (; ; ) { continue label; } }") << QString("function () { for (; ; ) { continue label; } }");
    QTest::newRow("break") << QString("function() { for (; ; ) { break; } }") << QString("function () { for (; ; ) { break; } }");
    QTest::newRow("break") << QString("function() { for (; ; ) { break label; } }") << QString("function () { for (; ; ) { break label; } }");
    QTest::newRow("return") << QString("function() { return; }") << QString("function () { return; }");
    QTest::newRow("return") << QString("function() { return 10; }") << QString("function () { return 10; }");
    QTest::newRow("with") << QString("function() { with (a) { b; } }") << QString("function () { with (a) { b; } }");
    QTest::newRow("with") << QString("function() { with (a) { b; c; } }") << QString("function () { with (a) { b; c; } }");
    QTest::newRow("switch") << QString("function() { switch (a) { } }") << QString("function () { switch (a) { } }");
    QTest::newRow("switch") << QString("function() { switch (a) { case 1: ; } }") << QString("function () { switch (a) { case 1: ; } }");
    QTest::newRow("switch") << QString("function() { switch (a) { case 1: b; break; } }") << QString("function () { switch (a) { case 1: b; break; } }");
    QTest::newRow("switch") << QString("function() { switch (a) { case 1: b; break; case 2: break; } }") << QString("function () { switch (a) { case 1: b; break; case 2: break; } }");
    QTest::newRow("switch") << QString("function() { switch (a) { case 1: case 2: ; } }") << QString("function () { switch (a) { case 1: case 2: ; } }");
    QTest::newRow("switch") << QString("function() { switch (a) { case 1: default: ; } }") << QString("function () { switch (a) { case 1: default: ; } }");
    QTest::newRow("switch") << QString("function() { switch (a) { case 1: default: ; case 3: ; } }") << QString("function () { switch (a) { case 1: default: ; case 3: ; } }");
    QTest::newRow("label") << QString("function() { a: b; }") << QString("function () { a: b; }");
    QTest::newRow("throw") << QString("function() { throw a; }") << QString("function () { throw a; }");
    QTest::newRow("try-catch") << QString("function() { try { a; } catch (e) { b; } }") << QString("function () { try { a; } catch (e) { b; } }");
    QTest::newRow("try-finally") << QString("function() { try { a; } finally { b; } }") << QString("function () { try { a; } finally { b; } }");
    QTest::newRow("try-catch-finally") << QString("function() { try { a; } catch (e) { b; } finally { c; } }") << QString("function () { try { a; } catch (e) { b; } finally { c; } }");
    QTest::newRow("a + b + c + d") << QString("function() { a + b + c + d; }") << QString("function () { a + b + c + d; }");
    QTest::newRow("a + b - c") << QString("function() { a + b - c; }") << QString("function () { a + b - c; }");
    QTest::newRow("a + -b") << QString("function() { a + -b; }") << QString("function () { a + -b; }");
    QTest::newRow("a + ~b") << QString("function() { a + ~b; }") << QString("function () { a + ~b; }");
    QTest::newRow("a + !b") << QString("function() { a + !b; }") << QString("function () { a + !b; }");
    QTest::newRow("a + +b") << QString("function() { a + +b; }") << QString("function () { a + +b; }");
    QTest::newRow("(a + b) - c") << QString("function() { (a + b) - c; }") << QString("function () { (a + b) - c; }");
    QTest::newRow("(a - b + c") << QString("function() { a - b + c; }") << QString("function () { a - b + c; }");
    QTest::newRow("(a - (b + c)") << QString("function() { a - (b + c); }") << QString("function () { a - (b + c); }");
    QTest::newRow("a + -(b + c)") << QString("function() { a + -(b + c); }") << QString("function () { a + -(b + c); }");
    QTest::newRow("a + ~(b + c)") << QString("function() { a + ~(b + c); }") << QString("function () { a + ~(b + c); }");
    QTest::newRow("a + !(b + c)") << QString("function() { a + !(b + c); }") << QString("function () { a + !(b + c); }");
    QTest::newRow("a + +(b + c)") << QString("function() { a + +(b + c); }") << QString("function () { a + +(b + c); }");
    QTest::newRow("a + b * c") << QString("function() { a + b * c; }") << QString("function () { a + b * c; }");
    QTest::newRow("(a + b) * c") << QString("function() { (a + b) * c; }") << QString("function () { (a + b) * c; }");
    QTest::newRow("(a + b) * (c + d)") << QString("function() { (a + b) * (c + d); }") << QString("function () { (a + b) * (c + d); }");
    QTest::newRow("a + (b * c)") << QString("function() { a + (b * c); }") << QString("function () { a + (b * c); }");
    QTest::newRow("a + (b / c)") << QString("function() { a + (b / c); }") << QString("function () { a + (b / c); }");
    QTest::newRow("(a / b) * c") << QString("function() { (a / b) * c; }") << QString("function () { (a / b) * c; }");
    QTest::newRow("a / (b * c)") << QString("function() { a / (b * c); }") << QString("function () { a / (b * c); }");
    QTest::newRow("a / (b % c)") << QString("function() { a / (b % c); }") << QString("function () { a / (b % c); }");
    QTest::newRow("a && b || c") << QString("function() { a && b || c; }") << QString("function () { a && b || c; }");
    QTest::newRow("a && (b || c)") << QString("function() { a && (b || c); }") << QString("function () { a && (b || c); }");
    QTest::newRow("a & b | c") << QString("function() { a & b | c; }") << QString("function () { a & b | c; }");
    QTest::newRow("a & (b | c)") << QString("function() { a & (b | c); }") << QString("function () { a & (b | c); }");
    QTest::newRow("a & b | c ^ d") << QString("function() { a & b | c ^ d; }") << QString("function () { a & b | c ^ d; }");
    QTest::newRow("a & (b | c ^ d)") << QString("function() { a & (b | c ^ d); }") << QString("function () { a & (b | c ^ d); }");
    QTest::newRow("(a & b | c) ^ d") << QString("function() { (a & b | c) ^ d; }") << QString("function () { (a & b | c) ^ d; }");
    QTest::newRow("a << b + c") << QString("function() { a << b + c; }") << QString("function () { a << b + c; }");
    QTest::newRow("(a << b) + c") << QString("function() { (a << b) + c; }") << QString("function () { (a << b) + c; }");
    QTest::newRow("a >> b + c") << QString("function() { a >> b + c; }") << QString("function () { a >> b + c; }");
    QTest::newRow("(a >> b) + c") << QString("function() { (a >> b) + c; }") << QString("function () { (a >> b) + c; }");
    QTest::newRow("a >>> b + c") << QString("function() { a >>> b + c; }") << QString("function () { a >>> b + c; }");
    QTest::newRow("(a >>> b) + c") << QString("function() { (a >>> b) + c; }") << QString("function () { (a >>> b) + c; }");
    QTest::newRow("a == b || c != d") << QString("function() { a == b || c != d; }") << QString("function () { a == b || c != d; }");
    QTest::newRow("a == (b || c != d)") << QString("function() { a == (b || c != d); }") << QString("function () { a == (b || c != d); }");
    QTest::newRow("a === b || c !== d") << QString("function() { a === b || c !== d; }") << QString("function () { a === b || c !== d; }");
    QTest::newRow("a === (b || c !== d)") << QString("function() { a === (b || c !== d); }") << QString("function () { a === (b || c !== d); }");
    QTest::newRow("a &= b + c") << QString("function() { a &= b + c; }") << QString("function () { a &= b + c; }");
    QTest::newRow("debugger") << QString("function() { debugger }") << QString("function () { debugger; }");
}

void tst_QScriptValue::prettyPrinter()
{
    QFETCH(QString, function);
    QFETCH(QString, expected);
    QScriptEngine eng;
    QScriptValue val = eng.evaluate("(" + function + ")");
    QVERIFY(val.isFunction());
    QString actual = val.toString();
    int count = qMin(actual.size(), expected.size());
//    qDebug() << actual << expected;
    for (int i = 0; i < count; ++i) {
//        qDebug() << i << actual.at(i) << expected.at(i);
        QCOMPARE(actual.at(i), expected.at(i));
    }
    QCOMPARE(actual.size(), expected.size());
}

void tst_QScriptValue::engineDeleted()
{
    QScriptEngine *eng = new QScriptEngine;
    QScriptValue v1(eng, 123);
    QVERIFY(v1.isNumber());
    QScriptValue v2(eng, QString("ciao"));
    QVERIFY(v2.isString());
    QScriptValue v3 = eng->newObject();
    QVERIFY(v3.isObject());
    QScriptValue v4 = eng->newQObject(this);
    QVERIFY(v4.isQObject());
    QScriptValue v5 = "Hello";
    QVERIFY(v2.isString());

    delete eng;

    QVERIFY(!v1.isValid());
    QVERIFY(v1.engine() == 0);
    QVERIFY(!v2.isValid());
    QVERIFY(v2.engine() == 0);
    QVERIFY(!v3.isValid());
    QVERIFY(v3.engine() == 0);
    QVERIFY(!v4.isValid());
    QVERIFY(v4.engine() == 0);
    QVERIFY(v5.isValid());
    QVERIFY(v5.engine() == 0);

    QVERIFY(!v3.property("foo").isValid());
}

void tst_QScriptValue::valueOfWithClosure()
{
    QScriptEngine eng;
    // valueOf()
    {
        QScriptValue obj = eng.evaluate("o = {}; (function(foo) { o.valueOf = function() { return foo; } })(123); o");
        QVERIFY(obj.isObject());
        QCOMPARE(obj.toInt32(), 123);
    }
    // toString()
    {
        QScriptValue obj = eng.evaluate("o = {}; (function(foo) { o.toString = function() { return foo; } })('ciao'); o");
        QVERIFY(obj.isObject());
        QCOMPARE(obj.toString(), QString::fromLatin1("ciao"));
    }
}

void tst_QScriptValue::objectId()
{
    QCOMPARE(QScriptValue().objectId(), (qint64)-1);
    QCOMPARE(QScriptValue(QScriptValue::UndefinedValue).objectId(), (qint64)-1);
    QCOMPARE(QScriptValue(QScriptValue::NullValue).objectId(), (qint64)-1);
    QCOMPARE(QScriptValue(false).objectId(), (qint64)-1);
    QCOMPARE(QScriptValue(123).objectId(), (qint64)-1);
    QCOMPARE(QScriptValue(uint(123)).objectId(), (qint64)-1);
    QCOMPARE(QScriptValue(123.5).objectId(), (qint64)-1);
    QCOMPARE(QScriptValue("ciao").objectId(), (qint64)-1);

    QScriptEngine eng;
    QScriptValue o1 = eng.newObject();
    QVERIFY(o1.objectId() != -1);
    QScriptValue o2 = eng.newObject();
    QVERIFY(o2.objectId() != -1);
    QVERIFY(o1.objectId() != o2.objectId());

    QVERIFY(eng.objectById(o1.objectId()).strictlyEquals(o1));
    QVERIFY(eng.objectById(o2.objectId()).strictlyEquals(o2));

    qint64 globalObjectId = -1;
    {
        QScriptValue global = eng.globalObject();
        globalObjectId = global.objectId();
        QVERIFY(globalObjectId != -1);
        QVERIFY(eng.objectById(globalObjectId).strictlyEquals(global));
    }
    QScriptValue obj = eng.objectById(globalObjectId);
    QVERIFY(obj.isObject());
    QVERIFY(obj.strictlyEquals(eng.globalObject()));
}

void tst_QScriptValue::nestedObjectToVariant_data()
{
    QTest::addColumn<QString>("program");
    QTest::addColumn<QVariant>("expected");

    // Array literals
    QTest::newRow("[[]]")
        << QString::fromLatin1("[[]]")
        << QVariant(QVariantList() << (QVariant(QVariantList())));
    QTest::newRow("[[123]]")
        << QString::fromLatin1("[[123]]")
        << QVariant(QVariantList() << (QVariant(QVariantList() << 123)));
    QTest::newRow("[[], 123]")
        << QString::fromLatin1("[[], 123]")
        << QVariant(QVariantList() << QVariant(QVariantList()) << 123);

    // Cyclic arrays
    QTest::newRow("var a=[]; a.push(a)")
        << QString::fromLatin1("var a=[]; a.push(a); a")
        << QVariant(QVariantList() << QVariant(QVariantList()));
    QTest::newRow("var a=[]; a.push(123, a)")
        << QString::fromLatin1("var a=[]; a.push(123, a); a")
        << QVariant(QVariantList() << 123 << QVariant(QVariantList()));
    QTest::newRow("var a=[]; var b=[]; a.push(b); b.push(a)")
        << QString::fromLatin1("var a=[]; var b=[]; a.push(b); b.push(a); a")
        << QVariant(QVariantList() << QVariant(QVariantList() << QVariant(QVariantList())));
    QTest::newRow("var a=[]; var b=[]; a.push(123, b); b.push(456, a)")
        << QString::fromLatin1("var a=[]; var b=[]; a.push(123, b); b.push(456, a); a")
        << QVariant(QVariantList() << 123 << QVariant(QVariantList() << 456 << QVariant(QVariantList())));

    // Object literals
    {
        QVariantMap m;
        m["a"] = QVariantMap();
        QTest::newRow("{ a:{} }")
            << QString::fromLatin1("({ a:{} })")
            << QVariant(m);
    }
    {
        QVariantMap m, m2;
        m2["b"] = 10;
        m2["c"] = 20;
        m["a"] = m2;
        QTest::newRow("{ a:{b:10, c:20} }")
            << QString::fromLatin1("({ a:{b:10, c:20} })")
            << QVariant(m);
    }
    {
        QVariantMap m;
        m["a"] = 10;
        m["b"] = QVariantList() << 20 << 30;
        QTest::newRow("{ a:10, b:[20, 30]}")
            << QString::fromLatin1("({ a:10, b:[20,30]})")
            << QVariant(m);
    }

    // Cyclic objects
    {
        QVariantMap m;
        m["p"] = QVariantMap();
        QTest::newRow("var o={}; o.p=o")
            << QString::fromLatin1("var o={}; o.p=o; o")
            << QVariant(m);
    }
    {
        QVariantMap m;
        m["p"] = 123;
        m["q"] = QVariantMap();
        QTest::newRow("var o={}; o.p=123; o.q=o")
            << QString::fromLatin1("var o={}; o.p=123; o.q=o; o")
            << QVariant(m);
    }
}

void tst_QScriptValue::nestedObjectToVariant()
{
    QScriptEngine eng;
    QFETCH(QString, program);
    QFETCH(QVariant, expected);
    QScriptValue o = eng.evaluate(program);
    QVERIFY(!o.isError());
    QVERIFY(o.isObject());
    QCOMPARE(o.toVariant(), expected);
}

void tst_QScriptValue::propertyFlags_data()
{
    QTest::addColumn<QString>("program");
    QTest::addColumn<uint>("expected");

    QTest::newRow("nothing") << "" << 0u;
    QTest::newRow("getter") << "o.__defineGetter__('prop', function() { return 'blah' } );\n" << uint(QScriptValue::PropertyGetter);
    QTest::newRow("setter") << "o.__defineSetter__('prop', function(a) { this.setted_prop2 = a; } );\n" << uint(QScriptValue::PropertySetter);
    QTest::newRow("getterSetter") <<  "o.__defineGetter__('prop', function() { return 'ploup' } );\n"
                                      "o.__defineSetter__('prop', function(a) { this.setted_prop3 = a; } );\n" << uint(QScriptValue::PropertySetter|QScriptValue::PropertyGetter);
    QTest::newRow("nothing2") << "o.prop = 'nothing'" << 0u;
}

void tst_QScriptValue::propertyFlags()
{
    QFETCH(QString, program);
    QFETCH(uint, expected);
    QScriptEngine eng;
    eng.evaluate("o = new Object;");
    eng.evaluate(program);
    QScriptValue o = eng.evaluate("o");

    QCOMPARE(uint(o.propertyFlags("prop")), expected);
}


QTEST_MAIN(tst_QScriptValue)
