tests/auto/qscriptengine/tst_qscriptengine.cpp
changeset 23 89e065397ea6
parent 22 79de32ba3296
child 30 5dc02b23752f
equal deleted inserted replaced
22:79de32ba3296 23:89e065397ea6
   155     void installTranslatorFunctions_data();
   155     void installTranslatorFunctions_data();
   156     void installTranslatorFunctions();
   156     void installTranslatorFunctions();
   157     void translateScript();
   157     void translateScript();
   158     void translateWithInvalidArgs_data();
   158     void translateWithInvalidArgs_data();
   159     void translateWithInvalidArgs();
   159     void translateWithInvalidArgs();
       
   160     void translationContext_data();
       
   161     void translationContext();
   160     void functionScopes();
   162     void functionScopes();
   161     void nativeFunctionScopes();
   163     void nativeFunctionScopes();
   162     void evaluateProgram();
   164     void evaluateProgram();
   163     void collectGarbageAfterConnect();
   165     void collectGarbageAfterConnect();
   164 
   166 
   796     }
   798     }
   797     obj.setProperty("isCalledAsConstructor", QScriptValue(eng, ctx->isCalledAsConstructor()));
   799     obj.setProperty("isCalledAsConstructor", QScriptValue(eng, ctx->isCalledAsConstructor()));
   798     return obj;
   800     return obj;
   799 }
   801 }
   800 
   802 
       
   803 static QScriptValue instanceofJS(const QScriptValue &inst, const QScriptValue &ctor)
       
   804 {
       
   805     return inst.engine()->evaluate("(function(inst, ctor) { return inst instanceof ctor; })")
       
   806         .call(QScriptValue(), QScriptValueList() << inst << ctor);
       
   807 }
       
   808 
   801 void tst_QScriptEngine::newQMetaObject()
   809 void tst_QScriptEngine::newQMetaObject()
   802 {
   810 {
   803     QScriptEngine eng;
   811     QScriptEngine eng;
   804 #if 0
   812 #if 0
   805     QScriptValue qclass = eng.newQMetaObject<QObject>();
   813     QScriptValue qclass = eng.newQMetaObject<QObject>();
   826 
   834 
   827     QScriptValue instance = qclass.construct();
   835     QScriptValue instance = qclass.construct();
   828     QCOMPARE(instance.isQObject(), true);
   836     QCOMPARE(instance.isQObject(), true);
   829     QCOMPARE(instance.toQObject()->metaObject(), qclass.toQMetaObject());
   837     QCOMPARE(instance.toQObject()->metaObject(), qclass.toQMetaObject());
   830     QVERIFY(instance.instanceOf(qclass));
   838     QVERIFY(instance.instanceOf(qclass));
       
   839     QVERIFY(instanceofJS(instance, qclass).strictlyEquals(true));
   831 
   840 
   832     QScriptValue instance2 = qclass2.construct();
   841     QScriptValue instance2 = qclass2.construct();
   833     QCOMPARE(instance2.isQObject(), true);
   842     QCOMPARE(instance2.isQObject(), true);
   834     QCOMPARE(instance2.toQObject()->metaObject(), qclass2.toQMetaObject());
   843     QCOMPARE(instance2.toQObject()->metaObject(), qclass2.toQMetaObject());
   835     QVERIFY(instance2.instanceOf(qclass2));
   844     QVERIFY(instance2.instanceOf(qclass2));
       
   845     QVERIFY(instanceofJS(instance2, qclass2).strictlyEquals(true));
       
   846     QVERIFY(!instance2.instanceOf(qclass));
       
   847     QVERIFY(instanceofJS(instance2, qclass).strictlyEquals(false));
   836 
   848 
   837     QScriptValueList args;
   849     QScriptValueList args;
   838     args << instance;
   850     args << instance;
   839     QScriptValue instance3 = qclass.construct(args);
   851     QScriptValue instance3 = qclass.construct(args);
   840     QCOMPARE(instance3.isQObject(), true);
   852     QCOMPARE(instance3.isQObject(), true);
   841     QCOMPARE(instance3.toQObject()->parent(), instance.toQObject());
   853     QCOMPARE(instance3.toQObject()->parent(), instance.toQObject());
   842     QVERIFY(instance3.instanceOf(qclass));
   854     QVERIFY(instance3.instanceOf(qclass));
       
   855     QVERIFY(instanceofJS(instance3, qclass).strictlyEquals(true));
       
   856     QVERIFY(!instance3.instanceOf(qclass2));
       
   857     QVERIFY(instanceofJS(instance3, qclass2).strictlyEquals(false));
   843     args.clear();
   858     args.clear();
   844 
   859 
   845     QPointer<QObject> qpointer1 = instance.toQObject();
   860     QPointer<QObject> qpointer1 = instance.toQObject();
   846     QPointer<QObject> qpointer2 = instance2.toQObject();
   861     QPointer<QObject> qpointer2 = instance2.toQObject();
   847     QPointer<QObject> qpointer3 = instance3.toQObject();
   862     QPointer<QObject> qpointer3 = instance3.toQObject();
   873         QScriptValue ret = qclass3.call();
   888         QScriptValue ret = qclass3.call();
   874         QVERIFY(ret.isObject());
   889         QVERIFY(ret.isObject());
   875         QVERIFY(ret.property("isCalledAsConstructor").isBoolean());
   890         QVERIFY(ret.property("isCalledAsConstructor").isBoolean());
   876         QVERIFY(!ret.property("isCalledAsConstructor").toBoolean());
   891         QVERIFY(!ret.property("isCalledAsConstructor").toBoolean());
   877         QVERIFY(ret.instanceOf(qclass3));
   892         QVERIFY(ret.instanceOf(qclass3));
       
   893         QVERIFY(instanceofJS(ret, qclass3).strictlyEquals(true));
       
   894         QVERIFY(!ret.instanceOf(qclass));
       
   895         QVERIFY(instanceofJS(ret, qclass).strictlyEquals(false));
   878     }
   896     }
   879     {
   897     {
   880         QScriptValue ret = qclass3.construct();
   898         QScriptValue ret = qclass3.construct();
   881         QVERIFY(ret.isObject());
   899         QVERIFY(ret.isObject());
   882         QVERIFY(ret.property("isCalledAsConstructor").isBoolean());
   900         QVERIFY(ret.property("isCalledAsConstructor").isBoolean());
   883         QVERIFY(ret.property("isCalledAsConstructor").toBoolean());
   901         QVERIFY(ret.property("isCalledAsConstructor").toBoolean());
   884         QVERIFY(ret.instanceOf(qclass3));
   902         QVERIFY(ret.instanceOf(qclass3));
       
   903         QVERIFY(instanceofJS(ret, qclass3).strictlyEquals(true));
       
   904         QVERIFY(!ret.instanceOf(qclass2));
       
   905         QVERIFY(instanceofJS(ret, qclass2).strictlyEquals(false));
   885     }
   906     }
   886 
   907 
   887     // subclassing
   908     // subclassing
   888     qclass2.setProperty("prototype", qclass.construct());
   909     qclass2.setProperty("prototype", qclass.construct());
   889     QVERIFY(qclass2.construct().instanceOf(qclass));
   910     QVERIFY(qclass2.construct().instanceOf(qclass));
       
   911     QVERIFY(instanceofJS(qclass2.construct(), qclass).strictlyEquals(true));
   890 
   912 
   891     // with meta-constructor
   913     // with meta-constructor
   892     QScriptValue qclass4 = eng.newQMetaObject(&QObject::staticMetaObject);
   914     QScriptValue qclass4 = eng.newQMetaObject(&QObject::staticMetaObject);
   893     {
   915     {
   894         QScriptValue inst = qclass4.construct();
   916         QScriptValue inst = qclass4.construct();
   895         QVERIFY(inst.isQObject());
   917         QVERIFY(inst.isQObject());
   896         QVERIFY(inst.toQObject() != 0);
   918         QVERIFY(inst.toQObject() != 0);
   897         QCOMPARE(inst.toQObject()->parent(), (QObject*)0);
   919         QCOMPARE(inst.toQObject()->parent(), (QObject*)0);
   898         QVERIFY(inst.instanceOf(qclass4));
   920         QVERIFY(inst.instanceOf(qclass4));
       
   921         QVERIFY(instanceofJS(inst, qclass4).strictlyEquals(true));
       
   922         QVERIFY(!inst.instanceOf(qclass3));
       
   923         QVERIFY(instanceofJS(inst, qclass3).strictlyEquals(false));
   899     }
   924     }
   900     {
   925     {
   901         QScriptValue inst = qclass4.construct(QScriptValueList() << eng.newQObject(this));
   926         QScriptValue inst = qclass4.construct(QScriptValueList() << eng.newQObject(this));
   902         QVERIFY(inst.isQObject());
   927         QVERIFY(inst.isQObject());
   903         QVERIFY(inst.toQObject() != 0);
   928         QVERIFY(inst.toQObject() != 0);
   904         QCOMPARE(inst.toQObject()->parent(), (QObject*)this);
   929         QCOMPARE(inst.toQObject()->parent(), (QObject*)this);
   905         QVERIFY(inst.instanceOf(qclass4));
   930         QVERIFY(inst.instanceOf(qclass4));
       
   931         QVERIFY(instanceofJS(inst, qclass4).strictlyEquals(true));
       
   932         QVERIFY(!inst.instanceOf(qclass2));
       
   933         QVERIFY(instanceofJS(inst, qclass2).strictlyEquals(false));
   906     }
   934     }
   907 }
   935 }
   908 
   936 
   909 void tst_QScriptEngine::newActivationObject()
   937 void tst_QScriptEngine::newActivationObject()
   910 {
   938 {
  3831     {
  3859     {
  3832         QScriptValue tmp = eng.toObject(falskt);
  3860         QScriptValue tmp = eng.toObject(falskt);
  3833         QVERIFY(tmp.isObject());
  3861         QVERIFY(tmp.isObject());
  3834         QCOMPARE(tmp.toNumber(), falskt.toNumber());
  3862         QCOMPARE(tmp.toNumber(), falskt.toNumber());
  3835     }
  3863     }
       
  3864     QVERIFY(falskt.isBool());
  3836 
  3865 
  3837     QScriptValue sant(true);
  3866     QScriptValue sant(true);
  3838     {
  3867     {
  3839         QScriptValue tmp = eng.toObject(sant);
  3868         QScriptValue tmp = eng.toObject(sant);
  3840         QVERIFY(tmp.isObject());
  3869         QVERIFY(tmp.isObject());
  3841         QCOMPARE(tmp.toNumber(), sant.toNumber());
  3870         QCOMPARE(tmp.toNumber(), sant.toNumber());
  3842     }
  3871     }
       
  3872     QVERIFY(sant.isBool());
  3843 
  3873 
  3844     QScriptValue number(123.0);
  3874     QScriptValue number(123.0);
  3845     {
  3875     {
  3846         QScriptValue tmp = eng.toObject(number);
  3876         QScriptValue tmp = eng.toObject(number);
  3847         QVERIFY(tmp.isObject());
  3877         QVERIFY(tmp.isObject());
  3848         QCOMPARE(tmp.toNumber(), number.toNumber());
  3878         QCOMPARE(tmp.toNumber(), number.toNumber());
  3849     }
  3879     }
       
  3880     QVERIFY(number.isNumber());
  3850 
  3881 
  3851     QScriptValue str = QScriptValue(&eng, QString("ciao"));
  3882     QScriptValue str = QScriptValue(&eng, QString("ciao"));
  3852     {
  3883     {
  3853         QScriptValue tmp = eng.toObject(str);
  3884         QScriptValue tmp = eng.toObject(str);
  3854         QVERIFY(tmp.isObject());
  3885         QVERIFY(tmp.isObject());
  3855         QCOMPARE(tmp.toString(), str.toString());
  3886         QCOMPARE(tmp.toString(), str.toString());
  3856     }
  3887     }
       
  3888     QVERIFY(str.isString());
  3857 
  3889 
  3858     QScriptValue object = eng.newObject();
  3890     QScriptValue object = eng.newObject();
  3859     {
  3891     {
  3860         QScriptValue tmp = eng.toObject(object);
  3892         QScriptValue tmp = eng.toObject(object);
  3861         QVERIFY(tmp.isObject());
  3893         QVERIFY(tmp.isObject());
  3864 
  3896 
  3865     QScriptValue qobject = eng.newQObject(this);
  3897     QScriptValue qobject = eng.newQObject(this);
  3866     QVERIFY(eng.toObject(qobject).strictlyEquals(qobject));
  3898     QVERIFY(eng.toObject(qobject).strictlyEquals(qobject));
  3867 
  3899 
  3868     QVERIFY(!eng.toObject(QScriptValue()).isValid());
  3900     QVERIFY(!eng.toObject(QScriptValue()).isValid());
       
  3901 
       
  3902     // v1 constructors
       
  3903 
       
  3904     QScriptValue boolValue(&eng, true);
       
  3905     {
       
  3906         QScriptValue ret = eng.toObject(boolValue);
       
  3907         QVERIFY(ret.isObject());
       
  3908         QCOMPARE(ret.toBool(), boolValue.toBool());
       
  3909     }
       
  3910     QVERIFY(boolValue.isBool());
       
  3911 
       
  3912     QScriptValue numberValue(&eng, 123.0);
       
  3913     {
       
  3914         QScriptValue ret = eng.toObject(numberValue);
       
  3915         QVERIFY(ret.isObject());
       
  3916         QCOMPARE(ret.toNumber(), numberValue.toNumber());
       
  3917     }
       
  3918     QVERIFY(numberValue.isNumber());
       
  3919 
       
  3920     QScriptValue stringValue(&eng, QString::fromLatin1("foo"));
       
  3921     {
       
  3922         QScriptValue ret = eng.toObject(stringValue);
       
  3923         QVERIFY(ret.isObject());
       
  3924         QCOMPARE(ret.toString(), stringValue.toString());
       
  3925     }
       
  3926     QVERIFY(stringValue.isString());
  3869 }
  3927 }
  3870 
  3928 
  3871 void tst_QScriptEngine::reservedWords_data()
  3929 void tst_QScriptEngine::reservedWords_data()
  3872 {
  3930 {
  3873     QTest::addColumn<QString>("word");
  3931     QTest::addColumn<QString>("word");
  4436     QScriptValue result = engine.evaluate(expression);
  4494     QScriptValue result = engine.evaluate(expression);
  4437     QVERIFY(result.isError());
  4495     QVERIFY(result.isError());
  4438     QCOMPARE(result.toString(), expectedError);
  4496     QCOMPARE(result.toString(), expectedError);
  4439 }
  4497 }
  4440 
  4498 
       
  4499 void tst_QScriptEngine::translationContext_data()
       
  4500 {
       
  4501     QTest::addColumn<QString>("path");
       
  4502     QTest::addColumn<QString>("text");
       
  4503     QTest::addColumn<QString>("expectedTranslation");
       
  4504 
       
  4505     QTest::newRow("translatable.js")  << "translatable.js" << "One" << "En";
       
  4506     QTest::newRow("/translatable.js")  << "/translatable.js" << "One" << "En";
       
  4507     QTest::newRow("/foo/translatable.js")  << "/foo/translatable.js" << "One" << "En";
       
  4508     QTest::newRow("/foo/bar/translatable.js")  << "/foo/bar/translatable.js" << "One" << "En";
       
  4509     QTest::newRow("./translatable.js")  << "./translatable.js" << "One" << "En";
       
  4510     QTest::newRow("../translatable.js")  << "../translatable.js" << "One" << "En";
       
  4511     QTest::newRow("foo/translatable.js")  << "foo/translatable.js" << "One" << "En";
       
  4512     QTest::newRow("file:///home/qt/translatable.js")  << "file:///home/qt/translatable.js" << "One" << "En";
       
  4513     QTest::newRow(":/resources/translatable.js")  << ":/resources/translatable.js" << "One" << "En";
       
  4514     QTest::newRow("/translatable.js.foo")  << "/translatable.js.foo" << "One" << "En";
       
  4515     QTest::newRow("/translatable.txt")  << "/translatable.txt" << "One" << "En";
       
  4516     QTest::newRow("translatable")  << "translatable" << "One" << "En";
       
  4517     QTest::newRow("foo/translatable")  << "foo/translatable" << "One" << "En";
       
  4518 
       
  4519     QTest::newRow("native separators")
       
  4520         << (QDir::toNativeSeparators(QDir::currentPath()) + QDir::separator() + "translatable.js")
       
  4521         << "One" << "En";
       
  4522 
       
  4523     QTest::newRow("translatable.js/")  << "translatable.js/" << "One" << "One";
       
  4524     QTest::newRow("nosuchscript.js")  << "" << "One" << "One";
       
  4525     QTest::newRow("(empty)")  << "" << "One" << "One";
       
  4526 }
       
  4527 
       
  4528 void tst_QScriptEngine::translationContext()
       
  4529 {
       
  4530     QTranslator translator;
       
  4531     translator.load(":/translations/translatable_la");
       
  4532     QCoreApplication::instance()->installTranslator(&translator);
       
  4533 
       
  4534     QScriptEngine engine;
       
  4535     engine.installTranslatorFunctions();
       
  4536 
       
  4537     QFETCH(QString, path);
       
  4538     QFETCH(QString, text);
       
  4539     QFETCH(QString, expectedTranslation);
       
  4540     QScriptValue ret = engine.evaluate(QString::fromLatin1("qsTr('%0')").arg(text), path);
       
  4541     QVERIFY(ret.isString());
       
  4542     QCOMPARE(ret.toString(), expectedTranslation);
       
  4543 
       
  4544     QCoreApplication::instance()->removeTranslator(&translator);
       
  4545 }
       
  4546 
  4441 void tst_QScriptEngine::functionScopes()
  4547 void tst_QScriptEngine::functionScopes()
  4442 {
  4548 {
  4443     QScriptEngine eng;
  4549     QScriptEngine eng;
  4444     {
  4550     {
  4445         // top-level functions have only the global object in their scope
  4551         // top-level functions have only the global object in their scope