summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp')
-rw-r--r--tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp127
1 files changed, 84 insertions, 43 deletions
diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
index 8df3b4055b..4ff404e12a 100644
--- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
+++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
@@ -57,6 +57,8 @@
#include <private/qlocale_p.h>
#include "tst_qvariant_common.h"
+#include <unordered_map>
+
class CustomNonQObject;
class tst_QVariant : public QObject
@@ -4150,11 +4152,6 @@ struct KeyGetter<std::map<T, U> >
};
-// We have no built-in defines to check the stdlib features.
-// #define TEST_UNORDERED_MAP
-
-#ifdef TEST_UNORDERED_MAP
-#include <unordered_map>
typedef std::unordered_map<int, bool> StdUnorderedMap_int_bool;
Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE(std::unordered_map)
@@ -4173,7 +4170,6 @@ struct KeyGetter<std::unordered_map<T, U> >
return it->second;
}
};
-#endif
template<typename Iterator>
void sortIterable(QSequentialIterable *iterable)
@@ -4290,6 +4286,83 @@ void testSequentialIteration()
QCOMPARE(listIter.at(2), second);
QCOMPARE(listIter.at(3), second);
QCOMPARE(listIter.at(4), third);
+
+ auto i = listIter.mutableBegin();
+ QVERIFY(i != listIter.mutableEnd());
+
+ *i = QStringLiteral("17");
+ if (listIter.metaContainer().valueMetaType() == QMetaType::fromType<int>())
+ QCOMPARE(listIter.at(0).toInt(), 17);
+ else if (listIter.metaContainer().valueMetaType() == QMetaType::fromType<bool>())
+ QCOMPARE(listIter.at(0).toBool(), false);
+
+ *i = QStringLiteral("true");
+ if (listIter.metaContainer().valueMetaType() == QMetaType::fromType<int>())
+ QCOMPARE(listIter.at(0).toInt(), 0);
+ else if (listIter.metaContainer().valueMetaType() == QMetaType::fromType<bool>())
+ QCOMPARE(listIter.at(0).toBool(), true);
+}
+
+template<typename Container>
+void testAssociativeIteration()
+{
+ using Key = typename Container::key_type;
+ using Mapped = typename Container::mapped_type;
+
+ int numSeen = 0;
+ Container mapping;
+ mapping[5] = true;
+ mapping[15] = false;
+
+ QVariant mappingVariant = QVariant::fromValue(mapping);
+ QVariantMap varMap = mappingVariant.value<QVariantMap>();
+ QVariantMap varHash = mappingVariant.value<QVariantMap>();
+ QAssociativeIterable mappingIter = mappingVariant.view<QAssociativeIterable>();
+
+ typename Container::const_iterator containerIter = mapping.begin();
+ const typename Container::const_iterator containerEnd = mapping.end();
+ for ( ;containerIter != containerEnd; ++containerIter, ++numSeen)
+ {
+ Mapped expected = KeyGetter<Container>::value(containerIter);
+ Key key = KeyGetter<Container>::get(containerIter);
+ Mapped actual = qvariant_cast<Mapped>(mappingIter.value(key));
+ QCOMPARE(qvariant_cast<Mapped>(varMap.value(QString::number(key))), expected);
+ QCOMPARE(qvariant_cast<Mapped>(varHash.value(QString::number(key))), expected);
+ QCOMPARE(actual, expected);
+ const QAssociativeIterable::const_iterator it = mappingIter.find(key);
+ QVERIFY(it != mappingIter.end());
+ QCOMPARE(it.value().value<Mapped>(), expected);
+ }
+ QCOMPARE(numSeen, (int)std::distance(mapping.begin(), mapping.end()));
+ QCOMPARE(containerIter, containerEnd);
+ QVERIFY(mappingIter.find(10) == mappingIter.end());
+
+ auto i = mappingIter.mutableFind(QStringLiteral("nonono"));
+ QCOMPARE(i, mappingIter.mutableEnd());
+ i = mappingIter.mutableFind(QStringLiteral("5"));
+ QVERIFY(i != mappingIter.mutableEnd());
+
+ *i = QStringLiteral("17");
+
+ if (mappingIter.metaContainer().mappedMetaType() == QMetaType::fromType<int>())
+ QCOMPARE(mappingIter.value(5).toInt(), 17);
+ else if (mappingIter.metaContainer().mappedMetaType() == QMetaType::fromType<bool>())
+ QCOMPARE(mappingIter.value(5).toBool(), true);
+
+ *i = QStringLiteral("true");
+ if (mappingIter.metaContainer().mappedMetaType() == QMetaType::fromType<int>())
+ QCOMPARE(mappingIter.value(5).toInt(), 0);
+ else if (mappingIter.metaContainer().mappedMetaType() == QMetaType::fromType<bool>())
+ QCOMPARE(mappingIter.value(5).toBool(), true);
+
+ // Test that find() does not coerce
+ auto container = Container();
+ container[0] = true;
+
+ QVariant containerVariant = QVariant::fromValue(container);
+ QAssociativeIterable iter = containerVariant.value<QAssociativeIterable>();
+ auto f = iter.constFind(QStringLiteral("anything"));
+ QCOMPARE(f, iter.constEnd());
}
void tst_QVariant::iterateContainerElements()
@@ -4341,43 +4414,11 @@ void tst_QVariant::iterateContainerElements()
QCOMPARE(ints, intsCopy);
}
-#define TEST_ASSOCIATIVE_ITERATION(CONTAINER, KEY_TYPE, MAPPED_TYPE) \
- { \
- int numSeen = 0; \
- CONTAINER<KEY_TYPE, MAPPED_TYPE> mapping; \
- mapping[5] = true; \
- mapping[15] = false; \
- \
- QVariant mappingVariant = QVariant::fromValue(mapping); \
- QVariantMap varMap = mappingVariant.value<QVariantMap>(); \
- QVariantMap varHash = mappingVariant.value<QVariantMap>(); \
- QAssociativeIterable mappingIter = mappingVariant.value<QAssociativeIterable>(); \
- \
- CONTAINER<KEY_TYPE, MAPPED_TYPE>::const_iterator containerIter = mapping.begin(); \
- const CONTAINER<KEY_TYPE, MAPPED_TYPE>::const_iterator containerEnd = mapping.end(); \
- for ( ; containerIter != containerEnd; ++containerIter, ++numSeen) \
- { \
- MAPPED_TYPE expected = KeyGetter<CONTAINER<KEY_TYPE, MAPPED_TYPE> >::value(containerIter); \
- KEY_TYPE key = KeyGetter<CONTAINER<KEY_TYPE, MAPPED_TYPE> >::get(containerIter); \
- MAPPED_TYPE actual = mappingIter.value(key).value<MAPPED_TYPE >(); \
- QCOMPARE(varMap.value(QString::number(key)).value<MAPPED_TYPE>(), expected); \
- QCOMPARE(varHash.value(QString::number(key)).value<MAPPED_TYPE>(), expected); \
- QCOMPARE(actual, expected); \
- const QAssociativeIterable::const_iterator it = mappingIter.find(key); \
- QVERIFY(it != mappingIter.end()); \
- QCOMPARE(it.value().value<MAPPED_TYPE>(), expected); \
- } \
- QCOMPARE(numSeen, (int)std::distance(mapping.begin(), mapping.end())); \
- QCOMPARE(containerIter, containerEnd); \
- QVERIFY(mappingIter.find(10) == mappingIter.end()); \
- }
-
- TEST_ASSOCIATIVE_ITERATION(QHash, int, bool)
- TEST_ASSOCIATIVE_ITERATION(QMap, int, bool)
- TEST_ASSOCIATIVE_ITERATION(std::map, int, bool)
-#ifdef TEST_UNORDERED_MAP
- TEST_ASSOCIATIVE_ITERATION(std::unordered_map, int, bool)
-#endif
+ testAssociativeIteration<QHash<int, bool>>();
+ testAssociativeIteration<QHash<int, int>>();
+ testAssociativeIteration<QMap<int, bool>>();
+ testAssociativeIteration<std::map<int, bool>>();
+ testAssociativeIteration<std::unordered_map<int, bool>>();
{
QMap<int, QString> mapping;