// Copyright (c) 2017 Emmanuel Gil Peyrot // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. use crate::delay::Delay; use crate::message::Message; generate_element!( /// Contains a forwarded stanza, either standalone or part of another /// extension (such as carbons). Forwarded, "forwarded", FORWARD, children: [ /// When the stanza originally got sent. delay: Option = ("delay", DELAY) => Delay, // XXX: really? Option? /// The stanza being forwarded. stanza: Option = ("message", DEFAULT_NS) => Message // TODO: also handle the two other stanza possibilities. ] ); #[cfg(test)] mod tests { use super::*; use minidom::Element; use xso::error::{Error, FromElementError}; #[cfg(target_pointer_width = "32")] #[test] fn test_size() { assert_size!(Forwarded, 140); } #[cfg(target_pointer_width = "64")] #[test] fn test_size() { assert_size!(Forwarded, 264); } #[test] fn test_simple() { let elem: Element = "".parse().unwrap(); Forwarded::try_from(elem).unwrap(); } #[test] fn test_invalid_child() { let elem: Element = "" .parse() .unwrap(); let error = Forwarded::try_from(elem).unwrap_err(); let message = match error { FromElementError::Invalid(Error::Other(string)) => string, _ => panic!(), }; assert_eq!(message, "Unknown child in forwarded element."); } #[test] fn test_serialise() { let elem: Element = "".parse().unwrap(); let forwarded = Forwarded { delay: None, stanza: None, }; let elem2 = forwarded.into(); assert_eq!(elem, elem2); } #[test] fn test_serialize_with_delay_and_stanza() { let reference: Element = "" .parse() .unwrap(); let elem: Element = "" .parse() .unwrap(); let message = Message::try_from(elem).unwrap(); let elem: Element = "" .parse() .unwrap(); let delay = Delay::try_from(elem).unwrap(); let forwarded = Forwarded { delay: Some(delay), stanza: Some(message), }; let serialized: Element = forwarded.into(); assert_eq!(serialized, reference); } #[test] fn test_invalid_duplicate_delay() { let elem: Element = "" .parse() .unwrap(); let error = Forwarded::try_from(elem).unwrap_err(); let message = match error { FromElementError::Invalid(Error::Other(string)) => string, _ => panic!(), }; assert_eq!( message, "Element forwarded must not have more than one delay child." ); } #[test] fn test_invalid_duplicate_message() { let elem: Element = "" .parse() .unwrap(); let error = Forwarded::try_from(elem).unwrap_err(); let message = match error { FromElementError::Invalid(Error::Other(string)) => string, _ => panic!(), }; assert_eq!( message, "Element forwarded must not have more than one message child." ); } }