lib

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

serde.rs (2210B)


      1 #![cfg(feature = "serde")]
      2 
      3 mod common;
      4 
      5 use core::str::FromStr;
      6 
      7 use radroots_core::{
      8     RadrootsCoreCurrency, RadrootsCoreDecimal, RadrootsCoreMoney, RadrootsCorePercent,
      9     RadrootsCoreQuantity, RadrootsCoreUnit,
     10 };
     11 use serde_json::Value;
     12 
     13 #[test]
     14 fn decimal_serializes_as_string() {
     15     let d = common::dec("1.2300");
     16     let json = serde_json::to_string(&d).unwrap();
     17     assert_eq!(json, "\"1.23\"");
     18 
     19     let back: RadrootsCoreDecimal = serde_json::from_str(&json).unwrap();
     20     assert_eq!(back, common::dec("1.23"));
     21 }
     22 
     23 #[test]
     24 fn quantity_uses_decimal_str_and_omits_empty_label() {
     25     let q = RadrootsCoreQuantity::new(common::dec("1.2300"), RadrootsCoreUnit::MassKg);
     26     let value = serde_json::to_value(&q).unwrap();
     27 
     28     assert_eq!(value["amount"], Value::String("1.23".to_string()));
     29     assert_eq!(value["unit"], Value::String("kg".to_string()));
     30     assert!(value.get("label").is_none());
     31 }
     32 
     33 #[test]
     34 fn quantity_deserializes_decimal_str_via_serde_ext() {
     35     let raw = r#"{"amount":"1.2300","unit":"kg","label":"bag"}"#;
     36     let q: RadrootsCoreQuantity = serde_json::from_str(raw).unwrap();
     37     assert_eq!(q.amount, common::dec("1.23"));
     38     assert_eq!(q.unit, RadrootsCoreUnit::MassKg);
     39     assert_eq!(q.label.as_deref(), Some("bag"));
     40 }
     41 
     42 #[test]
     43 fn quantity_rejects_non_string_decimal_amount() {
     44     let raw = r#"{"amount":1.23,"unit":"kg"}"#;
     45     let err = serde_json::from_str::<RadrootsCoreQuantity>(raw).unwrap_err();
     46     assert!(err.to_string().contains("invalid type"));
     47 }
     48 
     49 #[test]
     50 fn money_and_percent_roundtrip_with_strings() {
     51     let money = RadrootsCoreMoney::new(common::dec("2.50"), RadrootsCoreCurrency::USD);
     52     let value = serde_json::to_value(&money).unwrap();
     53     assert_eq!(value["amount"], Value::String("2.5".to_string()));
     54     assert_eq!(value["currency"], Value::String("USD".to_string()));
     55 
     56     let pct = RadrootsCorePercent::new(common::dec("12.5"));
     57     let value = serde_json::to_value(&pct).unwrap();
     58     assert_eq!(value["value"], Value::String("12.5".to_string()));
     59 }
     60 
     61 #[test]
     62 fn currency_serializes_as_code() {
     63     let c = RadrootsCoreCurrency::from_str("usd").unwrap();
     64     let json = serde_json::to_string(&c).unwrap();
     65     assert_eq!(json, "\"USD\"");
     66 }