From 0b7ec36816edd6093af37e005b20fe9561b4944e Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Sun, 10 Aug 2014 18:22:52 +0200 Subject: Add conversion between Q_ENUMs and strings in QVariant Change-Id: I9264a68d162cf20db0167dd3f976a007477786d1 Reviewed-by: Shawn Rutledge --- .../auto/corelib/kernel/qvariant/tst_qvariant.cpp | 79 +++++++++++++++++++++- 1 file changed, 77 insertions(+), 2 deletions(-) (limited to 'tests/auto/corelib') diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index e95ec88774..52fc4e1806 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. +** Copyright (C) 2015 Olivier Goffart ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -58,6 +59,12 @@ class CustomNonQObject; +#if defined(Q_COMPILER_CLASS_ENUM) +#define ENUM_SIZE(X) : X +#else +#define ENUM_SIZE(X) +#endif + class tst_QVariant : public QObject { Q_OBJECT @@ -69,6 +76,23 @@ public: } + + enum MetaEnumTest_Enum0 { MetaEnumTest_Enum0_value = 42, MetaEnsureSignedEnum0 = -1 }; + Q_ENUM(MetaEnumTest_Enum0) + enum MetaEnumTest_Enum1 { MetaEnumTest_Enum1_value = 42, MetaEnumTest_Enum1_bigValue = (Q_INT64_C(1) << 33) + 50 }; + Q_ENUM(MetaEnumTest_Enum1) + + enum MetaEnumTest_Enum3 ENUM_SIZE(qint64) { MetaEnumTest_Enum3_value = -47, MetaEnumTest_Enum3_bigValue = (Q_INT64_C(1) << 56) + 5 }; + Q_ENUM(MetaEnumTest_Enum3) + enum MetaEnumTest_Enum4 ENUM_SIZE(quint64) { MetaEnumTest_Enum4_value = 47, MetaEnumTest_Enum4_bigValue = (Q_INT64_C(1) << 52) + 45 }; + Q_ENUM(MetaEnumTest_Enum4) + enum MetaEnumTest_Enum5 ENUM_SIZE(uint) { MetaEnumTest_Enum5_value = 47 }; + Q_ENUM(MetaEnumTest_Enum5) + enum MetaEnumTest_Enum6 ENUM_SIZE(uchar) { MetaEnumTest_Enum6_value = 47 }; + Q_ENUM(MetaEnumTest_Enum6) + enum MetaEnumTest_Enum8 ENUM_SIZE(short) { MetaEnumTest_Enum8_value = 47 }; + Q_ENUM(MetaEnumTest_Enum8) + private slots: void cleanupTestCase(); @@ -249,7 +273,7 @@ private slots: void pairElements(); void enums(); - + void metaEnums(); void compareSanity_data(); void compareSanity(); @@ -4491,7 +4515,7 @@ void tst_QVariant::pairElements() TEST_PAIR_ELEMENT_ACCESS(std::pair, int, QVariant, 44, 15) } -enum EnumTest_Enum0 { EnumTest_Enum0_value = 42, ensureSignedEnum0 = -1 }; +enum EnumTest_Enum0 { EnumTest_Enum0_value = 42, EnumTest_Enum0_negValue = -8 }; Q_DECLARE_METATYPE(EnumTest_Enum0) enum EnumTest_Enum1 { EnumTest_Enum1_value = 42, EnumTest_Enum1_bigValue = (Q_INT64_C(1) << 33) + 50 }; Q_DECLARE_METATYPE(EnumTest_Enum1) @@ -4533,6 +4557,11 @@ template void testVariant(Enum value, bool *ok) QCOMPARE(var.value(), static_cast(value)); QCOMPARE(var.value(), static_cast(value)); QCOMPARE(var.value(), static_cast(value)); + if (sizeof(value) < 8 && static_cast(value) < 0) { + QEXPECT_FAIL("", "The metatype system don't store the sign of enums", Continue); + // The value is stored internaly with 32 bit. When asked to convert it to 64 bit unsigned, + // we consider that the value was unsigned, so we don't extent the bit signs + } QCOMPARE(var.value(), static_cast(value)); QVariant var2 = var; @@ -4547,6 +4576,8 @@ void tst_QVariant::enums() bool ok = false; testVariant(EnumTest_Enum0_value, &ok); QVERIFY(ok); + testVariant(EnumTest_Enum0_negValue, &ok); + QVERIFY(ok); testVariant(EnumTest_Enum1_value, &ok); QVERIFY(ok); testVariant(EnumTest_Enum1_bigValue, &ok); @@ -4573,6 +4604,50 @@ void tst_QVariant::enums() #endif } +template void testVariantMeta(Enum value, bool *ok, const char *string) +{ + testVariant(value, ok); + QVERIFY(ok); + *ok = false; + + QVariant var = QVariant::fromValue(value); + QVERIFY(var.canConvert()); + QVERIFY(var.canConvert()); + + QCOMPARE(var.value(), QString::fromLatin1(string)); + QCOMPARE(var.value(), QByteArray(string)); + + QVariant strVar = QString::fromLatin1(string); + QVERIFY(strVar.canConvert()); + if (value > INT_MAX) { + QEXPECT_FAIL("", "QMetaEnum api uses 'int' as return type QTBUG-27451", Abort); + *ok = true; + } + QCOMPARE(strVar.value(), value); + strVar = QByteArray(string); + QVERIFY(strVar.canConvert()); + QCOMPARE(strVar.value(), value); + *ok = true; +} + +void tst_QVariant::metaEnums() +{ + bool ok = false; +#define METAENUMS_TEST(Value) \ + testVariantMeta(Value, &ok, #Value); QVERIFY(ok) + + METAENUMS_TEST(MetaEnumTest_Enum0_value); + METAENUMS_TEST(MetaEnumTest_Enum1_value); + METAENUMS_TEST(MetaEnumTest_Enum1_bigValue); + METAENUMS_TEST(MetaEnumTest_Enum3_value); + METAENUMS_TEST(MetaEnumTest_Enum3_bigValue); + METAENUMS_TEST(MetaEnumTest_Enum4_value); + METAENUMS_TEST(MetaEnumTest_Enum4_bigValue); + METAENUMS_TEST(MetaEnumTest_Enum5_value); + METAENUMS_TEST(MetaEnumTest_Enum6_value); + METAENUMS_TEST(MetaEnumTest_Enum8_value); +} + void tst_QVariant::compareSanity_data() { QTest::addColumn("value1"); -- cgit v1.2.3