use std::collections::BTreeMap; use domain::{ Value, WidgetState, WidgetError, DisplayHint, LayoutNode, ContainerNode, LayoutChild, Direction, Sizing, }; use protocol::{ WireValue, WireWidgetState, WireWidgetError, WireDisplayHint, WireLayoutNode, WireContainerNode, WireLayoutChild, WireDirection, WireSizing, WireKeyValue, }; #[test] fn value_converts_to_wire_and_back() { let original = Value::Object(BTreeMap::from([ ("items".into(), Value::Array(vec![ Value::String("hello".into()), Value::Number(42.0), Value::Bool(true), Value::Null, ])), ])); let wire: WireValue = (&original).into(); let roundtripped: Value = wire.into(); assert_eq!(original, roundtripped); } #[test] fn widget_state_with_error_converts_to_wire_and_back() { let original = WidgetState { data: BTreeMap::from([ ("temp".into(), Value::Number(5.4)), ]), error: Some(WidgetError::SourceUnavailable), }; let wire: WireWidgetState = (&original).into(); let roundtripped: WidgetState = wire.into(); assert_eq!(original, roundtripped); } #[test] fn layout_tree_converts_to_wire_and_back() { let original = LayoutNode::Container(ContainerNode { direction: Direction::Row, gap: 4, padding: 2, children: vec![ LayoutChild { sizing: Sizing::Flex(1), node: LayoutNode::Leaf(1), }, LayoutChild { sizing: Sizing::Fixed(100), node: LayoutNode::Container(ContainerNode { direction: Direction::Column, gap: 2, padding: 0, children: vec![ LayoutChild { sizing: Sizing::Flex(1), node: LayoutNode::Leaf(2), }, ], }), }, ], }); let wire: WireLayoutNode = (&original).into(); let roundtripped: LayoutNode = wire.into(); assert_eq!(original, roundtripped); } #[test] fn display_hint_converts_to_wire_and_back() { for hint in [DisplayHint::IconValue, DisplayHint::TextBlock, DisplayHint::KeyValue] { let wire: WireDisplayHint = (&hint).into(); let roundtripped: DisplayHint = wire.into(); assert_eq!(hint, roundtripped); } }