From f1540a2966ce911e9a5d5754e53f6026e3c26d22 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 24 Mar 2014 12:53:27 -0700 Subject: Fix capacity reservation for shared QByteArray MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We can squeeze, but not by discarding elements. Make sure the size of the object stays intact after changing the reserved capacity. I've also added unit tests for other containers, just to be sure. Task-number: QTBUG-37750 Change-Id: I5135b095943b7589423c51cebcb52af792468e61 Reviewed-by: Marc Mutz Reviewed-by: Jędrzej Nowacki --- .../corelib/tools/qbytearray/tst_qbytearray.cpp | 15 ++++++++++++ tests/auto/corelib/tools/qlist/tst_qlist.cpp | 28 ++++++++++++++++++++++ tests/auto/corelib/tools/qstring/tst_qstring.cpp | 9 +++++++ tests/auto/corelib/tools/qvector/tst_qvector.cpp | 1 + 4 files changed, 53 insertions(+) (limited to 'tests/auto') diff --git a/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp b/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp index b06741b23e..6e183f3212 100644 --- a/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp +++ b/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp @@ -1855,6 +1855,21 @@ void tst_QByteArray::reserve() QVERIFY(data == qba.data()); } + qba.resize(capacity); + + QByteArray copy = qba; + qba.reserve(capacity / 2); + QCOMPARE(qba.size(), capacity); // we didn't shrink the size! + QCOMPARE(qba.capacity(), capacity); + QCOMPARE(copy.capacity(), capacity); + + copy = qba; + qba.reserve(capacity * 2); + QCOMPARE(qba.size(), capacity); + QCOMPARE(qba.capacity(), capacity * 2); + QCOMPARE(copy.capacity(), capacity); + QVERIFY(qba.constData() != data); + QByteArray nil1, nil2; nil1.reserve(0); nil2.squeeze(); diff --git a/tests/auto/corelib/tools/qlist/tst_qlist.cpp b/tests/auto/corelib/tools/qlist/tst_qlist.cpp index 2c9bf9d4c9..d77cc4a37c 100644 --- a/tests/auto/corelib/tools/qlist/tst_qlist.cpp +++ b/tests/auto/corelib/tools/qlist/tst_qlist.cpp @@ -278,6 +278,8 @@ private slots: void setSharableComplex() const; void eraseValidIteratorsOnSharedList() const; void insertWithValidIteratorsOnSharedList() const; + + void reserve() const; private: template void length() const; template void append() const; @@ -1669,5 +1671,31 @@ void tst_QList::insertWithValidIteratorsOnSharedList() const QCOMPARE(a.at(1), 15); } +void tst_QList::reserve() const +{ + // Note: + // This test depends on QList's current behavior that ints are stored in the array itself. + // This test would not work for QList. + int capacity = 100; + QList list; + list.reserve(capacity); + list << 0; + int *data = &list[0]; + + for (int i = 1; i < capacity; i++) { + list << i; + QCOMPARE(&list.at(0), data); + } + + QList copy = list; + list.reserve(capacity / 2); + QCOMPARE(list.size(), capacity); // we didn't shrink the size! + + copy = list; + list.reserve(capacity * 2); + QCOMPARE(list.size(), capacity); + QVERIFY(&list.at(0) != data); +} + QTEST_APPLESS_MAIN(tst_QList) #include "tst_qlist.moc" diff --git a/tests/auto/corelib/tools/qstring/tst_qstring.cpp b/tests/auto/corelib/tools/qstring/tst_qstring.cpp index 5655d9f529..d9d6b985b7 100644 --- a/tests/auto/corelib/tools/qstring/tst_qstring.cpp +++ b/tests/auto/corelib/tools/qstring/tst_qstring.cpp @@ -4277,14 +4277,23 @@ void tst_QString::capacity() QVERIFY( (int)s2.capacity() >= res ); QCOMPARE( s2, s1 ); + s2 = s1; // share again s2.reserve( res * 2 ); QVERIFY( (int)s2.capacity() >= res * 2 ); + QVERIFY(s2.constData() != s1.constData()); QCOMPARE( s2, s1 ); + // don't share again -- s2 must be detached for squeeze() to do anything s2.squeeze(); QVERIFY( (int)s2.capacity() == res ); QCOMPARE( s2, s1 ); + s2 = s1; // share again + int oldsize = s1.size(); + s2.reserve( res / 2 ); + QVERIFY( (int)s2.capacity() >= res / 2 ); + QVERIFY( (int)s2.capacity() >= oldsize ); + QCOMPARE( s2, s1 ); } void tst_QString::section_data() diff --git a/tests/auto/corelib/tools/qvector/tst_qvector.cpp b/tests/auto/corelib/tools/qvector/tst_qvector.cpp index 59956e33cf..c9545c8eb4 100644 --- a/tests/auto/corelib/tools/qvector/tst_qvector.cpp +++ b/tests/auto/corelib/tools/qvector/tst_qvector.cpp @@ -1942,6 +1942,7 @@ void tst_QVector::reserve() a.resize(2); QVector b(a); b.reserve(1); + QCOMPARE(b.size(), a.size()); } QCOMPARE(fooCtor, fooDtor); } -- cgit v1.2.3