imsz 0.4.1

Get width and height from an image file reading as few bytes as possible.
Documentation
use imsz::{imsz, ImError, ImFormat, ImInfo, ImResult};

fn expect_broken(data: &[u8], expect_format: ImFormat) {
    let actual = imsz(data);

    if let Err(ImError::ParserError(format)) = actual {
        if format == expect_format {
            return;
        }
    }

    let expected: ImResult<ImInfo> = Err(ImError::ParserError(expect_format));
    assert!(false, " expected: {expected:?}\n   actual: {actual:?}");
}

#[test]
fn broken_avif() {
    let _ = imsz(b"\0\0\0\0ftypavif");
    let broken_images = [
        b"\0\0\0\0ftypavif" as &[u8],
        b"\x00\x00\x00\x0cftypavif",
        b"\x00\x00\x00\x0cftypavif\x00\x00\x00\x14meta....\x00\x00\x00\x08iprp",
        b"\x00\x00\x00\x0cftypavif\x00\x00\x00\x1cmeta....\x00\x00\x00\x10iprp\x00\x00\x00\x08ipco",
        b"\x00\x00\x00\x0cftypavif\x00\x00\x00$meta....\x00\x00\x00\x18iprp\x00\x00\x00\x10ipco\x00\x00\x00\x08ispe",
        b"\x00\x00\x00\x0cftypavif\x00\x00\x00/meta....\x00\x00\x00#iprp\x00\x00\x00\x1bipco\x00\x00\x00\x13ispe..........."
    ];
    for data in broken_images {
        expect_broken(data, ImFormat::AVIF);
    }
}

#[test]
fn broken_heif() {
    let _ = imsz(b"\0\0\0\0ftypheic");
    let broken_images = [
        b"\0\0\0\0ftypheic" as &[u8],
        b"\x00\x00\x00\x0cftypheic",
        b"\x00\x00\x00\x0cftypheic\x00\x00\x00\x14meta....\x00\x00\x00\x08iprp",
        b"\x00\x00\x00\x0cftypheic\x00\x00\x00\x1cmeta....\x00\x00\x00\x10iprp\x00\x00\x00\x08ipco",
        b"\x00\x00\x00\x0cftypheic\x00\x00\x00$meta....\x00\x00\x00\x18iprp\x00\x00\x00\x10ipco\x00\x00\x00\x08ispe",
        b"\x00\x00\x00\x0cftypheic\x00\x00\x00/meta....\x00\x00\x00#iprp\x00\x00\x00\x1bipco\x00\x00\x00\x13ispe..........."
    ];
    for data in broken_images {
        expect_broken(data, ImFormat::HEIF);
    }
}

#[test]
fn broken_gif() {
    let broken_images = [
        b"GIF87a" as &[u8],
        b"GIF89a...",
    ];
    for data in broken_images {
        expect_broken(data, ImFormat::GIF);
    }
}

#[test]
fn broken_png() {
    let broken_images = [
        b"\x89PNG\r\n\x1a\n" as &[u8],
        b"\x89PNG\r\n\x1a\n\x00\x00\x00\x07IHDR.......",
    ];
    for data in broken_images {
        expect_broken(data, ImFormat::PNG);
    }
}

#[test]
fn broken_bmp() {
    let broken_images = [
        b"BM\x00\x00\x00\x0e\0\0\0\0\0\0\0\0" as &[u8],
        b"BM\x00\x00\x00\x19\0\0\0\0\x00\x00\x00\x0b...........",
    ];
    for data in broken_images {
        expect_broken(data, ImFormat::BMP);
    }
}

#[test]
fn broken_ilbm() {
    let broken_images = [
        b"FORM\x00\x00\x00\x80ILBMBMHD\x00\x00\x00\x12\x02\x80\x01\xe0" as &[u8],
        b"FORM\x00\x00\x00\x1ePBM BMHD\x00\x00\x00\x14\x02\x80\x01\xe0",
    ];
    for data in broken_images {
        expect_broken(data, ImFormat::ILBM);
    }
}