cellrune 0.1.18

Bounded XLSX/XLSM reading, deterministic calculation, editing, and writing for Rust
Documentation
use super::patch_calculation_properties;
use crate::WriteLimits;
use crate::xlsx::package::PartPath;

fn part() -> PartPath {
    PartPath::from_archive_name(b"xl/workbook.xml").expect("valid part")
}

#[test]
fn existing_calculation_properties_preserve_producer_fields() {
    let source = br#"<?xml version="1.0"?><workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><sheets/><calcPr calcId="191029" calcMode="manual" fullCalcOnLoad="0" forceFullCalc="0" iterate="1" concurrentCalc="1"/></workbook>"#;
    let output =
        patch_calculation_properties(source, &part(), true, WriteLimits::default()).expect("patch");
    let output = String::from_utf8(output).expect("UTF-8 XML");
    assert!(output.contains(r#"calcId="191029""#));
    assert!(output.contains(r#"calcMode="manual""#));
    assert!(output.contains(r#"iterate="1""#));
    assert!(output.contains(r#"concurrentCalc="1""#));
    assert!(output.contains(r#"fullCalcOnLoad="1""#));
    assert!(output.contains(r#"forceFullCalc="1""#));
    assert_eq!(output.matches("fullCalcOnLoad=").count(), 1);
    assert_eq!(output.matches("forceFullCalc=").count(), 1);
}

#[test]
fn missing_calculation_properties_are_inserted_before_extensions() {
    let source = br#"<?xml version="1.0"?><workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><sheets/><extLst><ext uri="preserve"/></extLst></workbook>"#;
    let output = patch_calculation_properties(source, &part(), false, WriteLimits::default())
        .expect("patch");
    let output = String::from_utf8(output).expect("UTF-8 XML");
    let calc = output.find("<calcPr").expect("generated calcPr");
    let extensions = output.find("<extLst").expect("preserved extLst");
    assert!(
        calc < extensions,
        "calcPr must precede extLst in workbook order"
    );
    assert!(output.contains(r#"fullCalcOnLoad="0""#));
    assert!(output.contains(r#"forceFullCalc="0""#));
    assert!(output.contains(r#"<ext uri="preserve"/>"#));
}