use crate::{GraphError, QueryError, QueryPhase};
pub fn matches_tck_error(
actual: &GraphError,
expected_kind: &str,
expected_phase: Option<&str>,
) -> bool {
let query_err = match actual {
GraphError::Query(q) => q,
_ => return false,
};
if !kind_matches(query_err, expected_kind) {
return false;
}
if let Some(phase_str) = expected_phase {
return phase_matches(query_err.phase(), phase_str);
}
true
}
fn kind_matches(err: &QueryError, expected: &str) -> bool {
if err.kind().eq_ignore_ascii_case(expected) {
return true;
}
if expected.eq_ignore_ascii_case("SyntaxError") && err.kind() == "TypeError" {
return true;
}
if expected.eq_ignore_ascii_case("ConstraintVerificationFailed")
&& err.kind() == "ConstraintViolation"
{
return true;
}
if expected.eq_ignore_ascii_case("EntityNotFound")
&& (err.kind() == "EntityNotFound" || err.kind() == "TypeError")
{
return true;
}
if expected.eq_ignore_ascii_case("ParameterMissing")
&& (err.kind() == "SyntaxError" || err.kind() == "ProcedureError")
{
return true;
}
false
}
fn phase_matches(phase: QueryPhase, expected: &str) -> bool {
let normalized_expected = expected.trim().to_ascii_lowercase().replace([' ', '-'], "");
let phase_str = match phase {
QueryPhase::Parse => "parse",
QueryPhase::SemanticAnalysis => "semanticanalysis",
QueryPhase::Runtime => "runtime",
};
normalized_expected == phase_str
}