| use std::path::PathBuf; | |
| use super::*; | |
| const INPUT: &str = include_str!("input.md"); | |
| const OUTPUT_PATH: &[&str] = | |
| &[env!("CARGO_MANIFEST_DIR"), "src", "markdown", "tests", "output.stdout"]; | |
| const TEST_WIDTH: usize = 80; | |
| // We try to make some words long to create corner cases | |
| const TXT: &str = r"Lorem ipsum dolor sit amet, consecteturadipiscingelit. | |
| Fusce-id-urna-sollicitudin, pharetra nisl nec, lobortis tellus. In at | |
| metus hendrerit, tincidunteratvel, ultrices turpis. Curabitur_risus_sapien, | |
| porta-sed-nunc-sed, ultricesposuerelacus. Sed porttitor quis | |
| dolor non venenatis. Aliquam ut. "; | |
| const WRAPPED: &str = r"Lorem ipsum dolor sit amet, consecteturadipiscingelit. Fusce-id-urna- | |
| sollicitudin, pharetra nisl nec, lobortis tellus. In at metus hendrerit, | |
| tincidunteratvel, ultrices turpis. Curabitur_risus_sapien, porta-sed-nunc-sed, | |
| ultricesposuerelacus. Sed porttitor quis dolor non venenatis. Aliquam ut. Lorem | |
| ipsum dolor sit amet, consecteturadipiscingelit. Fusce-id-urna- | |
| sollicitudin, pharetra nisl nec, lobortis tellus. In at metus hendrerit, | |
| tincidunteratvel, ultrices turpis. Curabitur_risus_sapien, porta-sed-nunc- | |
| sed, ultricesposuerelacus. Sed porttitor quis dolor non venenatis. Aliquam | |
| ut. Sample link lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, | |
| consecteturadipiscingelit. Fusce-id-urna-sollicitudin, pharetra nisl nec, | |
| lobortis tellus. In at metus hendrerit, tincidunteratvel, ultrices turpis. | |
| Curabitur_risus_sapien, porta-sed-nunc-sed, ultricesposuerelacus. Sed porttitor | |
| quis dolor non venenatis. Aliquam ut. "; | |
| #[test] | |
| fn test_wrapping_write() { | |
| WIDTH.with(|w| w.set(TEST_WIDTH)); | |
| let mut buf = Vec::new(); | |
| let txt = TXT.replace("-\n", "-").replace("_\n", "_").replace('\n', " ").replace(" ", ""); | |
| write_wrapping(&mut buf, &txt, 0, None, None).unwrap(); | |
| write_wrapping(&mut buf, &txt, 4, None, None).unwrap(); | |
| write_wrapping( | |
| &mut buf, | |
| "Sample link lorem ipsum dolor sit amet. ", | |
| 4, | |
| Some("link-address-placeholder"), | |
| None, | |
| ) | |
| .unwrap(); | |
| write_wrapping(&mut buf, &txt, 0, None, None).unwrap(); | |
| let out = String::from_utf8(buf).unwrap(); | |
| let out = out | |
| .replace("\x1b\\", "") | |
| .replace('\x1b', "") | |
| .replace("]8;;", "") | |
| .replace("link-address-placeholder", ""); | |
| for line in out.lines() { | |
| assert!(line.len() <= TEST_WIDTH, "line length\n'{line}'") | |
| } | |
| assert_eq!(out, WRAPPED); | |
| } | |
| #[test] | |
| fn test_output() { | |
| // Capture `--bless` when run via ./x | |
| let bless = std::env::var_os("RUSTC_BLESS").is_some_and(|v| v != "0"); | |
| let ast = MdStream::parse_str(INPUT); | |
| let mut buffer = Vec::new(); | |
| ast.write_anstream_buf(&mut buffer, None).unwrap(); | |
| let mut blessed = PathBuf::new(); | |
| blessed.extend(OUTPUT_PATH); | |
| if bless { | |
| std::fs::write(&blessed, buffer.as_slice()).unwrap(); | |
| eprintln!("blessed output at {}", blessed.display()); | |
| } else { | |
| let output = buffer.as_slice(); | |
| if std::fs::read(blessed).unwrap() != output { | |
| // hack: I don't know any way to write bytes to the captured stdout | |
| // that cargo test uses | |
| let mut out = std::io::stdout(); | |
| out.write_all(b"\n\nMarkdown output did not match. Expected:\n").unwrap(); | |
| out.write_all(&output).unwrap(); | |
| out.write_all(b"\n\n").unwrap(); | |
| panic!("markdown output mismatch"); | |
| } | |
| } | |
| } |