use domain::{ ContainerNode, Direction, DisplayHint, LayoutChild, LayoutNode, Sizing, Value, WidgetError, WidgetState, }; use protocol::{ WireContainerNode, WireDirection, WireDisplayHint, WireKeyValue, WireLayoutChild, WireLayoutNode, WireSizing, WireValue, WireWidgetError, WireWidgetState, }; use std::collections::BTreeMap; #[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); } }