From d95b21706fa63462124ce7c5b78ef1fbeff6b8af Mon Sep 17 00:00:00 2001 From: Ahmad Samir Date: Thu, 3 Nov 2022 17:32:29 +0200 Subject: [PATCH] ContainerApiSymmetry: verify Qt containers member erase returns iterator For QSet, the key_type is const, so can't test assiging to it. Change-Id: I9d363ef3fe52646b937d6a422227b19c48fdaf1f Reviewed-by: Qt CI Bot Reviewed-by: Thiago Macieira Reviewed-by: Marc Mutz (cherry picked from commit 93f54f0aa44467da1ea7ef7bcb01e891c619c8f5) Reviewed-by: Qt Cherry-pick Bot --- .../tst_containerapisymmetry.cpp | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp b/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp index 722a174a326..c3a56b68ecd 100644 --- a/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp +++ b/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp @@ -354,6 +354,15 @@ private: template void erase_if_associative_impl() const; + template + void member_erase_impl() const; + + template + void member_erase_associative_impl() const; + + template + void member_erase_set_impl() const; + private Q_SLOTS: void erase_QList() { erase_impl>(); } void erase_QVarLengthArray() { erase_impl>(); } @@ -380,6 +389,17 @@ private Q_SLOTS: void erase_if_QHash() { erase_if_associative_impl>(); } void erase_if_QMultiHash() { erase_if_associative_impl>(); } + void member_erase_QList() { member_erase_impl>(); } + void member_erase_QVarLengthArray() { member_erase_impl>(); } + void member_erase_QString() { member_erase_impl(); } + void member_erase_QByteArray() { member_erase_impl(); } + void member_erase_QSet() { member_erase_set_impl>(); } + + void member_erase_QMap() { member_erase_associative_impl>(); } + void member_erase_QMultiMap() {member_erase_associative_impl>(); } + void member_erase_QHash() { member_erase_associative_impl>(); } + void member_erase_QMultiHash() { member_erase_associative_impl>(); } + private: template void keyValueRange_impl() const; @@ -873,6 +893,65 @@ void tst_ContainerApiSymmetry::erase_if_associative_impl() const QCOMPARE(c.size(), S(0)); } +template +void tst_ContainerApiSymmetry::member_erase_impl() const +{ + using S = typename Container::size_type; + using V = typename Container::value_type; + const S size = 7; + auto c = make(size); // {1, 2, 3, 4, 5, 6, 7} + QCOMPARE(c.size(), size); + + auto copy = c; + // Container::erase() returns an iterator, not const_iterator + auto it = c.erase(c.cbegin(), c.cbegin()); + static_assert(std::is_same_v); + QCOMPARE(c.size(), size); + const V newVal{100}; + QCOMPARE_NE(*it, newVal); + *it = newVal; + QCOMPARE(it, c.cbegin()); + QCOMPARE(*c.cbegin(), newVal); + + QCOMPARE(std::find(copy.cbegin(), copy.cend(), newVal), copy.cend()); +} + +template +void tst_ContainerApiSymmetry::member_erase_associative_impl() const +{ + using S = typename Container::size_type; + using V = typename Container::mapped_type; + + const S size = 20; + auto c = makeAssociative(size); + QCOMPARE(c.size(), size); + + // Verify Container::erase() returns iterator, not const_iterator + auto it = c.erase(c.cbegin()); + static_assert(std::is_same_v); + QCOMPARE(c.size(), size - 1); + QCOMPARE(it, c.cbegin()); + const auto current = it.value(); + it.value() = current + V(5); + QCOMPARE(c.cbegin().value(),current + V(5)); +} + +template +void tst_ContainerApiSymmetry::member_erase_set_impl() const +{ + using S = typename Container::size_type; + + const S size = 20; + auto c = make(size); + QCOMPARE(c.size(), size); + + // Verify Container::erase() returns iterator, not const_iterator + auto it = c.erase(c.cbegin()); + static_assert(std::is_same_v); + QCOMPARE(c.size(), size - 1); + QCOMPARE(it, c.cbegin()); +} + template void tst_ContainerApiSymmetry::keyValueRange_impl() const {