FIX: small diverse fixes (#35)
This commit is contained in:
committed by
GitHub
parent
b3b7dea930
commit
49ef846ebd
@@ -8,7 +8,7 @@
|
||||
|
||||
use std::path;
|
||||
|
||||
use ironcalc::{compare::test_file, export::save_to_xlsx, import::load_model_from_xlsx};
|
||||
use ironcalc::{compare::test_file, export::save_to_xlsx, import::load_from_xlsx};
|
||||
|
||||
fn main() {
|
||||
let args: Vec<_> = std::env::args().collect();
|
||||
@@ -27,7 +27,7 @@ fn main() {
|
||||
let file_path = path::Path::new(file_name);
|
||||
let base_name = file_path.file_stem().unwrap().to_str().unwrap();
|
||||
let output_file_name = &format!("{base_name}.output.xlsx");
|
||||
let mut model = load_model_from_xlsx(file_name, "en", "UTC").unwrap();
|
||||
let mut model = load_from_xlsx(file_name, "en", "UTC").unwrap();
|
||||
model.evaluate();
|
||||
println!("Saving result as: {output_file_name}. Please open with Excel and test.");
|
||||
save_to_xlsx(&model, output_file_name).unwrap();
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
use std::path;
|
||||
|
||||
use ironcalc::{export::save_to_json, import::load_model_from_xlsx};
|
||||
use ironcalc::{export::save_to_icalc, import::load_from_xlsx};
|
||||
|
||||
fn main() {
|
||||
let args: Vec<_> = std::env::args().collect();
|
||||
@@ -21,6 +21,6 @@ fn main() {
|
||||
let file_path = path::Path::new(file_name);
|
||||
let base_name = file_path.file_stem().unwrap().to_str().unwrap();
|
||||
let output_file_name = &format!("{base_name}.ic");
|
||||
let model = load_model_from_xlsx(file_name, "en", "UTC").unwrap();
|
||||
save_to_json(model.workbook, output_file_name);
|
||||
let model = load_from_xlsx(file_name, "en", "UTC").unwrap();
|
||||
save_to_icalc(model.workbook, output_file_name);
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ use ironcalc_base::types::*;
|
||||
use ironcalc_base::{expressions::utils::number_to_column, Model};
|
||||
|
||||
use crate::export::save_to_xlsx;
|
||||
use crate::import::load_model_from_xlsx;
|
||||
use crate::import::load_from_xlsx;
|
||||
|
||||
pub struct CompareError {
|
||||
message: String,
|
||||
@@ -164,13 +164,13 @@ pub(crate) fn compare_models(m1: &Model, m2: &Model) -> Result<(), String> {
|
||||
let mut message = "".to_string();
|
||||
for diff in diffs {
|
||||
message = format!(
|
||||
"{}\n.Diff: {}!{}{}, value1: {}, value2 {}\n {}",
|
||||
"{}\n.Diff: {}!{}{}, value1: {:?}, value2 {:?}\n {}",
|
||||
message,
|
||||
diff.sheet_name,
|
||||
number_to_column(diff.column).unwrap(),
|
||||
diff.row,
|
||||
serde_json::to_string(&diff.value1).unwrap(),
|
||||
serde_json::to_string(&diff.value2).unwrap(),
|
||||
&diff.value1,
|
||||
&diff.value2,
|
||||
diff.reason
|
||||
);
|
||||
}
|
||||
@@ -183,15 +183,15 @@ pub(crate) fn compare_models(m1: &Model, m2: &Model) -> Result<(), String> {
|
||||
|
||||
/// Tests that file in file_path produces the same results in Excel and in IronCalc.
|
||||
pub fn test_file(file_path: &str) -> Result<(), String> {
|
||||
let model1 = load_model_from_xlsx(file_path, "en", "UTC").unwrap();
|
||||
let mut model2 = load_model_from_xlsx(file_path, "en", "UTC").unwrap();
|
||||
let model1 = load_from_xlsx(file_path, "en", "UTC").unwrap();
|
||||
let mut model2 = load_from_xlsx(file_path, "en", "UTC").unwrap();
|
||||
model2.evaluate();
|
||||
compare_models(&model1, &model2)
|
||||
}
|
||||
|
||||
/// Tests that file in file_path can be converted to xlsx and read again
|
||||
pub fn test_load_and_saving(file_path: &str, temp_dir_name: &Path) -> Result<(), String> {
|
||||
let model1 = load_model_from_xlsx(file_path, "en", "UTC").unwrap();
|
||||
let model1 = load_from_xlsx(file_path, "en", "UTC").unwrap();
|
||||
|
||||
let base_name = Path::new(file_path).file_name().unwrap().to_str().unwrap();
|
||||
|
||||
@@ -200,7 +200,7 @@ pub fn test_load_and_saving(file_path: &str, temp_dir_name: &Path) -> Result<(),
|
||||
// test can save
|
||||
save_to_xlsx(&model1, temp_file_path).unwrap();
|
||||
// test can open
|
||||
let mut model2 = load_model_from_xlsx(temp_file_path, "en", "UTC").unwrap();
|
||||
let mut model2 = load_from_xlsx(temp_file_path, "en", "UTC").unwrap();
|
||||
model2.evaluate();
|
||||
compare_models(&model1, &model2)
|
||||
}
|
||||
|
||||
@@ -129,9 +129,9 @@ pub fn save_xlsx_to_writer<W: Write + Seek>(model: &Model, writer: W) -> Result<
|
||||
}
|
||||
|
||||
/// Exports an internal representation of a workbook into an equivalent IronCalc json format
|
||||
pub fn save_to_json(workbook: Workbook, output: &str) {
|
||||
let s = serde_json::to_string(&workbook).unwrap();
|
||||
pub fn save_to_icalc(workbook: Workbook, output: &str) {
|
||||
let s = bitcode::encode(&workbook);
|
||||
let file_path = std::path::Path::new(output);
|
||||
let mut file = fs::File::create(file_path).unwrap();
|
||||
file.write_all(s.as_bytes()).unwrap();
|
||||
file.write_all(&s).unwrap();
|
||||
}
|
||||
|
||||
@@ -3,7 +3,9 @@ use std::fs;
|
||||
use ironcalc_base::Model;
|
||||
|
||||
use crate::error::XlsxError;
|
||||
use crate::{export::save_to_xlsx, import::load_model_from_xlsx};
|
||||
use crate::export::save_to_icalc;
|
||||
use crate::import::load_from_icalc;
|
||||
use crate::{export::save_to_xlsx, import::load_from_xlsx};
|
||||
|
||||
pub fn new_empty_model() -> Model {
|
||||
Model::new_empty("model", "en", "UTC").unwrap()
|
||||
@@ -26,29 +28,54 @@ fn test_values() {
|
||||
|
||||
// noop
|
||||
model.evaluate();
|
||||
{
|
||||
let temp_file_name = "temp_file_test_values.xlsx";
|
||||
save_to_xlsx(&model, temp_file_name).unwrap();
|
||||
|
||||
let temp_file_name = "temp_file_test_values.xlsx";
|
||||
save_to_xlsx(&model, temp_file_name).unwrap();
|
||||
let model = load_from_xlsx(temp_file_name, "en", "UTC").unwrap();
|
||||
assert_eq!(model.get_formatted_cell_value(0, 1, 1).unwrap(), "123.456");
|
||||
assert_eq!(
|
||||
model.get_formatted_cell_value(0, 2, 1).unwrap(),
|
||||
"Hello world!"
|
||||
);
|
||||
assert_eq!(
|
||||
model.get_formatted_cell_value(0, 3, 1).unwrap(),
|
||||
"Hello world!"
|
||||
);
|
||||
assert_eq!(
|
||||
model.get_formatted_cell_value(0, 4, 1).unwrap(),
|
||||
"你好世界!"
|
||||
);
|
||||
assert_eq!(model.get_formatted_cell_value(0, 5, 1).unwrap(), "TRUE");
|
||||
assert_eq!(model.get_formatted_cell_value(0, 6, 1).unwrap(), "FALSE");
|
||||
assert_eq!(model.get_formatted_cell_value(0, 7, 1).unwrap(), "#VALUE!");
|
||||
|
||||
let model = load_model_from_xlsx(temp_file_name, "en", "UTC").unwrap();
|
||||
assert_eq!(model.get_formatted_cell_value(0, 1, 1).unwrap(), "123.456");
|
||||
assert_eq!(
|
||||
model.get_formatted_cell_value(0, 2, 1).unwrap(),
|
||||
"Hello world!"
|
||||
);
|
||||
assert_eq!(
|
||||
model.get_formatted_cell_value(0, 3, 1).unwrap(),
|
||||
"Hello world!"
|
||||
);
|
||||
assert_eq!(
|
||||
model.get_formatted_cell_value(0, 4, 1).unwrap(),
|
||||
"你好世界!"
|
||||
);
|
||||
assert_eq!(model.get_formatted_cell_value(0, 5, 1).unwrap(), "TRUE");
|
||||
assert_eq!(model.get_formatted_cell_value(0, 6, 1).unwrap(), "FALSE");
|
||||
assert_eq!(model.get_formatted_cell_value(0, 7, 1).unwrap(), "#VALUE!");
|
||||
fs::remove_file(temp_file_name).unwrap();
|
||||
}
|
||||
{
|
||||
let temp_file_name = "temp_file_test_values.ic";
|
||||
save_to_icalc(model.workbook, temp_file_name);
|
||||
|
||||
fs::remove_file(temp_file_name).unwrap();
|
||||
let model = load_from_icalc(temp_file_name).unwrap();
|
||||
assert_eq!(model.get_formatted_cell_value(0, 1, 1).unwrap(), "123.456");
|
||||
assert_eq!(
|
||||
model.get_formatted_cell_value(0, 2, 1).unwrap(),
|
||||
"Hello world!"
|
||||
);
|
||||
assert_eq!(
|
||||
model.get_formatted_cell_value(0, 3, 1).unwrap(),
|
||||
"Hello world!"
|
||||
);
|
||||
assert_eq!(
|
||||
model.get_formatted_cell_value(0, 4, 1).unwrap(),
|
||||
"你好世界!"
|
||||
);
|
||||
assert_eq!(model.get_formatted_cell_value(0, 5, 1).unwrap(), "TRUE");
|
||||
assert_eq!(model.get_formatted_cell_value(0, 6, 1).unwrap(), "FALSE");
|
||||
assert_eq!(model.get_formatted_cell_value(0, 7, 1).unwrap(), "#VALUE!");
|
||||
|
||||
fs::remove_file(temp_file_name).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -67,7 +94,7 @@ fn test_formulas() {
|
||||
let temp_file_name = "temp_file_test_formulas.xlsx";
|
||||
save_to_xlsx(&model, temp_file_name).unwrap();
|
||||
|
||||
let model = load_model_from_xlsx(temp_file_name, "en", "UTC").unwrap();
|
||||
let model = load_from_xlsx(temp_file_name, "en", "UTC").unwrap();
|
||||
assert_eq!(model.get_formatted_cell_value(0, 1, 2).unwrap(), "11");
|
||||
assert_eq!(model.get_formatted_cell_value(0, 2, 2).unwrap(), "13");
|
||||
assert_eq!(model.get_formatted_cell_value(0, 3, 2).unwrap(), "15");
|
||||
@@ -89,7 +116,7 @@ fn test_sheets() {
|
||||
let temp_file_name = "temp_file_test_sheets.xlsx";
|
||||
save_to_xlsx(&model, temp_file_name).unwrap();
|
||||
|
||||
let model = load_model_from_xlsx(temp_file_name, "en", "UTC").unwrap();
|
||||
let model = load_from_xlsx(temp_file_name, "en", "UTC").unwrap();
|
||||
assert_eq!(
|
||||
model.workbook.get_worksheet_names(),
|
||||
vec!["Sheet1", "With space", "Tango & Cash", "你好世界"]
|
||||
@@ -118,7 +145,7 @@ fn test_named_styles() {
|
||||
let temp_file_name = "temp_file_test_named_styles.xlsx";
|
||||
save_to_xlsx(&model, temp_file_name).unwrap();
|
||||
|
||||
let model = load_model_from_xlsx(temp_file_name, "en", "UTC").unwrap();
|
||||
let model = load_from_xlsx(temp_file_name, "en", "UTC").unwrap();
|
||||
assert!(model
|
||||
.workbook
|
||||
.styles
|
||||
|
||||
@@ -106,7 +106,7 @@ fn load_xlsx_from_reader<R: Read + std::io::Seek>(
|
||||
// Public methods
|
||||
|
||||
/// Imports a file from disk into an internal representation
|
||||
pub fn load_from_excel(file_name: &str, locale: &str, tz: &str) -> Result<Workbook, XlsxError> {
|
||||
fn load_from_excel(file_name: &str, locale: &str, tz: &str) -> Result<Workbook, XlsxError> {
|
||||
let file_path = std::path::Path::new(file_name);
|
||||
let file = fs::File::open(file_path)?;
|
||||
let reader = BufReader::new(file);
|
||||
@@ -118,7 +118,14 @@ pub fn load_from_excel(file_name: &str, locale: &str, tz: &str) -> Result<Workbo
|
||||
load_xlsx_from_reader(name, reader, locale, tz)
|
||||
}
|
||||
|
||||
pub fn load_model_from_xlsx(file_name: &str, locale: &str, tz: &str) -> Result<Model, XlsxError> {
|
||||
pub fn load_from_xlsx(file_name: &str, locale: &str, tz: &str) -> Result<Model, XlsxError> {
|
||||
let workbook = load_from_excel(file_name, locale, tz)?;
|
||||
Model::from_workbook(workbook).map_err(XlsxError::Workbook)
|
||||
}
|
||||
|
||||
pub fn load_from_icalc(file_name: &str) -> Result<Model, XlsxError> {
|
||||
let contents = fs::read(file_name)
|
||||
.map_err(|e| XlsxError::IO(format!("Could not extract workbook name: {}", e)))?;
|
||||
let workbook: Workbook = bitcode::decode(&contents).unwrap();
|
||||
Model::from_workbook(workbook).map_err(XlsxError::Workbook)
|
||||
}
|
||||
|
||||
BIN
xlsx/tests/example.ic
Normal file
BIN
xlsx/tests/example.ic
Normal file
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -3,33 +3,32 @@ use uuid::Uuid;
|
||||
|
||||
use ironcalc::compare::{test_file, test_load_and_saving};
|
||||
use ironcalc::export::save_to_xlsx;
|
||||
use ironcalc::import::{load_from_excel, load_model_from_xlsx};
|
||||
use ironcalc_base::types::{HorizontalAlignment, VerticalAlignment, Workbook};
|
||||
use ironcalc::import::{load_from_icalc, load_from_xlsx};
|
||||
use ironcalc_base::types::{HorizontalAlignment, VerticalAlignment};
|
||||
use ironcalc_base::Model;
|
||||
|
||||
// This is a functional test.
|
||||
// We check that the output of example.xlsx is what we expect.
|
||||
#[test]
|
||||
fn test_example() {
|
||||
let model = load_from_excel("tests/example.xlsx", "en", "UTC").unwrap();
|
||||
assert_eq!(model.worksheets[0].frozen_rows, 0);
|
||||
assert_eq!(model.worksheets[0].frozen_columns, 0);
|
||||
let contents =
|
||||
fs::read_to_string("tests/example.json").expect("Something went wrong reading the file");
|
||||
let model2: Workbook = serde_json::from_str(&contents).unwrap();
|
||||
let s = serde_json::to_string(&model).unwrap();
|
||||
assert_eq!(model, model2, "{s}");
|
||||
let model = load_from_xlsx("tests/example.xlsx", "en", "UTC").unwrap();
|
||||
let workbook = model.workbook;
|
||||
assert_eq!(workbook.worksheets[0].frozen_rows, 0);
|
||||
assert_eq!(workbook.worksheets[0].frozen_columns, 0);
|
||||
let model2 = load_from_icalc("tests/example.ic").unwrap();
|
||||
let s = bitcode::encode(&model2.workbook);
|
||||
assert_eq!(workbook, model2.workbook, "{:?}", s);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_save_to_xlsx() {
|
||||
let mut model = load_model_from_xlsx("tests/example.xlsx", "en", "UTC").unwrap();
|
||||
let mut model = load_from_xlsx("tests/example.xlsx", "en", "UTC").unwrap();
|
||||
model.evaluate();
|
||||
let temp_file_name = "temp_file_example.xlsx";
|
||||
// test can safe
|
||||
save_to_xlsx(&model, temp_file_name).unwrap();
|
||||
// test can open
|
||||
let model = load_model_from_xlsx(temp_file_name, "en", "UTC").unwrap();
|
||||
let model = load_from_xlsx(temp_file_name, "en", "UTC").unwrap();
|
||||
let metadata = &model.workbook.metadata;
|
||||
assert_eq!(metadata.application, "IronCalc Sheets");
|
||||
// FIXME: This will need to be updated once we fix versioning
|
||||
@@ -41,7 +40,9 @@ fn test_save_to_xlsx() {
|
||||
#[test]
|
||||
fn test_freeze() {
|
||||
// freeze has 3 frozen columns and 2 frozen rows
|
||||
let model = load_from_excel("tests/freeze.xlsx", "en", "UTC").unwrap();
|
||||
let model = load_from_xlsx("tests/freeze.xlsx", "en", "UTC")
|
||||
.unwrap()
|
||||
.workbook;
|
||||
assert_eq!(model.worksheets[0].frozen_rows, 2);
|
||||
assert_eq!(model.worksheets[0].frozen_columns, 3);
|
||||
}
|
||||
@@ -49,7 +50,9 @@ fn test_freeze() {
|
||||
#[test]
|
||||
fn test_split() {
|
||||
// We test that a workbook with split panes do not produce frozen rows and columns
|
||||
let model = load_from_excel("tests/split.xlsx", "en", "UTC").unwrap();
|
||||
let model = load_from_xlsx("tests/split.xlsx", "en", "UTC")
|
||||
.unwrap()
|
||||
.workbook;
|
||||
assert_eq!(model.worksheets[0].frozen_rows, 0);
|
||||
assert_eq!(model.worksheets[0].frozen_columns, 0);
|
||||
}
|
||||
@@ -145,14 +148,14 @@ fn test_model_has_correct_styles(model: &Model) {
|
||||
|
||||
#[test]
|
||||
fn test_simple_text() {
|
||||
let model = load_model_from_xlsx("tests/basic_text.xlsx", "en", "UTC").unwrap();
|
||||
let model = load_from_xlsx("tests/basic_text.xlsx", "en", "UTC").unwrap();
|
||||
|
||||
test_model_has_correct_styles(&model);
|
||||
|
||||
let temp_file_name = "temp_file_test_named_styles.xlsx";
|
||||
save_to_xlsx(&model, temp_file_name).unwrap();
|
||||
|
||||
let model = load_model_from_xlsx(temp_file_name, "en", "UTC").unwrap();
|
||||
let model = load_from_xlsx(temp_file_name, "en", "UTC").unwrap();
|
||||
fs::remove_file(temp_file_name).unwrap();
|
||||
test_model_has_correct_styles(&model);
|
||||
}
|
||||
@@ -160,7 +163,9 @@ fn test_simple_text() {
|
||||
#[test]
|
||||
fn test_defined_names_casing() {
|
||||
let test_file_path = "tests/calc_tests/defined_names_for_unit_test.xlsx";
|
||||
let loaded_workbook = load_from_excel(test_file_path, "en", "UTC").unwrap();
|
||||
let loaded_workbook = load_from_xlsx(test_file_path, "en", "UTC")
|
||||
.unwrap()
|
||||
.workbook;
|
||||
let mut model = Model::from_bytes(&bitcode::encode(&loaded_workbook)).unwrap();
|
||||
|
||||
let (row, column) = (2, 13); // B13
|
||||
|
||||
Reference in New Issue
Block a user