/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include class tst_QDBusMetaObject: public QObject { Q_OBJECT QHash map; public slots: void init(); private slots: void initTestCase(); void types_data(); void types(); void methods_data(); void methods(); void _signals_data(); void _signals(); void properties_data(); void properties(); }; typedef QPair StringPair; struct Struct1 { }; // (s) struct Struct4 // (ssa(ss)sayasx) { QString m1; QString m2; QList m3; QString m4; QByteArray m5; QStringList m6; qlonglong m7; }; Q_DECLARE_METATYPE(Struct1) Q_DECLARE_METATYPE(Struct4) Q_DECLARE_METATYPE(StringPair) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(const QMetaObject*) QT_BEGIN_NAMESPACE QDBusArgument &operator<<(QDBusArgument &arg, const Struct1 &) { arg.beginStructure(); arg << QString(); arg.endStructure(); return arg; } QDBusArgument &operator<<(QDBusArgument &arg, const StringPair &s) { arg.beginStructure(); arg << s.first << s.second; arg.endStructure(); return arg; } QDBusArgument &operator<<(QDBusArgument &arg, const Struct4 &s) { arg.beginStructure(); arg << s.m1 << s.m2 << s.m3 << s.m4 << s.m5 << s.m6 << s.m7; arg.endStructure(); return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, Struct1 &) { return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, Struct4 &) { return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, StringPair &) { return arg; } QT_END_NAMESPACE void tst_QDBusMetaObject::initTestCase() { qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType >(); qDBusRegisterMetaType >(); } void tst_QDBusMetaObject::init() { qDeleteAll(map); map.clear(); } // test classes class TypesTest1: public QObject { Q_OBJECT signals: void signal(uchar); }; const char TypesTest1_xml[] = ""; class TypesTest2: public QObject { Q_OBJECT signals: void signal(bool); }; const char TypesTest2_xml[] = ""; class TypesTest3: public QObject { Q_OBJECT signals: void signal(short); }; const char TypesTest3_xml[] = ""; class TypesTest4: public QObject { Q_OBJECT signals: void signal(ushort); }; const char TypesTest4_xml[] = ""; class TypesTest5: public QObject { Q_OBJECT signals: void signal(int); }; const char TypesTest5_xml[] = ""; class TypesTest6: public QObject { Q_OBJECT signals: void signal(uint); }; const char TypesTest6_xml[] = ""; class TypesTest7: public QObject { Q_OBJECT signals: void signal(qlonglong); }; const char TypesTest7_xml[] = ""; class TypesTest8: public QObject { Q_OBJECT signals: void signal(qulonglong); }; const char TypesTest8_xml[] = ""; class TypesTest9: public QObject { Q_OBJECT signals: void signal(double); }; const char TypesTest9_xml[] = ""; class TypesTest10: public QObject { Q_OBJECT signals: void signal(QString); }; const char TypesTest10_xml[] = ""; class TypesTest11: public QObject { Q_OBJECT signals: void signal(QDBusObjectPath); }; const char TypesTest11_xml[] = ""; class TypesTest12: public QObject { Q_OBJECT signals: void signal(QDBusSignature); }; const char TypesTest12_xml[] = ""; class TypesTest13: public QObject { Q_OBJECT signals: void signal(QDBusVariant); }; const char TypesTest13_xml[] = ""; class TypesTest14: public QObject { Q_OBJECT signals: void signal(QStringList); }; const char TypesTest14_xml[] = ""; class TypesTest15: public QObject { Q_OBJECT signals: void signal(QByteArray); }; const char TypesTest15_xml[] = ""; class TypesTest16: public QObject { Q_OBJECT signals: void signal(StringPair); }; const char TypesTest16_xml[] = "" ""; class TypesTest17: public QObject { Q_OBJECT signals: void signal(Struct1); }; const char TypesTest17_xml[] = "" ""; class TypesTest18: public QObject { Q_OBJECT signals: void signal(Struct4); }; const char TypesTest18_xml[] = "" ""; class TypesTest19: public QObject { Q_OBJECT signals: void signal(QVariantList); }; const char TypesTest19_xml[] = "" ""; class TypesTest20: public QObject { Q_OBJECT signals: void signal(QVariantMap); }; const char TypesTest20_xml[] = "" ""; void tst_QDBusMetaObject::types_data() { QTest::addColumn("metaobject"); QTest::addColumn("xml"); QTest::newRow("byte") << &TypesTest1::staticMetaObject << QString(TypesTest1_xml); QTest::newRow("bool") << &TypesTest2::staticMetaObject << QString(TypesTest2_xml); QTest::newRow("short") << &TypesTest3::staticMetaObject << QString(TypesTest3_xml); QTest::newRow("ushort") << &TypesTest4::staticMetaObject << QString(TypesTest4_xml); QTest::newRow("int") << &TypesTest5::staticMetaObject << QString(TypesTest5_xml); QTest::newRow("uint") << &TypesTest6::staticMetaObject << QString(TypesTest6_xml); QTest::newRow("qlonglong") << &TypesTest7::staticMetaObject << QString(TypesTest7_xml); QTest::newRow("qulonglong") << &TypesTest8::staticMetaObject << QString(TypesTest8_xml); QTest::newRow("double") << &TypesTest9::staticMetaObject << QString(TypesTest9_xml); QTest::newRow("QString") << &TypesTest10::staticMetaObject << QString(TypesTest10_xml); QTest::newRow("QDBusObjectPath") << &TypesTest11::staticMetaObject << QString(TypesTest11_xml); QTest::newRow("QDBusSignature") << &TypesTest12::staticMetaObject << QString(TypesTest12_xml); QTest::newRow("QDBusVariant") << &TypesTest13::staticMetaObject << QString(TypesTest13_xml); QTest::newRow("QStringList") << &TypesTest14::staticMetaObject << QString(TypesTest14_xml); QTest::newRow("QByteArray") << &TypesTest15::staticMetaObject << QString(TypesTest15_xml); QTest::newRow("StringPair") << &TypesTest16::staticMetaObject << QString(TypesTest16_xml); QTest::newRow("Struct1") << &TypesTest17::staticMetaObject << QString(TypesTest17_xml); QTest::newRow("Struct4") << &TypesTest18::staticMetaObject << QString(TypesTest18_xml); QTest::newRow("QVariantList") << &TypesTest19::staticMetaObject << QString(TypesTest19_xml); QTest::newRow("QVariantMap") << &TypesTest20::staticMetaObject << QString(TypesTest20_xml); } void tst_QDBusMetaObject::types() { QFETCH(const QMetaObject*, metaobject); QFETCH(QString, xml); // add the rest of the XML tags xml = QString("%1") .arg(xml); QDBusError error; QMetaObject *result = QDBusMetaObject::createMetaObject("local.Interface", xml, map, error); QVERIFY2(result, qPrintable(error.message())); QCOMPARE(result->enumeratorCount(), 0); QCOMPARE(result->classInfoCount(), 0); // compare the meta objects QCOMPARE(result->methodCount() - result->methodOffset(), metaobject->methodCount() - metaobject->methodOffset()); QCOMPARE(result->propertyCount() - result->propertyOffset(), metaobject->propertyCount() - metaobject->propertyOffset()); for (int i = metaobject->methodOffset(); i < metaobject->methodCount(); ++i) { QMetaMethod expected = metaobject->method(i); int methodIdx = result->indexOfMethod(expected.signature()); QVERIFY(methodIdx != -1); QMetaMethod constructed = result->method(methodIdx); QCOMPARE(int(constructed.access()), int(expected.access())); QCOMPARE(int(constructed.methodType()), int(expected.methodType())); QCOMPARE(constructed.parameterNames(), expected.parameterNames()); QCOMPARE(constructed.parameterTypes(), expected.parameterTypes()); QCOMPARE(constructed.tag(), expected.tag()); QCOMPARE(constructed.typeName(), expected.typeName()); } for (int i = metaobject->propertyOffset(); i < metaobject->propertyCount(); ++i) { QMetaProperty expected = metaobject->property(i); int propIdx = result->indexOfProperty(expected.name()); QVERIFY(propIdx != -1); QMetaProperty constructed = result->property(propIdx); QCOMPARE(constructed.isDesignable(), expected.isDesignable()); QCOMPARE(constructed.isEditable(), expected.isEditable()); QCOMPARE(constructed.isEnumType(), expected.isEnumType()); QCOMPARE(constructed.isFlagType(), expected.isFlagType()); QCOMPARE(constructed.isReadable(), expected.isReadable()); QCOMPARE(constructed.isResettable(), expected.isResettable()); QCOMPARE(constructed.isScriptable(), expected.isScriptable()); QCOMPARE(constructed.isStored(), expected.isStored()); QCOMPARE(constructed.isUser(), expected.isUser()); QCOMPARE(constructed.isWritable(), expected.isWritable()); QCOMPARE(constructed.typeName(), expected.typeName()); } } class MethodTest1: public QObject { Q_OBJECT public slots: void method() { } }; const char MethodTest1_xml[] = ""; class MethodTest2: public QObject { Q_OBJECT public slots: void method(int) { } }; const char MethodTest2_xml[] = ""; class MethodTest3: public QObject { Q_OBJECT public slots: void method(int input0) { Q_UNUSED(input0); } }; const char MethodTest3_xml[] = ""; class MethodTest4: public QObject { Q_OBJECT public slots: int method() { return 0; } }; const char MethodTest4_xml[] = ""; const char MethodTest4_xml2[] = ""; class MethodTest5: public QObject { Q_OBJECT public slots: int method(int input0) { return input0; } }; const char MethodTest5_xml[] = "" "" "" ""; class MethodTest6: public QObject { Q_OBJECT public slots: int method(int input0, int input1) { Q_UNUSED(input0); return input1; } }; const char MethodTest6_xml[] = "" "" "" "" ""; class MethodTest7: public QObject { Q_OBJECT public slots: int method(int input0, int input1, int &output1) { output1 = input1; return input0; } }; const char MethodTest7_xml[] = "" "" "" "" "" ""; class MethodTest8: public QObject { Q_OBJECT public slots: int method(int input0, int input1, int &output1, int &output2) { output1 = output2 = input1; return input0; } }; const char MethodTest8_xml[] = "" "" "" "" "" "" ""; class MethodTest9: public QObject { Q_OBJECT public slots: Q_NOREPLY void method(int) { } }; const char MethodTest9_xml[] = "" "" "" ""; void tst_QDBusMetaObject::methods_data() { QTest::addColumn("metaobject"); QTest::addColumn("xml"); QTest::newRow("void-void") << &MethodTest1::staticMetaObject << QString(MethodTest1_xml); QTest::newRow("void-int") << &MethodTest2::staticMetaObject << QString(MethodTest2_xml); QTest::newRow("void-int-with-name") << &MethodTest3::staticMetaObject << QString(MethodTest3_xml); QTest::newRow("int-void") << &MethodTest4::staticMetaObject << QString(MethodTest4_xml); QTest::newRow("int-void2") << &MethodTest4::staticMetaObject << QString(MethodTest4_xml2); QTest::newRow("int-int") << &MethodTest5::staticMetaObject << QString(MethodTest5_xml); QTest::newRow("int-int,int") << &MethodTest6::staticMetaObject << QString(MethodTest6_xml); QTest::newRow("int,int-int,int") << &MethodTest7::staticMetaObject << QString(MethodTest7_xml); QTest::newRow("int,int,int-int,int") << &MethodTest8::staticMetaObject << QString(MethodTest8_xml); QTest::newRow("Q_ASYNC") << &MethodTest9::staticMetaObject << QString(MethodTest9_xml); } void tst_QDBusMetaObject::methods() { types(); } class SignalTest1: public QObject { Q_OBJECT signals: void signal(); }; const char SignalTest1_xml[] = ""; class SignalTest2: public QObject { Q_OBJECT signals: void signal(int); }; const char SignalTest2_xml[] = ""; class SignalTest3: public QObject { Q_OBJECT signals: void signal(int output0); }; const char SignalTest3_xml[] = ""; class SignalTest4: public QObject { Q_OBJECT signals: void signal(int output0, int); }; const char SignalTest4_xml[] = ""; void tst_QDBusMetaObject::_signals_data() { QTest::addColumn("metaobject"); QTest::addColumn("xml"); QTest::newRow("empty") << &SignalTest1::staticMetaObject << QString(SignalTest1_xml); QTest::newRow("int") << &SignalTest2::staticMetaObject << QString(SignalTest2_xml); QTest::newRow("int output0") << &SignalTest3::staticMetaObject << QString(SignalTest3_xml); QTest::newRow("int output0,int") << &SignalTest4::staticMetaObject << QString(SignalTest4_xml); } void tst_QDBusMetaObject::_signals() { types(); } class PropertyTest1: public QObject { Q_OBJECT Q_PROPERTY(int property READ property) public: int property() { return 0; } void setProperty(int) { } }; const char PropertyTest1_xml[] = ""; class PropertyTest2: public QObject { Q_OBJECT Q_PROPERTY(int property READ property WRITE setProperty) public: int property() { return 0; } void setProperty(int) { } }; const char PropertyTest2_xml[] = ""; class PropertyTest3: public QObject { Q_OBJECT Q_PROPERTY(int property WRITE setProperty) public: int property() { return 0; } void setProperty(int) { } }; const char PropertyTest3_xml[] = ""; class PropertyTest4: public QObject { Q_OBJECT Q_PROPERTY(Struct1 property WRITE setProperty) public: Struct1 property() { return Struct1(); } void setProperty(Struct1) { } }; const char PropertyTest4_xml[] = "" "" ""; void tst_QDBusMetaObject::properties_data() { QTest::addColumn("metaobject"); QTest::addColumn("xml"); QTest::newRow("read") << &PropertyTest1::staticMetaObject << QString(PropertyTest1_xml); QTest::newRow("readwrite") << &PropertyTest2::staticMetaObject << QString(PropertyTest2_xml); QTest::newRow("write") << &PropertyTest3::staticMetaObject << QString(PropertyTest3_xml); QTest::newRow("customtype") << &PropertyTest4::staticMetaObject << QString(PropertyTest4_xml); } void tst_QDBusMetaObject::properties() { types(); } QTEST_MAIN(tst_QDBusMetaObject) #include "tst_qdbusmetaobject.moc"