diff options
author | Brett Stottlemyer <bstottle@ford.com> | 2019-05-14 20:51:16 -0400 |
---|---|---|
committer | Brett Stottlemyer <bstottle@ford.com> | 2019-05-17 20:17:29 +0000 |
commit | 91f83125dd403878c989be4098cc3a35eb5ba06f (patch) | |
tree | 6a15a35bb32ebc745a3bd1f08b88c2c67d0496cd /tests | |
parent | e520e4fd777350673d5022982481f82672fea6ff (diff) |
More fixes for (dynamic) enums in signals and slots
This addresses two larger issues with enums and several smaller fixes.
First, unlike the recent fix for properties, we need to register enums for
queued connections to work and get signal/slot updates over QtRO to work.
This change adds said registration.
Second, enums are identified with the class they are defined in, so passing
updates through a dynamic object requires converting the typenames. The
templated enableRemoting methods become interesting here, as the class
name depends on the type passed as a template parameter. This change also
updates the repc output so enums are properly resolved via the templates.
Smaller fixes include updates to some tests and several places where enums
were converted to/from int. Note: we need (and have always needed) to
convert enums to ints, since the class name is passed as part of the
variant serialization which cannot be changed without major digging into
qvariant and QDataStream serialization internals.
Change-Id: I0a77f85df6a400a7a44394a05c9c2401bee4e4a8
Reviewed-by: Michael Brasser <michael.brasser@live.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/integration/tst_integration.cpp | 5 | ||||
-rw-r--r-- | tests/auto/integration_external/client/main.cpp | 4 | ||||
-rw-r--r-- | tests/auto/integration_multiprocess/client/main.cpp | 4 | ||||
-rw-r--r-- | tests/auto/proxy_multiprocess/client/main.cpp | 16 | ||||
-rw-r--r-- | tests/auto/proxy_multiprocess/server/main.cpp | 1 | ||||
-rw-r--r-- | tests/auto/proxy_multiprocess/server/mytestserver.cpp | 8 | ||||
-rw-r--r-- | tests/auto/proxy_multiprocess/server/mytestserver.h | 1 | ||||
-rw-r--r-- | tests/auto/proxy_multiprocess/subclass.rep | 11 |
8 files changed, 36 insertions, 14 deletions
diff --git a/tests/auto/integration/tst_integration.cpp b/tests/auto/integration/tst_integration.cpp index af5cba0..7f39381 100644 --- a/tests/auto/integration/tst_integration.cpp +++ b/tests/auto/integration/tst_integration.cpp @@ -345,8 +345,9 @@ private slots: // set property on the replica (test property change packet) { QSignalSpy spy(tc_rep.data(), SIGNAL(classEnumChanged(TestClassReplica::ClassEnum))); + QVERIFY(spy.isValid()); tc_rep->pushClassEnum(TestClassReplica::Two); - QVERIFY(spy.wait()); + QVERIFY(spy.count() || spy.wait()); QCOMPARE((qint32)tc.classEnum(), (qint32)tc_rep->classEnum()); } @@ -405,7 +406,7 @@ private slots: QSignalSpy spy(tc_rep.data(), SIGNAL(classEnumChanged(TestClassReplica::ClassEnum))); bool res = property.write(tc_repDynamic.data(), TestClassReplica::Two); QVERIFY(!res); - int methodIndex = metaObject->indexOfMethod("pushClassEnum(ClassEnum)"); + int methodIndex = metaObject->indexOfMethod("pushClassEnum(TestClassReplica::ClassEnum)"); QVERIFY(methodIndex >= 0); QMetaMethod method = metaObject->method(methodIndex); QVERIFY(method.isValid()); diff --git a/tests/auto/integration_external/client/main.cpp b/tests/auto/integration_external/client/main.cpp index 05f7f59..bc53333 100644 --- a/tests/auto/integration_external/client/main.cpp +++ b/tests/auto/integration_external/client/main.cpp @@ -129,7 +129,7 @@ private Q_SLOTS: QCOMPARE(simm.parameterType(2), int(QMetaType::QString)); } - int slotIdx = mo->indexOfSlot("testEnumParamsInSlots(Enum1,bool,int)"); + int slotIdx = mo->indexOfSlot("testEnumParamsInSlots(MyInterfaceReplica::Enum1,bool,int)"); QVERIFY(slotIdx != -1); auto slmm = mo->method(slotIdx); { @@ -143,7 +143,7 @@ private Q_SLOTS: int enumVal = 0; mo->invokeMethod(rep.data(), "testEnumParamsInSlots", - QGenericArgument("Enum1", &enumVal), + QGenericArgument("MyInterfaceReplica::Enum1", &enumVal), Q_ARG(bool, true), Q_ARG(int, 1234)); int enumIdx = mo->indexOfProperty("enum1"); diff --git a/tests/auto/integration_multiprocess/client/main.cpp b/tests/auto/integration_multiprocess/client/main.cpp index b60a48a..87f2ad8 100644 --- a/tests/auto/integration_multiprocess/client/main.cpp +++ b/tests/auto/integration_multiprocess/client/main.cpp @@ -112,7 +112,7 @@ private Q_SLOTS: QCOMPARE(simm.parameterType(2), int(QMetaType::QString)); } - int slotIdx = mo->indexOfSlot("testEnumParamsInSlots(Enum1,bool,int)"); + int slotIdx = mo->indexOfSlot("testEnumParamsInSlots(MyInterfaceReplica::Enum1,bool,int)"); QVERIFY(slotIdx != -1); auto slmm = mo->method(slotIdx); { @@ -126,7 +126,7 @@ private Q_SLOTS: int enumVal = 0; mo->invokeMethod(rep.data(), "testEnumParamsInSlots", - QGenericArgument("Enum1", &enumVal), + QGenericArgument("MyInterfaceReplica::Enum1", &enumVal), Q_ARG(bool, true), Q_ARG(int, 1234)); int enumIdx = mo->indexOfProperty("enum1"); diff --git a/tests/auto/proxy_multiprocess/client/main.cpp b/tests/auto/proxy_multiprocess/client/main.cpp index f37821f..7657464 100644 --- a/tests/auto/proxy_multiprocess/client/main.cpp +++ b/tests/auto/proxy_multiprocess/client/main.cpp @@ -69,14 +69,26 @@ private Q_SLOTS: QCOMPARE(m_rep->variant(), QVariant()); } + QPoint p(1, 2); + auto enumReply = m_rep->enumSlot(p, ParentClassReplica::bar); + QVERIFY(enumReply.waitForFinished()); + QCOMPARE(enumReply.error(), QRemoteObjectPendingCall::NoError); + QCOMPARE(enumReply.returnValue(), QVariant::fromValue(ParentClassReplica::foobar)); + qDebug() << "Verified expected initial states, sending start."; + QSignalSpy enumSpy(m_rep.data(), &ParentClassReplica::enum2); + QSignalSpy advanceSpy(m_rep.data(), SIGNAL(advance())); auto reply = m_rep->start(); QVERIFY(reply.waitForFinished()); QVERIFY(reply.error() == QRemoteObjectPendingCall::NoError); QCOMPARE(reply.returnValue(), QVariant::fromValue(true)); + QVERIFY(enumSpy.wait()); + QCOMPARE(enumSpy.count(), 1); + const auto arguments = enumSpy.takeFirst(); + QCOMPARE(arguments.at(0), QVariant::fromValue(ParentClassReplica::foo)); + QCOMPARE(arguments.at(1), QVariant::fromValue(ParentClassReplica::bar)); - QSignalSpy advanceSpy(m_rep.data(), SIGNAL(advance())); - QVERIFY(advanceSpy.wait()); + QVERIFY(advanceSpy.count() || advanceSpy.wait()); QVERIFY(m_rep->subClass() != nullptr); QCOMPARE(m_rep->subClass()->myPOD(), updatedValue); QCOMPARE(m_rep->subClass()->i(), updatedI); diff --git a/tests/auto/proxy_multiprocess/server/main.cpp b/tests/auto/proxy_multiprocess/server/main.cpp index 2e6895b..27d4336 100644 --- a/tests/auto/proxy_multiprocess/server/main.cpp +++ b/tests/auto/proxy_multiprocess/server/main.cpp @@ -83,6 +83,7 @@ private Q_SLOTS: parent.setTracks(&model); parent.setMyEnum(ParentClassSource::foobar); parent.setVariant(QVariant::fromValue(podValue)); + emit parent.enum2(ParentClassSource::foo, ParentClassSource::bar); emit parent.advance(); diff --git a/tests/auto/proxy_multiprocess/server/mytestserver.cpp b/tests/auto/proxy_multiprocess/server/mytestserver.cpp index b0c75ab..8b15e4d 100644 --- a/tests/auto/proxy_multiprocess/server/mytestserver.cpp +++ b/tests/auto/proxy_multiprocess/server/mytestserver.cpp @@ -29,7 +29,6 @@ #include <qdebug.h> #include "mytestserver.h" -#include "rep_subclass_source.h" MyTestServer::MyTestServer(QObject *parent) : ParentClassSimpleSource(parent) @@ -53,3 +52,10 @@ bool MyTestServer::quit() emit quitApp(); return true; } + +ParentClassSource::MyEnum MyTestServer::enumSlot(QPoint p, MyEnum myEnum) +{ + Q_UNUSED(p) + Q_UNUSED(myEnum) + return ParentClassSource::foobar; +} diff --git a/tests/auto/proxy_multiprocess/server/mytestserver.h b/tests/auto/proxy_multiprocess/server/mytestserver.h index df044c1..22fce15 100644 --- a/tests/auto/proxy_multiprocess/server/mytestserver.h +++ b/tests/auto/proxy_multiprocess/server/mytestserver.h @@ -47,6 +47,7 @@ public: public Q_SLOTS: bool start() override; bool quit() override; + MyEnum enumSlot(QPoint p, MyEnum myEnum) override; Q_SIGNALS: void quitApp(); diff --git a/tests/auto/proxy_multiprocess/subclass.rep b/tests/auto/proxy_multiprocess/subclass.rep index 7055944..41377d0 100644 --- a/tests/auto/proxy_multiprocess/subclass.rep +++ b/tests/auto/proxy_multiprocess/subclass.rep @@ -1,3 +1,5 @@ +#include <QPoint> + POD MyPOD(int i, float f, QString s) POD VariantPOD(int i, int j) @@ -9,17 +11,16 @@ class SubClass class ParentClass { - // We need several Enums to test dynamic registration - ENUM MyEnumProp {foo=1, bar=3, foobar=6} - ENUM MyEnumSignal {a=1, b, c} + ENUM MyEnum {foo=1, bar=3, foobar=6} PROP(bool started = false) - PROP(MyEnumProp myEnum=foo) + PROP(MyEnum myEnum=foo) PROP(QVariant variant) SLOT(bool start()) SLOT(bool quit()) SIGNAL(advance()) - SIGNAL(enum2(MyEnumSignal myEnumSignal, MyEnumSignal sig2)) + SIGNAL(enum2(MyEnum myEnum1, MyEnum myEnum2)) + SLOT(MyEnum enumSlot(QPoint point, MyEnum myEnum)) CLASS subClass(SubClass) MODEL tracks(display) |