use crate::api::{JxlDecoderInner, JxlDecoderOptions};
const CHUNK_SIZE: usize = 16;
fn test_resource(name: &str) -> Vec<u8> {
let manifest_dir = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
let path = manifest_dir.join("resources/test").join(name);
std::fs::read(&path).unwrap_or_else(|e| panic!("failed to read {}: {e}", path.display()))
}
#[test]
fn basic_info_hidden_until_embedded_profile_cmyk() {
let data = test_resource("conformance_test_images/cmyk_layers.jxl");
let mut decoder = JxlDecoderInner::new(JxlDecoderOptions::default());
let mut saw_some = false;
for chunk in data.chunks(CHUNK_SIZE) {
let mut input = chunk;
let _ = decoder.process(&mut input, None);
if decoder.embedded_color_profile().is_none() {
assert!(
decoder.basic_info().is_none(),
"basic_info() leaked before embedded color profile parsed"
);
}
if decoder.basic_info().is_some() {
assert!(
decoder.embedded_color_profile().is_some(),
"basic_info() became Some without embedded color profile"
);
saw_some = true;
break;
}
}
assert!(
saw_some,
"failed to reach image-info state while parsing cmyk_layers.jxl"
);
}
#[test]
fn basic_info_visible_for_non_icc_file() {
let data = test_resource("basic.jxl");
let mut decoder = JxlDecoderInner::new(JxlDecoderOptions::default());
let mut saw_some = false;
for chunk in data.chunks(CHUNK_SIZE) {
let mut input = chunk;
let _ = decoder.process(&mut input, None);
if decoder.basic_info().is_some() {
assert!(
decoder.embedded_color_profile().is_some(),
"basic.jxl transitioned to Some(basic_info) but embedded profile is still None"
);
let info = decoder.basic_info().unwrap();
assert!(info.size.0 > 0, "basic.jxl width should be positive");
assert!(info.size.1 > 0, "basic.jxl height should be positive");
saw_some = true;
break;
}
}
assert!(
saw_some,
"failed to reach image-info state while parsing basic.jxl"
);
}