@@ -2186,6 +2186,85 @@ mod tests {
2186
2186
}
2187
2187
}
2188
2188
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
+
2189
2268
#[ cfg( test) ]
2190
2269
mod bolt12_tests {
2191
2270
use super :: { Bolt12ParseError , Bolt12SemanticError , Offer } ;
0 commit comments