Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/tests/core/variant/test_array.h
11353 views
1
/**************************************************************************/
2
/* test_array.h */
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
#pragma once
32
33
#include "core/variant/array.h"
34
#include "tests/test_macros.h"
35
#include "tests/test_tools.h"
36
37
namespace TestArray {
38
TEST_CASE("[Array] initializer list") {
39
Array arr = { 0, 1, "test", true, { 0.0, 1.0 } };
40
CHECK(arr.size() == 5);
41
CHECK(arr[0] == Variant(0));
42
CHECK(arr[1] == Variant(1));
43
CHECK(arr[2] == Variant("test"));
44
CHECK(arr[3] == Variant(true));
45
CHECK(arr[4] == Variant({ 0.0, 1.0 }));
46
47
arr = { "reassign" };
48
CHECK(arr.size() == 1);
49
CHECK(arr[0] == Variant("reassign"));
50
51
TypedArray<int> typed_arr = { 0, 1, 2 };
52
CHECK(typed_arr.size() == 3);
53
CHECK(typed_arr[0] == Variant(0));
54
CHECK(typed_arr[1] == Variant(1));
55
CHECK(typed_arr[2] == Variant(2));
56
}
57
58
TEST_CASE("[Array] size(), clear(), and is_empty()") {
59
Array arr;
60
CHECK(arr.size() == 0);
61
CHECK(arr.is_empty());
62
arr.push_back(1);
63
CHECK(arr.size() == 1);
64
arr.clear();
65
CHECK(arr.is_empty());
66
CHECK(arr.size() == 0);
67
}
68
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
99
TEST_CASE("[Array] Assignment and comparison operators") {
100
Array arr1;
101
Array arr2;
102
arr1.push_back(1);
103
CHECK(arr1 != arr2);
104
CHECK(arr1 > arr2);
105
CHECK(arr1 >= arr2);
106
arr2.push_back(2);
107
CHECK(arr1 != arr2);
108
CHECK(arr1 < arr2);
109
CHECK(arr1 <= arr2);
110
CHECK(arr2 > arr1);
111
CHECK(arr2 >= arr1);
112
Array arr3 = arr2;
113
CHECK(arr3 == arr2);
114
}
115
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
126
TEST_CASE("[Array] append_array()") {
127
Array arr1;
128
Array arr2;
129
arr1.push_back(1);
130
arr1.append_array(arr2);
131
CHECK(arr1.size() == 1);
132
arr2.push_back(2);
133
arr1.append_array(arr2);
134
CHECK(arr1.size() == 2);
135
CHECK(int(arr1[0]) == 1);
136
CHECK(int(arr1[1]) == 2);
137
}
138
139
TEST_CASE("[Array] resize(), insert(), and erase()") {
140
Array arr;
141
arr.resize(2);
142
CHECK(arr.size() == 2);
143
arr.insert(0, 1);
144
CHECK(int(arr[0]) == 1);
145
arr.insert(0, 2);
146
CHECK(int(arr[0]) == 2);
147
arr.erase(2);
148
CHECK(int(arr[0]) == 1);
149
arr.resize(0);
150
CHECK(arr.size() == 0);
151
arr.insert(0, 8);
152
CHECK(arr.size() == 1);
153
arr.insert(1, 16);
154
CHECK(int(arr[1]) == 16);
155
arr.insert(-1, 3);
156
CHECK(int(arr[1]) == 3);
157
}
158
159
TEST_CASE("[Array] front() and back()") {
160
Array arr;
161
arr.push_back(1);
162
CHECK(int(arr.front()) == 1);
163
CHECK(int(arr.back()) == 1);
164
arr.push_back(3);
165
CHECK(int(arr.front()) == 1);
166
CHECK(int(arr.back()) == 3);
167
}
168
169
TEST_CASE("[Array] has() and count()") {
170
Array arr = { 1, 1 };
171
CHECK(arr.has(1));
172
CHECK(!arr.has(2));
173
CHECK(arr.count(1) == 2);
174
CHECK(arr.count(2) == 0);
175
}
176
177
TEST_CASE("[Array] remove_at()") {
178
Array arr = { 1, 2 };
179
arr.remove_at(0);
180
CHECK(arr.size() == 1);
181
CHECK(int(arr[0]) == 2);
182
arr.remove_at(0);
183
CHECK(arr.size() == 0);
184
185
// Negative index.
186
arr.push_back(3);
187
arr.push_back(4);
188
arr.remove_at(-1);
189
CHECK(arr.size() == 1);
190
CHECK(int(arr[0]) == 3);
191
arr.remove_at(-1);
192
CHECK(arr.size() == 0);
193
194
// The array is now empty; try to use `remove_at()` again.
195
// Normally, this prints an error message so we silence it.
196
ERR_PRINT_OFF;
197
arr.remove_at(0);
198
ERR_PRINT_ON;
199
200
CHECK(arr.size() == 0);
201
}
202
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);
211
}
212
213
TEST_CASE("[Array] sort() and bsearch()") {
214
Array arr = { 3, 4, 2, 1 };
215
arr.sort();
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);
282
}
283
284
TEST_CASE("[Array] push_front(), pop_front(), pop_back()") {
285
Array arr;
286
arr.push_front(1);
287
arr.push_front(2);
288
CHECK(int(arr[0]) == 2);
289
arr.pop_front();
290
CHECK(int(arr[0]) == 1);
291
CHECK(arr.size() == 1);
292
arr.push_front(2);
293
arr.push_front(3);
294
arr.pop_back();
295
CHECK(int(arr[1]) == 2);
296
CHECK(arr.size() == 2);
297
}
298
299
TEST_CASE("[Array] pop_at()") {
300
ErrorDetector ed;
301
302
Array arr = { 2, 4, 6, 8, 10 };
303
304
REQUIRE(int(arr.pop_at(2)) == 6);
305
REQUIRE(arr.size() == 4);
306
CHECK(int(arr[0]) == 2);
307
CHECK(int(arr[1]) == 4);
308
CHECK(int(arr[2]) == 8);
309
CHECK(int(arr[3]) == 10);
310
311
REQUIRE(int(arr.pop_at(2)) == 8);
312
REQUIRE(arr.size() == 3);
313
CHECK(int(arr[0]) == 2);
314
CHECK(int(arr[1]) == 4);
315
CHECK(int(arr[2]) == 10);
316
317
// Negative index.
318
REQUIRE(int(arr.pop_at(-1)) == 10);
319
REQUIRE(arr.size() == 2);
320
CHECK(int(arr[0]) == 2);
321
CHECK(int(arr[1]) == 4);
322
323
// Invalid pop.
324
ed.clear();
325
ERR_PRINT_OFF;
326
const Variant ret = arr.pop_at(-15);
327
ERR_PRINT_ON;
328
REQUIRE(ret.is_null());
329
CHECK(ed.has_error);
330
331
REQUIRE(int(arr.pop_at(0)) == 2);
332
REQUIRE(arr.size() == 1);
333
CHECK(int(arr[0]) == 4);
334
335
REQUIRE(int(arr.pop_at(0)) == 4);
336
REQUIRE(arr.is_empty());
337
338
// Pop from empty array.
339
ed.clear();
340
REQUIRE(arr.pop_at(24).is_null());
341
CHECK_FALSE(ed.has_error);
342
}
343
344
TEST_CASE("[Array] max() and min()") {
345
Array arr;
346
arr.push_back(3);
347
arr.push_front(4);
348
arr.push_back(5);
349
arr.push_back(2);
350
int max = int(arr.max());
351
int min = int(arr.min());
352
CHECK(max == 5);
353
CHECK(min == 2);
354
}
355
356
TEST_CASE("[Array] slice()") {
357
Array array = { 0, 1, 2, 3, 4, 5 };
358
359
Array slice0 = array.slice(0, 0);
360
CHECK(slice0.size() == 0);
361
362
Array slice1 = array.slice(1, 3);
363
CHECK(slice1.size() == 2);
364
CHECK(slice1[0] == Variant(1));
365
CHECK(slice1[1] == Variant(2));
366
367
Array slice2 = array.slice(1, -1);
368
CHECK(slice2.size() == 4);
369
CHECK(slice2[0] == Variant(1));
370
CHECK(slice2[1] == Variant(2));
371
CHECK(slice2[2] == Variant(3));
372
CHECK(slice2[3] == Variant(4));
373
374
Array slice3 = array.slice(3);
375
CHECK(slice3.size() == 3);
376
CHECK(slice3[0] == Variant(3));
377
CHECK(slice3[1] == Variant(4));
378
CHECK(slice3[2] == Variant(5));
379
380
Array slice4 = array.slice(2, -2);
381
CHECK(slice4.size() == 2);
382
CHECK(slice4[0] == Variant(2));
383
CHECK(slice4[1] == Variant(3));
384
385
Array slice5 = array.slice(-2);
386
CHECK(slice5.size() == 2);
387
CHECK(slice5[0] == Variant(4));
388
CHECK(slice5[1] == Variant(5));
389
390
Array slice6 = array.slice(2, 42);
391
CHECK(slice6.size() == 4);
392
CHECK(slice6[0] == Variant(2));
393
CHECK(slice6[1] == Variant(3));
394
CHECK(slice6[2] == Variant(4));
395
CHECK(slice6[3] == Variant(5));
396
397
Array slice7 = array.slice(4, 0, -2);
398
CHECK(slice7.size() == 2);
399
CHECK(slice7[0] == Variant(4));
400
CHECK(slice7[1] == Variant(2));
401
402
Array slice8 = array.slice(5, 0, -2);
403
CHECK(slice8.size() == 3);
404
CHECK(slice8[0] == Variant(5));
405
CHECK(slice8[1] == Variant(3));
406
CHECK(slice8[2] == Variant(1));
407
408
Array slice9 = array.slice(10, 0, -2);
409
CHECK(slice9.size() == 3);
410
CHECK(slice9[0] == Variant(5));
411
CHECK(slice9[1] == Variant(3));
412
CHECK(slice9[2] == Variant(1));
413
414
Array slice10 = array.slice(2, -10, -1);
415
CHECK(slice10.size() == 3);
416
CHECK(slice10[0] == Variant(2));
417
CHECK(slice10[1] == Variant(1));
418
CHECK(slice10[2] == Variant(0));
419
420
ERR_PRINT_OFF;
421
Array slice11 = array.slice(4, 1);
422
CHECK(slice11.size() == 0);
423
424
Array slice12 = array.slice(3, -4);
425
CHECK(slice12.size() == 0);
426
ERR_PRINT_ON;
427
428
Array slice13 = Array().slice(1);
429
CHECK(slice13.size() == 0);
430
431
Array slice14 = array.slice(6);
432
CHECK(slice14.size() == 0);
433
}
434
435
TEST_CASE("[Array] Duplicate array") {
436
// a = [1, [2, 2], {3: 3}]
437
Array a = { 1, { 2, 2 }, Dictionary({ { 3, 3 } }) };
438
439
// Deep copy
440
Array deep_a = a.duplicate(true);
441
CHECK_MESSAGE(deep_a.id() != a.id(), "Should create a new array");
442
CHECK_MESSAGE(Array(deep_a[1]).id() != Array(a[1]).id(), "Should clone nested array");
443
CHECK_MESSAGE(Dictionary(deep_a[2]).id() != Dictionary(a[2]).id(), "Should clone nested dictionary");
444
CHECK_EQ(deep_a, a);
445
deep_a.push_back(1);
446
CHECK_NE(deep_a, a);
447
deep_a.pop_back();
448
Array(deep_a[1]).push_back(1);
449
CHECK_NE(deep_a, a);
450
Array(deep_a[1]).pop_back();
451
CHECK_EQ(deep_a, a);
452
453
// Shallow copy
454
Array shallow_a = a.duplicate(false);
455
CHECK_MESSAGE(shallow_a.id() != a.id(), "Should create a new array");
456
CHECK_MESSAGE(Array(shallow_a[1]).id() == Array(a[1]).id(), "Should keep nested array");
457
CHECK_MESSAGE(Dictionary(shallow_a[2]).id() == Dictionary(a[2]).id(), "Should keep nested dictionary");
458
CHECK_EQ(shallow_a, a);
459
Array(shallow_a).push_back(1);
460
CHECK_NE(shallow_a, a);
461
}
462
463
TEST_CASE("[Array] Duplicate recursive array") {
464
// Self recursive
465
Array a;
466
a.push_back(a);
467
468
Array a_shallow = a.duplicate(false);
469
CHECK_EQ(a, a_shallow);
470
471
// Deep copy of recursive array ends up with recursion limit and return
472
// an invalid result (multiple nested arrays), the point is we should
473
// not end up with a segfault and an error log should be printed
474
ERR_PRINT_OFF;
475
a.duplicate(true);
476
ERR_PRINT_ON;
477
478
// Nested recursive
479
Array a1;
480
Array a2;
481
a2.push_back(a1);
482
a1.push_back(a2);
483
484
Array a1_shallow = a1.duplicate(false);
485
CHECK_EQ(a1, a1_shallow);
486
487
// Same deep copy issue as above
488
ERR_PRINT_OFF;
489
a1.duplicate(true);
490
ERR_PRINT_ON;
491
492
// Break the recursivity otherwise Array teardown will leak memory
493
a.clear();
494
a1.clear();
495
a2.clear();
496
}
497
498
TEST_CASE("[Array] Hash array") {
499
// a = [1, [2, 2], {3: 3}]
500
Array a = { 1, { 2, 2 }, Dictionary({ { 3, 3 } }) };
501
uint32_t original_hash = a.hash();
502
503
a.push_back(1);
504
CHECK_NE(a.hash(), original_hash);
505
506
a.pop_back();
507
CHECK_EQ(a.hash(), original_hash);
508
509
Array(a[1]).push_back(1);
510
CHECK_NE(a.hash(), original_hash);
511
Array(a[1]).pop_back();
512
CHECK_EQ(a.hash(), original_hash);
513
514
(Dictionary(a[2]))[1] = 1;
515
CHECK_NE(a.hash(), original_hash);
516
Dictionary(a[2]).erase(1);
517
CHECK_EQ(a.hash(), original_hash);
518
519
Array a2 = a.duplicate(true);
520
CHECK_EQ(a2.hash(), a.hash());
521
}
522
523
TEST_CASE("[Array] Hash recursive array") {
524
Array a1;
525
a1.push_back(a1);
526
527
Array a2;
528
a2.push_back(a2);
529
530
// Hash should reach recursion limit
531
ERR_PRINT_OFF;
532
CHECK_EQ(a1.hash(), a2.hash());
533
ERR_PRINT_ON;
534
535
// Break the recursivity otherwise Array teardown will leak memory
536
a1.clear();
537
a2.clear();
538
}
539
540
TEST_CASE("[Array] Empty comparison") {
541
Array a1;
542
Array a2;
543
544
// test both operator== and operator!=
545
CHECK_EQ(a1, a2);
546
CHECK_FALSE(a1 != a2);
547
}
548
549
TEST_CASE("[Array] Flat comparison") {
550
Array a1 = { 1 };
551
Array a2 = { 1 };
552
Array other_a = { 2 };
553
554
// test both operator== and operator!=
555
CHECK_EQ(a1, a1); // compare self
556
CHECK_FALSE(a1 != a1);
557
CHECK_EQ(a1, a2); // different equivalent arrays
558
CHECK_FALSE(a1 != a2);
559
CHECK_NE(a1, other_a); // different arrays with different content
560
CHECK_FALSE(a1 == other_a);
561
}
562
563
TEST_CASE("[Array] Nested array comparison") {
564
// a1 = [[[1], 2], 3]
565
Array a1 = { { { 1 }, 2 }, 3 };
566
567
Array a2 = a1.duplicate(true);
568
569
// other_a = [[[1, 0], 2], 3]
570
Array other_a = { { { 1, 0 }, 2 }, 3 };
571
572
// test both operator== and operator!=
573
CHECK_EQ(a1, a1); // compare self
574
CHECK_FALSE(a1 != a1);
575
CHECK_EQ(a1, a2); // different equivalent arrays
576
CHECK_FALSE(a1 != a2);
577
CHECK_NE(a1, other_a); // different arrays with different content
578
CHECK_FALSE(a1 == other_a);
579
}
580
581
TEST_CASE("[Array] Nested dictionary comparison") {
582
// a1 = [{1: 2}, 3]
583
Array a1 = { Dictionary({ { 1, 2 } }), 3 };
584
585
Array a2 = a1.duplicate(true);
586
587
// other_a = [{1: 0}, 3]
588
Array other_a = { Dictionary({ { 1, 0 } }), 3 };
589
590
// test both operator== and operator!=
591
CHECK_EQ(a1, a1); // compare self
592
CHECK_FALSE(a1 != a1);
593
CHECK_EQ(a1, a2); // different equivalent arrays
594
CHECK_FALSE(a1 != a2);
595
CHECK_NE(a1, other_a); // different arrays with different content
596
CHECK_FALSE(a1 == other_a);
597
}
598
599
TEST_CASE("[Array] Recursive comparison") {
600
Array a1;
601
a1.push_back(a1);
602
603
Array a2;
604
a2.push_back(a2);
605
606
// Comparison should reach recursion limit
607
ERR_PRINT_OFF;
608
CHECK_EQ(a1, a2);
609
CHECK_FALSE(a1 != a2);
610
ERR_PRINT_ON;
611
612
a1.push_back(1);
613
a2.push_back(1);
614
615
// Comparison should reach recursion limit
616
ERR_PRINT_OFF;
617
CHECK_EQ(a1, a2);
618
CHECK_FALSE(a1 != a2);
619
ERR_PRINT_ON;
620
621
a1.push_back(1);
622
a2.push_back(2);
623
624
// Comparison should reach recursion limit
625
ERR_PRINT_OFF;
626
CHECK_NE(a1, a2);
627
CHECK_FALSE(a1 == a2);
628
ERR_PRINT_ON;
629
630
// Break the recursivity otherwise Array tearndown will leak memory
631
a1.clear();
632
a2.clear();
633
}
634
635
TEST_CASE("[Array] Recursive self comparison") {
636
Array a1;
637
Array a2;
638
a2.push_back(a1);
639
a1.push_back(a2);
640
641
CHECK_EQ(a1, a1);
642
CHECK_FALSE(a1 != a1);
643
644
// Break the recursivity otherwise Array tearndown will leak memory
645
a1.clear();
646
a2.clear();
647
}
648
649
TEST_CASE("[Array] Iteration") {
650
Array a1 = { 1, 2, 3 };
651
Array a2 = { 1, 2, 3 };
652
653
int idx = 0;
654
for (Variant &E : a1) {
655
CHECK_EQ(int(a2[idx]), int(E));
656
idx++;
657
}
658
659
CHECK_EQ(idx, a1.size());
660
661
idx = 0;
662
663
for (const Variant &E : (const Array &)a1) {
664
CHECK_EQ(int(a2[idx]), int(E));
665
idx++;
666
}
667
668
CHECK_EQ(idx, a1.size());
669
670
a1.clear();
671
}
672
673
TEST_CASE("[Array] Iteration and modification") {
674
Array a1 = { 1, 2, 3 };
675
Array a2 = { 2, 3, 4 };
676
Array a3 = { 1, 2, 3 };
677
Array a4 = { 1, 2, 3 };
678
a3.make_read_only();
679
680
int idx = 0;
681
for (Variant &E : a1) {
682
E = a2[idx];
683
idx++;
684
}
685
686
CHECK_EQ(a1, a2);
687
688
// Ensure read-only is respected.
689
idx = 0;
690
for (Variant &E : a3) {
691
E = a2[idx];
692
}
693
694
CHECK_EQ(a3, a4);
695
696
a1.clear();
697
a2.clear();
698
a4.clear();
699
}
700
701
TEST_CASE("[Array] Typed copying") {
702
TypedArray<int> a1 = { 1 };
703
TypedArray<double> a2 = { 1.0 };
704
705
Array a3 = a1;
706
TypedArray<int> a4 = a3;
707
708
Array a5 = a2;
709
TypedArray<int> a6 = a5;
710
711
a3[0] = 2;
712
a4[0] = 3;
713
714
// Same typed TypedArray should be shared.
715
CHECK_EQ(a1[0], Variant(3));
716
CHECK_EQ(a3[0], Variant(3));
717
CHECK_EQ(a4[0], Variant(3));
718
719
a5[0] = 2.0;
720
a6[0] = 3.0;
721
722
// Different typed TypedArray should not be shared.
723
CHECK_EQ(a2[0], Variant(2.0));
724
CHECK_EQ(a5[0], Variant(2.0));
725
CHECK_EQ(a6[0], Variant(3.0));
726
727
a1.clear();
728
a2.clear();
729
a3.clear();
730
a4.clear();
731
a5.clear();
732
a6.clear();
733
}
734
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
746
static bool _find_custom_callable(const Variant &p_val) {
747
return (int)p_val % 2 == 0;
748
}
749
750
TEST_CASE("[Array] Test find_custom") {
751
Array a1 = { 1, 3, 4, 5, 8, 9 };
752
// Find first even number.
753
int index = a1.find_custom(callable_mp_static(_find_custom_callable));
754
CHECK_EQ(index, 2);
755
}
756
757
TEST_CASE("[Array] Test rfind_custom") {
758
Array a1 = { 1, 3, 4, 5, 8, 9 };
759
// Find last even number.
760
int index = a1.rfind_custom(callable_mp_static(_find_custom_callable));
761
CHECK_EQ(index, 4);
762
}
763
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
789
} // namespace TestArray
790
791