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

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

#[test]
#[cfg(feature="std")]
fn sending_requests() -> IoResult<()> {
    let request = Request {
        version: Version::V2_0,
        method: Method::Options,
        url: String::from("/some/where/?"),
        headers: vec![(Header::Tk, "one"), (Header::Host, "localhost")].into_iter().map(|(k, v)| (k, v.to_string())).collect(),
    };
    let mut buf = Vec::with_capacity(1024);
    let sent = request.send(&mut &b"Examples"[..], &mut buf)?;
    assert_eq!(sent, u64::try_from(buf.len()).unwrap());
    assert!(
        buf == &b"OPTIONS /some/where/? HTTP/2.0\r\nTk: one\r\nHost: localhost\r\n\r\nExamples"[..]
        || buf == &b"OPTIONS /some/where/? HTTP/2.0\r\nHost: localhost\r\nTk: one\r\n\r\nExamples"[..]
    );

    Ok(())
}

#[test]
#[cfg(feature="std")]
fn receiving_requests() -> IoResult<()> {
    for (version, method, url, headers, data) in vec![
        (Version::default(), Method::Get, "/home/", vec![(Header::Age, "99"), (Header::Expires, "Tomorrow")], &b"HOHOHO"[..]),
        (Version::V2_0, Method::Post, "https://some:443/ROOT/", vec![(Header::Origin, "Hell"), (Header::DNT, "true")], &[]),
    ] {
        let request = Request {
            version,
            method,
            url: url.to_string(),
            headers: headers.into_iter().map(|(k, v)| (k, v.to_string())).collect(),
        };
        let mut buf = Vec::with_capacity(1024);
        let sent = request.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 = Request::recv(&mut buf.as_slice(), &mut received_data)?;

        assert_eq!(request.version, other.version);
        assert_eq!(request.method, other.method);
        assert_eq!(request.url, other.url);
        assert_eq!(request.headers, other.headers);
        assert_eq!(data, received_data.as_slice());
    }

    Ok(())
}