use crate::time::Timestamp;
#[derive(Clone, Debug, PartialEq)]
pub struct Chapter {
pub id: u64,
pub start: Timestamp,
pub end: Timestamp,
pub title: Option<String>,
pub language: Option<String>,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Attachment {
pub name: String,
pub mime: Option<String>,
pub description: Option<String>,
pub data: Vec<u8>,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::time::TimeBase;
#[test]
fn chapter_clone_eq_round_trip() {
let base = TimeBase::new(1, 1000);
let c = Chapter {
id: 42,
start: Timestamp::new(0, base),
end: Timestamp::new(5_000, base),
title: Some("Intro".into()),
language: Some("en".into()),
};
let c2 = c.clone();
assert_eq!(c, c2);
assert_eq!(c.id, 42);
assert_eq!(c.start.value, 0);
assert_eq!(c.end.value, 5_000);
assert_eq!(c.title.as_deref(), Some("Intro"));
assert_eq!(c.language.as_deref(), Some("en"));
}
#[test]
fn chapter_optional_fields_default_to_none() {
let base = TimeBase::new(1, 1);
let c = Chapter {
id: 1,
start: Timestamp::new(0, base),
end: Timestamp::new(0, base),
title: None,
language: None,
};
assert!(c.title.is_none());
assert!(c.language.is_none());
assert_eq!(c.start, c.end);
}
#[test]
fn attachment_clone_eq_round_trip() {
let a = Attachment {
name: "cover.png".into(),
mime: Some("image/png".into()),
description: Some("Album front".into()),
data: vec![0x89, b'P', b'N', b'G'],
};
let a2 = a.clone();
assert_eq!(a, a2);
assert_eq!(a.name, "cover.png");
assert_eq!(a.mime.as_deref(), Some("image/png"));
assert_eq!(a.description.as_deref(), Some("Album front"));
assert_eq!(a.data, vec![0x89, b'P', b'N', b'G']);
}
#[test]
fn attachment_optional_fields_default_to_none() {
let a = Attachment {
name: "blob.bin".into(),
mime: None,
description: None,
data: Vec::new(),
};
assert!(a.mime.is_none());
assert!(a.description.is_none());
assert!(a.data.is_empty());
}
}