use std::io::BufWriter; use std::path::PathBuf; use termcolor::{BufferWriter, ColorChoice}; 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 = BufWriter::new(Vec::new()); let txt = TXT.replace("-\n","-").replace("_\n","_").replace('\n', " ").replace(" ", ""); write_wrapping(&mut buf, &txt, 0, None).unwrap(); write_wrapping(&mut buf, &txt, 4, None).unwrap(); write_wrapping( &mut buf, "Sample link lorem ipsum dolor sit amet. ", 4, Some("link-address-placeholder"), ) .unwrap(); write_wrapping(&mut buf, &txt, 0, None).unwrap(); let out = String::from_utf8(buf.into_inner().unwrap()).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 bufwtr = BufferWriter::stderr(ColorChoice::Always); let mut buffer = bufwtr.buffer(); ast.write_termcolor_buf(&mut buffer).unwrap(); let mut blessed = PathBuf::new(); blessed.extend(OUTPUT_PATH); if bless { std::fs::write(&blessed, buffer.into_inner()).unwrap(); eprintln!("blessed output at {}", blessed.display()); } else { let output = buffer.into_inner(); 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"); } } }