use mdtablefix::renumber_lists;
use rstest::rstest;
#[macro_use]
mod prelude;
use prelude::*;
#[test]
fn restart_after_equal_indent_paragraph() {
let input = lines_vec!("1. One", "", "Paragraph", "3. Next");
let expected = lines_vec!("1. One", "", "Paragraph", "1. Next");
assert_eq!(renumber_lists(&input), expected);
}
#[test]
fn no_restart_without_blank() {
let input = lines_vec!("1. One", "Paragraph", "3. Next");
let expected = lines_vec!("1. One", "Paragraph", "2. Next");
assert_eq!(renumber_lists(&input), expected);
}
#[test]
fn no_restart_for_indented_paragraph() {
let input = lines_vec!("1. One", "", " Indented", "3. Next");
let expected = lines_vec!("1. One", "", " Indented", "2. Next");
assert_eq!(renumber_lists(&input), expected);
}
#[test]
fn restart_after_top_heading() {
let input = lines_vec!("1. One", "", "# Heading", "3. Next");
let expected = lines_vec!("1. One", "", "# Heading", "1. Next");
assert_eq!(renumber_lists(&input), expected);
}
#[test]
fn restart_after_nested_paragraph() {
let input = lines_vec!("1. One", " 1. Sub", "", "Paragraph", "3. Next");
let expected = lines_vec!("1. One", " 1. Sub", "", "Paragraph", "1. Next");
assert_eq!(renumber_lists(&input), expected);
}
#[test]
fn restart_after_nested_equal_indent_paragraph() {
let input = lines_vec!("1. One", " 1. Sub", "", " Paragraph", " 5. Next");
let expected = lines_vec!("1. One", " 1. Sub", "", " Paragraph", " 1. Next");
assert_eq!(renumber_lists(&input), expected);
}
#[test]
fn restart_after_formatting_paragraph() {
let input = lines_vec!("1. Start", "", "**Bold intro**", "", "4. Next");
let expected = lines_vec!("1. Start", "", "**Bold intro**", "", "1. Next");
assert_eq!(renumber_lists(&input), expected);
}
#[test]
fn reset_on_heading_and_thematic_break() {
let input = lines_vec!("1. a", "2. b", "# Heading", "1. c", "---", "5. d");
let expected = lines_vec!("1. a", "2. b", "# Heading", "1. c", "---", "1. d");
assert_eq!(renumber_lists(&input), expected);
}
#[test]
fn test_cli_renumber_option() {
Command::cargo_bin("mdtablefix")
.expect("Failed to create cargo command for mdtablefix")
.arg("--renumber")
.write_stdin("1. a\n4. b\n")
.assert()
.success()
.stdout("1. a\n2. b\n");
}
#[test]
fn nested_lists_respect_fence_tracker() {
let input = lines_vec![
"1. Outer list",
" ```",
" 1. Code block list",
" ```",
"9. Outer list continued",
" 4. Nested list",
" ```",
" - Malformed fence",
" ```",
" 8. Nested list continued",
];
let expected = lines_vec![
"1. Outer list",
" ```",
" 1. Code block list",
" ```",
"2. Outer list continued",
" 1. Nested list",
" ```",
" - Malformed fence",
" ```",
" 2. Nested list continued",
];
assert_eq!(renumber_lists(&input), expected);
}
#[test]
fn malformed_fences_do_not_break_list_renumbering() {
let input = lines_vec![
"1. List before fence",
" ```",
" 1. Inside code block",
" ``",
" still inside fence",
" ```",
"7. List after fence",
];
let expected = lines_vec![
"1. List before fence",
" ```",
" 1. Inside code block",
" ``",
" still inside fence",
" ```",
"2. List after fence",
];
assert_eq!(renumber_lists(&input), expected);
}
#[rstest(
input,
expected,
case::basic(
lines_vec!["1. first", "2. second", "7. third"],
lines_vec!["1. first", "2. second", "3. third"]
),
case::with_fence(
lines_vec!["1. item", "```", "code", "```", "9. next"],
lines_vec!["1. item", "```", "code", "```", "2. next"]
),
case::nested_lists(
lines_vec!["1. first", " 1. sub first", " 3. sub second", "2. second"],
lines_vec!["1. first", " 1. sub first", " 2. sub second", "2. second"]
),
case::tabs_in_indent(
lines_vec!["1. first", "\t1. sub first", "\t5. sub second", "2. second"],
lines_vec!["1. first", "\t1. sub first", "\t2. sub second", "2. second"]
),
case::mult_paragraph_items(
lines_vec!["1. first", "", " still first paragraph", "", "2. second"],
lines_vec!["1. first", "", " still first paragraph", "", "2. second"]
),
case::table_in_list(
lines_vec!["1. first", " | A | B |", " | 1 | 2 |", "5. second"],
lines_vec!["1. first", " | A | B |", " | 1 | 2 |", "2. second"]
),
case::restart_after_paragraph(
include_lines!("data/renumber_paragraph_restart_input.txt"),
include_lines!("data/renumber_paragraph_restart_expected.txt")
),
case::restart_after_formatting(
include_lines!("data/renumber_formatting_paragraph_input.txt"),
include_lines!("data/renumber_formatting_paragraph_expected.txt")
),
case::restart_after_break(
include_lines!("data/renumber_break_restart_input.txt"),
include_lines!("data/renumber_break_restart_expected.txt")
),
case::restart_after_heading(
include_lines!("data/renumber_heading_restart_input.txt"),
include_lines!("data/renumber_heading_restart_expected.txt")
),
case::restart_after_break_and_heading(
include_lines!("data/renumber_break_heading_restart_input.txt"),
include_lines!("data/renumber_break_heading_restart_expected.txt")
),
case::blank_lines(
include_lines!("data/renumber_blank_lines_input.txt"),
include_lines!("data/renumber_blank_lines_expected.txt")
),
case::ordered_list(
include_lines!("data/renumber_ordered_list_input.txt"),
include_lines!("data/renumber_ordered_list_expected.txt")
)
)]
fn test_renumber_cases(input: Vec<String>, expected: Vec<String>) {
assert_eq!(renumber_lists(&input), expected);
}