#![allow(clippy::unwrap_used)]
use crate::{cell::CellValue, test::util::new_empty_model};
const EXCEL_MAX_DATE: f64 = 2958465.0; const EXCEL_INVALID_DATE: f64 = 2958466.0;
#[test]
fn test_fn_date_arguments() {
let mut model = new_empty_model();
model._set("A1", "=DATE()");
model._set("A2", "=DATE(1975)");
model._set("A3", "=DATE(1975, 2)");
model._set("A4", "=DATE(1975, 2, 10, 3)");
model._set("A5", "=DATE(1975, -2, 10)");
model._set("A6", "=DATE(1975, 2, -10)");
model._set("A7", "=DATE(1975, 14, 10)");
model._set("A8", "=DATE(1975, 2, 30)");
model._set("A9", "=DATE(1975, 2, 29)");
model._set("A10", "=DATE(1976, 2, 29)");
model.evaluate();
assert_eq!(model._get_text("A1"), *"#ERROR!");
assert_eq!(model._get_text("A2"), *"#ERROR!");
assert_eq!(model._get_text("A3"), *"#ERROR!");
assert_eq!(model._get_text("A4"), *"#ERROR!");
assert_eq!(model._get_text("A5"), *"10/10/1974");
assert_eq!(model._get_text("A6"), *"1/21/1975");
assert_eq!(model._get_text("A7"), *"2/10/1976");
assert_eq!(model._get_text("A8"), *"3/2/1975");
assert_eq!(model._get_text("A9"), *"3/1/1975");
assert_eq!(model._get_text("A10"), *"2/29/1976");
assert_eq!(
model.get_cell_value_by_ref("Sheet1!A10"),
Ok(CellValue::Number(27819.0))
);
}
#[test]
fn test_date_out_of_range() {
let mut model = new_empty_model();
model._set("A1", "=DATE(2022, 0, 10)");
model._set("A2", "=DATE(2022, 13, 10)");
model._set("B1", "=DATE(2042, 5, 0)");
model._set("B2", "=DATE(2025, 5, 32)");
model._set("C1", "=DATE(-1, 5, 5)");
model._set("C2", "=DATE(10000, 5, 5)");
model.evaluate();
assert_eq!(model._get_text("A1"), *"12/10/2021");
assert_eq!(model._get_text("A2"), *"1/10/2023");
assert_eq!(model._get_text("B1"), *"4/30/2042");
assert_eq!(model._get_text("B2"), *"6/1/2025");
assert_eq!(model._get_text("C1"), *"#NUM!");
assert_eq!(model._get_text("C2"), *"#NUM!");
}
#[test]
fn test_year_arguments() {
let mut model = new_empty_model();
model._set("A1", "=YEAR()");
model._set("A2", "=YEAR(27819)");
model._set("A3", "=YEAR(27819, 3)");
model.evaluate();
assert_eq!(model._get_text("A1"), *"#ERROR!");
assert_eq!(model._get_text("A2"), *"1976");
assert_eq!(model._get_text("A3"), *"#ERROR!");
}
#[test]
fn test_month_arguments() {
let mut model = new_empty_model();
model._set("A1", "=MONTH()");
model._set("A2", "=MONTH(27819)");
model._set("A3", "=MONTH(27819, 3)");
model.evaluate();
assert_eq!(model._get_text("A1"), *"#ERROR!");
assert_eq!(model._get_text("A2"), *"2");
assert_eq!(model._get_text("A3"), *"#ERROR!");
}
#[test]
fn test_day_arguments() {
let mut model = new_empty_model();
model._set("A1", "=DAY()");
model._set("A2", "=DAY(27819)");
model._set("A3", "=DAY(27819, 3)");
model.evaluate();
assert_eq!(model._get_text("A1"), *"#ERROR!");
assert_eq!(model._get_text("A2"), *"29");
assert_eq!(model._get_text("A3"), *"#ERROR!");
}
#[test]
fn test_day_small_serial() {
let mut model = new_empty_model();
model._set("A1", "=DAY(-1)");
model._set("A2", "=DAY(0)");
model._set("A3", "=DAY(60)");
model._set("A4", "=DAY(61)");
model.evaluate();
assert_eq!(model._get_text("A1"), *"#NUM!");
assert_eq!(model._get_text("A2"), *"#NUM!");
assert_eq!(model._get_text("A3"), *"28");
assert_eq!(model._get_text("A4"), *"1");
}
#[test]
fn test_month_small_serial() {
let mut model = new_empty_model();
model._set("A1", "=MONTH(-1)");
model._set("A2", "=MONTH(0)");
model._set("A3", "=MONTH(60)");
model._set("A4", "=MONTH(61)");
model.evaluate();
assert_eq!(model._get_text("A1"), *"#NUM!");
assert_eq!(model._get_text("A2"), *"#NUM!");
assert_eq!(model._get_text("A3"), *"2");
assert_eq!(model._get_text("A4"), *"3");
}
#[test]
fn test_year_small_serial() {
let mut model = new_empty_model();
model._set("A1", "=YEAR(-1)");
model._set("A2", "=YEAR(0)");
model._set("A3", "=YEAR(60)");
model._set("A4", "=YEAR(61)");
model.evaluate();
assert_eq!(model._get_text("A1"), *"#NUM!");
assert_eq!(model._get_text("A2"), *"#NUM!");
assert_eq!(model._get_text("A3"), *"1900");
assert_eq!(model._get_text("A4"), *"1900");
}
#[test]
fn test_date_early_dates() {
let mut model = new_empty_model();
model._set("A1", "=DATE(1900, 1, 1)");
model._set("A2", "=DATE(1900, 2, 28)");
model._set("B2", "=DATE(1900, 2, 29)");
model._set("A3", "=DATE(1900, 3, 1)");
model.evaluate();
assert_eq!(model._get_text("A1"), *"1/1/1900");
assert_eq!(
model.get_cell_value_by_ref("Sheet1!A1"),
Ok(CellValue::Number(2.0))
);
assert_eq!(model._get_text("A2"), *"2/28/1900");
assert_eq!(
model.get_cell_value_by_ref("Sheet1!A2"),
Ok(CellValue::Number(60.0))
);
assert_eq!(model._get_text("B2"), *"3/1/1900");
assert_eq!(model._get_text("A3"), *"3/1/1900");
assert_eq!(
model.get_cell_value_by_ref("Sheet1!A3"),
Ok(CellValue::Number(61.0))
);
}
#[test]
fn test_days_function() {
let mut model = new_empty_model();
model._set("A1", "=DAYS(44570,44561)");
model._set("A2", "=DAYS(44561,44570)"); model._set("A3", "=DAYS(44561,44561)");
model._set("A4", "=DAYS(1,2)"); model._set(
"A5",
&format!("=DAYS({},{})", EXCEL_MAX_DATE, EXCEL_MAX_DATE - 1.0),
);
model._set("A6", "=DAYS()");
model._set("A7", "=DAYS(44561)");
model._set("A8", "=DAYS(44561,44570,1)");
model._set("A9", "=DAYS(-1,44561)");
model._set("A10", &format!("=DAYS(44561,{EXCEL_INVALID_DATE})"));
model.evaluate();
assert_eq!(model._get_text("A1"), *"9");
assert_eq!(model._get_text("A2"), *"-9");
assert_eq!(model._get_text("A3"), *"0");
assert_eq!(model._get_text("A4"), *"-1"); assert_eq!(model._get_text("A5"), *"1");
assert_eq!(model._get_text("A6"), *"#ERROR!");
assert_eq!(model._get_text("A7"), *"#ERROR!");
assert_eq!(model._get_text("A8"), *"#ERROR!");
assert_eq!(model._get_text("A9"), *"#NUM!");
assert_eq!(model._get_text("A10"), *"#NUM!");
}
#[test]
fn test_days360_function() {
let mut model = new_empty_model();
model._set("A1", "=DAYS360(44196,44560)"); model._set("A2", "=DAYS360(44196,44560,FALSE)"); model._set("A3", "=DAYS360(44196,44560,TRUE)");
model._set("A4", "=DAYS360(44561,44561)");
model._set("A5", "=DAYS360(44561,44561,TRUE)");
model._set("A6", "=DAYS360(44560,44196)");
model._set("A7", "=DAYS360(44560,44196,TRUE)");
model._set("A8", "=DAYS360(1,2)");
model._set("A9", "=DAYS360(1,2,FALSE)");
model._set("A10", "=DAYS360()");
model._set("A11", "=DAYS360(44561)");
model._set("A12", "=DAYS360(44561,44570,TRUE,1)");
model._set("A13", "=DAYS360(-1,44561)");
model._set("A14", &format!("=DAYS360(44561,{EXCEL_INVALID_DATE})"));
model.evaluate();
assert_eq!(model._get_text("A1"), *"360");
assert_eq!(model._get_text("A2"), *"360");
assert_eq!(model._get_text("A3"), *"360");
assert_eq!(model._get_text("A4"), *"0");
assert_eq!(model._get_text("A5"), *"0");
assert_eq!(model._get_text("A6"), *"-360");
assert_eq!(model._get_text("A7"), *"-360");
assert_eq!(model._get_text("A8"), *"1");
assert_eq!(model._get_text("A9"), *"1");
assert_eq!(model._get_text("A10"), *"#ERROR!");
assert_eq!(model._get_text("A11"), *"#ERROR!");
assert_eq!(model._get_text("A12"), *"#ERROR!");
assert_eq!(model._get_text("A13"), *"#NUM!");
assert_eq!(model._get_text("A14"), *"#NUM!");
}
#[test]
fn test_weekday_function() {
let mut model = new_empty_model();
model._set("A1", "=WEEKDAY(44561)"); model._set("A2", "=WEEKDAY(44561,2)"); model._set("A3", "=WEEKDAY(44561,3)");
model._set("A4", "=WEEKDAY(44556,1)"); model._set("A5", "=WEEKDAY(44556,2)"); model._set("A6", "=WEEKDAY(44557,2)");
model._set("A7", "=WEEKDAY()"); model._set("A8", "=WEEKDAY(44561,0)"); model._set("A9", "=WEEKDAY(-1)");
model.evaluate();
assert_eq!(model._get_text("A1"), *"6"); assert_eq!(model._get_text("A2"), *"5"); assert_eq!(model._get_text("A3"), *"4");
assert_eq!(model._get_text("A4"), *"1"); assert_eq!(model._get_text("A5"), *"7"); assert_eq!(model._get_text("A6"), *"1");
assert_eq!(model._get_text("A7"), *"#ERROR!");
assert_eq!(model._get_text("A8"), *"#VALUE!");
assert_eq!(model._get_text("A9"), *"#NUM!");
}
#[test]
fn test_weeknum_function() {
let mut model = new_empty_model();
model._set("A1", "=WEEKNUM(44561)"); model._set("A2", "=WEEKNUM(44561,1)"); model._set("A3", "=WEEKNUM(44561,2)");
model._set("A4", "=WEEKNUM(43831,1)"); model._set("A5", "=WEEKNUM(43831,2)"); model._set("A6", "=WEEKNUM(44196,1)"); model._set("A7", "=WEEKNUM(44196,2)");
model._set("A8", "=WEEKNUM(44197,1)"); model._set("A9", "=WEEKNUM(44197,2)"); model._set("A10", "=WEEKNUM(44561,1)"); model._set("A11", "=WEEKNUM(44561,2)");
model._set("A12", "=WEEKNUM()");
model._set("A13", "=WEEKNUM(44561,1,1)");
model._set("A14", "=WEEKNUM(44561,0)");
model._set("A15", "=WEEKNUM(44561,3)");
model._set("A16", "=WEEKNUM(44561,-1)");
model._set("A17", "=WEEKNUM(-1)");
model._set("A18", &format!("=WEEKNUM({EXCEL_INVALID_DATE})"));
model.evaluate();
assert_eq!(model._get_text("A1"), *"53"); assert_eq!(model._get_text("A2"), *"53"); assert_eq!(model._get_text("A3"), *"53");
assert_eq!(model._get_text("A4"), *"1"); assert_eq!(model._get_text("A5"), *"1"); assert_eq!(model._get_text("A6"), *"53"); assert_eq!(model._get_text("A7"), *"53");
assert_eq!(model._get_text("A8"), *"1"); assert_eq!(model._get_text("A9"), *"1"); assert_eq!(model._get_text("A10"), *"53"); assert_eq!(model._get_text("A11"), *"53");
assert_eq!(model._get_text("A12"), *"#ERROR!");
assert_eq!(model._get_text("A13"), *"#ERROR!");
assert_eq!(model._get_text("A14"), *"#VALUE!");
assert_eq!(model._get_text("A15"), *"#VALUE!");
assert_eq!(model._get_text("A16"), *"#VALUE!");
assert_eq!(model._get_text("A17"), *"#NUM!");
assert_eq!(model._get_text("A18"), *"#NUM!");
}
#[test]
fn test_workday_function() {
let mut model = new_empty_model();
model._set("A1", "=WORKDAY(44560,1)");
model._set("A2", "=WORKDAY(44561,-1)");
model._set("A3", "=WORKDAY(44561,0)");
model._set("A4", "=WORKDAY(44560,5)");
model._set("B1", "44561");
model._set("A5", "=WORKDAY(44560,1,B1)"); model._set("B2", "44562");
model._set("B3", "44563");
model._set("A6", "=WORKDAY(44560,3,B1:B3)");
model._set("A7", "=WORKDAY(44562,1)"); model._set("A8", "=WORKDAY(44563,1)");
model._set("A9", "=WORKDAY(44565,-3)"); model._set("A10", "=WORKDAY(44565,-5,B1:B3)");
model._set("A11", "=WORKDAY(1,1)"); model._set("A12", "=WORKDAY(100000,10)");
model._set("A13", "=WORKDAY()");
model._set("A14", "=WORKDAY(44560)");
model._set("A15", "=WORKDAY(44560,1,B1,B2)");
model._set("A16", "=WORKDAY(-1,1)");
model._set("A17", &format!("=WORKDAY({EXCEL_INVALID_DATE},1)"));
model._set("B4", "-1");
model._set("A18", "=WORKDAY(44560,1,B4)");
model.evaluate();
assert_eq!(model._get_text("A1"), *"44561"); assert_eq!(model._get_text("A2"), *"44560"); assert_eq!(model._get_text("A3"), *"44561"); assert_eq!(model._get_text("A4"), *"44567");
assert_eq!(model._get_text("A5"), *"44564"); assert_eq!(model._get_text("A6"), *"44566");
assert_eq!(model._get_text("A7"), *"44564"); assert_eq!(model._get_text("A8"), *"44564");
assert_eq!(model._get_text("A9"), *"44560"); assert_eq!(model._get_text("A10"), *"44557");
assert_eq!(model._get_text("A11"), *"2"); assert_eq!(model._get_text("A12"), *"100014");
assert_eq!(model._get_text("A13"), *"#ERROR!");
assert_eq!(model._get_text("A14"), *"#ERROR!");
assert_eq!(model._get_text("A15"), *"#ERROR!");
assert_eq!(model._get_text("A16"), *"#NUM!");
assert_eq!(model._get_text("A17"), *"#NUM!");
assert_eq!(model._get_text("A18"), *"#NUM!"); }
#[test]
fn test_workday_intl_function() {
let mut model = new_empty_model();
model._set("A1", "=WORKDAY.INTL(44560,1,1)"); model._set("A2", "=WORKDAY.INTL(44560,1,2)"); model._set("A3", "=WORKDAY.INTL(44560,1,\"0000001\")"); model._set("A4", "=WORKDAY.INTL(44560,1,\"1100000\")");
model._set("B1", "44561");
model._set("A5", "=WORKDAY.INTL(44560,2,1,B1)"); model._set("A6", "=WORKDAY.INTL(44560,2,7,B1)");
model._set("A7", "=WORKDAY.INTL(44561,0,1)"); model._set("A8", "=WORKDAY.INTL(44565,-1,1)");
model._set("A9", "=WORKDAY.INTL()"); model._set("A10", "=WORKDAY.INTL(44560,1,0)"); model._set("A11", "=WORKDAY.INTL(44560,1,\"123\")"); model._set("A12", "=WORKDAY.INTL(-1,1,1)");
model.evaluate();
assert_eq!(model._get_text("A1"), *"44561"); assert_eq!(model._get_text("A2"), *"44561"); assert_eq!(model._get_text("A3"), *"44561"); assert_eq!(model._get_text("A4"), *"44561");
assert_eq!(model._get_text("A5"), *"44565"); assert_eq!(model._get_text("A6"), *"44564");
assert_eq!(model._get_text("A7"), *"44561"); assert_eq!(model._get_text("A8"), *"44564");
assert_eq!(model._get_text("A9"), *"#ERROR!");
assert_eq!(model._get_text("A10"), *"#NUM!");
assert_eq!(model._get_text("A11"), *"#VALUE!");
assert_eq!(model._get_text("A12"), *"#NUM!");
}
#[test]
fn test_yearfrac_function() {
let mut model = new_empty_model();
model._set("A1", "=YEARFRAC(44561,44926)"); model._set("A2", "=YEARFRAC(44561,44926,1)"); model._set("A3", "=YEARFRAC(44561,44926,4)");
model._set("A4", "=YEARFRAC(44561,44561,1)"); model._set("A6", "=YEARFRAC(44197,44562,1)");
model._set("A7", "=YEARFRAC()"); model._set("A8", "=YEARFRAC(44561,44926,5)"); model._set("A9", "=YEARFRAC(-1,44926,1)");
model.evaluate();
assert_eq!(model._get_text("A1"), *"1"); assert_eq!(model._get_text("A2"), *"1"); assert_eq!(model._get_text("A3"), *"1");
assert_eq!(model._get_text("A4"), *"0"); assert_eq!(model._get_text("A6"), *"1");
assert_eq!(model._get_text("A7"), *"#ERROR!");
assert_eq!(model._get_text("A8"), *"#NUM!"); assert_eq!(model._get_text("A9"), *"#NUM!");
}
#[test]
fn test_isoweeknum_function() {
let mut model = new_empty_model();
model._set("A1", "=ISOWEEKNUM(44563)"); model._set("A2", "=ISOWEEKNUM(44561)");
model._set("A3", "=ISOWEEKNUM(44197)"); model._set("A4", "=ISOWEEKNUM(44200)"); model._set("A5", "=ISOWEEKNUM(44564)");
model._set("A6", "=ISOWEEKNUM()"); model._set("A7", "=ISOWEEKNUM(-1)");
model.evaluate();
assert_eq!(model._get_text("A1"), *"52");
assert_eq!(model._get_text("A2"), *"52");
assert_eq!(model._get_text("A3"), *"53"); assert_eq!(model._get_text("A4"), *"1"); assert_eq!(model._get_text("A5"), *"1");
assert_eq!(model._get_text("A6"), *"#ERROR!");
assert_eq!(model._get_text("A7"), *"#NUM!");
}