diff options
author | Nicolas Catania <niko@google.com> | 2010-01-29 14:34:57 -0800 |
---|---|---|
committer | Nicolas Catania <niko@google.com> | 2010-01-29 16:58:25 -0800 |
commit | 2f8be091d59666a33e3fd11fca1ce71f0a90edbc (patch) | |
tree | f54841264c23a2ad1cb3174d32acb55e38eeaf10 /tests | |
parent | 743c6a2694bf16bf29d516c906363199a7bccf86 (diff) | |
download | astl-2f8be091d59666a33e3fd11fca1ce71f0a90edbc.tar.gz |
Added resize call to vector.
Fixed a bug in the memory uninitialized_fill to work with iterators.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test_vector.cpp | 104 |
1 files changed, 100 insertions, 4 deletions
diff --git a/tests/test_vector.cpp b/tests/test_vector.cpp index 304b114..88dd466 100644 --- a/tests/test_vector.cpp +++ b/tests/test_vector.cpp @@ -82,9 +82,39 @@ bool testConstructorString() } typedef enum { ONE = 10, TWO} TestEnum; - -template<typename T> struct A { }; -struct B { }; +// These class allocate chunks to detect memory leaks. +template<typename T> struct A { + public: + A() {mChunk = new T[2046];} + A(const A<T>& a) {mChunk = new T[2046];} + virtual ~A() {delete [] mChunk;} + T *mChunk; +}; + +struct B { + public: + B() {mChunk = new char[2046];} + B(const B& b) {mChunk = new char[2046];} + virtual ~B() {delete [] mChunk;} + char *mChunk; +}; + +bool testConstructorClass() +{ + { + vector<B> vec1; + EXPECT_TRUE(vec1.empty()); + EXPECT_TRUE(vec1.size() == 0); + EXPECT_TRUE(vec1.capacity() == 0); + } + { + vector<B> vec1(100); + EXPECT_TRUE(!vec1.empty()); + EXPECT_TRUE(vec1.size() == 100); + EXPECT_TRUE(vec1.capacity() == 100); + } + return true; +} bool testConstructorRepeat() { @@ -114,7 +144,7 @@ bool testConstructorRepeat() } { const vector< A<B> > vec4; - const vector< A<B> > vec5(10); + const vector< A<B> > vec5(10, A<B>()); EXPECT_TRUE(vec4.size() == 0); EXPECT_TRUE(vec5.size() == 10); @@ -316,6 +346,67 @@ bool testPopBack() } +bool testResize() +{ + { + vector<int> vec1(10, 0xdeadbeef); + vec1.resize(0); + EXPECT_TRUE(vec1.capacity() == 10); + vec1.resize(5); + EXPECT_TRUE(vec1.capacity() == 10); + vec1.resize(10); + EXPECT_TRUE(vec1.capacity() == 10); + vec1.resize(11); + EXPECT_TRUE(vec1.capacity() == 11); + vec1.resize(100); + EXPECT_TRUE(vec1.capacity() == 100); + vec1.resize(10); + EXPECT_TRUE(vec1.capacity() == 100); + } + { + vector<B> vec1(10); + vec1.resize(0); + EXPECT_TRUE(vec1.capacity() == 10); + vec1.resize(5); + EXPECT_TRUE(vec1.capacity() == 10); + vec1.resize(10); + EXPECT_TRUE(vec1.capacity() == 10); + vec1.resize(11); + EXPECT_TRUE(vec1.capacity() == 11); + vec1.resize(100); + EXPECT_TRUE(vec1.capacity() == 100); + vec1.resize(10); + EXPECT_TRUE(vec1.capacity() == 100); + } + { + vector<CtorDtorCounter> vec; + CtorDtorCounter::reset(); + vec.resize(10); + EXPECT_TRUE(CtorDtorCounter::mCtorCount == 1); // default arg. + EXPECT_TRUE(CtorDtorCounter::mCopyCtorCount == 10); // copied 10 times. + + CtorDtorCounter::reset(); + vec.resize(200); + EXPECT_TRUE(CtorDtorCounter::mCtorCount == 1); // default arg. + EXPECT_TRUE(CtorDtorCounter::mCopyCtorCount == 200); + + CtorDtorCounter::reset(); + vec.resize(199); + // the copy constructor should have been called once and the + // destructor twice (1 temp + 1 elt). + EXPECT_TRUE(CtorDtorCounter::mCtorCount == 1); // default arg. + EXPECT_TRUE(CtorDtorCounter::mDtorCount == 2); + + CtorDtorCounter::reset(); + vec.resize(0); + // the copy constructor should have been called once and the + // destructor twice (1 temp + 199 elts). + EXPECT_TRUE(CtorDtorCounter::mCtorCount == 1); // default arg. + EXPECT_TRUE(CtorDtorCounter::mDtorCount == 200); + } + return true; +} + bool testSwap() { vector<int> vec1(100, 10); @@ -427,13 +518,18 @@ int main(int argc, char **argv) { FAIL_UNLESS(testConstructorInt); FAIL_UNLESS(testConstructorString); + FAIL_UNLESS(testConstructorClass); + FAIL_UNLESS(testConstructorRepeat); FAIL_UNLESS(testConstructorIterator); FAIL_UNLESS(testReserve); FAIL_UNLESS(testPushBack); FAIL_UNLESS(testPopBack); + FAIL_UNLESS(testResize); +#if(0) FAIL_UNLESS(testSwap); FAIL_UNLESS(testIterators); FAIL_UNLESS(testCtorDtorForNonPod); +#endif return kPassed; } |