use crate::uri::Uri;
use serde_json::Value;
const WHATWG_URLTESTDATA: &[u8] = include_bytes!("whatwg_urltestdata.json");
#[derive(Debug, Clone, Copy)]
enum PolicyDifference {
BackslashNotFolded,
ControlCharNotStripped,
AltIpv4PreservedAsName,
NoNormalizationAtParse,
FileSchemeQuirksNotImplemented,
}
const POLICY_DIVERGENCES: &[(&str, PolicyDifference)] = &[
(
"http://example.com\\foo",
PolicyDifference::BackslashNotFolded,
),
(
"http://example.com/\tfoo",
PolicyDifference::ControlCharNotStripped,
),
(
"http://example.com/foo\nbar",
PolicyDifference::ControlCharNotStripped,
),
(
"http://0177.0.0.1/",
PolicyDifference::AltIpv4PreservedAsName,
),
(
"http://0x7f.0.0.1/",
PolicyDifference::AltIpv4PreservedAsName,
),
(
"http://EXAMPLE.com:80/Path",
PolicyDifference::NoNormalizationAtParse,
),
(
"file:///C:/foo",
PolicyDifference::FileSchemeQuirksNotImplemented,
),
(
"file:C:/foo",
PolicyDifference::FileSchemeQuirksNotImplemented,
),
];
#[test]
fn whatwg_corpus_no_panic_either_mode() {
let entries: Vec<Value> = serde_json::from_slice(WHATWG_URLTESTDATA)
.expect("vendored whatwg_urltestdata.json must be valid JSON");
let mut tested = 0usize;
let mut graceful_ok = 0usize;
let mut strict_ok = 0usize;
for entry in &entries {
let Some(obj) = entry.as_object() else {
continue;
};
let Some(input) = obj.get("input").and_then(Value::as_str) else {
continue;
};
tested += 1;
if Uri::parse(input).is_ok() {
graceful_ok += 1;
}
if Uri::parse_strict(input).is_ok() {
strict_ok += 1;
}
}
assert!(
tested >= 100,
"WHATWG corpus loaded only {tested} entries — JSON probably broken"
);
eprintln!("whatwg corpus: tested={tested} graceful_ok={graceful_ok} strict_ok={strict_ok}",);
}
#[test]
fn policy_divergence_table_self_consistent() {
for (input, diff) in POLICY_DIVERGENCES {
drop(Uri::parse(*input));
drop(Uri::parse_strict(*input));
drop(format!("{diff:?}"));
}
}