use std::fs;
#[test]
fn fence_repair_mismatched_lengths() {
let input = fs::read_to_string("tests/data/unit/input/mismatched_fences.md")
.expect("Failed to read input fixture");
let expected = fs::read_to_string("tests/data/unit/expected/mismatched_fences.md")
.expect("Failed to read expected fixture");
let result = ascfix::modes::process_by_mode(
&ascfix::cli::Mode::Safe,
&input,
true,
&ascfix::config::Config::default(),
);
assert_eq!(
result.trim(),
expected.trim(),
"Fence repair output does not match expected"
);
}
#[test]
fn fence_repair_nested_fences() {
let input = fs::read_to_string("tests/data/unit/input/nested_fences.md")
.expect("Failed to read input fixture");
let expected = fs::read_to_string("tests/data/unit/expected/nested_fences.md")
.expect("Failed to read expected fixture");
let result = ascfix::modes::process_by_mode(
&ascfix::cli::Mode::Safe,
&input,
true,
&ascfix::config::Config::default(),
);
assert_eq!(
result.trim(),
expected.trim(),
"Nested fence output does not match expected"
);
}
#[test]
fn fence_repair_idempotent_mismatched() {
let input = fs::read_to_string("tests/data/unit/input/mismatched_fences.md")
.expect("Failed to read input fixture");
let first = ascfix::modes::process_by_mode(
&ascfix::cli::Mode::Safe,
&input,
true,
&ascfix::config::Config::default(),
);
let second = ascfix::modes::process_by_mode(
&ascfix::cli::Mode::Safe,
&first,
true,
&ascfix::config::Config::default(),
);
assert_eq!(
first.trim(),
second.trim(),
"Fence repair is not idempotent for mismatched fences"
);
}
#[test]
fn fence_repair_idempotent_nested() {
let input = fs::read_to_string("tests/data/unit/input/nested_fences.md")
.expect("Failed to read input fixture");
let first = ascfix::modes::process_by_mode(
&ascfix::cli::Mode::Safe,
&input,
true,
&ascfix::config::Config::default(),
);
let second = ascfix::modes::process_by_mode(
&ascfix::cli::Mode::Safe,
&first,
true,
&ascfix::config::Config::default(),
);
assert_eq!(
first.trim(),
second.trim(),
"Fence repair is not idempotent for nested fences"
);
}
#[test]
fn fence_repair_with_diagram_mode() {
let input = "```python\ncode\n`````\n\n┌─┐\n│a│\n└─┘";
let result = ascfix::modes::process_by_mode(
&ascfix::cli::Mode::Diagram,
input,
true,
&ascfix::config::Config::default(),
);
assert!(!result.is_empty());
assert!(result.contains("python") || result.contains("code"));
}
#[test]
fn fence_repair_disabled_by_default() {
let input = "```python\ncode\n`````";
let result = ascfix::modes::process_by_mode(
&ascfix::cli::Mode::Safe,
input,
false,
&ascfix::config::Config::default(),
);
assert_eq!(result, input);
}
#[test]
fn fence_repair_preserves_content() {
let input = "# Header\n\n```python\nprint('hello')\n`````\n\nSome text";
let result = ascfix::modes::process_by_mode(
&ascfix::cli::Mode::Safe,
input,
true,
&ascfix::config::Config::default(),
);
assert!(result.contains("# Header"));
assert!(result.contains("print('hello')"));
assert!(result.contains("Some text"));
}
#[test]
fn fence_repair_already_correct() {
let input = "```python\ncode\n```";
let result = ascfix::modes::process_by_mode(
&ascfix::cli::Mode::Safe,
input,
true,
&ascfix::config::Config::default(),
);
assert_eq!(result, input);
}
#[test]
fn fence_repair_unclosed_fence() {
let input = "```python\ncode";
let result = ascfix::modes::process_by_mode(
&ascfix::cli::Mode::Safe,
input,
true,
&ascfix::config::Config::default(),
);
assert!(result.contains("```"));
assert!(result.lines().count() >= 2);
}
#[test]
fn fence_repair_multiple_blocks() {
let input = "```\ncode1\n```\n\n```\ncode2\n`````";
let result = ascfix::modes::process_by_mode(
&ascfix::cli::Mode::Safe,
input,
true,
&ascfix::config::Config::default(),
);
assert!(result.contains("code1"));
assert!(result.contains("code2"));
let fence_count = result.matches("```").count();
assert_eq!(fence_count % 2, 0, "Fences should be balanced");
}
#[test]
fn fence_repair_mixed_types() {
let input = "```\ncode\n~~~";
let result = ascfix::modes::process_by_mode(
&ascfix::cli::Mode::Safe,
input,
true,
&ascfix::config::Config::default(),
);
assert!(!result.is_empty());
}
#[test]
fn fence_repair_with_language_specifier() {
let input = "```javascript\ncode\n`````";
let result = ascfix::modes::process_by_mode(
&ascfix::cli::Mode::Safe,
input,
true,
&ascfix::config::Config::default(),
);
assert!(result.contains("javascript"));
assert!(result.lines().filter(|l| l.contains('`')).count() >= 2);
}