use crate::core::{FromXml, IntoXml};
use crate::ns::TUNE;
use crate::pubsub::PubSubPayload;
#[derive(FromXml, IntoXml, Debug, PartialEq, Clone, Default)]
#[xml(namespace = TUNE, name = "tune")]
pub struct Tune {
#[xml(child(namespace = TUNE, name = "artist", extract(text), default))]
artist: Option<String>,
#[xml(child(namespace = TUNE, name = "length", extract(text(type = u16)), default))]
length: Option<u16>,
#[xml(child(namespace = TUNE, name = "rating", extract(text(type = u8)), default))]
rating: Option<u8>,
#[xml(child(namespace = TUNE, name = "source", extract(text), default))]
source: Option<String>,
#[xml(child(namespace = TUNE, name = "title", extract(text), default))]
title: Option<String>,
#[xml(child(namespace = TUNE, name = "track", extract(text), default))]
track: Option<String>,
#[xml(child(namespace = TUNE, name = "uri", extract(text), default))]
uri: Option<String>,
}
impl PubSubPayload for Tune {}
#[cfg(test)]
mod tests {
use super::*;
use crate::Element;
#[cfg(target_pointer_width = "32")]
#[test]
fn test_size() {
assert_size!(Tune, 68);
}
#[cfg(target_pointer_width = "64")]
#[test]
fn test_size() {
assert_size!(Tune, 128);
}
#[test]
fn empty() {
let elem: Element = "<tune xmlns='http://jabber.org/protocol/tune'/>"
.parse()
.unwrap();
let elem2 = elem.clone();
let tune = Tune::try_from(elem).unwrap();
assert!(tune.artist.is_none());
assert!(tune.length.is_none());
assert!(tune.rating.is_none());
assert!(tune.source.is_none());
assert!(tune.title.is_none());
assert!(tune.track.is_none());
assert!(tune.uri.is_none());
let elem3 = tune.into();
assert_eq!(elem2, elem3);
}
#[test]
fn full() {
let elem: Element = "<tune xmlns='http://jabber.org/protocol/tune'><artist>Yes</artist><length>686</length><rating>8</rating><source>Yessongs</source><title>Heart of the Sunrise</title><track>3</track><uri>http://www.yesworld.com/lyrics/Fragile.html#9</uri></tune>"
.parse()
.unwrap();
let tune = Tune::try_from(elem).unwrap();
assert_eq!(tune.artist, Some(String::from("Yes")));
assert_eq!(tune.length, Some(686));
assert_eq!(tune.rating, Some(8));
assert_eq!(tune.source, Some(String::from("Yessongs")));
assert_eq!(tune.title, Some(String::from("Heart of the Sunrise")));
assert_eq!(tune.track, Some(String::from("3")));
assert_eq!(
tune.uri,
Some(String::from(
"http://www.yesworld.com/lyrics/Fragile.html#9"
))
);
}
}