10static void checkTrimRight(
const string& s,
char c,
const string& expected)
14 CHECK(test == expected);
18 CHECK(ref == expected);
20static void checkTrimRight(
const string& s,
const char* chars,
const string& expected)
24 CHECK(test == expected);
28 CHECK(ref == expected);
31static void checkTrimLeft(
const string& s,
char c,
const string& expected)
35 CHECK(test == expected);
39 CHECK(ref == expected);
41static void checkTrimLeft(
const string& s,
const char* chars,
const string& expected)
45 CHECK(test == expected);
49 CHECK(ref == expected);
52static void checkSplitOnFirst(
const string& s,
const string& first,
const string& last)
56 static_assert(std::is_same_v<
decltype(f1), std::string_view>);
57 static_assert(std::is_same_v<
decltype(f2), std::string_view>);
58 static_assert(std::is_same_v<
decltype(l1), std::string_view>);
59 static_assert(std::is_same_v<
decltype(l2), std::string_view>);
66static void checkSplitOnLast(
const string& s,
const string& first,
const string& last)
70 static_assert(std::is_same_v<
decltype(f1), std::string_view>);
71 static_assert(std::is_same_v<
decltype(f2), std::string_view>);
72 static_assert(std::is_same_v<
decltype(l1), std::string_view>);
73 static_assert(std::is_same_v<
decltype(l2), std::string_view>);
80static void checkSplit(
const string& s,
const std::vector<string_view> expected)
84 std::vector<string_view> result;
88 CHECK(result == expected);
91static void checkParseRange(
const string& s,
const std::vector<unsigned>& expected)
94 std::vector<unsigned> result;
95 parsed.foreachSetBit([&](
size_t i) { result.push_back(narrow<unsigned>(i)); });
96 CHECK(result == expected);
102 SECTION(
"stringTo<int>") {
103 std::optional<int> NOK;
104 using OK = std::optional<int>;
107 CHECK(StringOp::stringTo<int>(
"") == NOK);
110 CHECK(StringOp::stringTo<int>(
"0") ==
OK(0));
111 CHECK(StringOp::stringTo<int>(
"03") ==
OK(3));
112 CHECK(StringOp::stringTo<int>(
"097") ==
OK(97));
113 CHECK(StringOp::stringTo<int>(
"12") ==
OK(12));
115 CHECK(StringOp::stringTo<int>(
"-0") ==
OK(0));
116 CHECK(StringOp::stringTo<int>(
"-11") ==
OK(-11));
119 CHECK(StringOp::stringTo<int>(
"-") == NOK);
120 CHECK(StringOp::stringTo<int>(
"zz") == NOK);
121 CHECK(StringOp::stringTo<int>(
"+") == NOK);
122 CHECK(StringOp::stringTo<int>(
"+12") == NOK);
125 CHECK(StringOp::stringTo<int>(
" 14") == NOK);
126 CHECK(StringOp::stringTo<int>(
"15 ") == NOK);
127 CHECK(StringOp::stringTo<int>(
"15bar") == NOK);
130 CHECK(StringOp::stringTo<int>(
"0x1a") ==
OK(26));
131 CHECK(StringOp::stringTo<int>(
"0x1B") ==
OK(27));
132 CHECK(StringOp::stringTo<int>(
"0X1c") ==
OK(28));
133 CHECK(StringOp::stringTo<int>(
"0X1D") ==
OK(29));
134 CHECK(StringOp::stringTo<int>(
"-0x100") ==
OK(-256));
135 CHECK(StringOp::stringTo<int>(
"0x") == NOK);
136 CHECK(StringOp::stringTo<int>(
"0x12g") == NOK);
137 CHECK(StringOp::stringTo<int>(
"0x-123") == NOK);
140 CHECK(StringOp::stringTo<int>(
"0b") == NOK);
141 CHECK(StringOp::stringTo<int>(
"0b2") == NOK);
142 CHECK(StringOp::stringTo<int>(
"0b100") ==
OK(4));
143 CHECK(StringOp::stringTo<int>(
"-0B1001") ==
OK(-9));
144 CHECK(StringOp::stringTo<int>(
"0b-11") == NOK);
147 CHECK(StringOp::stringTo<int>(
"-2147483649") == NOK);
148 CHECK(StringOp::stringTo<int>(
"2147483648") == NOK);
149 CHECK(StringOp::stringTo<int>(
"999999999999999") == NOK);
150 CHECK(StringOp::stringTo<int>(
"-999999999999999") == NOK);
152 CHECK(StringOp::stringTo<int>(
"-2147483648") ==
OK(-2147483648));
153 CHECK(StringOp::stringTo<int>(
"2147483647") ==
OK(2147483647));
154 CHECK(StringOp::stringTo<int>(
"-0x80000000") ==
OK(-2147483648));
155 CHECK(StringOp::stringTo<int>(
"0x7fffffff") ==
OK(2147483647));
157 SECTION(
"stringTo<unsigned>") {
158 std::optional<unsigned> NOK;
159 using OK = std::optional<unsigned>;
162 CHECK(StringOp::stringTo<unsigned>(
"") == NOK);
165 CHECK(StringOp::stringTo<unsigned>(
"0") ==
OK(0));
166 CHECK(StringOp::stringTo<unsigned>(
"08") ==
OK(8));
167 CHECK(StringOp::stringTo<unsigned>(
"0123") ==
OK(123));
168 CHECK(StringOp::stringTo<unsigned>(
"13") ==
OK(13));
170 CHECK(StringOp::stringTo<unsigned>(
"-0") == NOK);
171 CHECK(StringOp::stringTo<unsigned>(
"-12") == NOK);
174 CHECK(StringOp::stringTo<unsigned>(
"-") == NOK);
175 CHECK(StringOp::stringTo<unsigned>(
"zz") == NOK);
176 CHECK(StringOp::stringTo<unsigned>(
"+") == NOK);
177 CHECK(StringOp::stringTo<unsigned>(
"+12") == NOK);
180 CHECK(StringOp::stringTo<unsigned>(
" 16") == NOK);
181 CHECK(StringOp::stringTo<unsigned>(
"17 ") == NOK);
182 CHECK(StringOp::stringTo<unsigned>(
"17qux") == NOK);
185 CHECK(StringOp::stringTo<unsigned>(
"0x2a") ==
OK(42));
186 CHECK(StringOp::stringTo<unsigned>(
"0x2B") ==
OK(43));
187 CHECK(StringOp::stringTo<unsigned>(
"0X2c") ==
OK(44));
188 CHECK(StringOp::stringTo<unsigned>(
"0X2D") ==
OK(45));
189 CHECK(StringOp::stringTo<unsigned>(
"0x") == NOK);
190 CHECK(StringOp::stringTo<unsigned>(
"-0x456") == NOK);
191 CHECK(StringOp::stringTo<unsigned>(
"0x-123") == NOK);
194 CHECK(StringOp::stringTo<unsigned>(
"0b1100") ==
OK(12));
195 CHECK(StringOp::stringTo<unsigned>(
"0B1010") ==
OK(10));
196 CHECK(StringOp::stringTo<unsigned>(
"0b") == NOK);
197 CHECK(StringOp::stringTo<unsigned>(
"-0b101") == NOK);
198 CHECK(StringOp::stringTo<unsigned>(
"0b2") == NOK);
199 CHECK(StringOp::stringTo<unsigned>(
"0b-11") == NOK);
202 CHECK(StringOp::stringTo<unsigned>(
"4294967296") == NOK);
203 CHECK(StringOp::stringTo<unsigned>(
"999999999999999") == NOK);
205 CHECK(StringOp::stringTo<unsigned>(
"4294967295") ==
OK(4294967295));
206 CHECK(StringOp::stringTo<unsigned>(
"0xffffffff") ==
OK(4294967295));
209 SECTION(
"stringToBool") {
235 SECTION(
"trimRight") {
236 checkTrimRight(
"",
' ',
"");
237 checkTrimRight(
" ",
' ',
"");
238 checkTrimRight(
"foo",
' ',
"foo");
239 checkTrimRight(
" foo",
' ',
" foo");
240 checkTrimRight(
"foo ",
' ',
"foo");
242 checkTrimRight(
"",
"o ",
"");
243 checkTrimRight(
" o ",
"o ",
"");
244 checkTrimRight(
"foobar",
"o ",
"foobar");
245 checkTrimRight(
" foobar",
"o ",
" foobar");
246 checkTrimRight(
"foo ",
"o ",
"f");
248 SECTION(
"trimLeft") {
249 checkTrimLeft(
"",
' ',
"");
250 checkTrimLeft(
" ",
' ',
"");
251 checkTrimLeft(
"foo",
' ',
"foo");
252 checkTrimLeft(
"foo ",
' ',
"foo ");
253 checkTrimLeft(
" foo",
' ',
"foo");
255 checkTrimLeft(
"",
"f ",
"");
256 checkTrimLeft(
" f ",
"f ",
"");
257 checkTrimLeft(
"foo",
"f ",
"oo");
258 checkTrimLeft(
"barfoo ",
"f ",
"barfoo ");
259 checkTrimLeft(
" foo",
"f ",
"oo");
261 SECTION(
"splitOnFirst") {
262 checkSplitOnFirst(
"",
"",
"");
263 checkSplitOnFirst(
"-",
"",
"");
264 checkSplitOnFirst(
"foo-",
"foo",
"");
265 checkSplitOnFirst(
"-foo",
"",
"foo");
266 checkSplitOnFirst(
"foo-bar",
"foo",
"bar");
267 checkSplitOnFirst(
"foo-bar-qux",
"foo",
"bar-qux");
268 checkSplitOnFirst(
"-bar-qux",
"",
"bar-qux");
269 checkSplitOnFirst(
"foo-bar-",
"foo",
"bar-");
271 SECTION(
"splitOnLast") {
272 checkSplitOnLast(
"",
"",
"");
273 checkSplitOnLast(
"-",
"",
"");
274 checkSplitOnLast(
"foo-",
"foo",
"");
275 checkSplitOnLast(
"-foo",
"",
"foo");
276 checkSplitOnLast(
"foo-bar",
"foo",
"bar");
277 checkSplitOnLast(
"foo-bar-qux",
"foo-bar",
"qux");
278 checkSplitOnLast(
"-bar-qux",
"-bar",
"qux");
279 checkSplitOnLast(
"foo-bar-",
"foo-bar",
"");
283 checkSplit(
"-", {
""});
284 checkSplit(
"foo-", {
"foo"});
285 checkSplit(
"-foo", {
"",
"foo"});
286 checkSplit(
"foo-bar", {
"foo",
"bar"});
287 checkSplit(
"foo-bar-qux", {
"foo",
"bar",
"qux"});
288 checkSplit(
"-bar-qux", {
"",
"bar",
"qux"});
289 checkSplit(
"foo-bar-", {
"foo",
"bar"});
291 SECTION(
"parseRange") {
292 checkParseRange(
"", {});
293 checkParseRange(
"5", {5});
294 checkParseRange(
"5,8", {5,8});
295 checkParseRange(
"5,5", {5});
296 checkParseRange(
"5-7", {5,6,7});
297 checkParseRange(
"7-5", {5,6,7});
298 checkParseRange(
"5-7,19", {5,6,7,19});
299 checkParseRange(
"15,5-7", {5,6,7,15});
300 checkParseRange(
"6,5-7", {5,6,7});
301 checkParseRange(
"5-8,10-12", {5,6,7,8,10,11,12});
302 checkParseRange(
"5-9,6-10", {5,6,7,8,9,10});
309 SECTION(
"caseless") {
311 CHECK( op(
"abc",
"xyz"));
312 CHECK(!op(
"xyz",
"abc"));
313 CHECK(!op(
"abc",
"abc"));
314 CHECK( op(
"ABC",
"xyz"));
315 CHECK(!op(
"xyz",
"ABC"));
316 CHECK(!op(
"ABC",
"abc"));
317 CHECK( op(
"aBC",
"Xyz"));
318 CHECK(!op(
"xYz",
"AbC"));
319 CHECK(!op(
"ABc",
"abC"));
321 CHECK( op(
"abc",
"ABCdef"));
322 CHECK(!op(
"AbcDef",
"AbC"));
326 CHECK( op(
"abc",
"abc"));
327 CHECK( op(
"abc",
"ABC"));
328 CHECK(!op(
"abc",
"xyz"));
329 CHECK(!op(
"ab",
"abc"));
330 CHECK(!op(
"ab",
"ABC"));
331 CHECK(!op(
"abc",
"ab"));
332 CHECK(!op(
"abc",
"AB"));
void test(const IterableBitSet< N > &s, std::initializer_list< size_t > list)
IterableBitSet< 64 > parseRange(string_view str, unsigned min, unsigned max)
bool stringToBool(string_view str)
std::pair< string_view, string_view > splitOnLast(string_view str, string_view chars)
void trimRight(string &str, const char *chars)
std::pair< string_view, string_view > splitOnFirst(string_view str, string_view chars)
void trimLeft(string &str, const char *chars)
auto split_view(std::string_view str, char c)