use tono_core::patch::Patch;
use tono_core::program::Program;
use tono_core::song::{CompileOptions, Song};
fn read(path: &str) -> String {
std::fs::read_to_string(format!(
"{}/tests/compat/{path}",
env!("CARGO_MANIFEST_DIR")
))
.unwrap_or_else(|e| panic!("read {path}: {e}"))
}
#[test]
fn alpha1_song_loads_and_compiles() {
let song: Song = serde_json::from_str(&read("song-alpha1.json")).expect("alpha.1 song parses");
assert!(song.tempo_map.is_empty() && song.meter_map.is_empty());
assert!(song.sections.is_empty() && song.markers.is_empty() && song.buses.is_empty());
assert_eq!(song.engine, Some(4), "the pin travels with the file");
let program = song.compile(&CompileOptions::default()).expect("compiles");
assert_eq!(
program.engine_version, 4,
"an engine-4 song renders engine 4"
);
program.doc.validate().expect("the resolved doc validates");
assert_eq!(
program.hash, 0x4ce124e0bc294e8b,
"the alpha.1 song compiles to its pinned v2 hash — if this changed, \
the change is a compatibility break, intentional or not"
);
assert!(!program.render_mono().is_empty());
}
#[test]
fn legacy_minimal_song_keeps_the_legacy_rule() {
let song: Song =
serde_json::from_str(&read("song-legacy-minimal.json")).expect("legacy song parses");
assert!(song.engine.is_none() && song.version.is_none());
let doc = song.to_doc().expect("compiles");
assert_eq!(doc.engine, Some(tono_core::dsl::ENGINE_VERSION));
assert_eq!(doc.version, None, "v1 semantics for unpinned saves");
doc.validate().expect("validates");
}
#[test]
fn program_v1_bundle_loads_and_verifies() {
let program = Program::from_json(&read("program-v1.program.json")).expect("v1 bundle loads");
assert_eq!(program.program_version, 1);
assert_eq!(program.schema_version, 2);
assert_eq!(program.engine_version, 5);
assert_eq!(program.hash, 0x551776bbf16d6c78);
assert_eq!(program.meta.name, "compat-fixture");
assert!(!program.render_mono().is_empty());
let tampered = read("program-v1.program.json").replacen("44100", "48000", 1);
assert!(
Program::from_json(&tampered).is_err(),
"tampering is detected"
);
}
#[test]
fn shipped_patch_example_loads_and_renders() {
let json = std::fs::read_to_string(concat!(
env!("CARGO_MANIFEST_DIR"),
"/../../docs/examples/parametric-impact.patch.json"
))
.expect("read shipped patch");
let patch: Patch = serde_json::from_str(&json).expect("patch parses");
let samples = patch
.render(&patch.defaults().into_iter().collect())
.expect("patch renders with defaults");
assert!(
samples.iter().any(|&x| x != 0.0),
"the shipped patch sounds"
);
}