use pptx_rs::shape::Shape;
use pptx_rs::EmuExt;
use pptx_rs::{Inches, Presentation, PresetGeometry};
#[test]
fn textbox_round_trip() {
let mut prs = Presentation::new().expect("Presentation::new failed");
let counter = prs.id_counter();
let slide = prs
.slides_mut()
.add_slide(counter)
.expect("add_slide failed");
let tb = slide
.shapes_mut()
.add_textbox_with_text(
Inches(1.0),
Inches(1.0),
Inches(8.0),
Inches(1.0),
"文本框集成测试",
)
.expect("add_textbox failed");
assert_eq!(tb.left().value(), Inches(1.0).emu().value());
assert_eq!(tb.width().value(), Inches(8.0).emu().value());
let bytes = prs.to_bytes().expect("to_bytes failed");
let prs2 = Presentation::load_bytes(&bytes).expect("load_bytes failed");
assert_eq!(prs2.slides().len(), 1, "slide count should be 1");
}
#[test]
fn multiple_autoshapes() {
let mut prs = Presentation::new().expect("Presentation::new failed");
let counter = prs.id_counter();
let slide = prs
.slides_mut()
.add_slide(counter)
.expect("add_slide failed");
let rect = slide
.shapes_mut()
.add_shape(
PresetGeometry::Rectangle,
Inches(1.0),
Inches(1.0),
Inches(2.0),
Inches(1.0),
)
.expect("add_shape Rectangle failed");
assert_eq!(rect.width().value(), Inches(2.0).emu().value());
let round_rect = slide
.shapes_mut()
.add_shape(
PresetGeometry::RoundRectangle,
Inches(4.0),
Inches(1.0),
Inches(2.0),
Inches(1.0),
)
.expect("add_shape RoundRectangle failed");
assert_eq!(round_rect.left().value(), Inches(4.0).emu().value());
let oval = slide
.shapes_mut()
.add_shape(
PresetGeometry::Ellipse,
Inches(1.0),
Inches(3.0),
Inches(2.0),
Inches(1.0),
)
.expect("add_shape Ellipse failed");
assert_eq!(oval.top().value(), Inches(3.0).emu().value());
let bytes = prs.to_bytes().expect("to_bytes failed");
let prs2 = Presentation::load_bytes(&bytes).expect("load_bytes failed");
assert_eq!(prs2.slides().len(), 1, "slide count should be 1");
}
#[test]
fn table_round_trip() {
let mut prs = Presentation::new().expect("Presentation::new failed");
let counter = prs.id_counter();
let slide = prs
.slides_mut()
.add_slide(counter)
.expect("add_slide failed");
let table = slide
.shapes_mut()
.add_table(4, 3, Inches(1.0), Inches(1.0), Inches(8.0), Inches(3.0))
.expect("add_table failed");
assert_eq!(table.row_count(), 4);
assert_eq!(table.column_count(), 3);
let bytes = prs.to_bytes().expect("to_bytes failed");
let prs2 = Presentation::load_bytes(&bytes).expect("load_bytes failed");
assert_eq!(prs2.slides().len(), 1, "slide count should be 1");
}
#[test]
fn connector_round_trip() {
let mut prs = Presentation::new().expect("Presentation::new failed");
let counter = prs.id_counter();
let slide = prs
.slides_mut()
.add_slide(counter)
.expect("add_slide failed");
let _shape1 = slide
.shapes_mut()
.add_shape(
PresetGeometry::Rectangle,
Inches(1.0),
Inches(1.0),
Inches(2.0),
Inches(1.0),
)
.expect("add_shape 1 failed");
let _shape2 = slide
.shapes_mut()
.add_shape(
PresetGeometry::Rectangle,
Inches(5.0),
Inches(3.0),
Inches(2.0),
Inches(1.0),
)
.expect("add_shape 2 failed");
let _cxn = slide
.shapes_mut()
.add_connector(
pptx_rs::MsoConnectorType::Straight,
Inches(3.0),
Inches(1.5),
Inches(5.0),
Inches(3.5),
)
.expect("add_connector failed");
let bytes = prs.to_bytes().expect("to_bytes failed");
let prs2 = Presentation::load_bytes(&bytes).expect("load_bytes failed");
assert_eq!(prs2.slides().len(), 1, "slide count should be 1");
}
#[test]
fn mixed_shapes_in_one_slide() {
let mut prs = Presentation::new().expect("Presentation::new failed");
let counter = prs.id_counter();
let slide = prs
.slides_mut()
.add_slide(counter)
.expect("add_slide failed");
slide
.shapes_mut()
.add_textbox_with_text(
Inches(0.5),
Inches(0.5),
Inches(9.0),
Inches(1.0),
"混合形状标题",
)
.expect("add_textbox failed");
slide
.shapes_mut()
.add_shape(
PresetGeometry::Rectangle,
Inches(0.5),
Inches(2.0),
Inches(4.0),
Inches(2.0),
)
.expect("add_shape Rectangle failed");
slide
.shapes_mut()
.add_shape(
PresetGeometry::Ellipse,
Inches(5.0),
Inches(2.0),
Inches(4.0),
Inches(2.0),
)
.expect("add_shape Ellipse failed");
slide
.shapes_mut()
.add_table(3, 4, Inches(0.5), Inches(4.5), Inches(9.0), Inches(2.5))
.expect("add_table failed");
let bytes = prs.to_bytes().expect("to_bytes failed");
let prs2 = Presentation::load_bytes(&bytes).expect("load_bytes failed");
assert_eq!(prs2.slides().len(), 1, "slide count should be 1");
}
#[test]
fn multiple_slides_with_different_shapes() {
let mut prs = Presentation::new().expect("Presentation::new failed");
let counter = prs.id_counter();
let slide1 = prs
.slides_mut()
.add_slide(counter)
.expect("add_slide 1 failed");
slide1
.shapes_mut()
.add_textbox_with_text(
Inches(1.0),
Inches(1.0),
Inches(8.0),
Inches(1.0),
"第 1 张幻灯片",
)
.expect("add_textbox failed");
let counter = prs.id_counter();
let slide2 = prs
.slides_mut()
.add_slide(counter)
.expect("add_slide 2 failed");
slide2
.shapes_mut()
.add_shape(
PresetGeometry::Rectangle,
Inches(2.0),
Inches(2.0),
Inches(4.0),
Inches(2.0),
)
.expect("add_shape failed");
let counter = prs.id_counter();
let slide3 = prs
.slides_mut()
.add_slide(counter)
.expect("add_slide 3 failed");
slide3
.shapes_mut()
.add_table(3, 3, Inches(1.0), Inches(1.0), Inches(8.0), Inches(4.0))
.expect("add_table failed");
assert_eq!(prs.slides().len(), 3);
let bytes = prs.to_bytes().expect("to_bytes failed");
let prs2 = Presentation::load_bytes(&bytes).expect("load_bytes failed");
assert_eq!(
prs2.slides().len(),
3,
"slide count should be preserved after round-trip"
);
}