Skip to content

Commit 3bc11d8

Browse files
committed
adding missing file
1 parent 5fff7d4 commit 3bc11d8

File tree

1 file changed

+136
-0
lines changed

1 file changed

+136
-0
lines changed
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
#include <catch2/catch_test_macros.hpp>
2+
3+
#include <vector>
4+
#include <cstdlib>
5+
6+
#include "utils/subset.hpp"
7+
8+
using namespace libtokamap;
9+
10+
TEST_CASE("Parsing of slice strings", "[slice]") {
11+
12+
constexpr size_t dim_size = 10;
13+
14+
SECTION("select single element") {
15+
std::vector<size_t> shape = {dim_size};
16+
auto slices = libtokamap::parse_slices("[3]", shape);
17+
18+
REQUIRE(slices.size() == 1);
19+
REQUIRE(slices[0].start() == 3);
20+
REQUIRE(slices[0].stop() == 4);
21+
REQUIRE(slices[0].stride() == 1);
22+
}
23+
24+
SECTION("select single element outside of range throws exception") {
25+
std::vector<size_t> shape = {dim_size};
26+
REQUIRE_THROWS(libtokamap::parse_slices("[11]", shape));
27+
}
28+
29+
SECTION("select all of dimension") {
30+
std::vector<size_t> shape = {dim_size};
31+
auto slices = libtokamap::parse_slices("[:]", shape);
32+
33+
REQUIRE(slices.size() == 1);
34+
REQUIRE(slices[0].start() == 0);
35+
REQUIRE(slices[0].stop() == dim_size);
36+
REQUIRE(slices[0].stride() == 1);
37+
}
38+
39+
SECTION("select range of dimension") {
40+
std::vector<size_t> shape = {dim_size};
41+
auto slices = libtokamap::parse_slices("[3:7]", shape);
42+
43+
REQUIRE(slices.size() == 1);
44+
REQUIRE(slices[0].start() == 3);
45+
REQUIRE(slices[0].stop() == 7);
46+
REQUIRE(slices[0].stride() == 1);
47+
}
48+
49+
SECTION("select range of dimension using negative indices") {
50+
std::vector<size_t> shape = {dim_size};
51+
auto slices = libtokamap::parse_slices("[3:-2]", shape);
52+
53+
REQUIRE(slices.size() == 1);
54+
REQUIRE(slices[0].start() == 3);
55+
REQUIRE(slices[0].stop() == 9);
56+
REQUIRE(slices[0].stride() == 1);
57+
}
58+
59+
SECTION("select all with stride") {
60+
std::vector<size_t> shape = {dim_size};
61+
auto slices = libtokamap::parse_slices("[::2]", shape);
62+
63+
REQUIRE(slices.size() == 1);
64+
REQUIRE(slices[0].start() == 0);
65+
REQUIRE(slices[0].stop() == dim_size);
66+
REQUIRE(slices[0].stride() == 2);
67+
}
68+
69+
SECTION("select range with stride") {
70+
std::vector<size_t> shape = {dim_size};
71+
auto slices = libtokamap::parse_slices("[3:7:2]", shape);
72+
73+
REQUIRE(slices.size() == 1);
74+
REQUIRE(slices[0].start() == 3);
75+
REQUIRE(slices[0].stop() == 7);
76+
REQUIRE(slices[0].stride() == 2);
77+
}
78+
79+
SECTION("select range with negative stride") {
80+
std::vector<size_t> shape = {dim_size};
81+
auto slices = libtokamap::parse_slices("[3:7:-1]", shape);
82+
83+
REQUIRE(slices.size() == 1);
84+
REQUIRE(slices[0].start() == 3);
85+
REQUIRE(slices[0].stop() == 7);
86+
REQUIRE(slices[0].stride() == -1);
87+
}
88+
89+
SECTION("select too large range throws exception") {
90+
std::vector<size_t> shape = {dim_size};
91+
REQUIRE_THROWS(libtokamap::parse_slices("[3:11]", shape));
92+
}
93+
94+
SECTION("select all for each dimension") {
95+
std::vector<size_t> shape = {dim_size, dim_size, dim_size};
96+
auto slices = libtokamap::parse_slices("[:][:][:]", shape);
97+
98+
REQUIRE(slices.size() == 3);
99+
100+
REQUIRE(slices[0].start() == 0);
101+
REQUIRE(slices[0].stop() == 10);
102+
REQUIRE(slices[0].stride() == 1);
103+
104+
REQUIRE(slices[1].start() == 0);
105+
REQUIRE(slices[1].stop() == 10);
106+
REQUIRE(slices[1].stride() == 1);
107+
108+
REQUIRE(slices[2].start() == 0);
109+
REQUIRE(slices[2].stop() == 10);
110+
REQUIRE(slices[2].stride() == 1);
111+
}
112+
113+
SECTION("select range for each dimension") {
114+
std::vector<size_t> shape = {dim_size, dim_size, dim_size};
115+
auto slices = libtokamap::parse_slices("[1:3][2:4][3:5]", shape);
116+
117+
REQUIRE(slices.size() == 3);
118+
119+
REQUIRE(slices[0].start() == 1);
120+
REQUIRE(slices[0].stop() == 3);
121+
REQUIRE(slices[0].stride() == 1);
122+
123+
REQUIRE(slices[1].start() == 2);
124+
REQUIRE(slices[1].stop() == 4);
125+
REQUIRE(slices[1].stride() == 1);
126+
127+
REQUIRE(slices[2].start() == 3);
128+
REQUIRE(slices[2].stop() == 5);
129+
REQUIRE(slices[2].stride() == 1);
130+
}
131+
132+
SECTION("selecting more ranges than dimensions throws exception") {
133+
std::vector<size_t> shape = {dim_size, dim_size};
134+
REQUIRE_THROWS(libtokamap::parse_slices("[1:3][2:4][3:5]", shape));
135+
}
136+
}

0 commit comments

Comments
 (0)