Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/src/common-tests/heap_array_tests.cpp
7197 views
1
// SPDX-FileCopyrightText: 2019-2025 Connor McLaughlin <[email protected]>
2
// SPDX-License-Identifier: CC-BY-NC-ND-4.0
3
4
#include "common/heap_array.h"
5
6
#include <gtest/gtest.h>
7
8
// ============================================================================
9
// FixedHeapArray Tests
10
// ============================================================================
11
12
TEST(FixedHeapArray, DefaultConstruction)
13
{
14
FixedHeapArray<int, 10> arr;
15
EXPECT_EQ(arr.size(), 10u);
16
EXPECT_EQ(arr.capacity(), 10u);
17
EXPECT_EQ(arr.size_bytes(), 10u * sizeof(int));
18
EXPECT_FALSE(arr.empty());
19
EXPECT_NE(arr.data(), nullptr);
20
}
21
22
TEST(FixedHeapArray, CopyConstruction)
23
{
24
FixedHeapArray<int, 5> arr1;
25
for (size_t i = 0; i < arr1.size(); ++i)
26
arr1[i] = static_cast<int>(i * 10);
27
28
FixedHeapArray<int, 5> arr2(arr1);
29
EXPECT_EQ(arr2.size(), arr1.size());
30
for (size_t i = 0; i < arr1.size(); ++i)
31
EXPECT_EQ(arr2[i], arr1[i]);
32
33
// Ensure they have separate storage
34
EXPECT_NE(arr1.data(), arr2.data());
35
}
36
37
TEST(FixedHeapArray, MoveConstruction)
38
{
39
FixedHeapArray<int, 5> arr1;
40
int* original_data = arr1.data();
41
for (size_t i = 0; i < arr1.size(); ++i)
42
arr1[i] = static_cast<int>(i * 10);
43
44
FixedHeapArray<int, 5> arr2(std::move(arr1));
45
EXPECT_EQ(arr2.data(), original_data);
46
EXPECT_EQ(arr2.size(), 5u);
47
48
for (size_t i = 0; i < arr2.size(); ++i)
49
EXPECT_EQ(arr2[i], static_cast<int>(i * 10));
50
}
51
52
TEST(FixedHeapArray, ElementAccess)
53
{
54
FixedHeapArray<int, 5> arr;
55
arr[0] = 100;
56
arr[1] = 200;
57
arr[2] = 300;
58
arr[3] = 400;
59
arr[4] = 500;
60
61
EXPECT_EQ(arr[0], 100);
62
EXPECT_EQ(arr[1], 200);
63
EXPECT_EQ(arr[2], 300);
64
EXPECT_EQ(arr[3], 400);
65
EXPECT_EQ(arr[4], 500);
66
67
const auto& carr = arr;
68
EXPECT_EQ(carr[0], 100);
69
EXPECT_EQ(carr[4], 500);
70
}
71
72
TEST(FixedHeapArray, FrontBack)
73
{
74
FixedHeapArray<int, 5> arr;
75
arr[0] = 10;
76
arr[4] = 50;
77
78
EXPECT_EQ(arr.front(), 10);
79
EXPECT_EQ(arr.back(), 50);
80
81
arr.front() = 15;
82
arr.back() = 55;
83
EXPECT_EQ(arr[0], 15);
84
EXPECT_EQ(arr[4], 55);
85
86
const auto& carr = arr;
87
EXPECT_EQ(carr.front(), 15);
88
EXPECT_EQ(carr.back(), 55);
89
}
90
91
TEST(FixedHeapArray, Iterators)
92
{
93
FixedHeapArray<int, 5> arr;
94
for (size_t i = 0; i < arr.size(); ++i)
95
arr[i] = static_cast<int>(i);
96
97
int expected = 0;
98
for (auto it = arr.begin(); it != arr.end(); ++it)
99
{
100
EXPECT_EQ(*it, expected);
101
++expected;
102
}
103
EXPECT_EQ(expected, 5);
104
105
expected = 0;
106
for (auto it = arr.cbegin(); it != arr.cend(); ++it)
107
{
108
EXPECT_EQ(*it, expected);
109
++expected;
110
}
111
}
112
113
TEST(FixedHeapArray, Fill)
114
{
115
FixedHeapArray<int, 10> arr;
116
arr.fill(42);
117
118
for (size_t i = 0; i < arr.size(); ++i)
119
EXPECT_EQ(arr[i], 42);
120
}
121
122
TEST(FixedHeapArray, Swap)
123
{
124
FixedHeapArray<int, 5> arr1;
125
FixedHeapArray<int, 5> arr2;
126
arr1.fill(10);
127
arr2.fill(20);
128
129
int* arr1_data = arr1.data();
130
int* arr2_data = arr2.data();
131
132
arr1.swap(arr2);
133
134
EXPECT_EQ(arr1.data(), arr2_data);
135
EXPECT_EQ(arr2.data(), arr1_data);
136
137
for (size_t i = 0; i < arr1.size(); ++i)
138
{
139
EXPECT_EQ(arr1[i], 20);
140
EXPECT_EQ(arr2[i], 10);
141
}
142
}
143
144
TEST(FixedHeapArray, Span)
145
{
146
FixedHeapArray<int, 5> arr;
147
for (size_t i = 0; i < arr.size(); ++i)
148
arr[i] = static_cast<int>(i * 2);
149
150
std::span<int, 5> sp = arr.span();
151
EXPECT_EQ(sp.size(), 5u);
152
EXPECT_EQ(sp.data(), arr.data());
153
154
for (size_t i = 0; i < sp.size(); ++i)
155
EXPECT_EQ(sp[i], static_cast<int>(i * 2));
156
157
const auto& carr = arr;
158
std::span<const int, 5> csp = carr.cspan();
159
EXPECT_EQ(csp.size(), 5u);
160
EXPECT_EQ(csp.data(), carr.data());
161
}
162
163
TEST(FixedHeapArray, MoveAssignment)
164
{
165
FixedHeapArray<int, 5> arr1;
166
arr1.fill(42);
167
int* original_data = arr1.data();
168
169
FixedHeapArray<int, 5> arr2;
170
arr2.fill(0);
171
172
arr2 = std::move(arr1);
173
EXPECT_EQ(arr2.data(), original_data);
174
for (size_t i = 0; i < arr2.size(); ++i)
175
EXPECT_EQ(arr2[i], 42);
176
}
177
178
TEST(FixedHeapArray, AlignedAllocation)
179
{
180
constexpr size_t alignment = 64;
181
FixedHeapArray<int, 16, alignment> arr;
182
183
uintptr_t addr = reinterpret_cast<uintptr_t>(arr.data());
184
EXPECT_EQ(addr % alignment, 0u);
185
}
186
187
TEST(FixedHeapArray, DifferentTypes)
188
{
189
FixedHeapArray<double, 3> arr;
190
arr[0] = 1.5;
191
arr[1] = 2.5;
192
arr[2] = 3.5;
193
194
EXPECT_DOUBLE_EQ(arr[0], 1.5);
195
EXPECT_DOUBLE_EQ(arr[1], 2.5);
196
EXPECT_DOUBLE_EQ(arr[2], 3.5);
197
EXPECT_EQ(arr.size_bytes(), 3u * sizeof(double));
198
}
199
200
// ============================================================================
201
// DynamicHeapArray Tests
202
// ============================================================================
203
204
TEST(DynamicHeapArray, DefaultConstruction)
205
{
206
DynamicHeapArray<int> arr;
207
EXPECT_EQ(arr.size(), 0u);
208
EXPECT_EQ(arr.capacity(), 0u);
209
EXPECT_EQ(arr.size_bytes(), 0u);
210
EXPECT_TRUE(arr.empty());
211
EXPECT_EQ(arr.data(), nullptr);
212
}
213
214
TEST(DynamicHeapArray, SizeConstruction)
215
{
216
DynamicHeapArray<int> arr(10);
217
EXPECT_EQ(arr.size(), 10u);
218
EXPECT_EQ(arr.capacity(), 10u);
219
EXPECT_EQ(arr.size_bytes(), 10u * sizeof(int));
220
EXPECT_FALSE(arr.empty());
221
EXPECT_NE(arr.data(), nullptr);
222
}
223
224
TEST(DynamicHeapArray, RangeConstructionBeginEnd)
225
{
226
int source[] = {1, 2, 3, 4, 5};
227
DynamicHeapArray<int> arr(std::begin(source), std::end(source));
228
229
EXPECT_EQ(arr.size(), 5u);
230
for (size_t i = 0; i < arr.size(); ++i)
231
EXPECT_EQ(arr[i], source[i]);
232
}
233
234
TEST(DynamicHeapArray, RangeConstructionBeginCount)
235
{
236
int source[] = {10, 20, 30, 40, 50};
237
DynamicHeapArray<int> arr(source, 5);
238
239
EXPECT_EQ(arr.size(), 5u);
240
for (size_t i = 0; i < arr.size(); ++i)
241
EXPECT_EQ(arr[i], source[i]);
242
}
243
244
TEST(DynamicHeapArray, SpanConstruction)
245
{
246
int source[] = {1, 2, 3, 4, 5};
247
std::span<const int> sp(source);
248
DynamicHeapArray<int> arr(sp);
249
250
EXPECT_EQ(arr.size(), 5u);
251
for (size_t i = 0; i < arr.size(); ++i)
252
EXPECT_EQ(arr[i], source[i]);
253
}
254
255
TEST(DynamicHeapArray, SpanConstructionEmpty)
256
{
257
std::span<const int> sp;
258
DynamicHeapArray<int> arr(sp);
259
260
EXPECT_EQ(arr.size(), 0u);
261
EXPECT_TRUE(arr.empty());
262
}
263
264
TEST(DynamicHeapArray, CopyConstruction)
265
{
266
DynamicHeapArray<int> arr1(5);
267
for (size_t i = 0; i < arr1.size(); ++i)
268
arr1[i] = static_cast<int>(i * 10);
269
270
DynamicHeapArray<int> arr2(arr1);
271
EXPECT_EQ(arr2.size(), arr1.size());
272
for (size_t i = 0; i < arr1.size(); ++i)
273
EXPECT_EQ(arr2[i], arr1[i]);
274
275
// Ensure they have separate storage
276
EXPECT_NE(arr1.data(), arr2.data());
277
}
278
279
TEST(DynamicHeapArray, CopyConstructionEmpty)
280
{
281
DynamicHeapArray<int> arr1;
282
DynamicHeapArray<int> arr2(arr1);
283
284
EXPECT_EQ(arr2.size(), 0u);
285
EXPECT_TRUE(arr2.empty());
286
}
287
288
TEST(DynamicHeapArray, MoveConstruction)
289
{
290
DynamicHeapArray<int> arr1(5);
291
int* original_data = arr1.data();
292
for (size_t i = 0; i < arr1.size(); ++i)
293
arr1[i] = static_cast<int>(i * 10);
294
295
DynamicHeapArray<int> arr2(std::move(arr1));
296
297
EXPECT_EQ(arr2.data(), original_data);
298
EXPECT_EQ(arr2.size(), 5u);
299
EXPECT_EQ(arr1.size(), 0u);
300
EXPECT_EQ(arr1.data(), nullptr);
301
302
for (size_t i = 0; i < arr2.size(); ++i)
303
EXPECT_EQ(arr2[i], static_cast<int>(i * 10));
304
}
305
306
TEST(DynamicHeapArray, ElementAccess)
307
{
308
DynamicHeapArray<int> arr(5);
309
arr[0] = 100;
310
arr[1] = 200;
311
arr[2] = 300;
312
arr[3] = 400;
313
arr[4] = 500;
314
315
EXPECT_EQ(arr[0], 100);
316
EXPECT_EQ(arr[1], 200);
317
EXPECT_EQ(arr[2], 300);
318
EXPECT_EQ(arr[3], 400);
319
EXPECT_EQ(arr[4], 500);
320
321
const auto& carr = arr;
322
EXPECT_EQ(carr[0], 100);
323
EXPECT_EQ(carr[4], 500);
324
}
325
326
TEST(DynamicHeapArray, FrontBack)
327
{
328
DynamicHeapArray<int> arr(5);
329
arr[0] = 10;
330
arr[4] = 50;
331
332
EXPECT_EQ(arr.front(), 10);
333
EXPECT_EQ(arr.back(), 50);
334
335
arr.front() = 15;
336
arr.back() = 55;
337
EXPECT_EQ(arr[0], 15);
338
EXPECT_EQ(arr[4], 55);
339
340
const auto& carr = arr;
341
EXPECT_EQ(carr.front(), 15);
342
EXPECT_EQ(carr.back(), 55);
343
}
344
345
TEST(DynamicHeapArray, Iterators)
346
{
347
DynamicHeapArray<int> arr(5);
348
for (size_t i = 0; i < arr.size(); ++i)
349
arr[i] = static_cast<int>(i);
350
351
int expected = 0;
352
for (auto it = arr.begin(); it != arr.end(); ++it)
353
{
354
EXPECT_EQ(*it, expected);
355
++expected;
356
}
357
EXPECT_EQ(expected, 5);
358
359
expected = 0;
360
for (auto it = arr.cbegin(); it != arr.cend(); ++it)
361
{
362
EXPECT_EQ(*it, expected);
363
++expected;
364
}
365
}
366
367
TEST(DynamicHeapArray, Fill)
368
{
369
DynamicHeapArray<int> arr(10);
370
arr.fill(42);
371
372
for (size_t i = 0; i < arr.size(); ++i)
373
EXPECT_EQ(arr[i], 42);
374
}
375
376
TEST(DynamicHeapArray, Swap)
377
{
378
DynamicHeapArray<int> arr1(5);
379
DynamicHeapArray<int> arr2(3);
380
arr1.fill(10);
381
arr2.fill(20);
382
383
int* arr1_data = arr1.data();
384
int* arr2_data = arr2.data();
385
386
arr1.swap(arr2);
387
388
EXPECT_EQ(arr1.data(), arr2_data);
389
EXPECT_EQ(arr2.data(), arr1_data);
390
EXPECT_EQ(arr1.size(), 3u);
391
EXPECT_EQ(arr2.size(), 5u);
392
393
for (size_t i = 0; i < arr1.size(); ++i)
394
EXPECT_EQ(arr1[i], 20);
395
for (size_t i = 0; i < arr2.size(); ++i)
396
EXPECT_EQ(arr2[i], 10);
397
}
398
399
TEST(DynamicHeapArray, ResizeGrow)
400
{
401
DynamicHeapArray<int> arr(5);
402
for (size_t i = 0; i < arr.size(); ++i)
403
arr[i] = static_cast<int>(i);
404
405
arr.resize(10);
406
EXPECT_EQ(arr.size(), 10u);
407
408
// Original data should be preserved
409
for (size_t i = 0; i < 5; ++i)
410
EXPECT_EQ(arr[i], static_cast<int>(i));
411
}
412
413
TEST(DynamicHeapArray, ResizeShrink)
414
{
415
DynamicHeapArray<int> arr(10);
416
for (size_t i = 0; i < arr.size(); ++i)
417
arr[i] = static_cast<int>(i);
418
419
arr.resize(5);
420
EXPECT_EQ(arr.size(), 5u);
421
422
for (size_t i = 0; i < arr.size(); ++i)
423
EXPECT_EQ(arr[i], static_cast<int>(i));
424
}
425
426
TEST(DynamicHeapArray, ResizeSameSize)
427
{
428
DynamicHeapArray<int> arr(5);
429
int* original_data = arr.data();
430
arr.fill(42);
431
432
arr.resize(5);
433
EXPECT_EQ(arr.size(), 5u);
434
EXPECT_EQ(arr.data(), original_data);
435
436
for (size_t i = 0; i < arr.size(); ++i)
437
EXPECT_EQ(arr[i], 42);
438
}
439
440
TEST(DynamicHeapArray, Deallocate)
441
{
442
DynamicHeapArray<int> arr(10);
443
EXPECT_FALSE(arr.empty());
444
445
arr.deallocate();
446
EXPECT_TRUE(arr.empty());
447
EXPECT_EQ(arr.size(), 0u);
448
EXPECT_EQ(arr.data(), nullptr);
449
}
450
451
TEST(DynamicHeapArray, AssignSpan)
452
{
453
DynamicHeapArray<int> arr;
454
int source[] = {1, 2, 3, 4, 5};
455
std::span<const int> sp(source);
456
457
arr.assign(sp);
458
EXPECT_EQ(arr.size(), 5u);
459
for (size_t i = 0; i < arr.size(); ++i)
460
EXPECT_EQ(arr[i], source[i]);
461
}
462
463
TEST(DynamicHeapArray, AssignBeginEnd)
464
{
465
DynamicHeapArray<int> arr;
466
int source[] = {10, 20, 30};
467
468
arr.assign(std::begin(source), std::end(source));
469
EXPECT_EQ(arr.size(), 3u);
470
for (size_t i = 0; i < arr.size(); ++i)
471
EXPECT_EQ(arr[i], source[i]);
472
}
473
474
TEST(DynamicHeapArray, AssignBeginCount)
475
{
476
DynamicHeapArray<int> arr;
477
int source[] = {100, 200, 300, 400};
478
479
arr.assign(source, 4);
480
EXPECT_EQ(arr.size(), 4u);
481
for (size_t i = 0; i < arr.size(); ++i)
482
EXPECT_EQ(arr[i], source[i]);
483
}
484
485
TEST(DynamicHeapArray, AssignCopy)
486
{
487
DynamicHeapArray<int> arr1(5);
488
for (size_t i = 0; i < arr1.size(); ++i)
489
arr1[i] = static_cast<int>(i * 3);
490
491
DynamicHeapArray<int> arr2;
492
arr2.assign(arr1);
493
494
EXPECT_EQ(arr2.size(), arr1.size());
495
for (size_t i = 0; i < arr1.size(); ++i)
496
EXPECT_EQ(arr2[i], arr1[i]);
497
EXPECT_NE(arr1.data(), arr2.data());
498
}
499
500
TEST(DynamicHeapArray, AssignMove)
501
{
502
DynamicHeapArray<int> arr1(5);
503
int* original_data = arr1.data();
504
for (size_t i = 0; i < arr1.size(); ++i)
505
arr1[i] = static_cast<int>(i * 3);
506
507
DynamicHeapArray<int> arr2;
508
arr2.assign(std::move(arr1));
509
510
EXPECT_EQ(arr2.size(), 5u);
511
EXPECT_EQ(arr2.data(), original_data);
512
EXPECT_EQ(arr1.size(), 0u);
513
EXPECT_EQ(arr1.data(), nullptr);
514
}
515
516
TEST(DynamicHeapArray, AssignEmpty)
517
{
518
DynamicHeapArray<int> arr(10);
519
arr.fill(42);
520
521
int* empty = nullptr;
522
arr.assign(empty, static_cast<size_t>(0));
523
524
EXPECT_TRUE(arr.empty());
525
EXPECT_EQ(arr.size(), 0u);
526
}
527
528
TEST(DynamicHeapArray, AssignSameSize)
529
{
530
DynamicHeapArray<int> arr(5);
531
arr.fill(10);
532
int* original_data = arr.data();
533
534
int source[] = {1, 2, 3, 4, 5};
535
arr.assign(source, 5);
536
537
// Should reuse existing buffer
538
EXPECT_EQ(arr.data(), original_data);
539
for (size_t i = 0; i < arr.size(); ++i)
540
EXPECT_EQ(arr[i], source[i]);
541
}
542
543
TEST(DynamicHeapArray, Span)
544
{
545
DynamicHeapArray<int> arr(5);
546
for (size_t i = 0; i < arr.size(); ++i)
547
arr[i] = static_cast<int>(i * 2);
548
549
std::span<int> sp = arr.span();
550
EXPECT_EQ(sp.size(), 5u);
551
EXPECT_EQ(sp.data(), arr.data());
552
553
for (size_t i = 0; i < sp.size(); ++i)
554
EXPECT_EQ(sp[i], static_cast<int>(i * 2));
555
}
556
557
TEST(DynamicHeapArray, SpanWithOffset)
558
{
559
DynamicHeapArray<int> arr(10);
560
for (size_t i = 0; i < arr.size(); ++i)
561
arr[i] = static_cast<int>(i);
562
563
std::span<int> sp = arr.span(3, 4);
564
EXPECT_EQ(sp.size(), 4u);
565
EXPECT_EQ(sp.data(), arr.data() + 3);
566
EXPECT_EQ(sp[0], 3);
567
EXPECT_EQ(sp[3], 6);
568
}
569
570
TEST(DynamicHeapArray, SpanWithOffsetClamp)
571
{
572
DynamicHeapArray<int> arr(10);
573
for (size_t i = 0; i < arr.size(); ++i)
574
arr[i] = static_cast<int>(i);
575
576
// Request more than available
577
std::span<int> sp = arr.span(7, 100);
578
EXPECT_EQ(sp.size(), 3u);
579
EXPECT_EQ(sp[0], 7);
580
EXPECT_EQ(sp[2], 9);
581
}
582
583
TEST(DynamicHeapArray, SpanWithOffsetOutOfRange)
584
{
585
DynamicHeapArray<int> arr(5);
586
std::span<int> sp = arr.span(10);
587
EXPECT_TRUE(sp.empty());
588
}
589
590
TEST(DynamicHeapArray, CSpan)
591
{
592
DynamicHeapArray<int> arr(5);
593
for (size_t i = 0; i < arr.size(); ++i)
594
arr[i] = static_cast<int>(i * 2);
595
596
const auto& carr = arr;
597
std::span<const int> csp = carr.cspan();
598
EXPECT_EQ(csp.size(), 5u);
599
EXPECT_EQ(csp.data(), carr.data());
600
}
601
602
TEST(DynamicHeapArray, CSpanWithOffset)
603
{
604
DynamicHeapArray<int> arr(10);
605
for (size_t i = 0; i < arr.size(); ++i)
606
arr[i] = static_cast<int>(i);
607
608
const auto& carr = arr;
609
std::span<const int> csp = carr.cspan(2, 3);
610
EXPECT_EQ(csp.size(), 3u);
611
EXPECT_EQ(csp[0], 2);
612
EXPECT_EQ(csp[2], 4);
613
}
614
615
TEST(DynamicHeapArray, CopyAssignment)
616
{
617
DynamicHeapArray<int> arr1(5);
618
for (size_t i = 0; i < arr1.size(); ++i)
619
arr1[i] = static_cast<int>(i * 2);
620
621
DynamicHeapArray<int> arr2;
622
arr2 = arr1;
623
624
EXPECT_EQ(arr2.size(), arr1.size());
625
EXPECT_NE(arr2.data(), arr1.data());
626
for (size_t i = 0; i < arr1.size(); ++i)
627
EXPECT_EQ(arr2[i], arr1[i]);
628
}
629
630
TEST(DynamicHeapArray, MoveAssignment)
631
{
632
DynamicHeapArray<int> arr1(5);
633
int* original_data = arr1.data();
634
arr1.fill(42);
635
636
DynamicHeapArray<int> arr2;
637
arr2 = std::move(arr1);
638
639
EXPECT_EQ(arr2.data(), original_data);
640
EXPECT_EQ(arr2.size(), 5u);
641
EXPECT_EQ(arr1.size(), 0u);
642
EXPECT_EQ(arr1.data(), nullptr);
643
644
for (size_t i = 0; i < arr2.size(); ++i)
645
EXPECT_EQ(arr2[i], 42);
646
}
647
648
TEST(DynamicHeapArray, AlignedAllocation)
649
{
650
constexpr size_t alignment = 64;
651
DynamicHeapArray<int, alignment> arr(16);
652
653
uintptr_t addr = reinterpret_cast<uintptr_t>(arr.data());
654
EXPECT_EQ(addr % alignment, 0u);
655
}
656
657
TEST(DynamicHeapArray, AlignedResize)
658
{
659
constexpr size_t alignment = 64;
660
DynamicHeapArray<int, alignment> arr(8);
661
arr.fill(42);
662
663
arr.resize(32);
664
665
uintptr_t addr = reinterpret_cast<uintptr_t>(arr.data());
666
EXPECT_EQ(addr % alignment, 0u);
667
668
// Original data preserved
669
for (size_t i = 0; i < 8; ++i)
670
EXPECT_EQ(arr[i], 42);
671
}
672
673
TEST(DynamicHeapArray, DifferentTypes)
674
{
675
DynamicHeapArray<double> arr(3);
676
arr[0] = 1.5;
677
arr[1] = 2.5;
678
arr[2] = 3.5;
679
680
EXPECT_DOUBLE_EQ(arr[0], 1.5);
681
EXPECT_DOUBLE_EQ(arr[1], 2.5);
682
EXPECT_DOUBLE_EQ(arr[2], 3.5);
683
EXPECT_EQ(arr.size_bytes(), 3u * sizeof(double));
684
}
685
686
TEST(DynamicHeapArray, RangeBasedFor)
687
{
688
DynamicHeapArray<int> arr(5);
689
int val = 0;
690
for (auto& elem : arr)
691
elem = val++;
692
693
val = 0;
694
for (const auto& elem : arr)
695
{
696
EXPECT_EQ(elem, val);
697
++val;
698
}
699
}
700
701
TEST(DynamicHeapArray, ByteArray)
702
{
703
DynamicHeapArray<std::byte> arr(16);
704
for (size_t i = 0; i < arr.size(); ++i)
705
arr[i] = static_cast<std::byte>(i);
706
707
EXPECT_EQ(arr.size(), 16u);
708
EXPECT_EQ(arr.size_bytes(), 16u);
709
710
for (size_t i = 0; i < arr.size(); ++i)
711
EXPECT_EQ(arr[i], static_cast<std::byte>(i));
712
}
713
714
TEST(DynamicHeapArray, EmptyRangeConstruction)
715
{
716
int* empty = nullptr;
717
DynamicHeapArray<int> arr(empty, empty);
718
719
EXPECT_TRUE(arr.empty());
720
EXPECT_EQ(arr.size(), 0u);
721
EXPECT_EQ(arr.data(), nullptr);
722
}
723
724
TEST(DynamicHeapArray, EmptyCountConstruction)
725
{
726
int* ptr = nullptr;
727
DynamicHeapArray<int> arr(ptr, static_cast<size_t>(0));
728
729
EXPECT_TRUE(arr.empty());
730
EXPECT_EQ(arr.size(), 0u);
731
EXPECT_EQ(arr.data(), nullptr);
732
}
733
734
TEST(FixedHeapArray, CopyAssignmentCopiesWrongDirection)
735
{
736
FixedHeapArray<int, 4> src;
737
FixedHeapArray<int, 4> dst;
738
739
src[0] = 1;
740
src[1] = 2;
741
src[2] = 3;
742
src[3] = 4;
743
dst[0] = 0;
744
dst[1] = 0;
745
dst[2] = 0;
746
dst[3] = 0;
747
748
dst = src; // Should copy src -> dst
749
750
// After assignment, dst should have src's values
751
EXPECT_EQ(dst[0], 1);
752
EXPECT_EQ(dst[1], 2);
753
EXPECT_EQ(dst[2], 3);
754
EXPECT_EQ(dst[3], 4);
755
}
756
757
TEST(FixedHeapArray, EqualityOperatorMissingReturnTrue)
758
{
759
FixedHeapArray<int, 4> a;
760
FixedHeapArray<int, 4> b;
761
762
a[0] = 1;
763
a[1] = 2;
764
a[2] = 3;
765
a[3] = 4;
766
b[0] = 1;
767
b[1] = 2;
768
b[2] = 3;
769
b[3] = 4;
770
771
// Both arrays have identical content, should return true
772
EXPECT_TRUE(a == b);
773
}
774
775
TEST(FixedHeapArray, InequalityOperatorReturnTrue)
776
{
777
FixedHeapArray<int, 4> a;
778
FixedHeapArray<int, 4> b;
779
780
a[0] = 1;
781
a[1] = 2;
782
a[2] = 3;
783
a[3] = 4;
784
b[0] = 1;
785
b[1] = 2;
786
b[2] = 3;
787
b[3] = 5; // Last element differs
788
789
// Arrays differ, inequality should return true
790
EXPECT_TRUE(a != b);
791
}
792
793
TEST(DynamicHeapArray, EqualityOperatorReturnTrue)
794
{
795
DynamicHeapArray<int> a(4);
796
DynamicHeapArray<int> b(4);
797
798
a[0] = 1;
799
a[1] = 2;
800
a[2] = 3;
801
a[3] = 4;
802
b[0] = 1;
803
b[1] = 2;
804
b[2] = 3;
805
b[3] = 4;
806
807
// Both arrays have identical content, should return true
808
EXPECT_TRUE(a == b);
809
}
810
811
TEST(DynamicHeapArray, EqualityOperatorWhenSizesDiffer)
812
{
813
DynamicHeapArray<int> a(4);
814
DynamicHeapArray<int> b(8);
815
816
// Different sizes should NOT be equal
817
EXPECT_FALSE(a == b);
818
}
819
820
TEST(DynamicHeapArray, InequalityOperatorWhenSizesDiffer)
821
{
822
DynamicHeapArray<int> a(4);
823
DynamicHeapArray<int> b(8);
824
825
// Different sizes should be not-equal
826
EXPECT_TRUE(a != b);
827
}
828
829