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 |
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 |