UPDATE: Dump of initial files
This commit is contained in:
102
base/src/expressions/parser/test_ranges.rs
Normal file
102
base/src/expressions/parser/test_ranges.rs
Normal file
@@ -0,0 +1,102 @@
|
||||
use std::collections::HashMap;
|
||||
|
||||
use crate::expressions::lexer::LexerMode;
|
||||
|
||||
use super::super::parser::stringify::{to_rc_format, to_string};
|
||||
use super::super::types::CellReferenceRC;
|
||||
use super::Parser;
|
||||
|
||||
struct Formula<'a> {
|
||||
formula_a1: &'a str,
|
||||
formula_r1c1: &'a str,
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_parser_formulas_with_full_ranges() {
|
||||
let worksheets = vec!["Sheet1".to_string(), "Second Sheet".to_string()];
|
||||
let mut parser = Parser::new(worksheets, HashMap::new());
|
||||
|
||||
let formulas = vec![
|
||||
Formula {
|
||||
formula_a1: "IF(C:D>2,B5,SUM(D:D))",
|
||||
formula_r1c1: "IF(R1C[2]:R1048576C[3]>2,R[4]C[1],SUM(R1C[3]:R1048576C[3]))",
|
||||
},
|
||||
Formula {
|
||||
formula_a1: "A:A",
|
||||
formula_r1c1: "R1C[0]:R1048576C[0]",
|
||||
},
|
||||
Formula {
|
||||
formula_a1: "SUM(3:3)",
|
||||
formula_r1c1: "SUM(R[2]C1:R[2]C16384)",
|
||||
},
|
||||
Formula {
|
||||
formula_a1: "SUM($3:$3)",
|
||||
formula_r1c1: "SUM(R3C1:R3C16384)",
|
||||
},
|
||||
Formula {
|
||||
formula_a1: "SUM(Sheet1!3:$3)",
|
||||
formula_r1c1: "SUM(Sheet1!R[2]C1:R3C16384)",
|
||||
},
|
||||
Formula {
|
||||
formula_a1: "SUM('Second Sheet'!C:D)",
|
||||
formula_r1c1: "SUM('Second Sheet'!R1C[2]:R1048576C[3])",
|
||||
},
|
||||
];
|
||||
|
||||
// Reference cell is Sheet1!A1
|
||||
let cell_reference = CellReferenceRC {
|
||||
sheet: "Sheet1".to_string(),
|
||||
row: 1,
|
||||
column: 1,
|
||||
};
|
||||
for formula in &formulas {
|
||||
let t = parser.parse(
|
||||
formula.formula_a1,
|
||||
&Some(CellReferenceRC {
|
||||
sheet: "Sheet1".to_string(),
|
||||
row: 1,
|
||||
column: 1,
|
||||
}),
|
||||
);
|
||||
assert_eq!(to_rc_format(&t), formula.formula_r1c1);
|
||||
assert_eq!(to_string(&t, &cell_reference), formula.formula_a1);
|
||||
}
|
||||
|
||||
// Now the inverse
|
||||
parser.set_lexer_mode(LexerMode::R1C1);
|
||||
for formula in &formulas {
|
||||
let t = parser.parse(
|
||||
formula.formula_r1c1,
|
||||
&Some(CellReferenceRC {
|
||||
sheet: "Sheet1".to_string(),
|
||||
row: 1,
|
||||
column: 1,
|
||||
}),
|
||||
);
|
||||
assert_eq!(to_rc_format(&t), formula.formula_r1c1);
|
||||
assert_eq!(to_string(&t, &cell_reference), formula.formula_a1);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_range_inverse_order() {
|
||||
let worksheets = vec!["Sheet1".to_string(), "Sheet2".to_string()];
|
||||
let mut parser = Parser::new(worksheets, HashMap::new());
|
||||
|
||||
// Reference cell is Sheet1!A1
|
||||
let cell_reference = CellReferenceRC {
|
||||
sheet: "Sheet1".to_string(),
|
||||
row: 1,
|
||||
column: 1,
|
||||
};
|
||||
|
||||
// D4:C2 => C2:D4
|
||||
let t = parser.parse(
|
||||
"SUM(D4:C2)*SUM(Sheet2!D4:C20)*SUM($C$20:D4)",
|
||||
&Some(cell_reference.clone()),
|
||||
);
|
||||
assert_eq!(
|
||||
to_string(&t, &cell_reference),
|
||||
"SUM(C2:D4)*SUM(Sheet2!C4:D20)*SUM($C4:D$20)".to_string()
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user