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 }