use insta::assert_snapshot;
use crate::*;
#[test]
fn column() {
let doc = Doc::text("prefix").concat_space(Doc::column(|l| {
Doc::text("| <- column").concat_space(Doc::text(format!("{l}")))
}));
let doc = Doc::vsep(
vec![0, 4, 8]
.into_iter()
.map(|n| Doc::indent(doc.clone(), n)),
);
assert_snapshot!(doc.render(20))
}
#[test]
fn nesting() {
let doc = Doc::text("prefix").concat_space(Doc::nesting(|l| {
Doc::brackets(Doc::text("Nested:").concat_space(Doc::text(format!("{l}"))))
}));
let doc = Doc::vsep(
vec![0, 4, 8]
.into_iter()
.map(|n| Doc::indent(doc.clone(), n)),
);
assert_snapshot!(doc.render(20))
}
#[test]
fn stack_stress() {
fn group_with_k_items(k: usize, base: usize, indent: i16) -> Doc {
let items: Vec<Doc> = (0..k)
.map(|i| {
let len = base + (i % 7) + (k % 5);
let label = format!("item{}_{}", k, i);
let payload = "x".repeat(len);
Doc::hcat([Doc::text(&label), Doc::text(":"), Doc::text(&payload)])
})
.collect();
let comma_space = Doc::text(", ");
let flat_items = Doc::intersperse(items.iter().cloned(), comma_space.clone());
let flat = flat_items.brackets();
let broke_items = {
let mut v: Vec<Doc> = Vec::new();
for (i, it) in items.into_iter().enumerate() {
if i > 0 {
v.push(Doc::line().concat(Doc::comma()));
v.push(Doc::text(" "));
}
v.push(it);
}
Doc::hcat(v).nest(indent)
};
let broke = broke_items.concat(Doc::line()).brackets();
Doc::alt(flat.flatten(), broke)
}
fn build_alt_stress(num_groups: usize) -> Doc {
let mut blocks: Vec<Doc> = Vec::new();
for g in 0..num_groups {
let k = 3 + (g % 9); let base = 4 + (g % 13); let indent = 2 + (g % 6) as i16;
let grp = group_with_k_items(k, base, indent);
let sep_flat = Doc::text(" • ");
let sep_broke = Doc::line().concat(Doc::text("- "));
let sep = Doc::alt(sep_flat, sep_broke);
if g > 0 {
blocks.push(sep);
}
let deep = {
let inner = Doc::line().concat(Doc::text("inner")).braces();
Doc::alt(inner.clone().flatten(), inner.nest(2 + (g % 4) as i16))
};
blocks.push(Doc::hcat(vec![grp, Doc::space(), deep]));
}
Doc::hcat(blocks)
}
let doc = build_alt_stress(1000);
let widths = [20_i16, 32, 48, 64, 96, 140];
for &w in &widths {
let cloned = doc.clone();
let _render = cloned.render(w);
}
}