lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README | LICENSE

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 }