ada-url 3.4.4

Fast WHATWG Compliant URL parser
Documentation
#![cfg(feature = "std")]

mod common;

use ada_url::Url;
use common::{as_array, as_object, get_str, maybe_str, read_json};

#[test]
fn urltestdata_encoding() {
    let doc = read_json("tests/wpt/urltestdata.json");
    let mut counter = 0usize;

    for element in as_array(&doc, "urltestdata") {
        if element.is_string() {
            continue;
        }

        let object = as_object(element, "urltestdata entry");
        let input = get_str(object, "input");
        let base = maybe_str(object, "base");
        let failure = object
            .get("failure")
            .and_then(serde_json::Value::as_bool)
            .unwrap_or(false);

        let parsed = match base {
            Some(base) => Url::parse(input, Some(base)),
            None => Url::parse(input, None),
        };

        if failure {
            assert!(
                parsed.is_err(),
                "input should fail: {input:?}, base={base:?}"
            );
            continue;
        }

        let url = parsed.unwrap_or_else(|_| panic!("input should parse: {input:?}, base={base:?}"));
        let href = url.href();
        let components = url.components();

        assert_eq!(&href[..components.protocol_end as usize], url.protocol());

        if !url.username().is_empty() {
            let username_start = href.find(url.username()).expect("username in href");
            assert_eq!(
                &href[username_start..username_start + url.username().len()],
                url.username()
            );
        }

        if !url.password().is_empty() {
            let password_start = components.username_end as usize + 1;
            assert_eq!(
                &href[password_start..password_start + url.password().len()],
                url.password()
            );
        }

        let mut host_start = components.host_start as usize;
        if url.has_credentials() {
            assert_eq!(href.as_bytes()[host_start], b'@');
            host_start += 1;
        }
        assert_eq!(
            &href[host_start..host_start + url.hostname().len()],
            url.hostname()
        );

        assert_eq!(components.port.is_some(), !url.port().is_empty());

        if !url.pathname().is_empty() {
            let pathname_start = components
                .pathname_start
                .expect("pathname_start should exist") as usize;
            let pathname_end = components
                .search_start
                .or(components.hash_start)
                .map_or(href.len(), |idx| idx as usize);
            assert_eq!(&href[pathname_start..pathname_end], url.pathname());
        }

        if !url.search().is_empty() {
            let search_start = components.search_start.expect("search_start should exist") as usize;
            assert_eq!(
                &href[search_start..search_start + url.search().len()],
                url.search()
            );
        }

        if !url.hash().is_empty() {
            let hash_start = components.hash_start.expect("hash_start should exist") as usize;
            assert_eq!(&href[hash_start..hash_start + url.hash().len()], url.hash());
        }

        counter += 1;
    }

    assert!(counter > 0);
}