@@ -145,26 +145,52 @@ BOOST_AUTO_TEST_CASE(parse_hex)
145145 // Basic test vector
146146 result = ParseHex (" 04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f" );
147147 BOOST_CHECK_EQUAL_COLLECTIONS (result.begin (), result.end (), expected.begin (), expected.end ());
148+ result = TryParseHex<uint8_t >(" 04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f" ).value ();
149+ BOOST_CHECK_EQUAL_COLLECTIONS (result.begin (), result.end (), expected.begin (), expected.end ());
148150
149151 // Spaces between bytes must be supported
150152 result = ParseHex (" 12 34 56 78" );
151153 BOOST_CHECK (result.size () == 4 && result[0 ] == 0x12 && result[1 ] == 0x34 && result[2 ] == 0x56 && result[3 ] == 0x78 );
154+ result = TryParseHex<uint8_t >(" 12 34 56 78" ).value ();
155+ BOOST_CHECK (result.size () == 4 && result[0 ] == 0x12 && result[1 ] == 0x34 && result[2 ] == 0x56 && result[3 ] == 0x78 );
152156
153157 // Leading space must be supported (used in BerkeleyEnvironment::Salvage)
154158 result = ParseHex (" 89 34 56 78" );
155159 BOOST_CHECK (result.size () == 4 && result[0 ] == 0x89 && result[1 ] == 0x34 && result[2 ] == 0x56 && result[3 ] == 0x78 );
160+ result = TryParseHex<uint8_t >(" 89 34 56 78" ).value ();
161+ BOOST_CHECK (result.size () == 4 && result[0 ] == 0x89 && result[1 ] == 0x34 && result[2 ] == 0x56 && result[3 ] == 0x78 );
162+
163+ // Mixed case and spaces are supported
164+ result = ParseHex (" Ff aA " );
165+ BOOST_CHECK (result.size () == 2 && result[0 ] == 0xff && result[1 ] == 0xaa );
166+ result = TryParseHex<uint8_t >(" Ff aA " ).value ();
167+ BOOST_CHECK (result.size () == 2 && result[0 ] == 0xff && result[1 ] == 0xaa );
156168
157- // Embedded null is treated as end
169+ // Empty string is supported
170+ result = ParseHex (" " );
171+ BOOST_CHECK (result.size () == 0 );
172+ result = TryParseHex<uint8_t >(" " ).value ();
173+ BOOST_CHECK (result.size () == 0 );
174+
175+ // Spaces between nibbles is treated as invalid
176+ BOOST_CHECK_EQUAL (ParseHex (" AAF F" ).size (), 0 );
177+ BOOST_CHECK (!TryParseHex (" AAF F" ).has_value ());
178+
179+ // Embedded null is treated as invalid
158180 const std::string with_embedded_null{" 11 " s
159181 " \0 "
160182 " 22 " s};
161183 BOOST_CHECK_EQUAL (with_embedded_null.size (), 11 );
162- result = ParseHex (with_embedded_null);
163- BOOST_CHECK (result.size () == 1 && result[0 ] == 0x11 );
184+ BOOST_CHECK_EQUAL (ParseHex (with_embedded_null).size (), 0 );
185+ BOOST_CHECK (!TryParseHex (with_embedded_null).has_value ());
186+
187+ // Non-hex is treated as invalid
188+ BOOST_CHECK_EQUAL (ParseHex (" 1234 invalid 1234" ).size (), 0 );
189+ BOOST_CHECK (!TryParseHex (" 1234 invalid 1234" ).has_value ());
164190
165- // Stop parsing at invalid value
166- result = ParseHex (" 1234 invalid 1234 " );
167- BOOST_CHECK (result. size () == 2 && result[ 0 ] == 0x12 && result[ 1 ] == 0x34 );
191+ // Truncated input is treated as invalid
192+ BOOST_CHECK_EQUAL ( ParseHex (" 12 3 " ). size (), 0 );
193+ BOOST_CHECK (! TryParseHex ( " 12 3 " ). has_value () );
168194}
169195
170196BOOST_AUTO_TEST_CASE (util_HexStr)
0 commit comments