From e4c7122d78e4f8dccc246a027cde1bf43a87841d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98ystein=20Heskestad?= Date: Wed, 14 Apr 2021 10:21:00 +0200 Subject: Add test for QProperty over QWebChannel Task-number: QTBUG-91757 Change-Id: I45eb5aed2a1254fe2553a1cfc2475ccdb39252b1 Reviewed-by: Allan Sandfeld Jensen --- tests/auto/webchannel/tst_webchannel.cpp | 52 ++++++++++++++++++++++++++++++++ tests/auto/webchannel/tst_webchannel.h | 12 ++++++++ 2 files changed, 64 insertions(+) diff --git a/tests/auto/webchannel/tst_webchannel.cpp b/tests/auto/webchannel/tst_webchannel.cpp index 3f2c435..20e5da1 100644 --- a/tests/auto/webchannel/tst_webchannel.cpp +++ b/tests/auto/webchannel/tst_webchannel.cpp @@ -406,6 +406,10 @@ void TestWebChannel::testInfoForObject() addMethod(QStringLiteral("overload"), "overload(QString)", false); addMethod(QStringLiteral("overload"), "overload(QString,int)", false); addMethod(QStringLiteral("overload"), "overload(QJsonArray)", false); + addMethod(QStringLiteral("bindableStringProperty"), "bindableStringProperty()"); + addMethod(QStringLiteral("getStringProperty"), "getStringProperty()"); + addMethod(QStringLiteral("bindStringPropertyToStringProperty2"), "bindStringPropertyToStringProperty2()"); + addMethod(QStringLiteral("setStringProperty2"), "setStringProperty2(QString&)"); addMethod(QStringLiteral("method1"), "method1()"); QCOMPARE(info["methods"].toArray(), expected); } @@ -513,6 +517,19 @@ void TestWebChannel::testInfoForObject() property.append(QJsonValue::fromVariant(QVariant::fromValue(obj.prop()))); expected.append(property); } + { + QJsonArray property; + property.append(obj.metaObject()->indexOfProperty("stringProperty")); + property.append(QStringLiteral("stringProperty")); + { + QJsonArray signal; + signal.append(1); + signal.append(obj.metaObject()->indexOfMethod("stringPropertyChanged()")); + property.append(signal); + } + property.append(QJsonValue::fromVariant(QVariant::fromValue(obj.readStringProperty()))); + expected.append(property); + } QCOMPARE(info["properties"].toArray(), expected); } } @@ -990,6 +1007,41 @@ void TestWebChannel::testAsyncObject() thread.wait(); } +void TestWebChannel::testQProperty() +{ + QWebChannel channel; + TestObject testObj; + testObj.setObjectName("testObject"); + + QProperty obj1("Hello"); + testObj.bindableStringProperty().setBinding([&](){ return obj1.value(); }); + QCOMPARE(obj1.value(), testObj.readStringProperty()); + + channel.registerObject(testObj.objectName(), &testObj); + channel.connectTo(m_dummyTransport); + channel.d_func()->publisher->initializeClient(m_dummyTransport); + + QVariant result; + QMetaObjectPublisher *publisher = channel.d_func()->publisher; + + result = publisher->invokeMethod(&testObj, "getStringProperty", {}); + QCOMPARE(result.toString(), obj1.value()); + + obj1 = "world"; + result = publisher->invokeMethod(&testObj, "getStringProperty", {}); + QCOMPARE(result.toString(), obj1.value()); + + publisher->invokeMethod(&testObj, "setStringProperty2", {"Hey"}); + publisher->invokeMethod(&testObj, "bindStringPropertyToStringProperty2", {}); + obj1 = "This should not affect getStringProperty"; + result = publisher->invokeMethod(&testObj, "getStringProperty", {}); + QCOMPARE(result.toString(), "Hey"); + + publisher->invokeMethod(&testObj, "setStringProperty2", {"again"}); + result = publisher->invokeMethod(&testObj, "getStringProperty", {}); + QCOMPARE(result.toString(), "again"); +} + class FunctionWrapper : public QObject { Q_OBJECT diff --git a/tests/auto/webchannel/tst_webchannel.h b/tests/auto/webchannel/tst_webchannel.h index c64cd05..e75c13c 100644 --- a/tests/auto/webchannel/tst_webchannel.h +++ b/tests/auto/webchannel/tst_webchannel.h @@ -90,6 +90,7 @@ class TestObject : public QObject Q_PROPERTY(QObject * objectProperty READ objectProperty WRITE setObjectProperty NOTIFY objectPropertyChanged) Q_PROPERTY(TestObject * returnedObject READ returnedObject WRITE setReturnedObject NOTIFY returnedObjectChanged) Q_PROPERTY(QString prop READ prop WRITE setProp NOTIFY propChanged) + Q_PROPERTY(QString stringProperty READ readStringProperty WRITE setStringProperty BINDABLE bindableStringProperty NOTIFY stringPropertyChanged) public: explicit TestObject(QObject *parent = 0) @@ -129,6 +130,9 @@ public: return mProp; } + QString readStringProperty() const { return mStringProperty; } + void setStringProperty(QString v) { mStringProperty = v; emit stringPropertyChanged(); } + Q_INVOKABLE void method1() {} protected: @@ -148,6 +152,7 @@ signals: void replay(); void overloadSignal(int); void overloadSignal(float); + void stringPropertyChanged(); public slots: void slot1() {} @@ -174,6 +179,10 @@ public slots: QString overload(const QString &str) { return str.toUpper(); } QString overload(const QString &str, int i) { return str.toUpper() + QString::number(i + 1); } QString overload(const QJsonArray &v) { return QString::number(v[1].toInt()) + v[0].toString(); } + QBindable bindableStringProperty() { return &mStringProperty; } + QString getStringProperty() const { return mStringProperty; } + void bindStringPropertyToStringProperty2() { bindableStringProperty().setBinding(Qt::makePropertyBinding(mStringProperty2)); } + void setStringProperty2(QString& string) { mStringProperty2 = string; } protected slots: void slot3() {} @@ -185,6 +194,8 @@ public: QObject *mObjectProperty; TestObject *mReturnedObject; QString mProp; + Q_OBJECT_BINDABLE_PROPERTY(TestObject, QString, mStringProperty); + QProperty mStringProperty2; }; Q_DECLARE_OPERATORS_FOR_FLAGS(TestObject::TestFlags) @@ -345,6 +356,7 @@ private slots: void testJsonToVariant(); void testInfiniteRecursion(); void testAsyncObject(); + void testQProperty(); void testDeletionDuringMethodInvocation_data(); void testDeletionDuringMethodInvocation(); -- cgit v1.2.1