|
18 | 18 | #include <boost/test/unit_test.hpp> |
19 | 19 | #include <boost/property_tree/ptree.hpp> |
20 | 20 | #include <cstdlib> |
| 21 | +#include <deque> |
21 | 22 | #include <filesystem> |
| 23 | +#include <list> |
| 24 | +#include <set> |
| 25 | +#include <unordered_set> |
| 26 | +#include <vector> |
22 | 27 |
|
23 | 28 | #include "CommonUtils/ConfigurableParamTest.h" |
24 | 29 |
|
@@ -200,6 +205,40 @@ BOOST_AUTO_TEST_CASE(ConfigurableParam_ContainerParserMap) |
200 | 205 | BOOST_CHECK_EQUAL(m["beta"], 0.3); |
201 | 206 | } |
202 | 207 |
|
| 208 | +BOOST_AUTO_TEST_CASE(ConfigurableParam_ContainerParserSetAndSequenceTypes) |
| 209 | +{ |
| 210 | + // All non-map containers go through the single parseSequence path. Verify the |
| 211 | + // set containers (which previously took a separate, doubly-parsing parseSet |
| 212 | + // branch) still parse and de-duplicate correctly. |
| 213 | + auto se = ContainerParser::parse<std::set<int>>("[2,3,2,3,2,5]"); |
| 214 | + BOOST_CHECK_EQUAL(se.size(), 3); |
| 215 | + BOOST_CHECK(se == (std::set<int>{2, 3, 5})); |
| 216 | + |
| 217 | + auto us = ContainerParser::parse<std::unordered_set<int>>("[1,2,3,3]"); |
| 218 | + BOOST_CHECK_EQUAL(us.size(), 3); |
| 219 | + BOOST_CHECK(us.count(1) && us.count(2) && us.count(3)); |
| 220 | + |
| 221 | + auto li = ContainerParser::parse<std::list<int>>("[7,8]"); |
| 222 | + BOOST_CHECK(li == (std::list<int>{7, 8})); |
| 223 | + |
| 224 | + auto dq = ContainerParser::parse<std::deque<int>>("[9,10]"); |
| 225 | + BOOST_CHECK(dq == (std::deque<int>{9, 10})); |
| 226 | +} |
| 227 | + |
| 228 | +BOOST_AUTO_TEST_CASE(ConfigurableParam_ContainerParserRejectsEmptyToken) |
| 229 | +{ |
| 230 | + // A stray delimiter must be reported, not silently swallowed: "[1,,3]" used to |
| 231 | + // parse to a 2-element vector with no error, masking malformed configuration. |
| 232 | + BOOST_CHECK_THROW(ContainerParser::parse<std::vector<int>>("[1,,3]"), std::exception); |
| 233 | + BOOST_CHECK_THROW(ContainerParser::parse<std::vector<int>>("[1,2,]"), std::exception); |
| 234 | + // ... and on the map side, an empty value/entry is rejected too. |
| 235 | + BOOST_CHECK_THROW((ContainerParser::parse<std::map<int, int>>("{1:2,,3:4}")), std::exception); |
| 236 | + BOOST_CHECK_THROW((ContainerParser::parse<std::map<int, int>>("{1:}")), std::exception); |
| 237 | + // Well-formed input is unaffected. |
| 238 | + auto v = ContainerParser::parse<std::vector<int>>("[1,2,3]"); |
| 239 | + BOOST_CHECK_EQUAL(v.size(), 3); |
| 240 | +} |
| 241 | + |
203 | 242 | BOOST_AUTO_TEST_CASE(ConfigurableParam_DamerauLevenshteinDistance) |
204 | 243 | { |
205 | 244 | BOOST_CHECK_EQUAL(damerauLevenshteinDistance("TestParam.iValue", "TestParam.iValue"), 0); |
@@ -255,5 +294,5 @@ BOOST_AUTO_TEST_CASE(ConfigurableParam_Container_FileIO_ROOT) |
255 | 294 | for (const auto& s : set) { |
256 | 295 | BOOST_CHECK(tp.set.contains(s)); |
257 | 296 | } |
258 | | - // std::remove(testFileName.c_str()); |
| 297 | + std::remove(testFileName.c_str()); |
259 | 298 | } |
0 commit comments