Skip to content

Commit 006edbf

Browse files
committed
Validate GroupSelector input before expanding to strata.
1 parent 6d8a3ce commit 006edbf

2 files changed

Lines changed: 34 additions & 0 deletions

File tree

inst/include/population_dynamics/population/subpopulation.hpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,26 @@ struct PartitionSpec {
114114
return strata;
115115
}
116116

117+
if (group.level.size() != axes.size()) {
118+
throw std::invalid_argument(
119+
"PartitionSpec::expand_group_to_strata: group.level size " +
120+
std::to_string(group.level.size()) +
121+
" does not match number of axes " + std::to_string(axes.size()));
122+
}
123+
for (size_t i = 0; i < axes.size(); ++i) {
124+
if (group.level[i] == GroupSelector::kWildcard) {
125+
continue;
126+
}
127+
if (group.level[i] < 0 ||
128+
static_cast<size_t>(group.level[i]) >= axes[i].size()) {
129+
throw std::invalid_argument(
130+
"PartitionSpec::expand_group_to_strata: level index " +
131+
std::to_string(group.level[i]) + " out of bounds for axis " +
132+
std::to_string(i) + " (size " + std::to_string(axes[i].size()) +
133+
")");
134+
}
135+
}
136+
117137
std::vector<size_t> current_levels(axes.size(), 0);
118138
expand_group_to_strata_recursive(group, 0, &current_levels, &strata);
119139
return strata;

tests/gtest/test_population_Subpopulation.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,20 @@ TEST(PartitionSpec, ExpandGroupToStrataSelectsSingleStratum) {
5757
(std::vector<size_t>{0}));
5858
}
5959

60+
TEST(PartitionSpec, ExpandGroupToStrataRejectsMismatchedGroupSize) {
61+
fims_popdy::PartitionSpec spec = fims_popdy::MakeDefaultSexPartitionSpec();
62+
fims_popdy::GroupSelector group;
63+
group.level = {0, 1};
64+
EXPECT_THROW(spec.expand_group_to_strata(group), std::invalid_argument);
65+
}
66+
67+
TEST(PartitionSpec, ExpandGroupToStrataRejectsOutOfBoundsLevel) {
68+
fims_popdy::PartitionSpec spec = fims_popdy::MakeDefaultSexPartitionSpec();
69+
fims_popdy::GroupSelector group;
70+
group.level = {2};
71+
EXPECT_THROW(spec.expand_group_to_strata(group), std::invalid_argument);
72+
}
73+
6074
TEST(IndexLayout, FoldedIndicesMatchYearAgeAndStratum) {
6175
fims_popdy::IndexLayout layout;
6276
layout.n_strata = 2;

0 commit comments

Comments
 (0)