use std::sync::Arc;
use xlsxparser::{parse_workbook, CellRef, CellValue, DateTimeValue, SheetVisibility};
fn fixture_path(relative: &str) -> String {
format!("{}/tests/fixtures/{relative}", env!("CARGO_MANIFEST_DIR"))
}
#[test]
fn real_basic_types_xlsx_maps_every_cell_type() {
let workbook = parse_workbook(fixture_path("normal/basic_types.xlsx")).unwrap();
let sheet = &workbook.sheets()[0];
assert_eq!(
sheet.get(CellRef { row: 1, col: 1 }).unwrap().value,
Some(CellValue::Text(Arc::from("日本語Text")))
);
assert_eq!(
sheet.get(CellRef { row: 1, col: 2 }).unwrap().value,
Some(CellValue::Number(42.0))
);
assert_eq!(
sheet.get(CellRef { row: 1, col: 3 }).unwrap().value,
Some(CellValue::Number(19.99))
);
assert_eq!(
sheet.get(CellRef { row: 1, col: 4 }).unwrap().value,
Some(CellValue::DateTime(DateTimeValue {
year: 2023,
month: 6,
day: 15,
hour: 0,
minute: 0,
second: 0,
}))
);
assert_eq!(
sheet.get(CellRef { row: 1, col: 5 }).unwrap().value,
Some(CellValue::Boolean(true))
);
assert_eq!(
sheet.get(CellRef { row: 1, col: 6 }).unwrap().value,
Some(CellValue::Boolean(false))
);
assert_eq!(
sheet.get(CellRef { row: 1, col: 7 }).unwrap().value,
Some(CellValue::Error("#N/A".to_string()))
);
}
#[test]
fn real_houganshi_merged_xlsx_resolves_the_whole_region_to_the_anchor() {
let workbook = parse_workbook(fixture_path("complex/houganshi_merged.xlsx")).unwrap();
let sheet = &workbook.sheets()[0];
let anchor = sheet.get(CellRef { row: 1, col: 1 }).unwrap();
assert_eq!(anchor.value, Some(CellValue::Text(Arc::from("houganshi"))));
for row in 1..=3 {
for col in 1..=3 {
assert_eq!(
sheet.get(CellRef { row, col }),
sheet.get(CellRef { row: 1, col: 1 })
);
}
}
}
#[test]
fn real_multi_sheet_states_xlsx_enumerates_every_visibility() {
let workbook = parse_workbook(fixture_path("complex/multi_sheet_states.xlsx")).unwrap();
let sheets = workbook.sheets();
assert_eq!(sheets.len(), 4);
let by_name: std::collections::HashMap<&str, &xlsxparser::Sheet> =
sheets.iter().map(|s| (s.name.as_str(), s)).collect();
assert_eq!(by_name["Visible"].visibility, SheetVisibility::Visible);
assert_eq!(by_name["Hidden"].visibility, SheetVisibility::Hidden);
assert_eq!(
by_name["VeryHidden"].visibility,
SheetVisibility::VeryHidden
);
assert_eq!(by_name["Empty"].iter_cells().count(), 0);
}
#[test]
fn real_extreme_sparse_xlsx_registers_only_the_two_populated_cells() {
let workbook = parse_workbook(fixture_path("complex/extreme_sparse.xlsx")).unwrap();
let sheet = &workbook.sheets()[0];
assert_eq!(
sheet.get(CellRef { row: 1, col: 1 }).unwrap().value,
Some(CellValue::Number(1.0))
);
assert_eq!(
sheet
.get(CellRef {
row: 1_048_576,
col: 16_384
})
.unwrap()
.value,
Some(CellValue::Number(2.0))
);
assert_eq!(sheet.iter_cells().count(), 2);
}