aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorMax Horn2009-05-26 11:28:38 +0000
committerMax Horn2009-05-26 11:28:38 +0000
commit94dfc8f6386ebf0f4a13094e68eaec289a974347 (patch)
tree06c3e53c20f2c43cec51c9481a0e9227e79fc3e1 /test
parentae378632cd4c28bc9d598aa05b1fe4365f7f1023 (diff)
downloadscummvm-rg350-94dfc8f6386ebf0f4a13094e68eaec289a974347.tar.gz
scummvm-rg350-94dfc8f6386ebf0f4a13094e68eaec289a974347.tar.bz2
scummvm-rg350-94dfc8f6386ebf0f4a13094e68eaec289a974347.zip
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
Diffstat (limited to 'test')
-rw-r--r--test/common/array.h23
1 files changed, 23 insertions, 0 deletions
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<SafeInt> 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<int> array1;