@@ -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