diff --git a/base/src/functions/information.rs b/base/src/functions/information.rs index fca7280..6d2aaa7 100644 --- a/base/src/functions/information.rs +++ b/base/src/functions/information.rs @@ -293,43 +293,4 @@ impl Model { 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(), - } - } - } } diff --git a/base/src/functions/lookup_and_reference.rs b/base/src/functions/lookup_and_reference.rs index 359be2e..04a9e95 100644 --- a/base/src/functions/lookup_and_reference.rs +++ b/base/src/functions/lookup_and_reference.rs @@ -838,4 +838,43 @@ impl Model { }; 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(), + } + } + } } diff --git a/base/src/test/test_fn_formulatext.rs b/base/src/test/test_fn_formulatext.rs index 622ecfa..4825990 100644 --- a/base/src/test/test_fn_formulatext.rs +++ b/base/src/test/test_fn_formulatext.rs @@ -8,10 +8,40 @@ fn simple_cases() {} #[test] fn wrong_number_of_arguments() { let mut model = new_empty_model(); - model._set("A1", "=UNICODE()"); - model._set("A2", "=UNICODE(\"B\",\"A\")"); + model._set("A1", "=FORMULATEXT()"); + model._set("A2", "=FORMULATEXT(\"B\",\"A\")"); model.evaluate(); assert_eq!(model._get_text("A1"), *"#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!"); +}