@@ -2166,6 +2166,61 @@ mod tests {
21662166 }
21672167}
21682168
2169+ #[ cfg( test) ]
2170+ mod currency_code_tests {
2171+ use super :: CurrencyCode ;
2172+
2173+ #[ test]
2174+ fn creates_valid_currency_codes ( ) {
2175+ let usd = CurrencyCode :: new ( * b"USD" ) . unwrap ( ) ;
2176+ assert_eq ! ( usd. as_str( ) , "USD" ) ;
2177+ assert_eq ! ( usd. as_bytes( ) , b"USD" ) ;
2178+
2179+ let eur = CurrencyCode :: new ( * b"EUR" ) . unwrap ( ) ;
2180+ assert_eq ! ( eur. as_str( ) , "EUR" ) ;
2181+ assert_eq ! ( eur. as_bytes( ) , b"EUR" ) ;
2182+ }
2183+
2184+ #[ test]
2185+ fn rejects_invalid_utf8 ( ) {
2186+ let invalid_utf8 = [ 0xFF , 0xFE , 0xFD ] ;
2187+ assert ! ( CurrencyCode :: new( invalid_utf8) . is_err( ) ) ;
2188+ }
2189+
2190+ #[ test]
2191+ fn rejects_lowercase_letters ( ) {
2192+ assert ! ( CurrencyCode :: new( * b"usd" ) . is_err( ) ) ;
2193+ assert ! ( CurrencyCode :: new( * b"Eur" ) . is_err( ) ) ;
2194+ }
2195+
2196+ #[ test]
2197+ fn rejects_non_letters ( ) {
2198+ assert ! ( CurrencyCode :: new( * b"US1" ) . is_err( ) ) ;
2199+ assert ! ( CurrencyCode :: new( * b"U$D" ) . is_err( ) ) ;
2200+ }
2201+
2202+ #[ test]
2203+ fn from_str_validates_length ( ) {
2204+ assert ! ( "US" . parse:: <CurrencyCode >( ) . is_err( ) ) ;
2205+ assert ! ( "USDA" . parse:: <CurrencyCode >( ) . is_err( ) ) ;
2206+
2207+ assert ! ( "USD" . parse:: <CurrencyCode >( ) . is_ok( ) ) ;
2208+ }
2209+
2210+ #[ test]
2211+ fn works_with_real_currency_codes ( ) {
2212+ let codes = [ "USD" , "EUR" , "GBP" , "JPY" , "CNY" ] ;
2213+
2214+ for code_str in & codes {
2215+ let code1 = CurrencyCode :: new ( code_str. as_bytes ( ) . try_into ( ) . unwrap ( ) ) . unwrap ( ) ;
2216+ let code2 = code_str. parse :: < CurrencyCode > ( ) . unwrap ( ) ;
2217+
2218+ assert_eq ! ( code1, code2) ;
2219+ assert_eq ! ( code1. as_str( ) , * code_str) ;
2220+ }
2221+ }
2222+ }
2223+
21692224#[ cfg( test) ]
21702225mod bolt12_tests {
21712226 use super :: { Bolt12ParseError , Bolt12SemanticError , Offer } ;
0 commit comments