summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_errors/src/markdown/tests/term.rs
blob: a0d956bf0cdab621a99b70b0c6742113c5af103f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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");
        }
    }
}