use protocol::{ ServerMessage, ClientMessage, WidgetDescriptor, WireDisplayHint, WireLayoutNode, WireContainerNode, WireLayoutChild, WireDirection, WireSizing, WireWidgetState, WireKeyValue, WireValue, encode, decode_server_message, encode_client, decode_client_message, }; #[test] fn screen_update_round_trips() { let msg = ServerMessage::ScreenUpdate { layout: WireLayoutNode::Container(WireContainerNode { direction: WireDirection::Row, gap: 4, padding: 2, children: vec![ WireLayoutChild { sizing: WireSizing::Flex(1), node: WireLayoutNode::Leaf(1), }, WireLayoutChild { sizing: WireSizing::Fixed(80), node: WireLayoutNode::Leaf(2), }, ], }), widgets: vec![ WidgetDescriptor { id: 1, display_hint: WireDisplayHint::IconValue, state: WireWidgetState { data: vec![ WireKeyValue { key: "temperature".into(), value: WireValue::String("5.4°C".into()) }, WireKeyValue { key: "icon".into(), value: WireValue::String("cloud_rain".into()) }, ], error: None, }, }, ], }; let frame = encode(&msg).unwrap(); let payload = &frame[4..]; let decoded = decode_server_message(payload).unwrap(); assert_eq!(msg, decoded); } #[test] fn data_update_round_trips() { let msg = ServerMessage::DataUpdate { widgets: vec![ WidgetDescriptor { id: 3, display_hint: WireDisplayHint::TextBlock, state: WireWidgetState { data: vec![ WireKeyValue { key: "body".into(), value: WireValue::String("Breaking news...".into()) }, ], error: None, }, }, ], }; let frame = encode(&msg).unwrap(); let payload = &frame[4..]; let decoded = decode_server_message(payload).unwrap(); assert_eq!(msg, decoded); } #[test] fn server_heartbeat_round_trips() { let msg = ServerMessage::Heartbeat; let frame = encode(&msg).unwrap(); let payload = &frame[4..]; let decoded = decode_server_message(payload).unwrap(); assert_eq!(msg, decoded); } #[test] fn client_heartbeat_round_trips() { let msg = ClientMessage::Heartbeat; let frame = encode_client(&msg).unwrap(); let payload = &frame[4..]; let decoded = decode_client_message(payload).unwrap(); assert_eq!(msg, decoded); } #[test] fn frame_has_correct_length_prefix() { let msg = ServerMessage::Heartbeat; let frame = encode(&msg).unwrap(); let len = u32::from_be_bytes([frame[0], frame[1], frame[2], frame[3]]) as usize; assert_eq!(len, frame.len() - 4); }