FIX: Adds some more tests fro FORMULATEXT

This commit is contained in:
Nicolás Hatcher
2024-11-27 21:30:41 +01:00
committed by Nicolás Hatcher Andrés
parent 65b959cb1c
commit d70ab85396
3 changed files with 71 additions and 41 deletions

View File

@@ -293,43 +293,4 @@ impl Model {
message: "Invalid name".to_string(), message: "Invalid name".to_string(),
} }
} }
pub(crate) fn fn_formulatext(&mut self, args: &[Node], cell: CellReferenceIndex) -> CalcResult {
if args.len() != 1 {
return CalcResult::new_args_number_error(cell);
}
if let CalcResult::Range { left, right } = self.evaluate_node_with_reference(&args[0], cell)
{
if left.sheet != right.sheet {
return CalcResult::Error {
error: Error::ERROR,
origin: cell,
message: "3D ranges not supported".to_string(),
};
}
if left.row != right.row && left.column != right.column {
// FIXME: Implicit intersection or dynamic arrays
return CalcResult::Error {
error: Error::VALUE,
origin: cell,
message: "argument must be a reference to a single cell".to_string(),
};
}
if let Ok(Some(f)) = self.get_cell_formula(left.sheet, left.row, left.column) {
CalcResult::String(f)
} else {
CalcResult::Error {
error: Error::NA,
origin: cell,
message: "Reference does not have a formula".to_string(),
}
}
} else {
CalcResult::Error {
error: Error::VALUE,
origin: cell,
message: "Argument must be a reference".to_string(),
}
}
}
} }

View File

@@ -838,4 +838,43 @@ impl Model {
}; };
CalcResult::Range { left, right } CalcResult::Range { left, right }
} }
pub(crate) fn fn_formulatext(&mut self, args: &[Node], cell: CellReferenceIndex) -> CalcResult {
if args.len() != 1 {
return CalcResult::new_args_number_error(cell);
}
if let CalcResult::Range { left, right } = self.evaluate_node_with_reference(&args[0], cell)
{
if left.sheet != right.sheet {
return CalcResult::Error {
error: Error::ERROR,
origin: cell,
message: "3D ranges not supported".to_string(),
};
}
if left.row != right.row || left.column != right.column {
// FIXME: Implicit intersection or dynamic arrays
return CalcResult::Error {
error: Error::ERROR,
origin: cell,
message: "argument must be a reference to a single cell".to_string(),
};
}
if let Ok(Some(f)) = self.get_cell_formula(left.sheet, left.row, left.column) {
CalcResult::String(f)
} else {
CalcResult::Error {
error: Error::NA,
origin: cell,
message: "Reference does not have a formula".to_string(),
}
}
} else {
CalcResult::Error {
error: Error::ERROR,
origin: cell,
message: "Argument must be a reference".to_string(),
}
}
}
} }

View File

@@ -8,10 +8,40 @@ fn simple_cases() {}
#[test] #[test]
fn wrong_number_of_arguments() { fn wrong_number_of_arguments() {
let mut model = new_empty_model(); let mut model = new_empty_model();
model._set("A1", "=UNICODE()"); model._set("A1", "=FORMULATEXT()");
model._set("A2", "=UNICODE(\"B\",\"A\")"); model._set("A2", "=FORMULATEXT(\"B\",\"A\")");
model.evaluate(); model.evaluate();
assert_eq!(model._get_text("A1"), *"#ERROR!"); assert_eq!(model._get_text("A1"), *"#ERROR!");
assert_eq!(model._get_text("A2"), *"#ERROR!"); assert_eq!(model._get_text("A2"), *"#ERROR!");
} }
#[test]
fn multi_sheet_ref() {
let mut model = new_empty_model();
model.new_sheet();
model._set("A1", "=FORMULATEXT(Sheet1!A1:Sheet2!A1)");
model.evaluate();
assert_eq!(model._get_text("A1"), *"#ERROR!");
}
#[test]
fn implicit_intersection() {
let mut model = new_empty_model();
model._set("A1", "=FORMULATEXT(C1:C2)");
model._set("A2", "=FORMULATEXT(D1:E1)");
model.evaluate();
assert_eq!(model._get_text("A1"), *"#ERROR!");
assert_eq!(model._get_text("A2"), *"#ERROR!");
}
#[test]
fn non_reference() {
let mut model = new_empty_model();
model._set("A1", "=FORMULATEXT(42)");
model.evaluate();
assert_eq!(model._get_text("A1"), *"#ERROR!");
}