Files
IronCalc/base/src/test/test_sheets.rs
2023-11-20 10:46:19 +01:00

239 lines
7.2 KiB
Rust

#![allow(clippy::unwrap_used)]
use crate::test::util::new_empty_model;
#[test]
fn test_add_remove_sheets() {
let mut model = new_empty_model();
model._set("A1", "7");
model._set("A2", "=Sheet2!C3");
model.evaluate();
assert_eq!(model.workbook.get_worksheet_names(), ["Sheet1"]);
assert_eq!(model._get_text("A2"), "#REF!");
// Add a sheet
model.new_sheet();
assert_eq!(model.workbook.get_worksheet_names(), ["Sheet1", "Sheet2"]);
assert_eq!(model._get_text("A2"), "0");
model._set("Sheet2!A1", "=Sheet1!A1");
model.evaluate();
assert_eq!(model._get_text("Sheet2!A1"), "7");
// Rename the first sheet
let r = model.rename_sheet("Sheet1", "Ricci");
assert!(r.is_ok());
assert_eq!(model.workbook.get_worksheet_names(), ["Ricci", "Sheet2"]);
assert_eq!(model._get_text("Sheet2!A1"), "7");
assert_eq!(model._get_formula("Sheet2!A1"), "=Ricci!A1");
// Remove the first sheet
let r = model.delete_sheet_by_name("Ricci");
assert!(r.is_ok());
assert_eq!(model.workbook.get_worksheet_names(), ["Sheet2"]);
assert_eq!(model._get_text("Sheet2!A1"), "#REF!");
}
#[test]
fn test_rename_delete_to_existing() {
let mut model = new_empty_model();
model.new_sheet();
// Cannot rename to an existing one
let r = model.rename_sheet("Sheet1", "Sheet2");
assert!(r.is_err());
// Not every name is valid
let r = model.rename_sheet("Sheet1", "Invalid[]");
assert!(r.is_err());
// Cannot delete something that does not exist
let r = model.delete_sheet_by_name("NonExists");
assert!(r.is_err());
}
#[test]
fn test_rename_one_sheet() {
let mut model = new_empty_model();
let r = model.rename_sheet("Sheet1", "Sheet2");
assert!(r.is_ok());
model.new_sheet();
assert_eq!(model.workbook.get_worksheet_names(), ["Sheet2", "Sheet1"]);
}
#[test]
fn test_rename_and_formula() {
let mut model = new_empty_model();
model._set("A1", "=A2*3");
model._set("A2", "42");
model.evaluate();
let r = model.rename_sheet("Sheet1", "Sheet2");
assert!(r.is_ok());
model.new_sheet();
assert_eq!(model.workbook.get_worksheet_names(), ["Sheet2", "Sheet1"]);
model._set("Sheet2!A3", "= A1 * 3");
model.evaluate();
assert_eq!(model._get_formula("Sheet2!A3"), "=A1*3");
}
#[test]
fn test_correct_quoting() {
let mut model = new_empty_model();
model.new_sheet();
model._set("Sheet2!B3", "400");
model._set("A1", "=Sheet2!B3*2");
model.evaluate();
assert_eq!(model._get_text("A1"), "800");
let r = model.rename_sheet("Sheet2", "New Sheet");
assert!(r.is_ok());
assert_eq!(model._get_text("A1"), "800");
assert_eq!(model._get_formula("A1"), "='New Sheet'!B3*2")
}
#[test]
fn test_cannot_delete_last_sheet() {
let mut model = new_empty_model();
let r = model.delete_sheet_by_name("Sheet1");
assert_eq!(r, Err("Cannot delete only sheet".to_string()));
model.new_sheet();
let r = model.delete_sheet_by_name("Sheet10");
assert_eq!(r, Err("Sheet not found".to_string()));
let r = model.delete_sheet_by_name("Sheet1");
assert!(r.is_ok());
}
#[test]
fn test_ranges() {
let mut model = new_empty_model();
model._set("A1", "=SUM(Sheet2!A1:C3)*Sheet3!A2");
model.evaluate();
assert_eq!(model._get_text("A1"), "#REF!");
model.new_sheet();
assert_eq!(model._get_text("A1"), "#REF!");
model.new_sheet();
assert_eq!(model._get_text("A1"), "0");
model._set("Sheet3!A2", "42");
model._set("Sheet2!A1", "2");
model.evaluate();
assert_eq!(model._get_text("A1"), "84");
let r = model.rename_sheet("Sheet2", "Other Sheet");
assert!(r.is_ok());
assert_eq!(
model._get_formula("A1"),
"=SUM('Other Sheet'!A1:C3)*Sheet3!A2"
);
}
#[test]
fn test_insert_sheet() {
// Set a formula with a wrong sheet
let mut model = new_empty_model();
model._set("A1", "=Bacchus!A3");
model._set("A2", "=Dionysus!A3");
model.evaluate();
assert_eq!(model._get_text("A1"), "#REF!");
assert_eq!(model._get_text("A2"), "#REF!");
// Insert the sheet at the end and check the formula
assert!(model.insert_sheet("Bacchus", 1, None).is_ok());
model.set_user_input(1, 3, 1, "42".to_string());
model.evaluate();
assert_eq!(model._get_text("A1"), "42");
assert_eq!(model._get_text("A2"), "#REF!");
// Insert a sheet in between the other two
assert!(model.insert_sheet("Dionysus", 1, None).is_ok());
model.set_user_input(1, 3, 1, "111".to_string());
model.evaluate();
assert_eq!(model._get_text("A1"), "42");
assert_eq!(model._get_text("A2"), "111");
assert_eq!(
model.workbook.get_worksheet_names(),
["Sheet1", "Dionysus", "Bacchus"]
);
// Insert a sheet out of bounds
assert!(model.insert_sheet("OutOfBounds", 4, None).is_err());
model.evaluate();
assert_eq!(
model.workbook.get_worksheet_names(),
["Sheet1", "Dionysus", "Bacchus"]
);
// Insert at the beginning
assert!(model.insert_sheet("FirstSheet", 0, None).is_ok());
model.evaluate();
assert_eq!(
model.workbook.get_worksheet_names(),
["FirstSheet", "Sheet1", "Dionysus", "Bacchus"]
);
}
#[test]
fn test_rename_sheet() {
let mut model = new_empty_model();
model.new_sheet();
model._set("A1", "=NewSheet!A3");
model.set_user_input(1, 3, 1, "25".to_string());
model.evaluate();
assert_eq!(model._get_text("A1"), "#REF!");
assert!(model.rename_sheet("Sheet2", "NewSheet").is_ok());
model.evaluate();
assert_eq!(model._get_text("A1"), "25");
}
#[test]
fn test_rename_sheet_by_index() {
let mut model = new_empty_model();
model.new_sheet();
model._set("A1", "=NewSheet!A1");
model.set_user_input(1, 1, 1, "25".to_string());
model.evaluate();
assert_eq!(model._get_text("A1"), "#REF!");
assert!(model.rename_sheet_by_index(1, "NewSheet").is_ok());
model.evaluate();
assert_eq!(model._get_text("A1"), "25");
}
#[test]
fn test_rename_sheet_by_index_error() {
let mut model = new_empty_model();
model.new_sheet();
assert!(model.rename_sheet_by_index(0, "OldSheet").is_ok());
assert!(model.rename_sheet_by_index(2, "NewSheet").is_err());
}
#[test]
fn test_delete_sheet_by_index() {
let mut model = new_empty_model();
model._set("A1", "7");
model._set("A2", "=Sheet2!C3");
model.evaluate();
assert_eq!(model.workbook.get_worksheet_names(), ["Sheet1"]);
assert_eq!(model._get_text("A2"), "#REF!");
// Add a sheet
model.new_sheet();
assert_eq!(model.workbook.get_worksheet_names(), ["Sheet1", "Sheet2"]);
assert_eq!(model._get_text("A2"), "0");
model._set("Sheet2!A1", "=Sheet1!A1");
model.evaluate();
assert_eq!(model._get_text("Sheet2!A1"), "7");
// Rename the first sheet
let r = model.rename_sheet("Sheet1", "Ricci");
assert!(r.is_ok());
assert_eq!(model.workbook.get_worksheet_names(), ["Ricci", "Sheet2"]);
assert_eq!(model._get_text("Sheet2!A1"), "7");
assert_eq!(model._get_formula("Sheet2!A1"), "=Ricci!A1");
// Remove the first sheet
let r = model.delete_sheet_by_name("Ricci");
assert!(r.is_ok());
assert_eq!(model.workbook.get_worksheet_names(), ["Sheet2"]);
assert_eq!(model._get_text("Sheet2!A1"), "#REF!");
}