FIX: Adds some more tests fro FORMULATEXT
This commit is contained in:
committed by
Nicolás Hatcher Andrés
parent
65b959cb1c
commit
d70ab85396
@@ -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(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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!");
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user