From 94dfc8f6386ebf0f4a13094e68eaec289a974347 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 26 May 2009 11:28:38 +0000 Subject: Fixed a bug in Common::Array (including a unit test for it), and changed the way the internal storage growth over time. The bug could result in incorrect results when using push_back (or insert_at) to insert data from an array into itself if this insertions would cause the internal array storage to grow. Also added a unit test for this bug. Furthermore, if the internal storage needs to grow, it will now be resized to the next power of two, instead of being increased by 32. svn-id: r40907 --- test/common/array.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'test') diff --git a/test/common/array.h b/test/common/array.h index cb793004a4..bce4e8cba1 100644 --- a/test/common/array.h +++ b/test/common/array.h @@ -124,6 +124,29 @@ class ArrayTestSuite : public CxxTest::TestSuite TS_ASSERT_EQUALS(array2.size(), (unsigned int)3); } + struct SafeInt { + int val; + SafeInt() : val(0) {} + SafeInt(int v) : val(v) {} + ~SafeInt() { val = -1; } + bool operator==(int v) { + return val == v; + } + }; + + void test_push_back_ex() { + // This test makes sure that inserting an element invalidates + // references/iterators/pointers to elements in the array itself + // only *after* their value has been copied. + Common::Array array; + + array.push_back(42); + for (int i = 0; i < 40; ++i) { + array.push_back(array[0]); + TS_ASSERT_EQUALS(array[i], 42); + } + } + void test_copy_constructor() { Common::Array array1; -- cgit v1.2.3