Anton Tarasenko
2 years ago
2 changed files with 320 additions and 1 deletions
@ -0,0 +1,319 @@
|
||||
/** |
||||
* Set of tests for `ArrayList` class. |
||||
* Copyright 2022 Anton Tarasenko |
||||
*------------------------------------------------------------------------------ |
||||
* This file is part of Acedia. |
||||
* |
||||
* Acedia is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, version 3 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* Acedia is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with Acedia. If not, see <https://www.gnu.org/licenses/>. |
||||
*/ |
||||
class TEST_ArrayList extends TestCase |
||||
abstract; |
||||
|
||||
protected static function TESTS() |
||||
{ |
||||
Test_GetSet(); |
||||
Test_CreateItem(); |
||||
Test_Length(); |
||||
Test_Empty(); |
||||
Test_AddInsert(); |
||||
Test_Remove(); |
||||
Test_Find(); |
||||
Test_ReferenceManagementGet(); |
||||
Test_Take(); |
||||
} |
||||
|
||||
protected static function Test_GetSet() |
||||
{ |
||||
local ArrayList array; |
||||
|
||||
array = ArrayList(__().memory.Allocate(class'ArrayList')); |
||||
Context("Testing getters and setters for items of `ArrayList`."); |
||||
Issue("Setters do not correctly expand `ArrayList`."); |
||||
array.SetItem(0, __().box.int(-9)).SetItem(2, __().text.FromString("text")); |
||||
TEST_ExpectTrue(array.GetLength() == 3); |
||||
TEST_ExpectTrue(IntBox(array.GetItem(0)).Get() == -9); |
||||
TEST_ExpectNone(array.GetItem(1)); |
||||
TEST_ExpectTrue(Text(array.GetItem(2)).ToString() == "text"); |
||||
|
||||
Issue("Setters do not correctly overwrite items of `ArrayList`."); |
||||
array.SetItem(1, __().box.float(34.76)); |
||||
array.SetItem(2, none); |
||||
TEST_ExpectTrue(array.GetLength() == 3); |
||||
TEST_ExpectTrue(IntBox(array.GetItem(0)).Get() == -9); |
||||
TEST_ExpectTrue(FloatBox(array.GetItem(1)).Get() == 34.76); |
||||
TEST_ExpectNone(array.GetItem(2)); |
||||
} |
||||
|
||||
protected static function Test_CreateItem() |
||||
{ |
||||
local ArrayList array; |
||||
|
||||
array = ArrayList(__().memory.Allocate(class'ArrayList')); |
||||
Context("Testing creating brand new items for `ArrayList`."); |
||||
Issue("`CreateItem()` incorrectly adds new values to the" |
||||
@ "`ArrayList`."); |
||||
array.CreateItem(1, class'Text'); |
||||
array.CreateItem(3, class'IntRef'); |
||||
array.CreateItem(4, class'BoolBox'); |
||||
TEST_ExpectNone(array.GetItem(0)); |
||||
TEST_ExpectNone(array.GetItem(2)); |
||||
TEST_ExpectTrue(Text(array.GetItem(1)).ToString() == ""); |
||||
TEST_ExpectTrue(IntRef(array.GetItem(3)).Get() == 0); |
||||
TEST_ExpectFalse(BoolBox(array.GetItem(4)).Get()); |
||||
|
||||
Issue("`CreateItem()` incorrectly overrides existing values in the" |
||||
@ "`ArrayList`."); |
||||
array.SetItem(5, __().ref.int(7)); |
||||
array.CreateItem(5, class'StringRef'); |
||||
TEST_ExpectTrue(StringRef(array.GetItem(5)).Get() == ""); |
||||
|
||||
class'MockItem'.default.objectCount = 0; |
||||
Issue("`CreateItem()` creates new object even if it cannot be recorded at" |
||||
@ "a given index."); |
||||
array.CreateItem(-1, class'MockItem'); |
||||
TEST_ExpectTrue(class'MockItem'.default.objectCount == 0); |
||||
} |
||||
|
||||
protected static function Test_Length() |
||||
{ |
||||
local ArrayList array; |
||||
|
||||
array = ArrayList(__().memory.Allocate(class'ArrayList')); |
||||
Context("Testing length getter and setter for `ArrayList`."); |
||||
Issue("Length of just created `ArrayList` is not zero."); |
||||
TEST_ExpectTrue(array.GetLength() == 0); |
||||
|
||||
Issue("`SetLength()` incorrectly changes length of the `ArrayList`."); |
||||
array.SetLength(200).SetItem(198, __().box.int(25)); |
||||
TEST_ExpectTrue(array.GetLength() == 200); |
||||
TEST_ExpectTrue(IntBox(array.GetItem(198)).Get() == 25); |
||||
array.SetLength(0); |
||||
TEST_ExpectTrue(array.GetLength() == 0); |
||||
|
||||
Issue("Shrinking size of `ArrayList` does not remove recorded items."); |
||||
array.SetLength(1000); |
||||
TEST_ExpectNone(array.GetItem(198)); |
||||
} |
||||
|
||||
protected static function Test_Empty() |
||||
{ |
||||
local ArrayList array; |
||||
|
||||
array = ArrayList(__().memory.Allocate(class'ArrayList')); |
||||
Context("Testing emptying `ArrayList`."); |
||||
array.AddItem(__().box.int(1)).AddItem(__().box.int(3)) |
||||
.AddItem(__().box.int(1)).AddItem(__().box.int(3)); |
||||
Issue("`Empty()` does not produce an empty array."); |
||||
array.Empty(); |
||||
TEST_ExpectTrue(array.GetLength() == 0); |
||||
} |
||||
|
||||
protected static function Test_AddInsert() |
||||
{ |
||||
local ArrayList array; |
||||
|
||||
array = ArrayList(__().memory.Allocate(class'ArrayList')); |
||||
Context("Testing adding new items to `ArrayList`."); |
||||
Issue("`Add()`/`AddItem()` incorrectly add new items to" |
||||
@ "the `ArrayList`."); |
||||
array.AddItem(__().box.int(3)).Add(3).AddItem(__().box.byte(7)).Add(1); |
||||
TEST_ExpectTrue(array.GetLength() == 6); |
||||
TEST_ExpectNotNone(IntBox(array.GetItem(0))); |
||||
TEST_ExpectTrue(IntBox(array.GetItem(0)).Get() == 3); |
||||
TEST_ExpectNone(array.GetItem(1)); |
||||
TEST_ExpectNone(array.GetItem(2)); |
||||
TEST_ExpectNone(array.GetItem(3)); |
||||
TEST_ExpectNotNone(ByteBox(array.GetItem(4))); |
||||
TEST_ExpectTrue(ByteBox(array.GetItem(4)).Get() == 7); |
||||
TEST_ExpectNone(array.GetItem(5)); |
||||
|
||||
Issue("`Insert()`/`InsertItem()` incorrectly add new items to" |
||||
@ "the `ArrayList`."); |
||||
array.Insert(2, 2).InsertItem(0, __().ref.bool(true)); |
||||
TEST_ExpectTrue(array.GetLength() == 9); |
||||
TEST_ExpectNotNone(BoolRef(array.GetItem(0))); |
||||
TEST_ExpectTrue(BoolRef(array.GetItem(0)).Get()); |
||||
TEST_ExpectNotNone(IntBox(array.GetItem(1))); |
||||
TEST_ExpectTrue(IntBox(array.GetItem(1)).Get() == 3); |
||||
TEST_ExpectNone(array.GetItem(2)); |
||||
TEST_ExpectNone(array.GetItem(6)); |
||||
TEST_ExpectNotNone(ByteBox(array.GetItem(7))); |
||||
TEST_ExpectTrue(ByteBox(array.GetItem(7)).Get() == 7); |
||||
TEST_ExpectNone(array.GetItem(8)); |
||||
} |
||||
|
||||
protected static function Test_Remove() |
||||
{ |
||||
local ArrayList array; |
||||
|
||||
array = ArrayList(__().memory.Allocate(class'ArrayList')); |
||||
Context("Testing removing items from `ArrayList`."); |
||||
array.AddItem(__().box.int(1)).AddItem(__().box.int(3)) |
||||
.AddItem(__().box.int(1)).AddItem(__().box.int(3)) |
||||
.AddItem(__().box.int(5)).AddItem(__().box.int(2)) |
||||
.AddItem(__().box.int(4)).AddItem(__().box.int(7)) |
||||
.AddItem(__().box.int(5)).AddItem(__().box.int(1)) |
||||
.AddItem(__().box.int(5)).AddItem(__().box.int(0)); |
||||
Issue("`Remove()` incorrectly removes items from array."); |
||||
array.Remove(3, 2).Remove(0, 2).Remove(7, 9); |
||||
TEST_ExpectTrue(array.GetLength() == 7); |
||||
TEST_ExpectTrue(IntBox(array.GetItem(0)).Get() == 1); |
||||
TEST_ExpectTrue(IntBox(array.GetItem(1)).Get() == 2); |
||||
TEST_ExpectTrue(IntBox(array.GetItem(2)).Get() == 4); |
||||
TEST_ExpectTrue(IntBox(array.GetItem(3)).Get() == 7); |
||||
TEST_ExpectTrue(IntBox(array.GetItem(4)).Get() == 5); |
||||
TEST_ExpectTrue(IntBox(array.GetItem(5)).Get() == 1); |
||||
TEST_ExpectTrue(IntBox(array.GetItem(6)).Get() == 5); |
||||
|
||||
Issue("`RemoveItem()` incorrectly removes items from array."); |
||||
array.RemoveItem(__().box.int(1)).RemoveItem(__().box.int(5), true); |
||||
TEST_ExpectTrue(array.GetLength() == 4); |
||||
TEST_ExpectTrue(IntBox(array.GetItem(0)).Get() == 2); |
||||
TEST_ExpectTrue(IntBox(array.GetItem(1)).Get() == 4); |
||||
TEST_ExpectTrue(IntBox(array.GetItem(2)).Get() == 7); |
||||
TEST_ExpectTrue(IntBox(array.GetItem(3)).Get() == 5); |
||||
|
||||
Issue("`RemoveIndex()` incorrectly removes items from array."); |
||||
array.RemoveIndex(0).RemoveIndex(1).RemoveIndex(1); |
||||
TEST_ExpectTrue(array.GetLength() == 1); |
||||
TEST_ExpectTrue(IntBox(array.GetItem(0)).Get() == 4); |
||||
} |
||||
|
||||
protected static function Test_Find() |
||||
{ |
||||
local ArrayList array; |
||||
|
||||
array = ArrayList(__().memory.Allocate(class'ArrayList')); |
||||
Context("Testing searching for items in `ArrayList`."); |
||||
array.AddItem(__().box.int(1)).AddItem(__().box.int(3)) |
||||
.AddItem(__().box.int(1)).AddItem(__().box.int(3)) |
||||
.AddItem(__().box.int(5)).AddItem(__().box.bool(true)) |
||||
.AddItem(none).AddItem(__().box.float(72.54)) |
||||
.AddItem(__().box.int(5)).AddItem(__().box.int(1)) |
||||
.AddItem(__().box.int(5)).AddItem(__().box.int(0)); |
||||
Issue("`Find()` does not properly find indices of existing items."); |
||||
TEST_ExpectTrue(array.Find(__().box.int(5)) == 4); |
||||
TEST_ExpectTrue(array.Find(__().box.int(1)) == 0); |
||||
TEST_ExpectTrue(array.Find(__().box.int(0)) == 11); |
||||
TEST_ExpectTrue(array.Find(__().box.float(72.54)) == 7); |
||||
TEST_ExpectTrue(array.Find(__().box.bool(true)) == 5); |
||||
TEST_ExpectTrue(array.Find(none) == 6); |
||||
|
||||
Issue("`Find()` does not return `-1` on missing values."); |
||||
TEST_ExpectTrue(array.Find(__().box.int(42)) == -1); |
||||
TEST_ExpectTrue(array.Find(__().box.float(72.543)) == -1); |
||||
TEST_ExpectTrue(array.Find(__().box.bool(false)) == -1); |
||||
TEST_ExpectTrue(array.Find(__().box.byte(128)) == -1); |
||||
} |
||||
|
||||
protected static function MockItem NewMockItem() |
||||
{ |
||||
return MockItem(__().memory.Allocate(class'MockItem')); |
||||
} |
||||
|
||||
protected static function ArrayList NewMockArray( |
||||
int arrayLength, |
||||
out array<MockItem> allocatedItems) |
||||
{ |
||||
local int i; |
||||
local ArrayList array; |
||||
|
||||
class'MockItem'.default.objectCount = 0; |
||||
array = ArrayList(__().memory.Allocate(class'ArrayList')); |
||||
for (i = 0; i < arrayLength; i += 1) |
||||
{ |
||||
allocatedItems[allocatedItems.length] = NewMockItem(); |
||||
array.AddItem(allocatedItems[allocatedItems.length - 1]); |
||||
} |
||||
// Get rid of references outside of array |
||||
__().memory.FreeMany(allocatedItems); |
||||
return array; |
||||
} |
||||
|
||||
protected static function Test_ReferenceManagementGet() |
||||
{ |
||||
local int i; |
||||
local ArrayList array; |
||||
local array<MockItem> allocatedItems; |
||||
|
||||
array = NewMockArray(20, allocatedItems); |
||||
Context("Testing how well `ArrayList` supports reference counting."); |
||||
Issue("`ArrayList` incorrectly increments reference count when storing" @ |
||||
"an item."); |
||||
for (i = 0; i < allocatedItems.length; i += 1) |
||||
{ |
||||
TEST_ExpectTrue(allocatedItems[i]._getRefCount() == 1); |
||||
if (i % 3 == 0) { |
||||
allocatedItems[i].FreeSelf(); |
||||
} |
||||
} |
||||
|
||||
for (i = 0; i < allocatedItems.length; i += 1) |
||||
{ |
||||
if (i % 3 == 0) |
||||
{ |
||||
Issue("`ArrayList` does unnecessary handling of deallocated" |
||||
@ "items."); |
||||
TEST_ExpectNotNone(array.GetItem(i)); |
||||
TEST_ExpectFalse(array.GetItem(i).IsAllocated()); |
||||
} |
||||
else if (i % 3 == 1) |
||||
{ |
||||
Issue("`ArrayList` does not increment reference count on" |
||||
@ "`GetItem()`"); |
||||
TEST_ExpectTrue(array.GetItem(i)._getRefCount() == 2); |
||||
} |
||||
else |
||||
{ |
||||
Issue("`ArrayList` increments reference count on `TakeItem()`"); |
||||
TEST_ExpectTrue(array.TakeItem(i)._getRefCount() == 1); |
||||
} |
||||
} |
||||
} |
||||
|
||||
protected static function Test_Take() |
||||
{ |
||||
local int i; |
||||
local ArrayList array; |
||||
local array<MockItem> allocatedItems; |
||||
|
||||
array = NewMockArray(20, allocatedItems); |
||||
Context("Testing how well `ArrayList`'s `TakeItem()` command"); |
||||
Issue("`TakeItem()` return wrongs item."); |
||||
for (i = 0; i < allocatedItems.length; i += 1) |
||||
{ |
||||
if (i % 2 == 0) { |
||||
TEST_ExpectTrue(array.TakeItem(i) == allocatedItems[i]); |
||||
} |
||||
} |
||||
for (i = 0; i < allocatedItems.length; i += 1) |
||||
{ |
||||
if (i % 2 == 0) |
||||
{ |
||||
Issue("`TakeItem()` does not remove items from collection."); |
||||
TEST_ExpectNone(array.TakeItem(i)); |
||||
} |
||||
else |
||||
{ |
||||
Issue("`TakeItem()` affects other items in collection."); |
||||
TEST_ExpectTrue(array.TakeItem(i).IsAllocated()); |
||||
} |
||||
} |
||||
} |
||||
|
||||
defaultproperties |
||||
{ |
||||
caseGroup = "Collections" |
||||
caseName = "ArrayList" |
||||
} |
Loading…
Reference in new issue