// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include #include #include #include #include class tst_QDBusMetaType: public QObject { Q_OBJECT public: int intStringMap; int stringStringMap; int stringStruct1Map; private slots: void initTestCase(); void staticTypes_data(); void staticTypes(); void dynamicTypes_data(); void dynamicTypes(); void invalidTypes_data(); void invalidTypes(); }; typedef QPair StringPair; struct Struct1 { }; // (s) struct Struct2 { }; // (sos) struct Struct3 { }; // (sas) struct Struct4 // (ssa(ss)sayasx) { QString m1; QString m2; QList m3; QString m4; QByteArray m5; QStringList m6; qlonglong m7; }; struct Struct5 // a{sa{sv}} - non-standard outer struct is used as a local { // container, see marshalling operator below. QVariantMap m1; QVariantMap m2; QVariantMap m3; }; struct Struct6 // av - non-standard outer struct is used as a local container, { // see marshalling operator below. QVariant v1; QVariant v2; QVariant v3; }; struct Invalid0 { }; // empty struct Invalid1 { }; // s struct Invalid2 { }; // o struct Invalid3 { }; // as struct Invalid4 { }; // ay struct Invalid5 { }; // ii struct Invalid6 { }; // struct Invalid7 { }; // () Q_DECLARE_METATYPE(Struct1) Q_DECLARE_METATYPE(Struct2) Q_DECLARE_METATYPE(Struct3) Q_DECLARE_METATYPE(Struct4) Q_DECLARE_METATYPE(StringPair) Q_DECLARE_METATYPE(Struct5) Q_DECLARE_METATYPE(Struct6) Q_DECLARE_METATYPE(Invalid0) Q_DECLARE_METATYPE(Invalid1) Q_DECLARE_METATYPE(Invalid2) Q_DECLARE_METATYPE(Invalid3) Q_DECLARE_METATYPE(Invalid4) Q_DECLARE_METATYPE(Invalid5) Q_DECLARE_METATYPE(Invalid6) Q_DECLARE_METATYPE(Invalid7) typedef QMap IntStringMap; typedef QMap StringStringMap; typedef QMap StringStruct1Map; QT_BEGIN_NAMESPACE QDBusArgument &operator<<(QDBusArgument &arg, const Struct1 &) { arg.beginStructure(); arg << QString(); arg.endStructure(); return arg; } QDBusArgument &operator<<(QDBusArgument &arg, const Struct2 &) { arg.beginStructure(); arg << QString() << QDBusObjectPath() << QString(); arg.endStructure(); return arg; } QDBusArgument &operator<<(QDBusArgument &arg, const Struct3 &) { arg.beginStructure(); arg << QString() << QStringList(); 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; } QDBusArgument &operator<<(QDBusArgument &arg, const Struct5 &s) { arg.beginMap(qMetaTypeId(), qMetaTypeId()); arg.beginMapEntry(); arg << QStringLiteral("map1") << s.m1; arg.endMapEntry(); arg.beginMapEntry(); arg << QStringLiteral("map2") << s.m2; arg.endMapEntry(); arg.beginMapEntry(); arg << QStringLiteral("map3") << s.m3; arg.endMapEntry(); arg.endMap(); return arg; } QDBusArgument &operator<<(QDBusArgument &arg, const Struct6 &s) { arg.beginArray(qMetaTypeId()); arg << QDBusVariant(s.v1) << QDBusVariant(s.v2) << QDBusVariant(s.v3); arg.endArray(); return arg; } QDBusArgument &operator<<(QDBusArgument &arg, const Invalid0 &) { return arg; } QDBusArgument &operator<<(QDBusArgument &arg, const Invalid1 &) { arg << QString(); return arg; } QDBusArgument &operator<<(QDBusArgument &arg, const Invalid2 &) { arg << QDBusObjectPath(); return arg; } QDBusArgument &operator<<(QDBusArgument &arg, const Invalid3 &) { arg << QStringList(); return arg; } QDBusArgument &operator<<(QDBusArgument &arg, const Invalid4 &) { arg << QByteArray(); return arg; } QDBusArgument &operator<<(QDBusArgument &arg, const Invalid5 &) { arg << 1 << 2; return arg; } // no Invalid6 QDBusArgument &operator<<(QDBusArgument &arg, const Invalid7 &) { arg.beginStructure(); arg << Invalid0(); arg.endStructure(); return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, Struct1 &) { return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, Struct2 &) { return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, Struct3 &) { return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, Struct4 &) { return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, Struct5 &) { return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, Struct6 &) { return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, StringPair &) { return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, Invalid0 &) { return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, Invalid1 &) { return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, Invalid2 &) { return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, Invalid3 &) { return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, Invalid4 &) { return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, Invalid5 &) { return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, Invalid6 &) { return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, Invalid7 &) { return arg; } QT_END_NAMESPACE void tst_QDBusMetaType::initTestCase() { qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType >(); qDBusRegisterMetaType >(); qDBusRegisterMetaType >(); qDBusRegisterMetaType >(); #ifdef Q_CC_GNU_ONLY // GCC has a defect/extension (depending on your point of view) that allows // a template class with defaulted template parameters to match a Template // Template Parameter (TTP) with fewer template arguments. The call below // tries to use the template