#![no_main]
use libfuzzer_sys::fuzz_target;

use qoi_fast::{decode_header, decode_to_vec, Channels, ColorSpace, Header};

fuzz_target!(|input: (u16, u16, bool, &[u8])| {
    let (w, h, is_4, data) = input;
    let (w, h) = (1 + w % 260, 1 + h % 260);
    let channels = if is_4 { 4 } else { 3 };

    let mut vec = vec![
        b'q',
        b'o',
        b'i',
        b'f',
        0,
        0,
        (w >> 8) as u8,
        (w & 0xff) as u8,
        0,
        0,
        (h >> 8) as u8,
        (h & 0xff) as u8,
        channels,
        0,
    ];
    vec.extend(&*data);
    vec.extend(&[0, 0, 0, 0, 0, 0, 0, 1]);

    let header_expected = Header {
        width: w as u32,
        height: h as u32,
        channels: Channels::try_from(channels).unwrap(),
        colorspace: ColorSpace::try_from(0).unwrap(),
    };
    assert_eq!(decode_header(&vec).unwrap(), header_expected);

    if let Ok((header, out)) = decode_to_vec(&vec) {
        assert_eq!(header, header_expected);
        assert_eq!(out.len(), header.n_bytes());
    }
});
