Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMartin Hořeňovský2022-10-20 15:06:26 +0200
committerMartin Hořeňovský2022-10-21 10:53:50 +0200
commitd7341b5dc198d8b66cb0b70bb54f5655c6a85ffe (patch)
tree1d26b338e7f0abe0020f1ce141fbe3410c3ff285
parent38d926090a9f14a9776d9fd5bda2290be3df6cdb (diff)
downloadcatch3-d7341b5dc198d8b66cb0b70bb54f5655c6a85ffe.tar.gz
Add parseUInt utility function
There is an increasing number of places where Catch2 wants to parse strings into numbers, but being stuck in C++14 world, we do not have good stdlib facilities to do this (`strtoul` and `stoul` are both bad).
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/catch2/catch_all.hpp1
-rw-r--r--src/catch2/internal/catch_parse_numbers.cpp49
-rw-r--r--src/catch2/internal/catch_parse_numbers.hpp26
-rw-r--r--src/catch2/meson.build2
-rw-r--r--tests/CMakeLists.txt1
-rw-r--r--tests/SelfTest/Baselines/automake.sw.approved.txt1
-rw-r--r--tests/SelfTest/Baselines/automake.sw.multi.approved.txt1
-rw-r--r--tests/SelfTest/Baselines/compact.sw.approved.txt11
-rw-r--r--tests/SelfTest/Baselines/compact.sw.multi.approved.txt11
-rw-r--r--tests/SelfTest/Baselines/console.std.approved.txt4
-rw-r--r--tests/SelfTest/Baselines/console.sw.approved.txt73
-rw-r--r--tests/SelfTest/Baselines/console.sw.multi.approved.txt73
-rw-r--r--tests/SelfTest/Baselines/junit.sw.approved.txt4
-rw-r--r--tests/SelfTest/Baselines/junit.sw.multi.approved.txt4
-rw-r--r--tests/SelfTest/Baselines/sonarqube.sw.approved.txt4
-rw-r--r--tests/SelfTest/Baselines/sonarqube.sw.multi.approved.txt4
-rw-r--r--tests/SelfTest/Baselines/tap.sw.approved.txt24
-rw-r--r--tests/SelfTest/Baselines/tap.sw.multi.approved.txt24
-rw-r--r--tests/SelfTest/Baselines/teamcity.sw.approved.txt2
-rw-r--r--tests/SelfTest/Baselines/teamcity.sw.multi.approved.txt2
-rw-r--r--tests/SelfTest/Baselines/xml.sw.approved.txt101
-rw-r--r--tests/SelfTest/Baselines/xml.sw.multi.approved.txt101
-rw-r--r--tests/SelfTest/IntrospectiveTests/Parse.tests.cpp38
-rw-r--r--tests/meson.build1
25 files changed, 550 insertions, 14 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index ae51bf8a..599a104f 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -81,6 +81,7 @@ set(INTERNAL_HEADERS
${SOURCES_DIR}/internal/catch_istream.hpp
${SOURCES_DIR}/internal/catch_unique_name.hpp
${SOURCES_DIR}/internal/catch_sharding.hpp
+ ${SOURCES_DIR}/internal/catch_parse_numbers.hpp
${SOURCES_DIR}/generators/catch_generator_exception.hpp
${SOURCES_DIR}/generators/catch_generators.hpp
${SOURCES_DIR}/generators/catch_generators_adapters.hpp
@@ -184,6 +185,7 @@ set(IMPL_SOURCES
${SOURCES_DIR}/internal/catch_fatal_condition_handler.cpp
${SOURCES_DIR}/internal/catch_floating_point_helpers.cpp
${SOURCES_DIR}/internal/catch_istream.cpp
+ ${SOURCES_DIR}/internal/catch_parse_numbers.cpp
${SOURCES_DIR}/interfaces/catch_interfaces_generatortracker.cpp
${SOURCES_DIR}/interfaces/catch_interfaces_reporter.cpp
${SOURCES_DIR}/internal/catch_list.cpp
diff --git a/src/catch2/catch_all.hpp b/src/catch2/catch_all.hpp
index bd83f5a7..3d32ce7f 100644
--- a/src/catch2/catch_all.hpp
+++ b/src/catch2/catch_all.hpp
@@ -78,6 +78,7 @@
#include <catch2/internal/catch_noncopyable.hpp>
#include <catch2/internal/catch_optional.hpp>
#include <catch2/internal/catch_output_redirect.hpp>
+#include <catch2/internal/catch_parse_numbers.hpp>
#include <catch2/internal/catch_platform.hpp>
#include <catch2/internal/catch_polyfills.hpp>
#include <catch2/internal/catch_preprocessor.hpp>
diff --git a/src/catch2/internal/catch_parse_numbers.cpp b/src/catch2/internal/catch_parse_numbers.cpp
new file mode 100644
index 00000000..05649046
--- /dev/null
+++ b/src/catch2/internal/catch_parse_numbers.cpp
@@ -0,0 +1,49 @@
+
+// Copyright Catch2 Authors
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// https://www.boost.org/LICENSE_1_0.txt)
+
+// SPDX-License-Identifier: BSL-1.0
+
+#include <catch2/internal/catch_parse_numbers.hpp>
+
+#include <catch2/internal/catch_compiler_capabilities.hpp>
+#include <catch2/internal/catch_string_manip.hpp>
+
+#include <limits>
+
+namespace Catch {
+
+ Optional<unsigned int> parseUInt(std::string const& input, int base) {
+ auto trimmed = trim( input );
+ // std::stoull is annoying and accepts numbers starting with '-',
+ // it just negates them into unsigned int
+ if ( trimmed.empty() || trimmed[0] == '-' ) {
+ return {};
+ }
+
+ CATCH_TRY {
+ size_t pos = 0;
+ const auto ret = std::stoull( trimmed, &pos, base );
+
+ // We did not consume the whole input, so there is an issue
+ // This can be bunch of different stuff, like multiple numbers
+ // in the input, or invalid digits/characters and so on. Either
+ // way, we do not want to return the partially parsed result.
+ if ( pos != trimmed.size() ) {
+ return {};
+ }
+ // Too large
+ if ( ret > std::numeric_limits<unsigned int>::max() ) {
+ return {};
+ }
+ return static_cast<unsigned int>(ret);
+ } CATCH_CATCH_ANON( std::exception const& ) {
+ // There was a larger issue with the input, e.g. the parsed
+ // number would be too large to fit within ull.
+ return {};
+ }
+ }
+
+} // namespace Catch
diff --git a/src/catch2/internal/catch_parse_numbers.hpp b/src/catch2/internal/catch_parse_numbers.hpp
new file mode 100644
index 00000000..941c0f24
--- /dev/null
+++ b/src/catch2/internal/catch_parse_numbers.hpp
@@ -0,0 +1,26 @@
+
+// Copyright Catch2 Authors
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// https://www.boost.org/LICENSE_1_0.txt)
+
+// SPDX-License-Identifier: BSL-1.0
+#ifndef CATCH_PARSE_NUMBERS_HPP_INCLUDED
+#define CATCH_PARSE_NUMBERS_HPP_INCLUDED
+
+#include <catch2/internal/catch_optional.hpp>
+
+#include <string>
+
+namespace Catch {
+
+ /**
+ * Parses unsigned int from the input, using provided base
+ *
+ * Effectively a wrapper around std::stoul but with better error checking
+ * e.g. "-1" is rejected, instead of being parsed as UINT_MAX.
+ */
+ Optional<unsigned int> parseUInt(std::string const& input, int base = 10);
+}
+
+#endif // CATCH_PARSE_NUMBERS_HPP_INCLUDED
diff --git a/src/catch2/meson.build b/src/catch2/meson.build
index 8f1e4331..8b9e288a 100644
--- a/src/catch2/meson.build
+++ b/src/catch2/meson.build
@@ -100,6 +100,7 @@ internal_headers = [
'internal/catch_noncopyable.hpp',
'internal/catch_optional.hpp',
'internal/catch_output_redirect.hpp',
+ 'internal/catch_parse_numbers.hpp',
'internal/catch_platform.hpp',
'internal/catch_polyfills.hpp',
'internal/catch_preprocessor.hpp',
@@ -207,6 +208,7 @@ internal_sources = files(
'internal/catch_list.cpp',
'internal/catch_message_info.cpp',
'internal/catch_output_redirect.cpp',
+ 'internal/catch_parse_numbers.cpp',
'internal/catch_polyfills.cpp',
'internal/catch_random_number_generator.cpp',
'internal/catch_random_seed_generation.cpp',
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 7f5af994..0dca91e8 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -85,6 +85,7 @@ set(TEST_SOURCES
${SELF_TEST_DIR}/IntrospectiveTests/FloatingPoint.tests.cpp
${SELF_TEST_DIR}/IntrospectiveTests/GeneratorsImpl.tests.cpp
${SELF_TEST_DIR}/IntrospectiveTests/InternalBenchmark.tests.cpp
+ ${SELF_TEST_DIR}/IntrospectiveTests/Parse.tests.cpp
${SELF_TEST_DIR}/IntrospectiveTests/PartTracker.tests.cpp
${SELF_TEST_DIR}/IntrospectiveTests/RandomNumberGeneration.tests.cpp
${SELF_TEST_DIR}/IntrospectiveTests/Reporters.tests.cpp
diff --git a/tests/SelfTest/Baselines/automake.sw.approved.txt b/tests/SelfTest/Baselines/automake.sw.approved.txt
index b8b59566..d3a1b63f 100644
--- a/tests/SelfTest/Baselines/automake.sw.approved.txt
+++ b/tests/SelfTest/Baselines/automake.sw.approved.txt
@@ -189,6 +189,7 @@ Nor would this
:test-result: FAIL Output from all sections is reported
:test-result: PASS Overloaded comma or address-of operators are not used
:test-result: PASS Parse test names and tags
+:test-result: PASS Parse uints
:test-result: PASS Parsed tags are matched case insensitive
:test-result: PASS Parsing sharding-related cli flags
:test-result: PASS Parsing tags with non-alphabetical characters is pass-through
diff --git a/tests/SelfTest/Baselines/automake.sw.multi.approved.txt b/tests/SelfTest/Baselines/automake.sw.multi.approved.txt
index 2afd308b..8604cde2 100644
--- a/tests/SelfTest/Baselines/automake.sw.multi.approved.txt
+++ b/tests/SelfTest/Baselines/automake.sw.multi.approved.txt
@@ -187,6 +187,7 @@
:test-result: FAIL Output from all sections is reported
:test-result: PASS Overloaded comma or address-of operators are not used
:test-result: PASS Parse test names and tags
+:test-result: PASS Parse uints
:test-result: PASS Parsed tags are matched case insensitive
:test-result: PASS Parsing sharding-related cli flags
:test-result: PASS Parsing tags with non-alphabetical characters is pass-through
diff --git a/tests/SelfTest/Baselines/compact.sw.approved.txt b/tests/SelfTest/Baselines/compact.sw.approved.txt
index 6d23d01d..768562ad 100644
--- a/tests/SelfTest/Baselines/compact.sw.approved.txt
+++ b/tests/SelfTest/Baselines/compact.sw.approved.txt
@@ -1270,6 +1270,17 @@ CmdLine.tests.cpp:<line number>: passed: !(spec.matches(*fakeTestCase("hidden an
CmdLine.tests.cpp:<line number>: passed: !(spec.matches(*fakeTestCase("only foo", "[foo]"))) for: !false
CmdLine.tests.cpp:<line number>: passed: !(spec.matches(*fakeTestCase("only hidden", "[.]"))) for: !false
CmdLine.tests.cpp:<line number>: passed: spec.matches(*fakeTestCase("neither foo nor hidden", "[bar]")) for: true
+Parse.tests.cpp:<line number>: passed: parseUInt( "0" ) == Optional<unsigned int>{ 0 } for: {?} == {?}
+Parse.tests.cpp:<line number>: passed: parseUInt( "100" ) == Optional<unsigned int>{ 100 } for: {?} == {?}
+Parse.tests.cpp:<line number>: passed: parseUInt( "4294967295" ) == Optional<unsigned int>{ 4294967295 } for: {?} == {?}
+Parse.tests.cpp:<line number>: passed: parseUInt( "0x<hex digits>", 16 ) == Optional<unsigned int>{ 255 } for: {?} == {?}
+Parse.tests.cpp:<line number>: passed: !(parseUInt( "" )) for: !{?}
+Parse.tests.cpp:<line number>: passed: !(parseUInt( "!!KJHF*#" )) for: !{?}
+Parse.tests.cpp:<line number>: passed: !(parseUInt( "-1" )) for: !{?}
+Parse.tests.cpp:<line number>: passed: !(parseUInt( "4294967296" )) for: !{?}
+Parse.tests.cpp:<line number>: passed: !(parseUInt( "42949672964294967296429496729642949672964294967296" )) for: !{?}
+Parse.tests.cpp:<line number>: passed: !(parseUInt( "2 4" )) for: !{?}
+Parse.tests.cpp:<line number>: passed: !(parseUInt( "0x<hex digits>", 10 )) for: !{?}
TestSpecParser.tests.cpp:<line number>: passed: spec.hasFilters() for: true
TestSpecParser.tests.cpp:<line number>: passed: spec.getInvalidSpecs().empty() for: true
TestSpecParser.tests.cpp:<line number>: passed: spec.matches( testCase ) for: true
diff --git a/tests/SelfTest/Baselines/compact.sw.multi.approved.txt b/tests/SelfTest/Baselines/compact.sw.multi.approved.txt
index a3500a35..d8d04130 100644
--- a/tests/SelfTest/Baselines/compact.sw.multi.approved.txt
+++ b/tests/SelfTest/Baselines/compact.sw.multi.approved.txt
@@ -1268,6 +1268,17 @@ CmdLine.tests.cpp:<line number>: passed: !(spec.matches(*fakeTestCase("hidden an
CmdLine.tests.cpp:<line number>: passed: !(spec.matches(*fakeTestCase("only foo", "[foo]"))) for: !false
CmdLine.tests.cpp:<line number>: passed: !(spec.matches(*fakeTestCase("only hidden", "[.]"))) for: !false
CmdLine.tests.cpp:<line number>: passed: spec.matches(*fakeTestCase("neither foo nor hidden", "[bar]")) for: true
+Parse.tests.cpp:<line number>: passed: parseUInt( "0" ) == Optional<unsigned int>{ 0 } for: {?} == {?}
+Parse.tests.cpp:<line number>: passed: parseUInt( "100" ) == Optional<unsigned int>{ 100 } for: {?} == {?}
+Parse.tests.cpp:<line number>: passed: parseUInt( "4294967295" ) == Optional<unsigned int>{ 4294967295 } for: {?} == {?}
+Parse.tests.cpp:<line number>: passed: parseUInt( "0x<hex digits>", 16 ) == Optional<unsigned int>{ 255 } for: {?} == {?}
+Parse.tests.cpp:<line number>: passed: !(parseUInt( "" )) for: !{?}
+Parse.tests.cpp:<line number>: passed: !(parseUInt( "!!KJHF*#" )) for: !{?}
+Parse.tests.cpp:<line number>: passed: !(parseUInt( "-1" )) for: !{?}
+Parse.tests.cpp:<line number>: passed: !(parseUInt( "4294967296" )) for: !{?}
+Parse.tests.cpp:<line number>: passed: !(parseUInt( "42949672964294967296429496729642949672964294967296" )) for: !{?}
+Parse.tests.cpp:<line number>: passed: !(parseUInt( "2 4" )) for: !{?}
+Parse.tests.cpp:<line number>: passed: !(parseUInt( "0x<hex digits>", 10 )) for: !{?}
TestSpecParser.tests.cpp:<line number>: passed: spec.hasFilters() for: true
TestSpecParser.tests.cpp:<line number>: passed: spec.getInvalidSpecs().empty() for: true
TestSpecParser.tests.cpp:<line number>: passed: spec.matches( testCase ) for: true
diff --git a/tests/SelfTest/Baselines/console.std.approved.txt b/tests/SelfTest/Baselines/console.std.approved.txt
index 6962e508..9515b2c6 100644
--- a/tests/SelfTest/Baselines/console.std.approved.txt
+++ b/tests/SelfTest/Baselines/console.std.approved.txt
@@ -1394,6 +1394,6 @@ due to unexpected exception with message:
Why would you throw a std::string?
===============================================================================
-test cases: 394 | 318 passed | 69 failed | 7 failed as expected
-assertions: 2284 | 2129 passed | 128 failed | 27 failed as expected
+test cases: 395 | 319 passed | 69 failed | 7 failed as expected
+assertions: 2295 | 2140 passed | 128 failed | 27 failed as expected
diff --git a/tests/SelfTest/Baselines/console.sw.approved.txt b/tests/SelfTest/Baselines/console.sw.approved.txt
index 63dd231e..8bd2dc0c 100644
--- a/tests/SelfTest/Baselines/console.sw.approved.txt
+++ b/tests/SelfTest/Baselines/console.sw.approved.txt
@@ -9056,6 +9056,75 @@ with expansion:
true
-------------------------------------------------------------------------------
+Parse uints
+ proper inputs
+-------------------------------------------------------------------------------
+Parse.tests.cpp:<line number>
+...............................................................................
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE( parseUInt( "0" ) == Optional<unsigned int>{ 0 } )
+with expansion:
+ {?} == {?}
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE( parseUInt( "100" ) == Optional<unsigned int>{ 100 } )
+with expansion:
+ {?} == {?}
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE( parseUInt( "4294967295" ) == Optional<unsigned int>{ 4294967295 } )
+with expansion:
+ {?} == {?}
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE( parseUInt( "0x<hex digits>", 16 ) == Optional<unsigned int>{ 255 } )
+with expansion:
+ {?} == {?}
+
+-------------------------------------------------------------------------------
+Parse uints
+ Bad inputs
+-------------------------------------------------------------------------------
+Parse.tests.cpp:<line number>
+...............................................................................
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE_FALSE( parseUInt( "" ) )
+with expansion:
+ !{?}
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE_FALSE( parseUInt( "!!KJHF*#" ) )
+with expansion:
+ !{?}
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE_FALSE( parseUInt( "-1" ) )
+with expansion:
+ !{?}
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE_FALSE( parseUInt( "4294967296" ) )
+with expansion:
+ !{?}
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE_FALSE( parseUInt( "42949672964294967296429496729642949672964294967296" ) )
+with expansion:
+ !{?}
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE_FALSE( parseUInt( "2 4" ) )
+with expansion:
+ !{?}
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE_FALSE( parseUInt( "0x<hex digits>", 10 ) )
+with expansion:
+ !{?}
+
+-------------------------------------------------------------------------------
Parsed tags are matched case insensitive
-------------------------------------------------------------------------------
TestSpecParser.tests.cpp:<line number>
@@ -18450,6 +18519,6 @@ Misc.tests.cpp:<line number>
Misc.tests.cpp:<line number>: PASSED:
===============================================================================
-test cases: 394 | 304 passed | 83 failed | 7 failed as expected
-assertions: 2299 | 2129 passed | 143 failed | 27 failed as expected
+test cases: 395 | 305 passed | 83 failed | 7 failed as expected
+assertions: 2310 | 2140 passed | 143 failed | 27 failed as expected
diff --git a/tests/SelfTest/Baselines/console.sw.multi.approved.txt b/tests/SelfTest/Baselines/console.sw.multi.approved.txt
index 9cba323d..0f565560 100644
--- a/tests/SelfTest/Baselines/console.sw.multi.approved.txt
+++ b/tests/SelfTest/Baselines/console.sw.multi.approved.txt
@@ -9054,6 +9054,75 @@ with expansion:
true
-------------------------------------------------------------------------------
+Parse uints
+ proper inputs
+-------------------------------------------------------------------------------
+Parse.tests.cpp:<line number>
+...............................................................................
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE( parseUInt( "0" ) == Optional<unsigned int>{ 0 } )
+with expansion:
+ {?} == {?}
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE( parseUInt( "100" ) == Optional<unsigned int>{ 100 } )
+with expansion:
+ {?} == {?}
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE( parseUInt( "4294967295" ) == Optional<unsigned int>{ 4294967295 } )
+with expansion:
+ {?} == {?}
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE( parseUInt( "0x<hex digits>", 16 ) == Optional<unsigned int>{ 255 } )
+with expansion:
+ {?} == {?}
+
+-------------------------------------------------------------------------------
+Parse uints
+ Bad inputs
+-------------------------------------------------------------------------------
+Parse.tests.cpp:<line number>
+...............................................................................
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE_FALSE( parseUInt( "" ) )
+with expansion:
+ !{?}
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE_FALSE( parseUInt( "!!KJHF*#" ) )
+with expansion:
+ !{?}
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE_FALSE( parseUInt( "-1" ) )
+with expansion:
+ !{?}
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE_FALSE( parseUInt( "4294967296" ) )
+with expansion:
+ !{?}
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE_FALSE( parseUInt( "42949672964294967296429496729642949672964294967296" ) )
+with expansion:
+ !{?}
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE_FALSE( parseUInt( "2 4" ) )
+with expansion:
+ !{?}
+
+Parse.tests.cpp:<line number>: PASSED:
+ REQUIRE_FALSE( parseUInt( "0x<hex digits>", 10 ) )
+with expansion:
+ !{?}
+
+-------------------------------------------------------------------------------
Parsed tags are matched case insensitive
-------------------------------------------------------------------------------
TestSpecParser.tests.cpp:<line number>
@@ -18442,6 +18511,6 @@ Misc.tests.cpp:<line number>
Misc.tests.cpp:<line number>: PASSED:
===============================================================================
-test cases: 394 | 304 passed | 83 failed | 7 failed as expected
-assertions: 2299 | 2129 passed | 143 failed | 27 failed as expected
+test cases: 395 | 305 passed | 83 failed | 7 failed as expected
+assertions: 2310 | 2140 passed | 143 failed | 27 failed as expected
diff --git a/tests/SelfTest/Baselines/junit.sw.approved.txt b/tests/SelfTest/Baselines/junit.sw.approved.txt
index f7411501..eed28e7b 100644
--- a/tests/SelfTest/Baselines/junit.sw.approved.txt
+++ b/tests/SelfTest/Baselines/junit.sw.approved.txt
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuitesloose text artifact
>
- <testsuite name="<exe-name>" errors="17" failures="126" tests="2299" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
+ <testsuite name="<exe-name>" errors="17" failures="126" tests="2310" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
<properties>
<property name="random-seed" value="1"/>
<property name="filters" value="~[!nonportable]~[!benchmark]~[approvals] *"/>
@@ -1083,6 +1083,8 @@ Message.tests.cpp:<line number>
<testcase classname="<exe-name>.global" name="Parse test names and tags/Leading and trailing spaces in test name" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Parse test names and tags/Shortened hide tags are split apart when parsing" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Parse test names and tags/Shortened hide tags also properly handle exclusion" time="{duration}" status="run"/>
+ <testcase classname="<exe-name>.global" name="Parse uints/proper inputs" time="{duration}" status="run"/>
+ <testcase classname="<exe-name>.global" name="Parse uints/Bad inputs" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Parsed tags are matched case insensitive" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Parsing sharding-related cli flags/shard-count" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Parsing sharding-related cli flags/Negative shard count reports error" time="{duration}" status="run"/>
diff --git a/tests/SelfTest/Baselines/junit.sw.multi.approved.txt b/tests/SelfTest/Baselines/junit.sw.multi.approved.txt
index aa0860a3..54a5a13c 100644
--- a/tests/SelfTest/Baselines/junit.sw.multi.approved.txt
+++ b/tests/SelfTest/Baselines/junit.sw.multi.approved.txt
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuites>
- <testsuite name="<exe-name>" errors="17" failures="126" tests="2299" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
+ <testsuite name="<exe-name>" errors="17" failures="126" tests="2310" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
<properties>
<property name="random-seed" value="1"/>
<property name="filters" value="~[!nonportable]~[!benchmark]~[approvals] *"/>
@@ -1082,6 +1082,8 @@ Message.tests.cpp:<line number>
<testcase classname="<exe-name>.global" name="Parse test names and tags/Leading and trailing spaces in test name" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Parse test names and tags/Shortened hide tags are split apart when parsing" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Parse test names and tags/Shortened hide tags also properly handle exclusion" time="{duration}" status="run"/>
+ <testcase classname="<exe-name>.global" name="Parse uints/proper inputs" time="{duration}" status="run"/>
+ <testcase classname="<exe-name>.global" name="Parse uints/Bad inputs" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Parsed tags are matched case insensitive" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Parsing sharding-related cli flags/shard-count" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Parsing sharding-related cli flags/Negative shard count reports error" time="{duration}" status="run"/>
diff --git a/tests/SelfTest/Baselines/sonarqube.sw.approved.txt b/tests/SelfTest/Baselines/sonarqube.sw.approved.txt
index a9319a62..be43f8d8 100644
--- a/tests/SelfTest/Baselines/sonarqube.sw.approved.txt
+++ b/tests/SelfTest/Baselines/sonarqube.sw.approved.txt
@@ -157,6 +157,10 @@
<testCase name="warmup" duration="{duration}"/>
<testCase name="weighted_average_quantile" duration="{duration}"/>
</file>
+ <file path="tests/<exe-name>/IntrospectiveTests/Parse.tests.cpp">
+ <testCase name="Parse uints/proper inputs" duration="{duration}"/>
+ <testCase name="Parse uints/Bad inputs" duration="{duration}"/>
+ </file>
<file path="tests/<exe-name>/IntrospectiveTests/PartTracker.tests.cpp">
<testCase name="#1938 - GENERATE after a section/A" duration="{duration}"/>
<testCase name="#1938 - GENERATE after a section/B" duration="{duration}"/>
diff --git a/tests/SelfTest/Baselines/sonarqube.sw.multi.approved.txt b/tests/SelfTest/Baselines/sonarqube.sw.multi.approved.txt
index 97b2d988..75157eca 100644
--- a/tests/SelfTest/Baselines/sonarqube.sw.multi.approved.txt
+++ b/tests/SelfTest/Baselines/sonarqube.sw.multi.approved.txt
@@ -156,6 +156,10 @@
<testCase name="warmup" duration="{duration}"/>
<testCase name="weighted_average_quantile" duration="{duration}"/>
</file>
+ <file path="tests/<exe-name>/IntrospectiveTests/Parse.tests.cpp">
+ <testCase name="Parse uints/proper inputs" duration="{duration}"/>
+ <testCase name="Parse uints/Bad inputs" duration="{duration}"/>
+ </file>
<file path="tests/<exe-name>/IntrospectiveTests/PartTracker.tests.cpp">
<testCase name="#1938 - GENERATE after a section/A" duration="{duration}"/>
<testCase name="#1938 - GENERATE after a section/B" duration="{duration}"/>
diff --git a/tests/SelfTest/Baselines/tap.sw.approved.txt b/tests/SelfTest/Baselines/tap.sw.approved.txt
index 2c7adae5..cae94b24 100644
--- a/tests/SelfTest/Baselines/tap.sw.approved.txt
+++ b/tests/SelfTest/Baselines/tap.sw.approved.txt
@@ -2383,6 +2383,28 @@ ok {test-number} - !(spec.matches(*fakeTestCase("only foo", "[foo]"))) for: !fal
ok {test-number} - !(spec.matches(*fakeTestCase("only hidden", "[.]"))) for: !false
# Parse test names and tags
ok {test-number} - spec.matches(*fakeTestCase("neither foo nor hidden", "[bar]")) for: true
+# Parse uints
+ok {test-number} - parseUInt( "0" ) == Optional<unsigned int>{ 0 } for: {?} == {?}
+# Parse uints
+ok {test-number} - parseUInt( "100" ) == Optional<unsigned int>{ 100 } for: {?} == {?}
+# Parse uints
+ok {test-number} - parseUInt( "4294967295" ) == Optional<unsigned int>{ 4294967295 } for: {?} == {?}
+# Parse uints
+ok {test-number} - parseUInt( "0x<hex digits>", 16 ) == Optional<unsigned int>{ 255 } for: {?} == {?}
+# Parse uints
+ok {test-number} - !(parseUInt( "" )) for: !{?}
+# Parse uints
+ok {test-number} - !(parseUInt( "!!KJHF*#" )) for: !{?}
+# Parse uints
+ok {test-number} - !(parseUInt( "-1" )) for: !{?}
+# Parse uints
+ok {test-number} - !(parseUInt( "4294967296" )) for: !{?}
+# Parse uints
+ok {test-number} - !(parseUInt( "42949672964294967296429496729642949672964294967296" )) for: !{?}
+# Parse uints
+ok {test-number} - !(parseUInt( "2 4" )) for: !{?}
+# Parse uints
+ok {test-number} - !(parseUInt( "0x<hex digits>", 10 )) for: !{?}
# Parsed tags are matched case insensitive
ok {test-number} - spec.hasFilters() for: true
# Parsed tags are matched case insensitive
@@ -4601,5 +4623,5 @@ ok {test-number} - q3 == 23. for: 23.0 == 23.0
ok {test-number} -
# xmlentitycheck
ok {test-number} -
-1..2299
+1..2310
diff --git a/tests/SelfTest/Baselines/tap.sw.multi.approved.txt b/tests/SelfTest/Baselines/tap.sw.multi.approved.txt
index d13b493c..15942bb6 100644
--- a/tests/SelfTest/Baselines/tap.sw.multi.approved.txt
+++ b/tests/SelfTest/Baselines/tap.sw.multi.approved.txt
@@ -2381,6 +2381,28 @@ ok {test-number} - !(spec.matches(*fakeTestCase("only foo", "[foo]"))) for: !fal
ok {test-number} - !(spec.matches(*fakeTestCase("only hidden", "[.]"))) for: !false
# Parse test names and tags
ok {test-number} - spec.matches(*fakeTestCase("neither foo nor hidden", "[bar]")) for: true
+# Parse uints
+ok {test-number} - parseUInt( "0" ) == Optional<unsigned int>{ 0 } for: {?} == {?}
+# Parse uints
+ok {test-number} - parseUInt( "100" ) == Optional<unsigned int>{ 100 } for: {?} == {?}
+# Parse uints
+ok {test-number} - parseUInt( "4294967295" ) == Optional<unsigned int>{ 4294967295 } for: {?} == {?}
+# Parse uints
+ok {test-number} - parseUInt( "0x<hex digits>", 16 ) == Optional<unsigned int>{ 255 } for: {?} == {?}
+# Parse uints
+ok {test-number} - !(parseUInt( "" )) for: !{?}
+# Parse uints
+ok {test-number} - !(parseUInt( "!!KJHF*#" )) for: !{?}
+# Parse uints
+ok {test-number} - !(parseUInt( "-1" )) for: !{?}
+# Parse uints
+ok {test-number} - !(parseUInt( "4294967296" )) for: !{?}
+# Parse uints
+ok {test-number} - !(parseUInt( "42949672964294967296429496729642949672964294967296" )) for: !{?}
+# Parse uints
+ok {test-number} - !(parseUInt( "2 4" )) for: !{?}
+# Parse uints