diff -r b72c6db6890b -r 5dc02b23752f tests/auto/qvarlengtharray/tst_qvarlengtharray.cpp --- a/tests/auto/qvarlengtharray/tst_qvarlengtharray.cpp Wed Jun 23 19:07:03 2010 +0300 +++ b/tests/auto/qvarlengtharray/tst_qvarlengtharray.cpp Tue Jul 06 15:10:48 2010 +0300 @@ -63,7 +63,6 @@ void oldTests(); void task214223(); void QTBUG6718_resize(); - void QTBUG10978_realloc(); }; int fooCtor = 0; @@ -134,6 +133,12 @@ QVERIFY(sa.data() == &sa[0]); QVERIFY(sa[0] == 0xfee); QVERIFY(sa[10] == 0xff); + QVERIFY(sa.at(0) == 0xfee); + QVERIFY(sa.at(10) == 0xff); + QVERIFY(sa.value(0) == 0xfee); + QVERIFY(sa.value(10) == 0xff); + QVERIFY(sa.value(1000) == 0); + QVERIFY(sa.value(1000, 12) == 12); QVERIFY(sa.size() == 512); sa.reserve(1024); QVERIFY(sa.capacity() == 1024); @@ -169,6 +174,13 @@ QCOMPARE(sa.size(), 12); QCOMPARE(sa[10], QString("hello")); QCOMPARE(sa[11], QString("world")); + QCOMPARE(sa.at(10), QString("hello")); + QCOMPARE(sa.at(11), QString("world")); + QCOMPARE(sa.value(10), QString("hello")); + QCOMPARE(sa.value(11), QString("world")); + QCOMPARE(sa.value(10000), QString()); + QCOMPARE(sa.value(1212112, QString("none")), QString("none")); + QCOMPARE(sa.value(-12, QString("neg")), QString("neg")); sa.append(arr, 1); QCOMPARE(sa.size(), 13); @@ -292,302 +304,5 @@ } } -struct MyBase -{ - MyBase() - : data(this) - , isCopy(false) - { - ++liveCount; - } - - MyBase(MyBase const &) - : data(this) - , isCopy(true) - { - ++copyCount; - ++liveCount; - } - - MyBase & operator=(MyBase const &) - { - if (!isCopy) { - isCopy = true; - ++copyCount; - } else { - ++errorCount; - } - - return *this; - } - - ~MyBase() - { - if (isCopy) { - if (!copyCount) - ++errorCount; - else - --copyCount; - } - - if (!liveCount) - ++errorCount; - else - --liveCount; - } - - bool hasMoved() const - { - return this != data; - } - -protected: - MyBase const * const data; - bool isCopy; - -public: - static int errorCount; - static int liveCount; - static int copyCount; -}; - -int MyBase::errorCount = 0; -int MyBase::liveCount = 0; -int MyBase::copyCount = 0; - -struct MyPrimitive - : MyBase -{ - MyPrimitive() - { - ++errorCount; - } - - ~MyPrimitive() - { - ++errorCount; - } - - MyPrimitive(MyPrimitive const &other) - : MyBase(other) - { - ++errorCount; - } -}; - -struct MyMovable - : MyBase -{ -}; - -struct MyComplex - : MyBase -{ -}; - -QT_BEGIN_NAMESPACE - -Q_DECLARE_TYPEINFO(MyPrimitive, Q_PRIMITIVE_TYPE); -Q_DECLARE_TYPEINFO(MyMovable, Q_MOVABLE_TYPE); -Q_DECLARE_TYPEINFO(MyComplex, Q_COMPLEX_TYPE); - -QT_END_NAMESPACE - -bool QTBUG10978_proceed = true; - -template -int countMoved(QVarLengthArray const &c) -{ - int result = 0; - for (int i = 0; i < c.size(); ++i) - if (c[i].hasMoved()) - ++result; - - return result; -} - -template -void QTBUG10978_test() -{ - QTBUG10978_proceed = false; - - typedef QVarLengthArray Container; - enum { - isStatic = QTypeInfo::isStatic, - isComplex = QTypeInfo::isComplex, - - isPrimitive = !isComplex && !isStatic, - isMovable = !isStatic - }; - - // Constructors - Container a; - QCOMPARE( MyBase::liveCount, 0 ); - QCOMPARE( MyBase::copyCount, 0 ); - - QVERIFY( a.capacity() >= 16 ); - QCOMPARE( a.size(), 0 ); - - Container b_real(8); - Container const &b = b_real; - QCOMPARE( MyBase::liveCount, isPrimitive ? 0 : 8 ); - QCOMPARE( MyBase::copyCount, 0 ); - - QVERIFY( b.capacity() >= 16 ); - QCOMPARE( b.size(), 8 ); - - // Assignment - a = b; - QCOMPARE( MyBase::liveCount, isPrimitive ? 0 : 16 ); - QCOMPARE( MyBase::copyCount, isComplex ? 8 : 0 ); - QVERIFY( a.capacity() >= 16 ); - QCOMPARE( a.size(), 8 ); - - QVERIFY( b.capacity() >= 16 ); - QCOMPARE( b.size(), 8 ); - - // append - a.append(b.data(), b.size()); - QCOMPARE( MyBase::liveCount, isPrimitive ? 0 : 24 ); - QCOMPARE( MyBase::copyCount, isComplex ? 16 : 0 ); - - QVERIFY( a.capacity() >= 16 ); - QCOMPARE( a.size(), 16 ); - - QVERIFY( b.capacity() >= 16 ); - QCOMPARE( b.size(), 8 ); - - // removeLast - a.removeLast(); - QCOMPARE( MyBase::liveCount, isPrimitive ? 0 : 23 ); - QCOMPARE( MyBase::copyCount, isComplex ? 15 : 0 ); - - QVERIFY( a.capacity() >= 16 ); - QCOMPARE( a.size(), 15 ); - - QVERIFY( b.capacity() >= 16 ); - QCOMPARE( b.size(), 8 ); - - // Movable types - const int capacity = a.capacity(); - if (!isPrimitive) - QCOMPARE( countMoved(a), 0 ); - - // Reserve, no re-allocation - a.reserve(capacity); - if (!isPrimitive) - QCOMPARE( countMoved(a), 0 ); - QCOMPARE( MyBase::liveCount, isPrimitive ? 0 : 23 ); - QCOMPARE( MyBase::copyCount, isComplex ? 15 : 0 ); - - QCOMPARE( a.capacity(), capacity ); - QCOMPARE( a.size(), 15 ); - - QVERIFY( b.capacity() >= 16 ); - QCOMPARE( b.size(), 8 ); - - // Reserve, force re-allocation - a.reserve(capacity * 2); - if (!isPrimitive) - QCOMPARE( countMoved(a), isMovable ? 15 : 0 ); - QCOMPARE( MyBase::liveCount, isPrimitive ? 0 : 23 ); - QCOMPARE( MyBase::copyCount, isComplex ? 15 : 0 ); - - QVERIFY( a.capacity() >= capacity * 2 ); - QCOMPARE( a.size(), 15 ); - - QVERIFY( b.capacity() >= 16 ); - QCOMPARE( b.size(), 8 ); - - // resize, grow - a.resize(40); - if (!isPrimitive) - QCOMPARE( countMoved(a), isMovable ? 15 : 0 ); - QCOMPARE( MyBase::liveCount, isPrimitive ? 0 : 48 ); - QCOMPARE( MyBase::copyCount, isComplex ? 15 : 0 ); - - QVERIFY( a.capacity() >= a.size() ); - QCOMPARE( a.size(), 40 ); - - QVERIFY( b.capacity() >= 16 ); - QCOMPARE( b.size(), 8 ); - - // Copy constructor, allocate - { - Container c(a); - if (!isPrimitive) - QCOMPARE( countMoved(c), 0 ); - QCOMPARE( MyBase::liveCount, isPrimitive ? 0 : 88 ); - QCOMPARE( MyBase::copyCount, isComplex ? 55 : 0 ); - - QVERIFY( a.capacity() >= a.size() ); - QCOMPARE( a.size(), 40 ); - - QVERIFY( b.capacity() >= 16 ); - QCOMPARE( b.size(), 8 ); - - QVERIFY( c.capacity() >= 40 ); - QCOMPARE( c.size(), 40 ); - } - - // resize, shrink - a.resize(10); - if (!isPrimitive) - QCOMPARE( countMoved(a), isMovable ? 10 : 0 ); - QCOMPARE( MyBase::liveCount, isPrimitive ? 0 : 18 ); - QCOMPARE( MyBase::copyCount, isComplex ? 10 : 0 ); - - QVERIFY( a.capacity() >= a.size() ); - QCOMPARE( a.size(), 10 ); - - QVERIFY( b.capacity() >= 16 ); - QCOMPARE( b.size(), 8 ); - - // Copy constructor, don't allocate - { - Container c(a); - if (!isPrimitive) - QCOMPARE( countMoved(c), 0 ); - QCOMPARE( MyBase::liveCount, isPrimitive ? 0 : 28 ); - QCOMPARE( MyBase::copyCount, isComplex ? 20 : 0 ); - - QVERIFY( a.capacity() >= a.size() ); - QCOMPARE( a.size(), 10 ); - - QVERIFY( b.capacity() >= 16 ); - QCOMPARE( b.size(), 8 ); - - QVERIFY( c.capacity() >= 16 ); - QCOMPARE( c.size(), 10 ); - } - - a.clear(); - QCOMPARE( a.size(), 0 ); - - b_real.clear(); - QCOMPARE( b.size(), 0 ); - - QCOMPARE(MyBase::errorCount, 0); - QCOMPARE(MyBase::liveCount, 0); - - // All done - QTBUG10978_proceed = true; -} - -void tst_QVarLengthArray::QTBUG10978_realloc() -{ - QTBUG10978_test(); - QVERIFY(QTBUG10978_proceed); - - QTBUG10978_test(); - QVERIFY(QTBUG10978_proceed); - - QTBUG10978_test(); - QVERIFY(QTBUG10978_proceed); - - QTBUG10978_test(); - QVERIFY(QTBUG10978_proceed); -} - QTEST_APPLESS_MAIN(tst_QVarLengthArray) #include "tst_qvarlengtharray.moc"