currency.rs (3075B)
1 use core::str::FromStr; 2 3 use radroots_core::{RadrootsCoreCurrency, RadrootsCoreCurrencyParseError}; 4 5 #[test] 6 fn from_str_upper_accepts_valid() { 7 let usd = RadrootsCoreCurrency::from_str_upper("USD").unwrap(); 8 assert_eq!(usd.as_str(), "USD"); 9 } 10 11 #[test] 12 fn from_str_upper_rejects_invalid() { 13 assert_eq!( 14 RadrootsCoreCurrency::from_str_upper("Usd"), 15 Err(RadrootsCoreCurrencyParseError::InvalidFormat) 16 ); 17 assert_eq!( 18 RadrootsCoreCurrency::from_str_upper("US"), 19 Err(RadrootsCoreCurrencyParseError::InvalidFormat) 20 ); 21 } 22 23 #[test] 24 fn from_str_trims_and_uppercases() { 25 let usd = RadrootsCoreCurrency::from_str(" usd ").unwrap(); 26 assert_eq!(usd.as_str(), "USD"); 27 } 28 29 #[test] 30 fn from_str_rejects_non_alpha() { 31 assert_eq!( 32 RadrootsCoreCurrency::from_str("US1"), 33 Err(RadrootsCoreCurrencyParseError::InvalidFormat) 34 ); 35 assert_eq!( 36 RadrootsCoreCurrency::from_str("US"), 37 Err(RadrootsCoreCurrencyParseError::InvalidFormat) 38 ); 39 } 40 41 #[test] 42 fn from_const_validates_bytes() { 43 assert!(RadrootsCoreCurrency::from_const(*b"USD").is_ok()); 44 assert_eq!( 45 RadrootsCoreCurrency::from_const(*b"1SD"), 46 Err(RadrootsCoreCurrencyParseError::InvalidFormat) 47 ); 48 assert_eq!( 49 RadrootsCoreCurrency::from_const(*b"Usd"), 50 Err(RadrootsCoreCurrencyParseError::InvalidFormat) 51 ); 52 assert_eq!( 53 RadrootsCoreCurrency::from_const(*b"USd"), 54 Err(RadrootsCoreCurrencyParseError::InvalidFormat) 55 ); 56 assert_eq!( 57 RadrootsCoreCurrency::from_const(*b"usd"), 58 Err(RadrootsCoreCurrencyParseError::InvalidFormat) 59 ); 60 } 61 62 #[test] 63 fn minor_unit_exponent_matches_known_currencies() { 64 let jpy = RadrootsCoreCurrency::from_str_upper("JPY").unwrap(); 65 let kwd = RadrootsCoreCurrency::from_str_upper("KWD").unwrap(); 66 let usd = RadrootsCoreCurrency::from_str_upper("USD").unwrap(); 67 68 assert_eq!(jpy.minor_unit_exponent(), 0); 69 assert_eq!(kwd.minor_unit_exponent(), 3); 70 assert_eq!(usd.minor_unit_exponent(), 2); 71 } 72 73 #[test] 74 fn display_debug_tryfrom_and_error_display_paths_are_exercised() { 75 let usd = RadrootsCoreCurrency::from_str("usd").unwrap(); 76 assert_eq!(usd.to_string(), "USD"); 77 assert_eq!(format!("{usd:?}"), "RadrootsCoreCurrency(\"USD\")"); 78 let via_try_from = RadrootsCoreCurrency::try_from("usd").unwrap(); 79 assert_eq!(via_try_from, usd); 80 assert_eq!( 81 RadrootsCoreCurrencyParseError::InvalidFormat.to_string(), 82 "currency must be a 3-letter code" 83 ); 84 } 85 86 #[cfg(feature = "serde")] 87 #[test] 88 fn serde_deserialize_paths_are_exercised() { 89 let parsed: RadrootsCoreCurrency = serde_json::from_str("\"USD\"").unwrap(); 90 assert_eq!(parsed.as_str(), "USD"); 91 let err = serde_json::from_str::<RadrootsCoreCurrency>("\"US1\"").unwrap_err(); 92 assert!(err.to_string().contains("currency must be a 3-letter code")); 93 let non_string_err = serde_json::from_str::<RadrootsCoreCurrency>("123").unwrap_err(); 94 assert!(non_string_err.to_string().contains("invalid type")); 95 }