diff options
author | Martin Jones <martin.jones@nokia.com> | 2009-05-14 05:42:25 (GMT) |
---|---|---|
committer | Martin Jones <martin.jones@nokia.com> | 2009-05-14 05:42:25 (GMT) |
commit | 3de4816d054b92a9dbac3c7830b52ca66fa052e3 (patch) | |
tree | 43e1587790ec132f9dcd036e53feee72a07d0065 | |
parent | 309e8a96af899c612ea26b73fc97d9d377bc9819 (diff) | |
parent | b1008e6a4f660866265083f6f4bd321a85cff377 (diff) | |
download | Qt-3de4816d054b92a9dbac3c7830b52ca66fa052e3.zip Qt-3de4816d054b92a9dbac3c7830b52ca66fa052e3.tar.gz Qt-3de4816d054b92a9dbac3c7830b52ca66fa052e3.tar.bz2 |
Merge branch 'kinetic-declarativeui' of git@scm.dev.nokia.troll.no:qt/kinetic into kinetic-declarativeui
9 files changed, 142 insertions, 11 deletions
diff --git a/tests/auto/declarative/qmlbindengine/bindingLoop.txt b/tests/auto/declarative/qmlbindengine/bindingLoop.txt new file mode 100644 index 0000000..e27a76c --- /dev/null +++ b/tests/auto/declarative/qmlbindengine/bindingLoop.txt @@ -0,0 +1,12 @@ +MyQmlContainer { + children : [ + MyQmlObject { + id: Object1 + stringProperty: "hello" + Object2.stringProperty + }, + MyQmlObject { + id: Object2 + stringProperty: "hello" + Object1.stringProperty + } + ] +} diff --git a/tests/auto/declarative/qmlbindengine/boolPropertiesEvaluateAsBool.1.txt b/tests/auto/declarative/qmlbindengine/boolPropertiesEvaluateAsBool.1.txt new file mode 100644 index 0000000..7368ff6 --- /dev/null +++ b/tests/auto/declarative/qmlbindengine/boolPropertiesEvaluateAsBool.1.txt @@ -0,0 +1,3 @@ +MyQmlObject { + stringProperty: trueProperty?'pass':'fail' +} diff --git a/tests/auto/declarative/qmlbindengine/boolPropertiesEvaluateAsBool.2.txt b/tests/auto/declarative/qmlbindengine/boolPropertiesEvaluateAsBool.2.txt new file mode 100644 index 0000000..c74493e --- /dev/null +++ b/tests/auto/declarative/qmlbindengine/boolPropertiesEvaluateAsBool.2.txt @@ -0,0 +1,3 @@ +MyQmlObject { + stringProperty: falseProperty?'fail':'pass' +} diff --git a/tests/auto/declarative/qmlbindengine/methods.1.txt b/tests/auto/declarative/qmlbindengine/methods.1.txt new file mode 100644 index 0000000..35279e0 --- /dev/null +++ b/tests/auto/declarative/qmlbindengine/methods.1.txt @@ -0,0 +1,4 @@ +MyQmlObject { + id: MyObject + onBasicSignal: MyObject.method() +} diff --git a/tests/auto/declarative/qmlbindengine/methods.2.txt b/tests/auto/declarative/qmlbindengine/methods.2.txt new file mode 100644 index 0000000..352913a --- /dev/null +++ b/tests/auto/declarative/qmlbindengine/methods.2.txt @@ -0,0 +1,4 @@ +MyQmlObject { + id: MyObject + onBasicSignal: MyObject.method(163) +} diff --git a/tests/auto/declarative/qmlbindengine/qmlbindengine.pro b/tests/auto/declarative/qmlbindengine/qmlbindengine.pro index 6d84931..800d9a0 100644 --- a/tests/auto/declarative/qmlbindengine/qmlbindengine.pro +++ b/tests/auto/declarative/qmlbindengine/qmlbindengine.pro @@ -1,3 +1,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle SOURCES += tst_qmlbindengine.cpp + +# QMAKE_CXXFLAGS = -fprofile-arcs -ftest-coverage +# LIBS += -lgcov diff --git a/tests/auto/declarative/qmlbindengine/signalAssignment.1.txt b/tests/auto/declarative/qmlbindengine/signalAssignment.1.txt new file mode 100644 index 0000000..ca682fa --- /dev/null +++ b/tests/auto/declarative/qmlbindengine/signalAssignment.1.txt @@ -0,0 +1,3 @@ +MyQmlObject { + onBasicSignal: setString('pass') +} diff --git a/tests/auto/declarative/qmlbindengine/signalAssignment.2.txt b/tests/auto/declarative/qmlbindengine/signalAssignment.2.txt new file mode 100644 index 0000000..5efd583 --- /dev/null +++ b/tests/auto/declarative/qmlbindengine/signalAssignment.2.txt @@ -0,0 +1,3 @@ +MyQmlObject { + onArgumentSignal: setString('pass ' + a + ' ' + b + ' ' + c) +} diff --git a/tests/auto/declarative/qmlbindengine/tst_qmlbindengine.cpp b/tests/auto/declarative/qmlbindengine/tst_qmlbindengine.cpp index 9a14abb..72c8953 100644 --- a/tests/auto/declarative/qmlbindengine/tst_qmlbindengine.cpp +++ b/tests/auto/declarative/qmlbindengine/tst_qmlbindengine.cpp @@ -66,6 +66,9 @@ private: QML_DECLARE_TYPE(MyQmlContainer); QML_DEFINE_TYPE(MyQmlContainer,MyQmlContainer); +#define TEST_FILE(filename) \ + QUrl::fromLocalFile(QApplication::applicationDirPath() + "/" + filename) + class tst_qmlbindengine : public QObject { Q_OBJECT @@ -77,6 +80,8 @@ private slots: void methods(); void signalAssignment(); void bindingLoop(); + void basicExpressions(); + void basicExpressions_data(); void contextPropertiesTriggerReeval(); private: @@ -86,13 +91,13 @@ private: void tst_qmlbindengine::boolPropertiesEvaluateAsBool() { { - QmlComponent component(&engine, "MyQmlObject { stringProperty: trueProperty?'pass':'fail' }"); + QmlComponent component(&engine, TEST_FILE("boolPropertiesEvaluateAsBool.1.txt")); MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create()); QVERIFY(object != 0); QCOMPARE(object->stringProperty(), QLatin1String("pass")); } { - QmlComponent component(&engine, "MyQmlObject { stringProperty: falseProperty?'fail':'pass' }"); + QmlComponent component(&engine, TEST_FILE("boolPropertiesEvaluateAsBool.2.txt")); MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create()); QVERIFY(object != 0); QCOMPARE(object->stringProperty(), QLatin1String("pass")); @@ -102,7 +107,7 @@ void tst_qmlbindengine::boolPropertiesEvaluateAsBool() void tst_qmlbindengine::signalAssignment() { { - QmlComponent component(&engine, "MyQmlObject { onBasicSignal: setString('pass') }"); + QmlComponent component(&engine, TEST_FILE("signalAssignment.1.txt")); MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create()); QVERIFY(object != 0); QCOMPARE(object->string(), QString()); @@ -111,7 +116,7 @@ void tst_qmlbindengine::signalAssignment() } { - QmlComponent component(&engine, "MyQmlObject { onArgumentSignal: setString('pass ' + a + ' ' + b + ' ' + c) }"); + QmlComponent component(&engine, TEST_FILE("signalAssignment.2.txt")); MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create()); QVERIFY(object != 0); QCOMPARE(object->string(), QString()); @@ -123,7 +128,7 @@ void tst_qmlbindengine::signalAssignment() void tst_qmlbindengine::methods() { { - QmlComponent component(&engine, "MyQmlObject { id: MyObject; onBasicSignal: MyObject.method() }"); + QmlComponent component(&engine, TEST_FILE("methods.1.txt")); MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create()); QVERIFY(object != 0); QCOMPARE(object->methodCalled(), false); @@ -134,7 +139,7 @@ void tst_qmlbindengine::methods() } { - QmlComponent component(&engine, "MyQmlObject { id: MyObject; onBasicSignal: MyObject.method(163) }"); + QmlComponent component(&engine, TEST_FILE("methods.2.txt")); MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create()); QVERIFY(object != 0); QCOMPARE(object->methodCalled(), false); @@ -147,11 +152,8 @@ void tst_qmlbindengine::methods() void tst_qmlbindengine::bindingLoop() { - QmlComponent component(&engine, "MyQmlContainer { children : [ "\ - "MyQmlObject { id: Object1; stringProperty: \"hello\" + Object2.stringProperty }, "\ - "MyQmlObject { id: Object2; stringProperty: \"hello\" + Object1.stringProperty } ] }"); - //### ignoreMessage doesn't seem to work here - //QTest::ignoreMessage(QtWarningMsg, "QML MyQmlObject (unknown location): Binding loop detected for property \"stringProperty\""); + QmlComponent component(&engine, TEST_FILE("bindingLoop.txt")); + QTest::ignoreMessage(QtWarningMsg, "QML MyQmlObject (unknown location): Binding loop detected for property \"stringProperty\" "); QObject *object = component.create(); QVERIFY(object != 0); } @@ -170,6 +172,99 @@ public: bool changed; }; + +class MyDefaultObject1 : public QObject +{ + Q_OBJECT + Q_PROPERTY(int horseLegs READ horseLegs); + Q_PROPERTY(int antLegs READ antLegs); +public: + int horseLegs() const { return 4; } + int antLegs() const { return 6; } +}; + +class MyDefaultObject2 : public QObject +{ + Q_OBJECT + Q_PROPERTY(int antLegs READ antLegs); + Q_PROPERTY(int emuLegs READ emuLegs); +public: + int antLegs() const { return 5; } // Had an accident + int emuLegs() const { return 2; } +}; + +class MyDefaultObject3 : public QObject +{ + Q_OBJECT + Q_PROPERTY(int antLegs READ antLegs); + Q_PROPERTY(int humanLegs READ humanLegs); +public: + int antLegs() const { return 7; } // Mutant + int humanLegs() const { return 2; } + int millipedeLegs() const { return 1000; } +}; + +void tst_qmlbindengine::basicExpressions_data() +{ + QTest::addColumn<QString>("expression"); + QTest::addColumn<QVariant>("result"); + QTest::addColumn<bool>("nest"); + + QTest::newRow("Context property") << "a" << QVariant(1944) << false; + QTest::newRow("Context property") << "a" << QVariant(1944) << true; + QTest::newRow("Context property expression") << "a * 2" << QVariant(3888) << false; + QTest::newRow("Context property expression") << "a * 2" << QVariant(3888) << true; + QTest::newRow("Overridden context property") << "b" << QVariant("Milk") << false; + QTest::newRow("Overridden context property") << "b" << QVariant("Cow") << true; + QTest::newRow("Object property") << "object.stringProperty" << QVariant("Object1") << false; + QTest::newRow("Object property") << "object.stringProperty" << QVariant("Object1") << true; + QTest::newRow("Overridden object property") << "objectOverride.stringProperty" << QVariant("Object2") << false; + QTest::newRow("Overridden object property") << "objectOverride.stringProperty" << QVariant("Object3") << true; + QTest::newRow("Default object property") << "horseLegs" << QVariant(4) << false; + QTest::newRow("Default object property") << "antLegs" << QVariant(6) << false; + QTest::newRow("Default object property") << "emuLegs" << QVariant(2) << false; + QTest::newRow("Nested default object property") << "horseLegs" << QVariant(4) << true; + QTest::newRow("Nested default object property") << "antLegs" << QVariant(7) << true; + QTest::newRow("Nested default object property") << "emuLegs" << QVariant(2) << true; + QTest::newRow("Nested default object property") << "humanLegs" << QVariant(2) << true; + QTest::newRow("Context property override default object property") << "millipedeLegs" << QVariant(100) << true; +} + +void tst_qmlbindengine::basicExpressions() +{ + QFETCH(QString, expression); + QFETCH(QVariant, result); + QFETCH(bool, nest); + + MyQmlObject object1; + MyQmlObject object2; + MyQmlObject object3; + MyDefaultObject1 default1; + MyDefaultObject2 default2; + MyDefaultObject3 default3; + object1.setStringProperty("Object1"); + object2.setStringProperty("Object2"); + object3.setStringProperty("Object3"); + + QmlContext context(engine.rootContext()); + QmlContext nestedContext(&context); + + context.addDefaultObject(&default1); + context.addDefaultObject(&default2); + context.setContextProperty("a", QVariant(1944)); + context.setContextProperty("b", QVariant("Milk")); + context.setContextProperty("object", &object1); + context.setContextProperty("objectOverride", &object2); + nestedContext.addDefaultObject(&default3); + nestedContext.setContextProperty("b", QVariant("Cow")); + nestedContext.setContextProperty("objectOverride", &object3); + nestedContext.setContextProperty("millipedeLegs", QVariant(100)); + + MyExpression expr(nest?&nestedContext:&context, expression); + QCOMPARE(expr.value(), result); +} + +// Tests that modifying a context property will reevaluate expressions void tst_qmlbindengine::contextPropertiesTriggerReeval() { QmlContext context(engine.rootContext()); |