Skip to content

Commit 2b855d8

Browse files
committed
Add more Array tests
Added more tests for Array, focusing on methods exposed to gdscript that didn't have tests.
1 parent cb850f7 commit 2b855d8

File tree

3 files changed

+160
-9
lines changed

3 files changed

+160
-9
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
func test():
2+
var array := [1, 2, 3]
3+
array.set(4, 4)
4+
var _value = array.get(4)
5+
_value = array[4]
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
GDTEST_RUNTIME_ERROR
2+
>> ERROR: Index p_index = 4 is out of bounds (p_instance->size() = 3).
3+
>> ERROR: Index p_index = 4 is out of bounds (p_instance->size() = 3).
4+
>> SCRIPT ERROR at runtime/errors/array_bad_index.gd:5 on test(): Out of bounds get index '4' (on base: 'Array')

tests/core/variant/test_array.h

Lines changed: 151 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,36 @@ TEST_CASE("[Array] size(), clear(), and is_empty()") {
6666
CHECK(arr.size() == 0);
6767
}
6868

69+
TEST_CASE("[Array] fill()") {
70+
Array arr;
71+
arr.resize(5);
72+
arr.fill(7);
73+
Array expected = { 7, 7, 7, 7, 7 };
74+
CHECK_EQ(arr, expected);
75+
76+
Array empty;
77+
empty.fill(7);
78+
Array empty_expected;
79+
CHECK_EQ(empty, empty_expected);
80+
}
81+
82+
TEST_CASE("[Array] reverse()") {
83+
Array odd_sized = { 1, 2, 3 };
84+
odd_sized.reverse();
85+
Array odd_sized_expected = { 3, 2, 1 };
86+
CHECK_EQ(odd_sized, odd_sized_expected);
87+
88+
Array even_sized = { "a", "b", "c", "d" };
89+
even_sized.reverse();
90+
Array even_sized_expected = { "d", "c", "b", "a" };
91+
CHECK_EQ(even_sized, even_sized_expected);
92+
93+
Array empty;
94+
empty.reverse();
95+
Array empty_expected;
96+
CHECK_EQ(empty, empty_expected);
97+
}
98+
6999
TEST_CASE("[Array] Assignment and comparison operators") {
70100
Array arr1;
71101
Array arr2;
@@ -83,6 +113,16 @@ TEST_CASE("[Array] Assignment and comparison operators") {
83113
CHECK(arr3 == arr2);
84114
}
85115

116+
TEST_CASE("[Array] append()") {
117+
Array arr;
118+
arr.append(1);
119+
arr.append(2);
120+
arr.append(3);
121+
arr.append("test");
122+
Array expected = { 1, 2, 3, "test" };
123+
CHECK_EQ(arr, expected);
124+
}
125+
86126
TEST_CASE("[Array] append_array()") {
87127
Array arr1;
88128
Array arr2;
@@ -160,19 +200,85 @@ TEST_CASE("[Array] remove_at()") {
160200
CHECK(arr.size() == 0);
161201
}
162202

163-
TEST_CASE("[Array] get()") {
164-
Array arr = { 1 };
165-
CHECK(int(arr.get(0)) == 1);
203+
TEST_CASE("[Array] get() and set()") {
204+
Array arr = { 1, 2, 3 };
205+
CHECK_EQ(int(arr.get(0)), 1);
206+
CHECK_EQ(int(arr.get(1)), 2);
207+
CHECK_EQ(int(arr.get(2)), 3);
208+
209+
arr.set(1, 5);
210+
CHECK_EQ(int(arr.get(1)), 5);
166211
}
167212

168-
TEST_CASE("[Array] sort()") {
213+
TEST_CASE("[Array] sort() and bsearch()") {
169214
Array arr = { 3, 4, 2, 1 };
170215
arr.sort();
171-
int val = 1;
172-
for (int i = 0; i < arr.size(); i++) {
173-
CHECK(int(arr[i]) == val);
174-
val++;
175-
}
216+
Array expected = { 1, 2, 3, 4 };
217+
CHECK_EQ(arr, expected);
218+
219+
CHECK_EQ(arr.bsearch(1), 0);
220+
CHECK_EQ(arr.bsearch(3), 2);
221+
CHECK_EQ(arr.bsearch(-100), 0);
222+
CHECK_EQ(arr.bsearch(100), 4);
223+
}
224+
225+
static bool _order_descending(int p_a, int p_b) {
226+
return p_b < p_a;
227+
}
228+
229+
TEST_CASE("[Array] sort_custom() and bsearch_custom()") {
230+
Array arr = { 3, 4, 2, 1 };
231+
arr.sort_custom(callable_mp_static(_order_descending));
232+
Array expected = { 4, 3, 2, 1 };
233+
CHECK_EQ(arr, expected);
234+
235+
CHECK_EQ(arr.bsearch_custom(1, callable_mp_static(_order_descending)), 3);
236+
CHECK_EQ(arr.bsearch_custom(4, callable_mp_static(_order_descending)), 0);
237+
CHECK_EQ(arr.bsearch_custom(100, callable_mp_static(_order_descending)), 0);
238+
CHECK_EQ(arr.bsearch_custom(-100, callable_mp_static(_order_descending)), 4);
239+
}
240+
241+
static bool _is_even(int p_num) {
242+
return p_num % 2 == 0;
243+
}
244+
245+
static bool _is_odd(int p_num) {
246+
return p_num % 2 == 1;
247+
}
248+
249+
TEST_CASE("[Array] filter(), any(), all()") {
250+
Array nums = { 1, 2, 3, 4, 5, 6, 7 };
251+
CHECK(nums.any(callable_mp_static(_is_odd)));
252+
CHECK(nums.any(callable_mp_static(_is_even)));
253+
CHECK(!nums.all(callable_mp_static(_is_odd)));
254+
CHECK(!nums.all(callable_mp_static(_is_even)));
255+
256+
Array odd = nums.filter(callable_mp_static(_is_odd));
257+
Array odd_expected = { 1, 3, 5, 7 };
258+
CHECK_EQ(odd, odd_expected);
259+
260+
Array even = nums.filter(callable_mp_static(_is_even));
261+
Array even_expected = { 2, 4, 6 };
262+
CHECK_EQ(even, even_expected);
263+
264+
CHECK(odd.all(callable_mp_static(_is_odd)));
265+
CHECK(odd.any(callable_mp_static(_is_odd)));
266+
CHECK(!odd.all(callable_mp_static(_is_even)));
267+
CHECK(!odd.any(callable_mp_static(_is_even)));
268+
}
269+
270+
static int _add(int p_a, int p_b) {
271+
return p_a + p_b;
272+
}
273+
274+
TEST_CASE("[Array] map() and reduce()") {
275+
Array array = { 1, 2, 3, 4, 5 };
276+
Array mapped = array.map(callable_mp_static(_add).bind(5));
277+
Array mapped_expected = { 6, 7, 8, 9, 10 };
278+
CHECK_EQ(mapped, mapped_expected);
279+
280+
Variant sum = 0;
281+
CHECK_EQ(int(array.reduce(callable_mp_static(_add), sum)), 15);
176282
}
177283

178284
TEST_CASE("[Array] push_front(), pop_front(), pop_back()") {
@@ -626,6 +732,17 @@ TEST_CASE("[Array] Typed copying") {
626732
a6.clear();
627733
}
628734

735+
TEST_CASE("[Array] find() and rfind()") {
736+
Array array = { "a", "b", "c", "a", "b", "c" };
737+
738+
CHECK_EQ(array.find("a"), 0);
739+
CHECK_EQ(array.find("c"), 2);
740+
CHECK_EQ(array.find("a", 1), 3);
741+
742+
CHECK_EQ(array.rfind("b"), 4);
743+
CHECK_EQ(array.rfind("c", -2), 2);
744+
}
745+
629746
static bool _find_custom_callable(const Variant &p_val) {
630747
return (int)p_val % 2 == 0;
631748
}
@@ -644,4 +761,29 @@ TEST_CASE("[Array] Test rfind_custom") {
644761
CHECK_EQ(index, 4);
645762
}
646763

764+
TEST_CASE("[Array] Test typed arrays") {
765+
Array arr1;
766+
CHECK_FALSE(arr1.is_typed());
767+
768+
arr1.set_typed(Variant::FLOAT, StringName(), Variant());
769+
CHECK(arr1.is_typed());
770+
CHECK_EQ(arr1.get_typed_builtin(), Variant::FLOAT);
771+
772+
arr1.push_back(1);
773+
CHECK_EQ(arr1.size(), 1);
774+
775+
ERR_PRINT_OFF;
776+
arr1.push_back("test wrong type");
777+
CHECK_EQ(arr1.size(), 1);
778+
ERR_PRINT_ON;
779+
780+
Array arr2;
781+
arr2.set_typed(Variant::INT, StringName(), Variant());
782+
CHECK_FALSE(arr1.is_same_typed(arr2));
783+
784+
Array arr3;
785+
arr3.set_typed(Variant::OBJECT, "Node", Variant());
786+
CHECK_EQ(arr3.get_typed_class_name(), "Node");
787+
}
788+
647789
} // namespace TestArray

0 commit comments

Comments
 (0)