use crate::checks::draft::testkit::{client, error, findings_for, trace};
fn for_code(check: &str, code: i64) -> Vec<String> {
let document = trace(&[
client(0, r#"{"jsonrpc":"2.0","id":1,"method":"ping"}"#),
error(1, "1", code),
]);
findings_for(check, &document)
}
fn assert_reports(check: &str, reported: &[i64], ignored: &[i64]) {
for code in reported {
assert_eq!(
for_code(check, *code).len(),
1,
"{check} should report {code}"
);
}
for code in ignored {
assert!(
for_code(check, *code).is_empty(),
"{check} should ignore {code}"
);
}
}
#[test]
fn the_legacy_sub_range_is_closed_at_both_ends() {
assert_reports(
"base.error-code-legacy-subrange",
&[-32000, -32010, -32019],
&[-32020, -31999, -32700, -1],
);
}
#[test]
fn the_reserved_sub_range_reports_only_codes_the_specification_leaves_undefined() {
assert_reports(
"base.error-code-reserved-subrange",
&[-32055, -32099, -32023],
&[-32020, -32021, -32022, -32010, -32100, -32700],
);
}
#[test]
fn withdrawn_codes_are_named_exactly() {
assert_reports(
"base.error-code-withdrawn",
&[-32002, -32042],
&[-32001, -32003, -32041, -32043, -32601],
);
}
#[test]
fn the_application_range_check_fires_only_on_what_nothing_else_accounts_for() {
assert_reports(
"base.error-code-application-range",
&[-32500, -32768, -32200],
&[
-32700, -32600, -32601, -32602, -32603,
-32020, -32021, -32022, -32010, -32055,
-1, 0, -31999, -40000,
],
);
}
#[test]
fn a_non_integer_code_is_left_to_its_own_clause() {
let document = trace(&[
client(0, r#"{"jsonrpc":"2.0","id":1,"method":"ping"}"#),
crate::checks::draft::testkit::server(
1,
r#"{"jsonrpc":"2.0","id":1,"error":{"code":"-32010","message":"x"}}"#,
),
]);
for check in [
"base.error-code-legacy-subrange",
"base.error-code-reserved-subrange",
"base.error-code-withdrawn",
"base.error-code-application-range",
] {
assert!(findings_for(check, &document).is_empty(), "{check}");
}
}