From fdeae2c771ed6f1fe04fd415f70fb5d827fa094f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Hatcher?= Date: Sun, 28 Sep 2025 12:26:13 +0200 Subject: [PATCH] UPDATE: Add templates --- base/src/expressions/parser/mod.rs | 6 +-- xlsx/tests/templates/mortgage_calculator.xlsx | Bin 0 -> 31153 bytes .../templates/travel_expenses_tracker.xlsx | Bin 0 -> 14875 bytes xlsx/tests/test.rs | 39 ++++++++++++++++++ 4 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 xlsx/tests/templates/mortgage_calculator.xlsx create mode 100644 xlsx/tests/templates/travel_expenses_tracker.xlsx diff --git a/base/src/expressions/parser/mod.rs b/base/src/expressions/parser/mod.rs index 8281cf5..af9e33a 100644 --- a/base/src/expressions/parser/mod.rs +++ b/base/src/expressions/parser/mod.rs @@ -717,7 +717,7 @@ impl Parser { return Node::ParseErrorKind { formula: self.lexer.get_formula(), position: 0, - message: "sheet not found".to_string(), + message: format!("sheet not found: {}", context.sheet), }; } }; @@ -850,7 +850,7 @@ impl Parser { return Node::ParseErrorKind { formula: self.lexer.get_formula(), position: 0, - message: "sheet not found".to_string(), + message: format!("sheet not found: {}", context.sheet), }; } }; @@ -878,7 +878,7 @@ impl Parser { return Node::ParseErrorKind { formula: self.lexer.get_formula(), position: 0, - message: "sheet not found".to_string(), + message: format!("table sheet not found: {}", table.sheet_name), }; } }; diff --git a/xlsx/tests/templates/mortgage_calculator.xlsx b/xlsx/tests/templates/mortgage_calculator.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..60aaa383d51fa9587c7a172e850602589f1a3b79 GIT binary patch literal 31153 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 literal 0 HcmV?d00001 diff --git a/xlsx/tests/templates/travel_expenses_tracker.xlsx b/xlsx/tests/templates/travel_expenses_tracker.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..809e607c83922b011cd63b0ed15ff1b9d3e7e99b GIT binary patch literal 14875 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 mPx$|I, io::Error>>() + .unwrap(); + entries.sort(); + let temp_folder = env::temp_dir(); + let path = format!("{}", Uuid::new_v4()); + let dir = temp_folder.join(path); + fs::create_dir(&dir).unwrap(); + let mut is_error = false; + for file_path in entries { + let file_name_str = file_path.file_name().unwrap().to_str().unwrap(); + let file_path_str = file_path.to_str().unwrap(); + println!("Testing file: {file_path_str}"); + if file_name_str.ends_with(".xlsx") && !file_name_str.starts_with('~') { + if let Err(message) = test_file(file_path_str) { + println!("Error with file: '{file_path_str}'"); + println!("{message}"); + is_error = true; + } + let t = test_load_and_saving(file_path_str, &dir); + if t.is_err() { + println!("Error while load and saving file: {file_path_str}"); + is_error = true; + } + } else { + println!("skipping"); + } + } + fs::remove_dir_all(&dir).unwrap(); + assert!( + !is_error, + "Models were evaluated inconsistently with XLSX data." + ); +} + #[test] fn test_documentation_xlsx() { let mut entries = fs::read_dir("tests/docs/")