use pptx_rs::{Inches, Presentation};
use tempfile::TempDir;
#[test]
fn new_presentation_saves_to_bytes() {
let prs = Presentation::new().expect("Presentation::new failed");
let bytes = prs.to_bytes().expect("to_bytes failed");
assert!(!bytes.is_empty(), "saved bytes should not be empty");
assert_eq!(
&bytes[0..2],
b"PK",
"saved bytes should start with PK zip signature"
);
}
#[test]
fn round_trip_preserves_slide_count() {
let mut prs = Presentation::new().expect("Presentation::new failed");
for i in 0..3 {
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(1.0),
Inches(1.0),
Inches(8.0),
Inches(1.0),
&format!("Slide {}", i + 1),
)
.expect("add_textbox failed");
}
assert_eq!(prs.slides().len(), 3, "should have 3 slides before save");
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"
);
}
#[test]
fn save_to_temp_file_and_reload() {
let dir = TempDir::new().expect("TempDir::new failed");
let path = dir.path().join("test_presentation.pptx");
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(1.0),
Inches(1.0),
Inches(8.0),
Inches(1.0),
"临时文件测试",
)
.expect("add_textbox failed");
prs.save(&path).expect("save failed");
assert!(path.exists(), "saved file should exist");
let prs2 = Presentation::open(&path).expect("open failed");
assert_eq!(
prs2.slides().len(),
1,
"reloaded presentation should have 1 slide"
);
}
#[test]
fn load_modify_resave_workflow() {
let mut prs = Presentation::new().expect("Presentation::new failed");
let counter = prs.id_counter();
let _ = prs
.slides_mut()
.add_slide(counter)
.expect("add_slide failed");
let bytes1 = prs.to_bytes().expect("first to_bytes failed");
assert_eq!(prs.slides().len(), 1);
let mut prs2 = Presentation::load_bytes(&bytes1).expect("load_bytes failed");
assert_eq!(
prs2.slides().len(),
1,
"loaded presentation should have 1 slide"
);
let counter2 = prs2.id_counter();
let _ = prs2
.slides_mut()
.add_slide(counter2)
.expect("add_slide failed");
assert_eq!(
prs2.slides().len(),
2,
"should have 2 slides after adding one"
);
let bytes2 = prs2.to_bytes().expect("second to_bytes failed");
assert!(!bytes2.is_empty());
let prs3 = Presentation::load_bytes(&bytes2).expect("second load_bytes failed");
assert_eq!(
prs3.slides().len(),
2,
"final presentation should have 2 slides"
);
}
#[test]
fn empty_presentation_round_trip() {
let prs = Presentation::new().expect("Presentation::new 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(),
0,
"empty presentation should have 0 slides after round-trip"
);
}
#[test]
fn multiple_round_trips_are_stable() {
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(1.0),
Inches(1.0),
Inches(8.0),
Inches(1.0),
"多重 round-trip 稳定性测试",
)
.expect("add_textbox failed");
let mut bytes = prs.to_bytes().expect("first to_bytes failed");
for i in 0..3 {
let prs = Presentation::load_bytes(&bytes).expect("load_bytes failed");
assert_eq!(
prs.slides().len(),
1,
"round-trip #{} should preserve 1 slide",
i + 1
);
bytes = prs.to_bytes().expect("to_bytes failed");
}
assert!(
!bytes.is_empty(),
"bytes should not be empty after 3 round-trips"
);
}