From 87e27eb870d08ee8953cc9b350ed29c5b3e4f785 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Fri, 5 Apr 2013 13:23:38 +0200 Subject: Add container access functionality for associative containers in QVariant. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I4763a4c157e52918a0a68cba63624c0649aca235 Reviewed-by: Jędrzej Nowacki --- .../auto/corelib/kernel/qvariant/tst_qvariant.cpp | 85 ++++++++++++++++++++++ 1 file changed, 85 insertions(+) (limited to 'tests') diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index cdc6f1f1df..546b90e164 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -3460,6 +3460,55 @@ struct ContainerAPI > }; #endif +template +struct KeyGetter +{ + static const typename Container::key_type & get(const typename Container::const_iterator &it) + { + return it.key(); + } + static const typename Container::mapped_type & value(const typename Container::const_iterator &it) + { + return it.value(); + } +}; + +template +struct KeyGetter > +{ + static const T & get(const typename std::map::const_iterator &it) + { + return it->first; + } + static const U & value(const typename std::map::const_iterator &it) + { + return it->second; + } +}; + + +// We have no built-in defines to check the stdlib features. +// #define TEST_UNORDERED_MAP + +#ifdef TEST_UNORDERED_MAP +#include +typedef std::unordered_map StdUnorderedMap_int_bool; +Q_DECLARE_METATYPE(StdUnorderedMap_int_bool) + +template +struct KeyGetter > +{ + static const T & get(const typename std::unordered_map::const_iterator &it) + { + return it->first; + } + static const U & value(const typename std::unordered_map::const_iterator &it) + { + return it->second; + } +}; +#endif + void tst_QVariant::iterateContainerElements() { #ifdef Q_COMPILER_RANGE_FOR @@ -3545,6 +3594,42 @@ void tst_QVariant::iterateContainerElements() TEST_SEQUENTIAL_ITERATION(std::forward_list, QVariant) TEST_SEQUENTIAL_ITERATION(std::forward_list, QString) #endif + +#define TEST_ASSOCIATIVE_ITERATION(CONTAINER, KEY_TYPE, MAPPED_TYPE) \ + { \ + int numSeen = 0; \ + CONTAINER mapping; \ + mapping[5] = true; \ + mapping[15] = false; \ + \ + QVariant mappingVariant = QVariant::fromValue(mapping); \ + QVariantMap varMap = mappingVariant.value(); \ + QVariantMap varHash = mappingVariant.value(); \ + QAssociativeIterable mappingIter = mappingVariant.value(); \ + \ + CONTAINER::const_iterator containerIter = mapping.begin(); \ + const CONTAINER::const_iterator containerEnd = mapping.end(); \ + for ( ; containerIter != containerEnd; ++containerIter, ++numSeen) \ + { \ + MAPPED_TYPE expected = KeyGetter >::value(containerIter); \ + KEY_TYPE key = KeyGetter >::get(containerIter); \ + MAPPED_TYPE actual = mappingIter.value(key).value(); \ + QCOMPARE(varMap.value(QString::number(key)).value(), expected); \ + QCOMPARE(varHash.value(QString::number(key)).value(), expected); \ + QCOMPARE(actual, expected); \ + } \ + QCOMPARE(numSeen, (int)std::distance(mapping.begin(), mapping.end())); \ + QCOMPARE(containerIter, containerEnd); \ + \ + } + + TEST_ASSOCIATIVE_ITERATION(QHash, int, bool) + TEST_ASSOCIATIVE_ITERATION(QMap, int, bool) + TEST_ASSOCIATIVE_ITERATION(std::map, int, bool) +#ifdef TEST_UNORDERED_MAP + qRegisterAssociativeConverter(); + TEST_ASSOCIATIVE_ITERATION(std::unordered_map, int, bool) +#endif } QTEST_MAIN(tst_QVariant) -- cgit v1.2.3