use super::*;
#[test]
fn test_table_cell_with_multiple_paragraphs() {
let multi_para_cell = TableCell {
content: vec![
Block::Paragraph(Paragraph {
style: ParagraphStyle::default(),
runs: vec![Run {
text: "First para".to_string(),
style: TextStyle::default(),
href: None,
footnote: None,
}],
}),
Block::Paragraph(Paragraph {
style: ParagraphStyle::default(),
runs: vec![Run {
text: "Second para".to_string(),
style: TextStyle::default(),
href: None,
footnote: None,
}],
}),
],
..TableCell::default()
};
let table = Table {
rows: vec![TableRow {
cells: vec![multi_para_cell],
height: None,
}],
column_widths: vec![200.0],
..Table::default()
};
let doc = make_doc(vec![make_flow_page(vec![Block::Table(table)])]);
let result = generate_typst(&doc).unwrap().source;
assert!(
result.contains("First para"),
"Expected First para in: {result}"
);
assert!(
result.contains("Second para"),
"Expected Second para in: {result}"
);
}
#[test]
fn test_table_cell_simple_list_uses_compact_fixed_text_layout() {
let list = List {
kind: ListKind::Unordered,
items: vec![
ListItem {
content: vec![Paragraph {
style: ParagraphStyle::default(),
runs: vec![Run {
text: "First item".to_string(),
style: TextStyle::default(),
href: None,
footnote: None,
}],
}],
level: 0,
start_at: None,
},
ListItem {
content: vec![Paragraph {
style: ParagraphStyle::default(),
runs: vec![Run {
text: "Second item".to_string(),
style: TextStyle::default(),
href: None,
footnote: None,
}],
}],
level: 0,
start_at: None,
},
],
level_styles: BTreeMap::new(),
};
let cell = TableCell {
content: vec![Block::List(list)],
..TableCell::default()
};
let table = Table {
rows: vec![TableRow {
cells: vec![cell],
height: None,
}],
column_widths: vec![200.0],
..Table::default()
};
let doc = make_doc(vec![make_flow_page(vec![Block::Table(table)])]);
let result = generate_typst(&doc).unwrap().source;
assert!(
result.contains("#stack(dir: ttb"),
"Expected compact stack-based list layout in: {result}"
);
assert!(
!result.contains("#list("),
"Compact table-cell lists should not use Typst list layout in: {result}"
);
assert!(result.contains("First item"));
assert!(result.contains("Second item"));
}
#[test]
fn test_table_cell_simple_list_treats_default_and_explicit_left_as_same_style() {
let list = List {
kind: ListKind::Unordered,
items: vec![
ListItem {
content: vec![Paragraph {
style: ParagraphStyle {
alignment: Some(Alignment::Left),
..ParagraphStyle::default()
},
runs: vec![Run {
text: "First item".to_string(),
style: TextStyle::default(),
href: None,
footnote: None,
}],
}],
level: 0,
start_at: None,
},
ListItem {
content: vec![Paragraph {
style: ParagraphStyle::default(),
runs: vec![Run {
text: "Second item".to_string(),
style: TextStyle::default(),
href: None,
footnote: None,
}],
}],
level: 0,
start_at: None,
},
],
level_styles: BTreeMap::new(),
};
let cell = TableCell {
content: vec![Block::List(list)],
..TableCell::default()
};
let table = Table {
rows: vec![TableRow {
cells: vec![cell],
height: None,
}],
column_widths: vec![200.0],
..Table::default()
};
let doc = make_doc(vec![make_flow_page(vec![Block::Table(table)])]);
let result = generate_typst(&doc).unwrap().source;
assert!(
result.contains("#stack(dir: ttb"),
"Expected compact stack-based list layout when only left-alignment explicitness differs: {result}"
);
assert!(
!result.contains("#list("),
"Equivalent left-alignment styles should not force Typst list layout in: {result}"
);
}
#[test]
fn test_table_cell_compact_list_adds_inter_item_spacing_from_line_spacing() {
let list = List {
kind: ListKind::Unordered,
items: vec![
ListItem {
content: vec![Paragraph {
style: ParagraphStyle {
line_spacing: Some(LineSpacing::Proportional(1.5)),
..ParagraphStyle::default()
},
runs: vec![Run {
text: "First item".to_string(),
style: TextStyle {
font_size: Some(24.0),
..TextStyle::default()
},
href: None,
footnote: None,
}],
}],
level: 0,
start_at: None,
},
ListItem {
content: vec![Paragraph {
style: ParagraphStyle {
line_spacing: Some(LineSpacing::Proportional(1.5)),
..ParagraphStyle::default()
},
runs: vec![Run {
text: "Second item".to_string(),
style: TextStyle {
font_size: Some(24.0),
..TextStyle::default()
},
href: None,
footnote: None,
}],
}],
level: 0,
start_at: None,
},
],
level_styles: BTreeMap::new(),
};
let cell = TableCell {
content: vec![Block::List(list)],
..TableCell::default()
};
let table = Table {
rows: vec![TableRow {
cells: vec![cell],
height: None,
}],
column_widths: vec![200.0],
..Table::default()
};
let doc = make_doc(vec![make_flow_page(vec![Block::Table(table)])]);
let result = generate_typst(&doc).unwrap().source;
assert!(
result.contains("#set par(leading: 12pt)"),
"Expected paragraph leading derived from PPT line spacing in: {result}"
);
assert!(
result.contains("#stack(dir: ttb, spacing: 12pt"),
"Compact table-cell lists should add inter-item spacing derived from PPT line spacing in: {result}"
);
}