use super::atom::walk_literal_bytes;
struct Case {
input: &'static str,
expected_out: &'static str,
expected_remainder: &'static str,
expected_out_bytes: &'static [u8],
}
fn run_case(case: &Case) {
let mut out = String::new();
let mut remainder = case.input;
walk_literal_bytes(case.input, &mut out, &mut remainder);
assert_eq!(
out, case.expected_out,
"out mismatch for input {:?}",
case.input
);
assert_eq!(
out.as_bytes(),
case.expected_out_bytes,
"byte mismatch for input {:?}",
case.input
);
assert_eq!(
remainder, case.expected_remainder,
"remainder mismatch for input {:?}",
case.input
);
}
#[test]
fn walks_em_dash_leading() {
run_case(&Case {
input: "—password",
expected_out: "—password",
expected_remainder: "",
expected_out_bytes: b"\xe2\x80\x94password",
});
}
#[test]
fn walks_escaped_em_dash() {
run_case(&Case {
input: "\\—rest",
expected_out: "—rest",
expected_remainder: "",
expected_out_bytes: b"\xe2\x80\x94rest",
});
}
#[test]
fn walks_pure_ascii_regression() {
run_case(&Case {
input: "hello world",
expected_out: "hello world",
expected_remainder: "",
expected_out_bytes: b"hello world",
});
}
#[test]
fn walks_pipe_breaks_at_alternation() {
run_case(&Case {
input: "foo|bar",
expected_out: "foo",
expected_remainder: "|bar",
expected_out_bytes: b"foo",
});
}
#[test]
fn walks_metacharacter_breaks() {
run_case(&Case {
input: "foo.*bar",
expected_out: "foo",
expected_remainder: ".*bar",
expected_out_bytes: b"foo",
});
}
#[test]
fn walks_escape_underscore_regression() {
run_case(&Case {
input: "\\_foo",
expected_out: "_foo",
expected_remainder: "",
expected_out_bytes: b"_foo",
});
}
#[test]
fn walks_alphanumeric_escape_breaks() {
run_case(&Case {
input: "foo\\dbar",
expected_out: "foo",
expected_remainder: "\\dbar",
expected_out_bytes: b"foo",
});
}
#[test]
fn walks_em_dash_then_metacharacter() {
run_case(&Case {
input: "—.*",
expected_out: "—",
expected_remainder: ".*",
expected_out_bytes: b"\xe2\x80\x94",
});
}
#[test]
fn walks_two_byte_utf8_leading() {
run_case(&Case {
input: "écret",
expected_out: "écret",
expected_remainder: "",
expected_out_bytes: b"\xc3\xa9cret",
});
}
#[test]
fn walks_four_byte_utf8_leading() {
run_case(&Case {
input: "🔑secret",
expected_out: "🔑secret",
expected_remainder: "",
expected_out_bytes: b"\xf0\x9f\x94\x91secret",
});
}
#[test]
fn walks_escaped_emoji() {
run_case(&Case {
input: "\\🔑rest",
expected_out: "🔑rest",
expected_remainder: "",
expected_out_bytes: b"\xf0\x9f\x94\x91rest",
});
}
#[test]
fn walks_empty_input() {
run_case(&Case {
input: "",
expected_out: "",
expected_remainder: "",
expected_out_bytes: b"",
});
}
#[test]
fn walks_trailing_backslash() {
run_case(&Case {
input: "\\",
expected_out: "",
expected_remainder: "\\",
expected_out_bytes: b"",
});
}
#[test]
fn walks_mixed_widths_consecutive() {
run_case(&Case {
input: "a—é🔑z",
expected_out: "a—é🔑z",
expected_remainder: "",
expected_out_bytes: b"a\xe2\x80\x94\xc3\xa9\xf0\x9f\x94\x91z",
});
}