Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/tests/core/variant/test_array.cpp
23450 views
1
/**************************************************************************/
2
/* test_array.cpp */
3
/**************************************************************************/
4
/* This file is part of: */
5
/* GODOT ENGINE */
6
/* https://godotengine.org */
7
/**************************************************************************/
8
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
9
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
10
/* */
11
/* Permission is hereby granted, free of charge, to any person obtaining */
12
/* a copy of this software and associated documentation files (the */
13
/* "Software"), to deal in the Software without restriction, including */
14
/* without limitation the rights to use, copy, modify, merge, publish, */
15
/* distribute, sublicense, and/or sell copies of the Software, and to */
16
/* permit persons to whom the Software is furnished to do so, subject to */
17
/* the following conditions: */
18
/* */
19
/* The above copyright notice and this permission notice shall be */
20
/* included in all copies or substantial portions of the Software. */
21
/* */
22
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
23
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
24
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
25
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
26
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
27
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
28
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
29
/**************************************************************************/
30
31
#include "tests/test_macros.h"
32
33
TEST_FORCE_LINK(test_array)
34
35
#include "core/object/callable_method_pointer.h"
36
#include "core/variant/array.h"
37
#include "core/variant/typed_array.h"
38
#include "tests/test_tools.h"
39
40
namespace TestArray {
41
42
TEST_CASE("[Array] initializer list") {
43
Array arr = { 0, 1, "test", true, { 0.0, 1.0 } };
44
CHECK(arr.size() == 5);
45
CHECK(arr[0] == Variant(0));
46
CHECK(arr[1] == Variant(1));
47
CHECK(arr[2] == Variant("test"));
48
CHECK(arr[3] == Variant(true));
49
CHECK(arr[4] == Variant({ 0.0, 1.0 }));
50
51
arr = { "reassign" };
52
CHECK(arr.size() == 1);
53
CHECK(arr[0] == Variant("reassign"));
54
55
TypedArray<int> typed_arr = { 0, 1, 2 };
56
CHECK(typed_arr.size() == 3);
57
CHECK(typed_arr[0] == Variant(0));
58
CHECK(typed_arr[1] == Variant(1));
59
CHECK(typed_arr[2] == Variant(2));
60
}
61
62
TEST_CASE("[Array] size(), clear(), and is_empty()") {
63
Array arr;
64
CHECK(arr.size() == 0);
65
CHECK(arr.is_empty());
66
arr.push_back(1);
67
CHECK(arr.size() == 1);
68
arr.clear();
69
CHECK(arr.is_empty());
70
CHECK(arr.size() == 0);
71
}
72
73
TEST_CASE("[Array] fill()") {
74
Array arr;
75
arr.resize(5);
76
arr.fill(7);
77
Array expected = { 7, 7, 7, 7, 7 };
78
CHECK_EQ(arr, expected);
79
80
Array empty;
81
empty.fill(7);
82
Array empty_expected;
83
CHECK_EQ(empty, empty_expected);
84
}
85
86
TEST_CASE("[Array] reverse()") {
87
Array odd_sized = { 1, 2, 3 };
88
odd_sized.reverse();
89
Array odd_sized_expected = { 3, 2, 1 };
90
CHECK_EQ(odd_sized, odd_sized_expected);
91
92
Array even_sized = { "a", "b", "c", "d" };
93
even_sized.reverse();
94
Array even_sized_expected = { "d", "c", "b", "a" };
95
CHECK_EQ(even_sized, even_sized_expected);
96
97
Array empty;
98
empty.reverse();
99
Array empty_expected;
100
CHECK_EQ(empty, empty_expected);
101
}
102
103
TEST_CASE("[Array] Assignment and comparison operators") {
104
Array arr1;
105
Array arr2;
106
arr1.push_back(1);
107
CHECK(arr1 != arr2);
108
CHECK(arr1 > arr2);
109
CHECK(arr1 >= arr2);
110
arr2.push_back(2);
111
CHECK(arr1 != arr2);
112
CHECK(arr1 < arr2);
113
CHECK(arr1 <= arr2);
114
CHECK(arr2 > arr1);
115
CHECK(arr2 >= arr1);
116
Array arr3 = arr2;
117
CHECK(arr3 == arr2);
118
}
119
120
TEST_CASE("[Array] append()") {
121
Array arr;
122
arr.append(1);
123
arr.append(2);
124
arr.append(3);
125
arr.append("test");
126
Array expected = { 1, 2, 3, "test" };
127
CHECK_EQ(arr, expected);
128
}
129
130
TEST_CASE("[Array] append_array()") {
131
Array arr1;
132
Array arr2;
133
arr1.push_back(1);
134
arr1.append_array(arr2);
135
CHECK(arr1.size() == 1);
136
arr2.push_back(2);
137
arr1.append_array(arr2);
138
CHECK(arr1.size() == 2);
139
CHECK(int(arr1[0]) == 1);
140
CHECK(int(arr1[1]) == 2);
141
}
142
143
TEST_CASE("[Array] resize(), insert(), and erase()") {
144
Array arr;
145
arr.resize(2);
146
CHECK(arr.size() == 2);
147
arr.insert(0, 1);
148
CHECK(int(arr[0]) == 1);
149
arr.insert(0, 2);
150
CHECK(int(arr[0]) == 2);
151
arr.erase(2);
152
CHECK(int(arr[0]) == 1);
153
arr.resize(0);
154
CHECK(arr.size() == 0);
155
arr.insert(0, 8);
156
CHECK(arr.size() == 1);
157
arr.insert(1, 16);
158
CHECK(int(arr[1]) == 16);
159
arr.insert(-1, 3);
160
CHECK(int(arr[1]) == 3);
161
}
162
163
TEST_CASE("[Array] front() and back()") {
164
Array arr;
165
arr.push_back(1);
166
CHECK(int(arr.front()) == 1);
167
CHECK(int(arr.back()) == 1);
168
arr.push_back(3);
169
CHECK(int(arr.front()) == 1);
170
CHECK(int(arr.back()) == 3);
171
}
172
173
TEST_CASE("[Array] has() and count()") {
174
Array arr = { 1, 1 };
175
CHECK(arr.has(1));
176
CHECK(!arr.has(2));
177
CHECK(arr.count(1) == 2);
178
CHECK(arr.count(2) == 0);
179
}
180
181
TEST_CASE("[Array] remove_at()") {
182
Array arr = { 1, 2 };
183
arr.remove_at(0);
184
CHECK(arr.size() == 1);
185
CHECK(int(arr[0]) == 2);
186
arr.remove_at(0);
187
CHECK(arr.size() == 0);
188
189
// Negative index.
190
arr.push_back(3);
191
arr.push_back(4);
192
arr.remove_at(-1);
193
CHECK(arr.size() == 1);
194
CHECK(int(arr[0]) == 3);
195
arr.remove_at(-1);
196
CHECK(arr.size() == 0);
197
198
// The array is now empty; try to use `remove_at()` again.
199
// Normally, this prints an error message so we silence it.
200
ERR_PRINT_OFF;
201
arr.remove_at(0);
202
ERR_PRINT_ON;
203
204
CHECK(arr.size() == 0);
205
}
206
207
TEST_CASE("[Array] get() and set()") {
208
Array arr = { 1, 2, 3 };
209
CHECK_EQ(int(arr.get(0)), 1);
210
CHECK_EQ(int(arr.get(1)), 2);
211
CHECK_EQ(int(arr.get(2)), 3);
212
213
arr.set(1, 5);
214
CHECK_EQ(int(arr.get(1)), 5);
215
}
216
217
TEST_CASE("[Array] sort() and bsearch()") {
218
Array arr = { 3, 4, 2, 1 };
219
arr.sort();
220
Array expected = { 1, 2, 3, 4 };
221
CHECK_EQ(arr, expected);
222
223
CHECK_EQ(arr.bsearch(1), 0);
224
CHECK_EQ(arr.bsearch(3), 2);
225
CHECK_EQ(arr.bsearch(-100), 0);
226
CHECK_EQ(arr.bsearch(100), 4);
227
}
228
229
static bool _order_descending(int p_a, int p_b) {
230
return p_b < p_a;
231
}
232
233
TEST_CASE("[Array] sort_custom() and bsearch_custom()") {
234
Array arr = { 3, 4, 2, 1 };
235
arr.sort_custom(callable_mp_static(_order_descending));
236
Array expected = { 4, 3, 2, 1 };
237
CHECK_EQ(arr, expected);
238
239
CHECK_EQ(arr.bsearch_custom(1, callable_mp_static(_order_descending)), 3);
240
CHECK_EQ(arr.bsearch_custom(4, callable_mp_static(_order_descending)), 0);
241
CHECK_EQ(arr.bsearch_custom(100, callable_mp_static(_order_descending)), 0);
242
CHECK_EQ(arr.bsearch_custom(-100, callable_mp_static(_order_descending)), 4);
243
}
244
245
static bool _is_even(int p_num) {
246
return p_num % 2 == 0;
247
}
248
249
static bool _is_odd(int p_num) {
250
return p_num % 2 == 1;
251
}
252
253
TEST_CASE("[Array] filter(), any(), all()") {
254
Array nums = { 1, 2, 3, 4, 5, 6, 7 };
255
CHECK(nums.any(callable_mp_static(_is_odd)));
256
CHECK(nums.any(callable_mp_static(_is_even)));
257
CHECK(!nums.all(callable_mp_static(_is_odd)));
258
CHECK(!nums.all(callable_mp_static(_is_even)));
259
260
Array odd = nums.filter(callable_mp_static(_is_odd));
261
Array odd_expected = { 1, 3, 5, 7 };
262
CHECK_EQ(odd, odd_expected);
263
264
Array even = nums.filter(callable_mp_static(_is_even));
265
Array even_expected = { 2, 4, 6 };
266
CHECK_EQ(even, even_expected);
267
268
CHECK(odd.all(callable_mp_static(_is_odd)));
269
CHECK(odd.any(callable_mp_static(_is_odd)));
270
CHECK(!odd.all(callable_mp_static(_is_even)));
271
CHECK(!odd.any(callable_mp_static(_is_even)));
272
}
273
274
static int _add(int p_a, int p_b) {
275
return p_a + p_b;
276
}
277
278
TEST_CASE("[Array] map() and reduce()") {
279
Array array = { 1, 2, 3, 4, 5 };
280
Array mapped = array.map(callable_mp_static(_add).bind(5));
281
Array mapped_expected = { 6, 7, 8, 9, 10 };
282
CHECK_EQ(mapped, mapped_expected);
283
284
Variant sum = 0;
285
CHECK_EQ(int(array.reduce(callable_mp_static(_add), sum)), 15);
286
}
287
288
TEST_CASE("[Array] push_front(), pop_front(), pop_back()") {
289
Array arr;
290
arr.push_front(1);
291
arr.push_front(2);
292
CHECK(int(arr[0]) == 2);
293
arr.pop_front();
294
CHECK(int(arr[0]) == 1);
295
CHECK(arr.size() == 1);
296
arr.push_front(2);
297
arr.push_front(3);
298
arr.pop_back();
299
CHECK(int(arr[1]) == 2);
300
CHECK(arr.size() == 2);
301
}
302
303
TEST_CASE("[Array] pop_at()") {
304
ErrorDetector ed;
305
306
Array arr = { 2, 4, 6, 8, 10 };
307
308
REQUIRE(int(arr.pop_at(2)) == 6);
309
REQUIRE(arr.size() == 4);
310
CHECK(int(arr[0]) == 2);
311
CHECK(int(arr[1]) == 4);
312
CHECK(int(arr[2]) == 8);
313
CHECK(int(arr[3]) == 10);
314
315
REQUIRE(int(arr.pop_at(2)) == 8);
316
REQUIRE(arr.size() == 3);
317
CHECK(int(arr[0]) == 2);
318
CHECK(int(arr[1]) == 4);
319
CHECK(int(arr[2]) == 10);
320
321
// Negative index.
322
REQUIRE(int(arr.pop_at(-1)) == 10);
323
REQUIRE(arr.size() == 2);
324
CHECK(int(arr[0]) == 2);
325
CHECK(int(arr[1]) == 4);
326
327
// Invalid pop.
328
ed.clear();
329
ERR_PRINT_OFF;
330
const Variant ret = arr.pop_at(-15);
331
ERR_PRINT_ON;
332
REQUIRE(ret.is_null());
333
CHECK(ed.has_error);
334
335
REQUIRE(int(arr.pop_at(0)) == 2);
336
REQUIRE(arr.size() == 1);
337
CHECK(int(arr[0]) == 4);
338
339
REQUIRE(int(arr.pop_at(0)) == 4);
340
REQUIRE(arr.is_empty());
341
342
// Pop from empty array.
343
ed.clear();
344
REQUIRE(arr.pop_at(24).is_null());
345
CHECK_FALSE(ed.has_error);
346
}
347
348
TEST_CASE("[Array] max() and min()") {
349
Array arr;
350
arr.push_back(3);
351
arr.push_front(4);
352
arr.push_back(5);
353
arr.push_back(2);
354
int max = int(arr.max());
355
int min = int(arr.min());
356
CHECK(max == 5);
357
CHECK(min == 2);
358
}
359
360
TEST_CASE("[Array] slice()") {
361
Array array = { 0, 1, 2, 3, 4, 5 };
362
363
Array slice0 = array.slice(0, 0);
364
CHECK(slice0.size() == 0);
365
366
Array slice1 = array.slice(1, 3);
367
CHECK(slice1.size() == 2);
368
CHECK(slice1[0] == Variant(1));
369
CHECK(slice1[1] == Variant(2));
370
371
Array slice2 = array.slice(1, -1);
372
CHECK(slice2.size() == 4);
373
CHECK(slice2[0] == Variant(1));
374
CHECK(slice2[1] == Variant(2));
375
CHECK(slice2[2] == Variant(3));
376
CHECK(slice2[3] == Variant(4));
377
378
Array slice3 = array.slice(3);
379
CHECK(slice3.size() == 3);
380
CHECK(slice3[0] == Variant(3));
381
CHECK(slice3[1] == Variant(4));
382
CHECK(slice3[2] == Variant(5));
383
384
Array slice4 = array.slice(2, -2);
385
CHECK(slice4.size() == 2);
386
CHECK(slice4[0] == Variant(2));
387
CHECK(slice4[1] == Variant(3));
388
389
Array slice5 = array.slice(-2);
390
CHECK(slice5.size() == 2);
391
CHECK(slice5[0] == Variant(4));
392
CHECK(slice5[1] == Variant(5));
393
394
Array slice6 = array.slice(2, 42);
395
CHECK(slice6.size() == 4);
396
CHECK(slice6[0] == Variant(2));
397
CHECK(slice6[1] == Variant(3));
398
CHECK(slice6[2] == Variant(4));
399
CHECK(slice6[3] == Variant(5));
400
401
Array slice7 = array.slice(4, 0, -2);
402
CHECK(slice7.size() == 2);
403
CHECK(slice7[0] == Variant(4));
404
CHECK(slice7[1] == Variant(2));
405
406
Array slice8 = array.slice(5, 0, -2);
407
CHECK(slice8.size() == 3);
408
CHECK(slice8[0] == Variant(5));
409
CHECK(slice8[1] == Variant(3));
410
CHECK(slice8[2] == Variant(1));
411
412
Array slice9 = array.slice(10, 0, -2);
413
CHECK(slice9.size() == 3);
414
CHECK(slice9[0] == Variant(5));
415
CHECK(slice9[1] == Variant(3));
416
CHECK(slice9[2] == Variant(1));
417
418
Array slice10 = array.slice(2, -10, -1);
419
CHECK(slice10.size() == 3);
420
CHECK(slice10[0] == Variant(2));
421
CHECK(slice10[1] == Variant(1));
422
CHECK(slice10[2] == Variant(0));
423
424
ERR_PRINT_OFF;
425
Array slice11 = array.slice(4, 1);
426
CHECK(slice11.size() == 0);
427
428
Array slice12 = array.slice(3, -4);
429
CHECK(slice12.size() == 0);
430
ERR_PRINT_ON;
431
432
Array slice13 = Array().slice(1);
433
CHECK(slice13.size() == 0);
434
435
Array slice14 = array.slice(6);
436
CHECK(slice14.size() == 0);
437
}
438
439
TEST_CASE("[Array] Duplicate array") {
440
// a = [1, [2, 2], {3: 3}]
441
Array a = { 1, { 2, 2 }, Dictionary({ { 3, 3 } }) };
442
443
// Deep copy
444
Array deep_a = a.duplicate(true);
445
CHECK_MESSAGE(deep_a.id() != a.id(), "Should create a new array");
446
CHECK_MESSAGE(Array(deep_a[1]).id() != Array(a[1]).id(), "Should clone nested array");
447
CHECK_MESSAGE(Dictionary(deep_a[2]).id() != Dictionary(a[2]).id(), "Should clone nested dictionary");
448
CHECK_EQ(deep_a, a);
449
deep_a.push_back(1);
450
CHECK_NE(deep_a, a);
451
deep_a.pop_back();
452
Array(deep_a[1]).push_back(1);
453
CHECK_NE(deep_a, a);
454
Array(deep_a[1]).pop_back();
455
CHECK_EQ(deep_a, a);
456
457
// Shallow copy
458
Array shallow_a = a.duplicate(false);
459
CHECK_MESSAGE(shallow_a.id() != a.id(), "Should create a new array");
460
CHECK_MESSAGE(Array(shallow_a[1]).id() == Array(a[1]).id(), "Should keep nested array");
461
CHECK_MESSAGE(Dictionary(shallow_a[2]).id() == Dictionary(a[2]).id(), "Should keep nested dictionary");
462
CHECK_EQ(shallow_a, a);
463
Array(shallow_a).push_back(1);
464
CHECK_NE(shallow_a, a);
465
}
466
467
TEST_CASE("[Array] Duplicate recursive array") {
468
// Self recursive
469
Array a;
470
a.push_back(a);
471
472
Array a_shallow = a.duplicate(false);
473
CHECK_EQ(a, a_shallow);
474
475
// Deep copy of recursive array ends up with recursion limit and return
476
// an invalid result (multiple nested arrays), the point is we should
477
// not end up with a segfault and an error log should be printed
478
ERR_PRINT_OFF;
479
a.duplicate(true);
480
ERR_PRINT_ON;
481
482
// Nested recursive
483
Array a1;
484
Array a2;
485
a2.push_back(a1);
486
a1.push_back(a2);
487
488
Array a1_shallow = a1.duplicate(false);
489
CHECK_EQ(a1, a1_shallow);
490
491
// Same deep copy issue as above
492
ERR_PRINT_OFF;
493
a1.duplicate(true);
494
ERR_PRINT_ON;
495
496
// Break the recursivity otherwise Array teardown will leak memory
497
a.clear();
498
a1.clear();
499
a2.clear();
500
}
501
502
TEST_CASE("[Array] Hash array") {
503
// a = [1, [2, 2], {3: 3}]
504
Array a = { 1, { 2, 2 }, Dictionary({ { 3, 3 } }) };
505
uint32_t original_hash = a.hash();
506
507
a.push_back(1);
508
CHECK_NE(a.hash(), original_hash);
509
510
a.pop_back();
511
CHECK_EQ(a.hash(), original_hash);
512
513
Array(a[1]).push_back(1);
514
CHECK_NE(a.hash(), original_hash);
515
Array(a[1]).pop_back();
516
CHECK_EQ(a.hash(), original_hash);
517
518
(Dictionary(a[2]))[1] = 1;
519
CHECK_NE(a.hash(), original_hash);
520
Dictionary(a[2]).erase(1);
521
CHECK_EQ(a.hash(), original_hash);
522
523
Array a2 = a.duplicate(true);
524
CHECK_EQ(a2.hash(), a.hash());
525
}
526
527
TEST_CASE("[Array] Hash recursive array") {
528
Array a1;
529
a1.push_back(a1);
530
531
Array a2;
532
a2.push_back(a2);
533
534
// Hash should reach recursion limit
535
ERR_PRINT_OFF;
536
CHECK_EQ(a1.hash(), a2.hash());
537
ERR_PRINT_ON;
538
539
// Break the recursivity otherwise Array teardown will leak memory
540
a1.clear();
541
a2.clear();
542
}
543
544
TEST_CASE("[Array] Empty comparison") {
545
Array a1;
546
Array a2;
547
548
// test both operator== and operator!=
549
CHECK_EQ(a1, a2);
550
CHECK_FALSE(a1 != a2);
551
}
552
553
TEST_CASE("[Array] Flat comparison") {
554
Array a1 = { 1 };
555
Array a2 = { 1 };
556
Array other_a = { 2 };
557
558
// test both operator== and operator!=
559
CHECK_EQ(a1, a1); // compare self
560
CHECK_FALSE(a1 != a1);
561
CHECK_EQ(a1, a2); // different equivalent arrays
562
CHECK_FALSE(a1 != a2);
563
CHECK_NE(a1, other_a); // different arrays with different content
564
CHECK_FALSE(a1 == other_a);
565
}
566
567
TEST_CASE("[Array] Nested array comparison") {
568
// a1 = [[[1], 2], 3]
569
Array a1 = { { { 1 }, 2 }, 3 };
570
571
Array a2 = a1.duplicate(true);
572
573
// other_a = [[[1, 0], 2], 3]
574
Array other_a = { { { 1, 0 }, 2 }, 3 };
575
576
// test both operator== and operator!=
577
CHECK_EQ(a1, a1); // compare self
578
CHECK_FALSE(a1 != a1);
579
CHECK_EQ(a1, a2); // different equivalent arrays
580
CHECK_FALSE(a1 != a2);
581
CHECK_NE(a1, other_a); // different arrays with different content
582
CHECK_FALSE(a1 == other_a);
583
}
584
585
TEST_CASE("[Array] Nested dictionary comparison") {
586
// a1 = [{1: 2}, 3]
587
Array a1 = { Dictionary({ { 1, 2 } }), 3 };
588
589
Array a2 = a1.duplicate(true);
590
591
// other_a = [{1: 0}, 3]
592
Array other_a = { Dictionary({ { 1, 0 } }), 3 };
593
594
// test both operator== and operator!=
595
CHECK_EQ(a1, a1); // compare self
596
CHECK_FALSE(a1 != a1);
597
CHECK_EQ(a1, a2); // different equivalent arrays
598
CHECK_FALSE(a1 != a2);
599
CHECK_NE(a1, other_a); // different arrays with different content
600
CHECK_FALSE(a1 == other_a);
601
}
602
603
TEST_CASE("[Array] Recursive comparison") {
604
Array a1;
605
a1.push_back(a1);
606
607
Array a2;
608
a2.push_back(a2);
609
610
// Comparison should reach recursion limit
611
ERR_PRINT_OFF;
612
CHECK_EQ(a1, a2);
613
CHECK_FALSE(a1 != a2);
614
ERR_PRINT_ON;
615
616
a1.push_back(1);
617
a2.push_back(1);
618
619
// Comparison should reach recursion limit
620
ERR_PRINT_OFF;
621
CHECK_EQ(a1, a2);
622
CHECK_FALSE(a1 != a2);
623
ERR_PRINT_ON;
624
625
a1.push_back(1);
626
a2.push_back(2);
627
628
// Comparison should reach recursion limit
629
ERR_PRINT_OFF;
630
CHECK_NE(a1, a2);
631
CHECK_FALSE(a1 == a2);
632
ERR_PRINT_ON;
633
634
// Break the recursivity otherwise Array tearndown will leak memory
635
a1.clear();
636
a2.clear();
637
}
638
639
TEST_CASE("[Array] Recursive self comparison") {
640
Array a1;
641
Array a2;
642
a2.push_back(a1);
643
a1.push_back(a2);
644
645
CHECK_EQ(a1, a1);
646
CHECK_FALSE(a1 != a1);
647
648
// Break the recursivity otherwise Array tearndown will leak memory
649
a1.clear();
650
a2.clear();
651
}
652
653
TEST_CASE("[Array] Iteration") {
654
Array a1 = { 1, 2, 3 };
655
Array a2 = { 1, 2, 3 };
656
657
int idx = 0;
658
for (Variant &E : a1) {
659
CHECK_EQ(int(a2[idx]), int(E));
660
idx++;
661
}
662
663
CHECK_EQ(idx, a1.size());
664
665
idx = 0;
666
667
for (const Variant &E : (const Array &)a1) {
668
CHECK_EQ(int(a2[idx]), int(E));
669
idx++;
670
}
671
672
CHECK_EQ(idx, a1.size());
673
674
a1.clear();
675
}
676
677
TEST_CASE("[Array] Iteration and modification") {
678
Array a1 = { 1, 2, 3 };
679
Array a2 = { 2, 3, 4 };
680
Array a3 = { 1, 2, 3 };
681
Array a4 = { 1, 2, 3 };
682
a3.make_read_only();
683
684
int idx = 0;
685
for (Variant &E : a1) {
686
E = a2[idx];
687
idx++;
688
}
689
690
CHECK_EQ(a1, a2);
691
692
// Ensure read-only is respected.
693
idx = 0;
694
for (Variant &E : a3) {
695
E = a2[idx];
696
}
697
698
CHECK_EQ(a3, a4);
699
700
a1.clear();
701
a2.clear();
702
a4.clear();
703
}
704
705
TEST_CASE("[Array] Typed copying") {
706
TypedArray<int> a1 = { 1 };
707
TypedArray<double> a2 = { 1.0 };
708
709
Array a3 = a1;
710
TypedArray<int> a4 = a3;
711
712
Array a5 = a2;
713
TypedArray<int> a6 = a5;
714
715
a3[0] = 2;
716
a4[0] = 3;
717
718
// Same typed TypedArray should be shared.
719
CHECK_EQ(a1[0], Variant(3));
720
CHECK_EQ(a3[0], Variant(3));
721
CHECK_EQ(a4[0], Variant(3));
722
723
a5[0] = 2.0;
724
a6[0] = 3.0;
725
726
// Different typed TypedArray should not be shared.
727
CHECK_EQ(a2[0], Variant(2.0));
728
CHECK_EQ(a5[0], Variant(2.0));
729
CHECK_EQ(a6[0], Variant(3.0));
730
731
a1.clear();
732
a2.clear();
733
a3.clear();
734
a4.clear();
735
a5.clear();
736
a6.clear();
737
}
738
739
TEST_CASE("[Array] find() and rfind()") {
740
Array array = { "a", "b", "c", "a", "b", "c" };
741
742
CHECK_EQ(array.find("a"), 0);
743
CHECK_EQ(array.find("c"), 2);
744
CHECK_EQ(array.find("a", 1), 3);
745
746
CHECK_EQ(array.rfind("b"), 4);
747
CHECK_EQ(array.rfind("c", -2), 2);
748
}
749
750
static bool _find_custom_callable(const Variant &p_val) {
751
return (int)p_val % 2 == 0;
752
}
753
754
TEST_CASE("[Array] Test find_custom") {
755
Array a1 = { 1, 3, 4, 5, 8, 9 };
756
// Find first even number.
757
int index = a1.find_custom(callable_mp_static(_find_custom_callable));
758
CHECK_EQ(index, 2);
759
}
760
761
TEST_CASE("[Array] Test rfind_custom") {
762
Array a1 = { 1, 3, 4, 5, 8, 9 };
763
// Find last even number.
764
int index = a1.rfind_custom(callable_mp_static(_find_custom_callable));
765
CHECK_EQ(index, 4);
766
}
767
768
TEST_CASE("[Array] Test typed arrays") {
769
Array arr1;
770
CHECK_FALSE(arr1.is_typed());
771
772
arr1.set_typed(Variant::FLOAT, StringName(), Variant());
773
CHECK(arr1.is_typed());
774
CHECK_EQ(arr1.get_typed_builtin(), Variant::FLOAT);
775
776
arr1.push_back(1);
777
CHECK_EQ(arr1.size(), 1);
778
779
ERR_PRINT_OFF;
780
arr1.push_back("test wrong type");
781
CHECK_EQ(arr1.size(), 1);
782
ERR_PRINT_ON;
783
784
Array arr2;
785
arr2.set_typed(Variant::INT, StringName(), Variant());
786
CHECK_FALSE(arr1.is_same_typed(arr2));
787
788
Array arr3;
789
arr3.set_typed(Variant::OBJECT, "Node", Variant());
790
CHECK_EQ(arr3.get_typed_class_name(), "Node");
791
}
792
793
} // namespace TestArray
794
795