use rstest::rstest;
use crate::wrap::wrap_text;
const NORMALISED_BREAK: &str =
"______________________________________________________________________";
fn lines(text: &str) -> Vec<String> { text.lines().map(str::to_string).collect() }
#[rstest]
#[case("---")]
#[case("***")]
#[case("___")]
#[case("- - -")]
#[case("* * *")]
#[case("_ _ _")]
#[case(" ---")]
fn wrap_text_keeps_thematic_break_on_its_own_line(#[case] break_line: &str) {
let input = lines(&format!("alpha\n{break_line}\nbeta"));
let wrapped = wrap_text(&input, 80);
assert_eq!(
wrapped,
vec![
"alpha".to_string(),
break_line.to_string(),
"beta".to_string(),
]
);
}
#[test]
fn wrap_text_keeps_normalised_break_on_its_own_line() {
let input = lines(&format!("prose words here\n{NORMALISED_BREAK}\nmore prose"));
let wrapped = wrap_text(&input, 80);
assert_eq!(
wrapped,
vec![
"prose words here".to_string(),
NORMALISED_BREAK.to_string(),
"more prose".to_string(),
]
);
}
#[test]
fn wrap_text_keeps_break_after_an_open_code_span() {
let input = lines("- item with `open span\n- - -\nbody");
let expected = vec![
"- item with `open span".to_string(),
"- - -".to_string(),
"body".to_string(),
];
let wrapped = wrap_text(&input, 80);
assert_eq!(wrapped, expected);
let rewrapped = wrap_text(&wrapped, 80);
assert_eq!(rewrapped, wrapped, "wrapping is not a fixed point");
}