@@ -2186,6 +2186,85 @@ mod tests {
21862186 }
21872187}
21882188
2189+
2190+ #[ cfg( test) ]
2191+ mod currency_code_tests {
2192+ use super :: { CurrencyCode , CurrencyCodeError } ;
2193+
2194+ #[ test]
2195+ fn creates_valid_currency_codes ( ) {
2196+ let usd = CurrencyCode :: new ( * b"USD" ) . unwrap ( ) ;
2197+ assert_eq ! ( usd. as_str( ) , "USD" ) ;
2198+ assert_eq ! ( usd. as_bytes( ) , b"USD" ) ;
2199+
2200+ let eur = CurrencyCode :: new ( * b"EUR" ) . unwrap ( ) ;
2201+ assert_eq ! ( eur. as_str( ) , "EUR" ) ;
2202+ assert_eq ! ( eur. as_bytes( ) , b"EUR" ) ;
2203+ }
2204+
2205+ #[ test]
2206+ fn rejects_invalid_utf8 ( ) {
2207+ let invalid_utf8 = [ 0xFF , 0xFE , 0xFD ] ;
2208+ assert_eq ! ( CurrencyCode :: new( invalid_utf8) , Err ( CurrencyCodeError :: InvalidUtf8 ) ) ;
2209+ }
2210+
2211+ #[ test]
2212+ fn rejects_lowercase_letters ( ) {
2213+ match CurrencyCode :: new ( * b"usd" ) {
2214+ Err ( CurrencyCodeError :: NotAsciiUppercase { code } ) => {
2215+ assert_eq ! ( code, "usd" ) ;
2216+ } ,
2217+ _ => panic ! ( "Expected NotAsciiUppercase error" ) ,
2218+ }
2219+
2220+ assert ! ( matches!(
2221+ CurrencyCode :: new( * b"Eur" ) ,
2222+ Err ( CurrencyCodeError :: NotAsciiUppercase { .. } )
2223+ ) ) ;
2224+ }
2225+
2226+ #[ test]
2227+ fn rejects_non_letters ( ) {
2228+ assert ! ( matches!(
2229+ CurrencyCode :: new( * b"US1" ) ,
2230+ Err ( CurrencyCodeError :: NotAsciiUppercase { .. } )
2231+ ) ) ;
2232+
2233+ assert ! ( matches!(
2234+ CurrencyCode :: new( * b"U$D" ) ,
2235+ Err ( CurrencyCodeError :: NotAsciiUppercase { .. } )
2236+ ) ) ;
2237+ }
2238+
2239+ #[ test]
2240+ fn from_str_validates_length ( ) {
2241+ assert ! ( matches!(
2242+ "US" . parse:: <CurrencyCode >( ) ,
2243+ Err ( CurrencyCodeError :: InvalidLength { actual: 2 } )
2244+ ) ) ;
2245+
2246+ assert ! ( matches!(
2247+ "USDA" . parse:: <CurrencyCode >( ) ,
2248+ Err ( CurrencyCodeError :: InvalidLength { actual: 4 } )
2249+ ) ) ;
2250+
2251+ assert ! ( "USD" . parse:: <CurrencyCode >( ) . is_ok( ) ) ;
2252+ }
2253+
2254+ #[ test]
2255+ fn works_with_real_currency_codes ( ) {
2256+ let codes = [ "USD" , "EUR" , "GBP" , "JPY" , "CNY" ] ;
2257+
2258+ for code_str in & codes {
2259+ let code1 = CurrencyCode :: new ( code_str. as_bytes ( ) . try_into ( ) . unwrap ( ) ) . unwrap ( ) ;
2260+ let code2 = code_str. parse :: < CurrencyCode > ( ) . unwrap ( ) ;
2261+
2262+ assert_eq ! ( code1, code2) ;
2263+ assert_eq ! ( code1. as_str( ) , * code_str) ;
2264+ }
2265+ }
2266+ }
2267+
21892268#[ cfg( test) ]
21902269mod bolt12_tests {
21912270 use super :: { Bolt12ParseError , Bolt12SemanticError , Offer } ;
0 commit comments