31
class QGVariantType : public QObject
35
34
QGVariantType() : type(NULL) {}
36
35
QGVariantType(const GVariantType *gvtype) : type(gvtype) {}
37
QGVariantType(const QGVariantType &other) : type(other.type) {}
38
36
const GVariantType *getType() const { return type; }
39
37
operator const GVariantType*() const { return type; }
44
42
Q_DECLARE_METATYPE(QGVariantType);
46
class QGVariant : public QObject
50
47
QGVariant() : variant(NULL) {}
51
48
~QGVariant() { if (variant) g_variant_unref(variant); }
52
49
QGVariant(GVariant *gv) : variant(g_variant_ref_sink(gv)) {}
53
QGVariant(const QGVariant &other) : variant(g_variant_ref_sink(other.variant)) {}
50
QGVariant(const QGVariant &other) : QGVariant(other.variant) {}
54
51
GVariant *gvariant() const { return variant; }
55
52
operator GVariant*() const { return variant; }
130
128
QTest::newRow("UInt64") << QVariant::fromValue<qulonglong>(42) << QGVariantType(G_VARIANT_TYPE_UINT64);
131
129
QTest::newRow("Double") << QVariant((double)42.42) << QGVariantType(G_VARIANT_TYPE_DOUBLE);
132
130
QTest::newRow("String") << QVariant(QString("42")) << QGVariantType(G_VARIANT_TYPE_STRING);
131
QTest::newRow("String List") << QVariant(QStringList({"42", "42"})) << QGVariantType(G_VARIANT_TYPE_STRING_ARRAY);
133
132
QTest::newRow("ByteArray") << QVariant(QByteArray("42")) << QGVariantType(G_VARIANT_TYPE_BYTESTRING);
134
133
QTest::newRow("Map") << QVariant(QVariantMap()) << QGVariantType(G_VARIANT_TYPE_VARDICT);
134
QTest::newRow("Map Filled") << QVariant(QVariantMap({{"fooBar", 0xdeadbeef}})) << QGVariantType(G_VARIANT_TYPE_VARDICT);
135
135
QTest::newRow("List") << QVariant(QVariantList()) << QGVariantType(G_VARIANT_TYPE_UNIT);
136
QTest::newRow("List Filled") << QVariant(QVariantList({"fooBar", 0xdeadbeef})) << QGVariantType(G_VARIANT_TYPE("(su)"));
139
result.setValue(QByteArrayList({"42", "53"}));
140
QTest::newRow("ByteArrayList") << result << QGVariantType(G_VARIANT_TYPE_BYTESTRING_ARRAY);
138
143
void testConvertToGVariant()
143
148
QVERIFY(compare(value, expectedType));
151
void testConvertToGVariantAndBack_data()
153
testConvertToGVariant_data();
156
void testConvertToGVariantAndBack()
158
QFETCH(QVariant, value);
160
GVariant *gv = Converter::toGVariant(value);
163
QCOMPARE(Converter::toQVariant(gv), value);
146
168
void testTupleConversion()
148
170
QVariantList qTuple;
175
197
QTest::addColumn<QVariant>("value");
176
198
QTest::addColumn<QString>("schema");
201
QTest::newRow("byte") << QVariant::fromValue<int>(1) << "y";
178
203
// convert to integer
179
204
QTest::newRow("integer") << QVariant::fromValue<int>(1) << "i";
180
205
QTest::newRow("integer from double") << QVariant::fromValue<double>(1.1) << "i";
206
QTest::newRow("int16") << QVariant::fromValue<int>(-1) << "n";
207
QTest::newRow("uint16") << QVariant::fromValue<int>(1) << "q";
208
QTest::newRow("uint32") << QVariant::fromValue<int>(1) << "u";
209
QTest::newRow("int64") << QVariant::fromValue<int>(1) << "x";
210
QTest::newRow("uint64") << QVariant::fromValue<int>(1) << "t";
212
// convert to variant
213
QTest::newRow("variant from int") << QVariant::fromValue<int>(1) << "v";
214
QTest::newRow("variant from double") << QVariant::fromValue<double>(1.1) << "v";
215
QTest::newRow("variant from string") << QVariant::fromValue<QString>("string") << "v";
182
217
// convert to bool
183
218
QTest::newRow("bool") << QVariant::fromValue<bool>(true) << "b";
242
277
QTest::newRow("UInt64") << QGVariant(g_variant_new_uint64(53)) << (unsigned) QVariant::ULongLong;
243
278
QTest::newRow("Double") << QGVariant(g_variant_new_double(53.3)) << (unsigned) QVariant::Double;
244
279
QTest::newRow("String") << QGVariant(g_variant_new_string("53")) << (unsigned) QVariant::String;
280
QTest::newRow("Byte string") << QGVariant(g_variant_new_bytestring("53")) << (unsigned) QVariant::ByteArray;
245
281
QTest::newRow("Tuple") << QGVariant(g_variant_new("(si)", "foo", 53)) << (unsigned) QVariant::List;
247
GVariantBuilder* builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
248
g_variant_builder_add(builder, "{sv}", "fooo", g_variant_new_variant(g_variant_new_int64(53)));
249
QTest::newRow("Map") << QGVariant(g_variant_new("a{sv}", builder)) << (unsigned) QVariant::Map;
283
GVariantBuilder* builder = g_variant_builder_new(G_VARIANT_TYPE_VARDICT);
284
g_variant_builder_add(builder, "{sv}", "fooo", g_variant_new_int64(53));
285
QTest::newRow("Map") << QGVariant(g_variant_builder_end(builder)) << (unsigned) QVariant::Map;
250
286
g_variant_builder_unref(builder);
252
288
builder = g_variant_builder_new(G_VARIANT_TYPE("ai"));
253
289
g_variant_builder_add(builder, "i", g_variant_new_int32(53));
254
290
QTest::newRow("List") << QGVariant(g_variant_new("ai", builder)) << (unsigned) QVariant::List;
255
291
g_variant_builder_unref(builder);
293
QTest::newRow("Tuple") << QGVariant(g_variant_new("(i)", 53)) << (unsigned) QVariant::List;
295
const gchar *byteArray[] = {"42", "53", NULL};
296
QTest::newRow("ByteArrayList") << QGVariant(g_variant_new_bytestring_array(byteArray, -1)) << (unsigned) QMetaType::QByteArrayList;
297
QTest::newRow("String List") << QGVariant(g_variant_new_strv(byteArray, -1)) << (unsigned) QVariant::StringList;
258
300
void testConvertToQVariant()
263
305
QVERIFY(compare(value, (QVariant::Type) expectedType));
308
void testConvertToQVariantAndBack_data()
310
testConvertToQVariant_data();
313
void testConvertToQVariantAndBack()
315
QFETCH(QGVariant, value);
317
QVariant qv = Converter::toQVariant(value);
318
QVERIFY(qv.isValid());
320
GVariant *gv = Converter::toGVariant(qv);
321
gboolean equals = g_variant_equal(value, gv);
323
if (!equals && qv.type() == QVariant::List) {
324
QVERIFY(g_variant_type_is_array(g_variant_get_type(value)));
325
QVERIFY(g_variant_type_is_tuple(g_variant_get_type(gv)));
327
gsize vsize = g_variant_n_children(value);
328
QCOMPARE(vsize, g_variant_n_children(gv));
330
for (gsize i = 0; i < vsize; ++i) {
331
equals = g_variant_equal(g_variant_get_child_value(value, i), g_variant_get_child_value(gv, i));
338
gchar *vs = g_variant_print(value, TRUE);
339
gchar *gvs = g_variant_print(gv, TRUE);
340
qWarning() << "Values do not match. Old" << vs << "converted" << gvs;
346
QVERIFY(equals != FALSE);
266
349
void testConvertToQVariantFromString_data()
268
351
QTest::addColumn<QString>("value");
279
362
QTest::newRow("Double") << "double 65" << (unsigned) QVariant::Double;
280
363
QTest::newRow("String") << "string '65'" << (unsigned) QVariant::String;
281
364
QTest::newRow("String simple") << "\"65\"" << (unsigned) QVariant::String;
365
QTest::newRow("String List") << "['foo', 'bar']" << (unsigned) QVariant::StringList;
366
QTest::newRow("Byte string") << "b'fooo'" << (unsigned) QVariant::ByteArray;
282
367
QTest::newRow("Map") << "{'foo': <65>}" << (unsigned) QVariant::Map;
283
368
QTest::newRow("List") << "[65, 66]" << (unsigned) QVariant::List;
284
369
QTest::newRow("Tuple") << "('foo', 65)" << (unsigned) QVariant::List;
370
QTest::newRow("ByteArrayList") << "[b'foo', b'bar']" << (unsigned) QMetaType::QByteArrayList;
287
373
void testConvertToQVariantFromString()