use serde::{Deserialize, Serialize};
#[derive(Deserialize, Clone, Serialize)]
pub struct Track {
name: String,
file: String,
file_channel: Option<u16>,
}
impl Track {
pub fn new(name: String, file: &str, file_channel: Option<u16>) -> Track {
Track {
name,
file: file.to_string(),
file_channel,
}
}
pub fn name(&self) -> &str {
&self.name
}
pub fn file(&self) -> &str {
&self.file
}
pub fn file_channel(&self) -> Option<u16> {
self.file_channel
}
}
#[cfg(test)]
mod tests {
use super::*;
use config::{Config, File, FileFormat};
#[test]
fn new_with_channel() {
let t = Track::new("vocals".to_string(), "vocals.wav", Some(1));
assert_eq!(t.name(), "vocals");
assert_eq!(t.file(), "vocals.wav");
assert_eq!(t.file_channel(), Some(1));
}
#[test]
fn new_without_channel() {
let t = Track::new("drums".to_string(), "drums.wav", None);
assert_eq!(t.name(), "drums");
assert_eq!(t.file(), "drums.wav");
assert_eq!(t.file_channel(), None);
}
#[test]
fn deserialize_with_channel() {
let yaml = r#"
name: guitar
file: guitar.wav
file_channel: 2
"#;
let t: Track = Config::builder()
.add_source(File::from_str(yaml, FileFormat::Yaml))
.build()
.unwrap()
.try_deserialize()
.unwrap();
assert_eq!(t.name(), "guitar");
assert_eq!(t.file(), "guitar.wav");
assert_eq!(t.file_channel(), Some(2));
}
#[test]
fn deserialize_without_channel() {
let yaml = r#"
name: bass
file: bass.wav
"#;
let t: Track = Config::builder()
.add_source(File::from_str(yaml, FileFormat::Yaml))
.build()
.unwrap()
.try_deserialize()
.unwrap();
assert_eq!(t.name(), "bass");
assert_eq!(t.file(), "bass.wav");
assert_eq!(t.file_channel(), None);
}
#[test]
fn clone_preserves_all_fields() {
let t = Track::new("vocals".to_string(), "vocals.wav", Some(3));
let cloned = t.clone();
assert_eq!(cloned.name(), "vocals");
assert_eq!(cloned.file(), "vocals.wav");
assert_eq!(cloned.file_channel(), Some(3));
}
#[test]
fn serialize_roundtrip() {
let t = Track::new("keys".to_string(), "keys.wav", Some(5));
let serialized = crate::util::to_yaml_string(&t).unwrap();
let deserialized: Track = config::Config::builder()
.add_source(config::File::from_str(
&serialized,
config::FileFormat::Yaml,
))
.build()
.unwrap()
.try_deserialize()
.unwrap();
assert_eq!(deserialized.name(), "keys");
assert_eq!(deserialized.file(), "keys.wav");
assert_eq!(deserialized.file_channel(), Some(5));
}
#[test]
fn serialize_roundtrip_no_channel() {
let t = Track::new("click".to_string(), "click.wav", None);
let serialized = crate::util::to_yaml_string(&t).unwrap();
let deserialized: Track = config::Config::builder()
.add_source(config::File::from_str(
&serialized,
config::FileFormat::Yaml,
))
.build()
.unwrap()
.try_deserialize()
.unwrap();
assert_eq!(deserialized.name(), "click");
assert_eq!(deserialized.file(), "click.wav");
assert_eq!(deserialized.file_channel(), None);
}
}