Documentation
// License: see LICENSE file at root directory of `master` branch

#[cfg(feature="std")]
use {
    core::convert::TryFrom,
    htt::{Header, IoResult, Response, Status, Version},
};

#[test]
#[cfg(feature="std")]
fn sending_responses() -> IoResult<()> {
    let response = Response {
        version: Version::V2_0,
        status: Status::Ok,
        headers: vec![(Header::Origin, "moon"), (Header::Server, "Mars")].into_iter().map(|(k, v)| (k, v.to_string())).collect(),
    };
    let mut buf = Vec::with_capacity(1024);
    let sent = response.send(&mut &b"Tests"[..], &mut buf)?;
    assert_eq!(sent, u64::try_from(buf.len()).unwrap());
    assert!(
        buf == &b"HTTP/2.0 200 OK\r\nOrigin: moon\r\nServer: Mars\r\n\r\nTests"[..]
        || buf == &b"HTTP/2.0 200 OK\r\nServer: Mars\r\nOrigin: moon\r\n\r\nTests"[..]
    );

    Ok(())
}

#[test]
#[cfg(feature="std")]
fn receiving_responses() -> IoResult<()> {
    for (version, status, headers, data) in vec![
        (Version::default(), Status::Ok, vec![(Header::Age, "9999"), (Header::Expires, "Next month")], &[][..]),
        (Version::V1_1, Status::TooEarly, vec![(Header::Origin, "Mars"), (Header::DNT, "of-course")], &b"Why???"[..]),
    ] {
        let response = Response {
            version,
            status,
            headers: headers.into_iter().map(|(k, v)| (k, v.to_string())).collect(),
        };
        let mut buf = Vec::with_capacity(1024);
        let sent = response.send(&mut &data[..], &mut buf)?;
        assert_eq!(sent, u64::try_from(buf.len()).unwrap());

        let mut received_data = Vec::with_capacity(data.len());
        let other = Response::recv(&mut buf.as_slice(), &mut received_data)?;

        assert_eq!(response.version, other.version);
        assert_eq!(response.status, other.status);
        assert_eq!(response.headers, other.headers);
        assert_eq!(data, received_data.as_slice());
    }

    Ok(())
}