CbmRoot
Loading...
Searching...
No Matches
_GTestPartitionedSpan.cxx
Go to the documentation of this file.
1/* Copyright (C) 2023-2025 FIAS Frankfurt Institute for Advanced Studies, Frankfurt / Main
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Felix Weiglhofer [committer] */
4
5#include "PartitionedSpan.h"
6#include "PartitionedVector.h"
7
8#include <gtest/gtest.h>
9
12
15
16template<typename T>
17void EXPECT_CONTAINER_EQ(gsl::span<T> a, std::vector<int32_t> b)
18{
19 EXPECT_EQ(a.size(), b.size());
20 for (size_t i = 0; i < a.size(); ++i) {
21 EXPECT_EQ(a[i], b[i]);
22 }
23}
24
25class PartitionedSpanTest : public ::testing::Test {
26 protected:
27 std::vector<int32_t> fData;
28 std::vector<size_t> fSizes;
29 std::vector<size_t> fOffsets;
30 std::vector<size_t> fOffsetsInvalid;
31 std::vector<uint32_t> fAddresses;
32 std::vector<uint32_t> fAddressesInvalid;
33
34 void SetUp() override
35 {
36 fData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
37 fSizes = {2, 4, 3};
38 fOffsets = {0, 2, 6, 9};
39 fOffsetsInvalid = {0, 2, 6};
40 fAddresses = {0x0, 0x100, 0x200};
41 fAddressesInvalid = {0x0, 0x100};
42 }
43
44 template<typename T> // T is either int32_t or 'const int32_t'
45 void Ensure(const PartitionedSpan<T>& vec)
46 {
47 EXPECT_EQ(vec.NElements(), 9);
48 EXPECT_EQ(vec.NPartitions(), 3);
49
50 EXPECT_EQ(vec.Size(0), 2);
51
52 EXPECT_EQ(vec.Size(0), 2);
53 EXPECT_EQ(vec[0].size(), 2);
54 EXPECT_EQ(vec.Address(0), 0x0);
55 EXPECT_CONTAINER_EQ(vec[0], {1, 2});
56
57 auto part = vec.Partition(0);
58 EXPECT_EQ(part.first.size(), vec.Size(0));
59 EXPECT_EQ(part.second, vec.Address(0));
60
61 EXPECT_EQ(vec.Size(1), 4);
62 EXPECT_EQ(vec[1].size(), 4);
63 EXPECT_EQ(vec.Address(1), 0x100);
64 EXPECT_CONTAINER_EQ(vec[1], {3, 4, 5, 6});
65
66 part = vec.Partition(1);
67 EXPECT_EQ(part.first.size(), vec.Size(1));
68 EXPECT_EQ(part.second, vec.Address(1));
69
70 EXPECT_EQ(vec.Size(2), 3);
71 EXPECT_EQ(vec[2].size(), 3);
72 EXPECT_EQ(vec.Address(2), 0x200);
73 EXPECT_CONTAINER_EQ(vec[2], {7, 8, 9});
74
75 part = vec.Partition(2);
76 EXPECT_EQ(part.first.size(), vec.Size(2));
77 EXPECT_EQ(part.second, vec.Address(2));
78 }
79};
80
81TEST_F(PartitionedSpanTest, IsDefaultConstructable)
82{
84 EXPECT_EQ(vec.NElements(), 0);
85 EXPECT_EQ(vec.NPartitions(), 0);
86}
87
88TEST_F(PartitionedSpanTest, CanCreateWithPartitions)
89{
90 PartitionedSpan vec(fData, fOffsets, fAddresses);
91 Ensure(vec);
92}
93
94TEST_F(PartitionedSpanTest, IsConstructableFromPartitionedVector)
95{
96 PartitionedVector vec(std::move(fData), fSizes, fAddresses);
97
98 PartitionedSpan span(vec);
99 Ensure(span);
100}
101
102TEST_F(PartitionedSpanTest, IsCopyConstructable)
103{
104 PartitionedSpan vec(fData, fOffsets, fAddresses);
105
106 PartitionedSpan vecCopy(vec);
107 Ensure(vecCopy);
108}
109
110TEST_F(PartitionedSpanTest, IsConstCopyConstructable)
111{
112 PartitionedSpan vec(fData, fOffsets, fAddresses);
113
115 Ensure(vecCopy);
116}
117
118TEST_F(PartitionedSpanTest, ThrowsOnNumAddressesMismatchesNumPartions)
119{
120 EXPECT_THROW(PartitionedSpan vec(fData, fOffsets, fAddressesInvalid), std::runtime_error);
121}
122
123TEST_F(PartitionedSpanTest, ThrowsOnOffsetsMismatchesDataSize)
124{
125 EXPECT_THROW(PartitionedSpan vec(fData, fOffsetsInvalid, fAddresses), std::runtime_error);
126}
127
128TEST_F(PartitionedSpanTest, ThrowsOnOutOfBounds)
129{
130 PartitionedSpan vec(fData, fOffsets, fAddresses);
131
132 EXPECT_THROW(vec[3], std::out_of_range);
133 EXPECT_THROW(vec.Partition(3), std::out_of_range);
134 EXPECT_THROW(vec.Address(3), std::out_of_range);
135 EXPECT_THROW(vec.Size(3), std::out_of_range);
136}
static constexpr size_t size()
Definition KfSimdPseudo.h:2
void EXPECT_CONTAINER_EQ(gsl::span< T > a, std::vector< int32_t > b)
TEST_F(PartitionedSpanTest, IsDefaultConstructable)
std::vector< uint32_t > fAddressesInvalid
std::vector< size_t > fSizes
std::vector< size_t > fOffsets
std::vector< size_t > fOffsetsInvalid
std::vector< int32_t > fData
std::vector< uint32_t > fAddresses
void Ensure(const PartitionedSpan< T > &vec)
std::pair< gsl::span< T >, uint32_t > Partition(size_t i) const
size_t NPartitions() const
size_t Size(size_t i) const
size_t NElements() const
uint32_t Address(size_t i) const
A vector that is partitioned into multiple subvectors.