use mp4box::get_boxes;
use serde_json::{self, Value};
use std::fs::File;
use std::io::Write;
use std::path::PathBuf;
fn make_minimal_mp4_file() -> PathBuf {
let mut data = Vec::new();
data.extend_from_slice(&24u32.to_be_bytes());
data.extend_from_slice(b"ftyp");
data.extend_from_slice(b"isom");
data.extend_from_slice(&512u32.to_be_bytes());
data.extend_from_slice(b"isom");
data.extend_from_slice(&8u32.to_be_bytes());
data.extend_from_slice(b"free");
data.extend_from_slice(&16u32.to_be_bytes());
data.extend_from_slice(b"mdat");
data.extend_from_slice(&[0u8; 8]);
let path = std::env::temp_dir().join("mp4box_json_roundtrip_test.mp4");
let mut f = File::create(&path).expect("create temp file failed");
f.write_all(&data).expect("write temp data failed");
path
}
#[test]
fn analyze_and_serialize_to_json() {
let path = make_minimal_mp4_file();
let mut file = File::open(&path).expect("open temp file failed");
let size = file.metadata().expect("metadata failed").len();
let boxes = get_boxes(&mut file, size, false).expect("get_boxes failed");
assert!(!boxes.is_empty(), "no boxes returned from get_boxes");
assert_eq!(boxes[0].typ, "ftyp");
assert_eq!(boxes[0].size, 24);
assert_eq!(boxes[0].header_size, 8);
assert_eq!(boxes[0].payload_size, Some(16));
let json_str = serde_json::to_string(&boxes).expect("serialize to JSON failed");
let v: Value = serde_json::from_str(&json_str).expect("parse JSON failed");
assert!(v.is_array());
let arr = v.as_array().unwrap();
let first = &arr[0];
assert_eq!(first["typ"], "ftyp");
assert_eq!(first["header_size"], 8);
assert_eq!(first["payload_size"], 16);
assert!(first.get("full_name").is_some());
assert!(first.get("offset").is_some());
}