blob: dc7a1f6d2195a47d6786b703be0cdd3da992ab0d [file] [log] [blame]
use crate::*;
use std::fmt::{Debug, Display};
#[track_caller]
pub(crate) fn assert_parse_ok_eq<T: PartialEq + Debug + Display>(
input: &str,
result: Result<T, ParseError>,
expected: T,
parse_method: &str,
) {
match result {
Ok(actual) if actual == expected => {
if actual.to_string() != input {
panic!(
"formatting does not yield original input `{}`: {:?}",
input,
actual,
);
}
}
Ok(actual) => {
panic!(
"unexpected parsing result (with `{}`) for `{}`:\nactual: {:?}\nexpected: {:?}",
parse_method,
input,
actual,
expected,
);
}
Err(e) => {
panic!(
"expected `{}` to be parsed (with `{}`) successfully, but it failed: {:?}",
input,
parse_method,
e,
);
}
}
}
macro_rules! assert_err {
($ty:ident, $input:literal, $kind:ident, $( $span:tt )+ ) => {
assert_err_single!($ty::parse($input), $kind, $($span)+);
assert_err_single!($crate::Literal::parse($input), $kind, $($span)+);
};
}
macro_rules! assert_err_single {
($expr:expr, $kind:ident, $( $span:tt )+ ) => {
let res = $expr;
let err = match res {
Err(e) => e,
Ok(v) => panic!(
"Expected `{}` to return an error, but it returned Ok({:?})",
stringify!($expr),
v,
),
};
if err.kind != $crate::err::ParseErrorKind::$kind {
panic!(
"Expected error kind {} for `{}` but got {:?}",
stringify!($kind),
stringify!($expr),
err.kind,
)
}
let expected_span = assert_err_single!(@span $($span)+);
if err.span != expected_span {
panic!(
"Expected error span {:?} for `{}` but got {:?}",
expected_span,
stringify!($expr),
err.span,
)
}
};
(@span $start:literal .. $end:literal) => { Some($start .. $end) };
(@span $at:literal) => { Some($at.. $at + 1) };
(@span None) => { None };
}