Initial Dever 0.0.1

This commit is contained in:
Codex committed 2026-11-03 03:32:07 +00:00
commit 81233d098c
1479 files changed
+163782

No files matched your search

+71
View File
@@ -0,0 +1,71 @@
// 使用实际三条调用路径记录接受/拒绝,不把 Axum 默认行为误当成 Dever 合同。
fn query_checks() {
let suffix = "&count=-7&enabled=true&ratio=1.25";
let mut cases = vec![
("plain", format!("name=Alice{suffix}")),
("empty_text", format!("name={suffix}")),
("unicode", format!("name=%E9%9B%AA+test{suffix}")),
("escaped_separator", format!("name=a%26b%3Dc{suffix}")),
("escaped_percent", format!("name=%25{suffix}")),
(
"valid_replacement_character",
format!("name=%EF%BF%BD{suffix}"),
),
("duplicate_required", format!("name=a&name=b{suffix}")),
("duplicate_optional", format!("name=a{suffix}&tag=x&tag=y")),
("escaped_duplicate", format!("name=a&%6Eame=b{suffix}")),
("unknown", format!("name=a{suffix}&extra=x")),
("missing_required", "name=a&enabled=true&ratio=1.25".into()),
("optional_present", format!("name=a{suffix}&tag=x")),
("empty_pairs", format!("&&name=a&&{suffix}&")),
("missing_equals", format!("name{suffix}")),
("truncated_percent", format!("name=%{suffix}")),
("short_percent", format!("name=%A{suffix}")),
("invalid_hex", format!("name=%GG{suffix}")),
("invalid_utf8", format!("name=%FF{suffix}")),
("overlong_utf8", format!("name=%C0%AF{suffix}")),
("encoded_surrogate", format!("name=%ED%A0%80{suffix}")),
("nul", format!("name=%00{suffix}")),
];
for (name, value) in [
("int_min", "-9223372036854775808"),
("int_max", "9223372036854775807"),
("int_overflow", "9223372036854775808"),
("int_fraction", "1.5"),
("int_leading_zero", "007"),
("int_encoded_plus", "%2B7"),
] {
cases.push((
name,
format!("name=a&count={value}&enabled=true&ratio=1.25"),
));
}
for (name, value) in [
("float_nan", "NaN"),
("float_inf", "inf"),
("float_overflow", "1e999"),
("float_negative_zero", "-0"),
("float_exponent", "1.5e3"),
] {
cases.push((name, format!("name=a&count=7&enabled=true&ratio={value}")));
}
cases.push(("invalid_bool", "name=a&count=7&enabled=1&ratio=1.25".into()));
println!("case,dever,axum,serde_urlencoded,equal_values");
for (name, query) in cases {
let input = [query_input(&query)];
let actual = runtime_query::<QueryArguments>(&input);
let axum = axum_query::<QueryArguments>(&input);
let serde = serde_query::<QueryArguments>(&input);
let equal = match (&actual, &axum, &serde) {
(Ok(actual), Ok(axum), Ok(serde)) => actual == axum && actual == serde,
(Err(_), Err(_), Err(_)) => true,
_ => false,
};
println!(
"{name},{},{},{},{equal}",
actual.is_ok(),
axum.is_ok(),
serde.is_ok()
);
}
}