summaryrefslogtreecommitdiffstats
path: root/test/qt/tst_qdbustype.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/qt/tst_qdbustype.cpp')
-rw-r--r--test/qt/tst_qdbustype.cpp272
1 files changed, 272 insertions, 0 deletions
diff --git a/test/qt/tst_qdbustype.cpp b/test/qt/tst_qdbustype.cpp
new file mode 100644
index 00000000..124e60cb
--- /dev/null
+++ b/test/qt/tst_qdbustype.cpp
@@ -0,0 +1,272 @@
+/* -*- C++ -*-
+ *
+ * Copyright (C) 2006 Trolltech AS. All rights reserved.
+ * Author: Thiago Macieira <thiago.macieira@trolltech.com>
+ *
+ * Licensed under the Academic Free License version 2.1
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+#include <qcoreapplication.h>
+#include <QtTest/QtTest>
+
+#include <dbus/qdbus.h>
+
+class tst_QDBusType: public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void fromType_data();
+ void fromType();
+ void fromSignature_data();
+ void fromSignature();
+ void arrayOf_data();
+ void arrayOf();
+ void mapOf_data();
+ void mapOf();
+};
+
+inline QTestData &operator<<(QTestData &data, QVariant::Type t)
+{
+ return data << int(t);
+}
+
+void tst_QDBusType::fromType_data()
+{
+ fromSignature_data();
+}
+
+void tst_QDBusType:: arrayOf_data()
+{
+ fromSignature_data();
+}
+
+void tst_QDBusType::mapOf_data()
+{
+ fromSignature_data();
+}
+
+void tst_QDBusType::fromSignature_data()
+{
+ QTest::addColumn<QString>("signature");
+ QTest::addColumn<char>("type");
+ QTest::addColumn<int>("qvariantType");
+ QTest::addColumn<bool>("isValid");
+ QTest::addColumn<bool>("isBasic");
+ QTest::addColumn<bool>("isContainer");
+ QTest::addColumn<int>("subtypeCount");
+
+ QTest::newRow("null") << QString() << '\0' << QVariant::Invalid << false << false << false << 0;
+ QTest::newRow("empty") << QString("") << '\0' << QVariant::Invalid << false << false << false << 0;
+ QTest::newRow("invalid") << QString("~") << '\0' << QVariant::Invalid << false << false << false << 0;
+
+ // integers:
+ QTest::newRow("byte") << "y" << 'y' << QVariant::UInt << true << true << false << 0;
+ QTest::newRow("boolean") << "b" << 'b' << QVariant::Bool << true << true << false << 0;
+ QTest::newRow("int16") << "n" << 'n' << QVariant::Int << true << true << false << 0;
+ QTest::newRow("uint16") << "q" << 'q' << QVariant::UInt << true << true << false << 0;
+ QTest::newRow("int32") << "i" << 'i' << QVariant::Int << true << true << false << 0;
+ QTest::newRow("uint32") << "u" << 'u' << QVariant::UInt << true << true << false << 0;
+ QTest::newRow("int64") << "x" << 'x' << QVariant::LongLong << true << true << false << 0;
+ QTest::newRow("uint64") << "t" << 't' << QVariant::ULongLong << true << true << false << 0;
+
+ // double:
+ QTest::newRow("double") << "d" << 'd' << QVariant::Double << true << true << false << 0;
+
+ // string types:
+ QTest::newRow("string") << "s" << 's' << QVariant::String << true << true << false << 0;
+ QTest::newRow("objpath") << "o" << 'o' << QVariant::String << true << true << false << 0;
+ QTest::newRow("signature")<<"g" << 'g' << QVariant::String << true << true << false << 0;
+
+ // variant
+ QTest::newRow("variant") << "v" << 'v' << QVariant::UserType << true << false << true << 0;
+
+ // compound types:
+ QTest::newRow("struct-empty") << "()" << '\0' << QVariant::Invalid << false << false << false << 0;
+ QTest::newRow("struct-invalid") << "(~)" << '\0' << QVariant::Invalid << false << false << false << 0;
+ QTest::newRow("struct-unterminated")<< "(iii" << '\0' << QVariant::Invalid << false << false << false << 0;
+ QTest::newRow("struct-bad-nest") << "(i(i)((i)i)" << '\0' << QVariant::Invalid << false << false << false << 0;
+ QTest::newRow("struct1") << "(i)" << 'r' << QVariant::List << true << false << true << 1;
+ QTest::newRow("struct2") << "(ii)" << 'r' << QVariant::List << true << false << true << 2;
+
+ QTest::newRow("array-empty") << "a" << '\0' << QVariant::Invalid << false << false << false << 0;
+ QTest::newRow("array-invalid") << "a~" << '\0' << QVariant::Invalid << false << false << false << 0;
+ QTest::newRow("array-simple") << "ab" << 'a' << QVariant::List << true << false << true << 1;
+ QTest::newRow("bytearray") << "ay" << 'a' << QVariant::ByteArray << true << false << true << 1;
+ QTest::newRow("stringlist") << "as" << 'a' << QVariant::StringList << true << false << true << 1;
+
+ QTest::newRow("map-empty") << "e" << '\0' << QVariant::Invalid << false << false << false << 0;
+ QTest::newRow("map-invalid1") << "a{}" << '\0' << QVariant::Invalid << false << false << false << 0;
+ QTest::newRow("map-invalid2") << "a{~}" << '\0' << QVariant::Invalid << false << false << false << 0;
+ QTest::newRow("map-invalid3") << "a{e}" << '\0' << QVariant::Invalid << false << false << false << 0;
+ QTest::newRow("map-invalid4") << "a{i}" << '\0' << QVariant::Invalid << false << false << false << 0;
+ QTest::newRow("map-invalid5") << "a{(i)d}" << '\0' << QVariant::Invalid << false << false << false << 0;
+ QTest::newRow("map-invalid6") << "{}" << '\0' << QVariant::Invalid << false << false << false << 0;
+ QTest::newRow("map-invalid7") << "{i}" << '\0' << QVariant::Invalid << false << false << false << 0;
+ //QTest::newRow("map-invalid8") << "{is}" << '\0' << QVariant::Invalid << false << false << false << 0; // this is valid when "a" is prepended
+ QTest::newRow("map-bad-nesting") << "a{i(s}" << '\0' << QVariant::Invalid << false << false << false << 0;
+ QTest::newRow("map-ok1") << "a{is}" << 'a' << QVariant::Map << true << false << true << 1;
+ QTest::newRow("map-ok2") << "a{sv}" << 'a' << QVariant::Map << true << false << true << 1;
+
+ // compound of compounds:
+ QTest::newRow("struct-struct") << "((i))" << 'r' << QVariant::List << true << false << true << 1;
+ QTest::newRow("struct-structs") << "((ii)d(i))" << 'r' << QVariant::List << true << false << true << 3;
+ QTest::newRow("map-struct") << "a{s(ii)}" << 'a' << QVariant::Map << true << false << true << 1;
+ QTest::newRow("map-stringlist") << "a{sas}" << 'a' << QVariant::Map << true << false << true << 1;
+ QTest::newRow("map-map") << "a{ia{sv}}" << 'a' << QVariant::Map << true << false << true << 1;
+ QTest::newRow("array-struct") << "a(ii)" << 'a' << QVariant::List << true << false << true << 1;
+ QTest::newRow("array-array") << "aai" << 'a' << QVariant::List << true << false << true << 1;
+ QTest::newRow("array-map") << "aa{sv}" << 'a' << QVariant::List << true << false << true << 1;
+}
+
+void tst_QDBusType::fromType()
+{
+ QFETCH(QString, signature);
+ if (signature.length() != 1)
+ // can't transform to typecode
+ return;
+
+ QFETCH(char, type);
+ QFETCH(int, qvariantType);
+ QFETCH(bool, isValid);
+ QFETCH(bool, isBasic);
+ QFETCH(bool, isContainer);
+
+ QDBusType t(signature.at(0).toLatin1());
+
+ QCOMPARE((char)t.dbusType(), type);
+ QCOMPARE(t.qvariantType(), QVariant::Type(qvariantType));
+ QCOMPARE(t.isValid(), isValid);
+ QCOMPARE(t.isBasic(), isBasic);
+ QCOMPARE(t.isContainer(), isContainer);
+}
+
+void tst_QDBusType::fromSignature()
+{
+ QFETCH(QString, signature);
+ QFETCH(char, type);
+ QFETCH(int, qvariantType);
+ QFETCH(bool, isValid);
+ QFETCH(bool, isBasic);
+ QFETCH(bool, isContainer);
+ QFETCH(int, subtypeCount);
+
+ QDBusType t(signature);
+
+ QCOMPARE((char)t.dbusType(), type);
+ QCOMPARE(t.qvariantType(), QVariant::Type(qvariantType));
+ QCOMPARE(t.isValid(), isValid);
+ QCOMPARE(t.isBasic(), isBasic);
+ QCOMPARE(t.isContainer(), isContainer);
+
+ if (isValid)
+ QCOMPARE(QLatin1String(t.dbusSignature()), signature);
+
+ QCOMPARE(t.subTypes().count(), subtypeCount);
+}
+
+void tst_QDBusType::arrayOf()
+{
+ QFETCH(QString, signature);
+ QFETCH(char, type);
+ QFETCH(int, qvariantType);
+ QFETCH(bool, isValid);
+ QFETCH(bool, isBasic);
+ QFETCH(bool, isContainer);
+ QFETCH(int, subtypeCount);
+
+ QDBusType arr("a" + signature.toLatin1());
+ QCOMPARE(arr.isValid(), isValid);
+ QVERIFY(!arr.isBasic());
+
+ if (isValid) {
+ QVERIFY(arr.isContainer());
+ QVERIFY(arr.isArray());
+ QCOMPARE((char)arr.dbusType(), 'a');
+ QCOMPARE(arr.subTypes().count(), 1);
+
+ // handle special cases:
+ if (type == 'y')
+ QCOMPARE(arr.qvariantType(), QVariant::ByteArray);
+ else if (type == 's' || type == 'o' || type == 'g')
+ QCOMPARE(arr.qvariantType(), QVariant::StringList);
+ else
+ QCOMPARE(arr.qvariantType(), QVariant::List);
+
+ // handle the array element now:
+ QDBusType t = arr.arrayElement();
+
+ QCOMPARE((char)t.dbusType(), type);
+ QCOMPARE(t.qvariantType(), QVariant::Type(qvariantType));
+ QCOMPARE(t.isValid(), isValid);
+ QCOMPARE(t.isBasic(), isBasic);
+ QCOMPARE(t.isContainer(), isContainer);
+
+ QCOMPARE(QLatin1String(t.dbusSignature()), signature);
+
+ QCOMPARE(t.subTypes().count(), subtypeCount);
+ }
+}
+
+void tst_QDBusType::mapOf()
+{
+ QFETCH(QString, signature);
+ QFETCH(char, type);
+ QFETCH(int, qvariantType);
+ QFETCH(bool, isValid);
+ QFETCH(bool, isBasic);
+ QFETCH(bool, isContainer);
+ QFETCH(int, subtypeCount);
+
+ QDBusType map("a{s" + signature.toLatin1() + '}');
+ QCOMPARE(map.isValid(), isValid);
+ QVERIFY(!map.isBasic());
+
+ if (isValid) {
+ QVERIFY(map.isContainer());
+ QVERIFY(map.isArray());
+ QVERIFY(map.isMap());
+ QCOMPARE((char)map.dbusType(), 'a');
+ QCOMPARE(map.subTypes().count(), 1);
+
+ // handle the array element now:
+ QDBusType dict_entry = map.arrayElement();
+ QVERIFY(dict_entry.isValid());
+ QVERIFY(dict_entry.isContainer());
+ QVERIFY(!dict_entry.isMap());
+ QVERIFY(!dict_entry.isArray());
+
+ QVERIFY(map.mapKey().isBasic());
+
+ // handle the value:
+ QDBusType t = map.mapValue();
+
+ QCOMPARE((char)t.dbusType(), type);
+ QCOMPARE(t.qvariantType(), QVariant::Type(qvariantType));
+ QCOMPARE(t.isValid(), isValid);
+ QCOMPARE(t.isBasic(), isBasic);
+ QCOMPARE(t.isContainer(), isContainer);
+
+ QCOMPARE(QLatin1String(t.dbusSignature()), signature);
+
+ QCOMPARE(t.subTypes().count(), subtypeCount);
+ }
+}
+
+QTEST_MAIN(tst_QDBusType)
+
+#include "tst_qdbustype.moc"