diff --git a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp index b342c9e1a62..4017888d92b 100644 --- a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp +++ b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp @@ -14,6 +14,9 @@ #endif #include +#include +#include + Q_DECLARE_METATYPE(const QMetaObject *) #include "forwarddeclared.h" @@ -49,6 +52,28 @@ public: Q_INVOKABLE MyGadget() {} }; +template +class MyQList +{ + std::vector m_data; +public: + MyQList(std::initializer_list il) : m_data{il} {} + + const std::vector &data() const { return m_data; } + std::vector &data() { return m_data; } +}; + +template +class MyQVector +{ + std::deque m_data; +public: + MyQVector(std::initializer_list il) : m_data{il} {} + + const std::deque &data() const { return m_data; } + std::deque &data() { return m_data; } +}; + namespace MyNamespace { // Used in tst_QMetaObject::checkScope class MyClass : public QObject @@ -316,6 +341,7 @@ private slots: void normalizedType_data(); void normalizedType(); void customPropertyType(); + void customQVectorSuffix(); void keysToValue_data(); void keysToValue(); // Also keyToValue() void propertyNotify(); @@ -357,6 +383,8 @@ private slots: signals: void value6Changed(); void value7Changed(const QString &); + void myQListChanged(const MyQList &); + void myQVectorChanged(const MyQVector &); // needs different template arg from MyQList! }; void tst_QMetaObject::stdSet() @@ -2304,8 +2332,11 @@ void tst_QMetaObject::normalizedSignature_data() QTest::newRow("const13") << "void foo(const Foo&)" << "void foo(Foo)"; QTest::newRow("const14") << "void foo(Fooconst&)" << "void foo(Foo)"; QTest::newRow("QVector") << "void foo(QVector)" << "void foo(QList)"; - QTest::newRow("QVector1") << "void foo(const Template)" - << "void foo(Template)"; + QTest::newRow("QVector1") << "void foo(const Template const>)" + << "void foo(Template>)"; + QTest::newRow("MyQVector") << "void foo(MyQVector)" << "void foo(MyQVector)"; + QTest::newRow("MyQVector1") << "void foo(const Template const>)" + << "void foo(Template>)"; QTest::newRow("refref") << "const char* foo(const X &&,X const &&, const X* &&) && " << "const char*foo(const X&&,const X&&,const X*&&)&&"; @@ -2428,6 +2459,22 @@ void tst_QMetaObject::customPropertyType() QCOMPARE(prop.metaType().id(), QMetaType::QVariantList); } +void tst_QMetaObject::customQVectorSuffix() +{ + QObject ctx; + QVERIFY(connect(this, SIGNAL(myQListChanged(MyQList)), + &ctx, SLOT(deleteLater()))); // just some compatible slot... + + // QMetaObject internally does s/QVector QList kludge getting in the way", Continue); + QTest::ignoreMessage(QtWarningMsg, + QRegularExpression(R"(.*QObject::connect: No such signal )" + R"(tst_QMetaObject.*::myQVectorChanged\(MyQVector\).*)"_L1)); + QVERIFY(connect(this, SIGNAL(myQVectorChanged(MyQVector)), + &ctx, SLOT(deleteLater()))); // just some compatible slot... +} + void tst_QMetaObject::keysToValue_data() { QTest::addColumn("object"); @@ -2802,10 +2849,11 @@ void tst_QMetaObject::indexOfMethod_data() QTest::addColumn("object"); QTest::addColumn("name"); QTest::addColumn("isSignal"); + QTest::addColumn("found"); - auto row = [this] (const char *fun, bool sig) { + auto row = [this] (const char *fun, bool sig, bool found = true) { QObject *o = this; - QTest::addRow("%s", fun) << o << QByteArray(fun) << sig; + QTest::addRow("%s", fun) << o << QByteArray(fun) << sig << found; }; row("indexOfMethod_data()", false); @@ -2814,6 +2862,9 @@ void tst_QMetaObject::indexOfMethod_data() row("value7Changed(QString)", true); row("destroyed()", true); row("destroyed(QObject*)", true); + row("myQListChanged(MyQList)", true); + row("myQListChanged(MyQVector)", true, false); + row("myQVectorChanged(MyQVector)", true); } void tst_QMetaObject::indexOfMethod() @@ -2821,9 +2872,16 @@ void tst_QMetaObject::indexOfMethod() QFETCH(QObject *, object); QFETCH(QByteArray, name); QFETCH(bool, isSignal); + QFETCH(const bool, found); + QEXPECT_FAIL("myQListChanged(MyQVector)", "Qt 6 QVector -> QList kludge getting in the way", Abort); + QEXPECT_FAIL("myQVectorChanged(MyQVector)", "Qt 6 QVector -> QList kludge getting in the way", Abort); int idx = object->metaObject()->indexOfMethod(name); - QVERIFY(idx >= 0); - QCOMPARE(object->metaObject()->method(idx).methodSignature(), name); + if (found) + QVERIFY(idx >= 0); + else + QVERIFY(idx < 0); + if (found) + QCOMPARE(object->metaObject()->method(idx).methodSignature(), name); QCOMPARE(object->metaObject()->indexOfSlot(name), isSignal ? -1 : idx); QCOMPARE(object->metaObject()->indexOfSignal(name), !isSignal ? -1 : idx); }