diff --git a/base/src/test/user_model/mod.rs b/base/src/test/user_model/mod.rs index c5b1afb..77f002c 100644 --- a/base/src/test/user_model/mod.rs +++ b/base/src/test/user_model/mod.rs @@ -15,6 +15,7 @@ mod test_on_area_selection; mod test_on_expand_selected_range; mod test_on_paste_styles; mod test_paste_csv; +mod test_recursive; mod test_rename_sheet; mod test_row_column; mod test_sheet_state; diff --git a/base/src/test/user_model/test_recursive.rs b/base/src/test/user_model/test_recursive.rs new file mode 100644 index 0000000..0a4c8a8 --- /dev/null +++ b/base/src/test/user_model/test_recursive.rs @@ -0,0 +1,42 @@ +#![allow(clippy::unwrap_used)] + +use crate::{ + constants::LAST_ROW, expressions::types::Area, test::util::new_empty_model, UserModel, +}; + +#[test] +fn two_columns() { + let model = new_empty_model(); + let mut model = UserModel::from_model(model); + + // Set style in column C (column 3) + let column_c_range = Area { + sheet: 0, + row: 1, + column: 3, + width: 1, + height: LAST_ROW, + }; + model + .update_range_style(&column_c_range, "fill.bg_color", "#333444") + .unwrap(); + model.set_user_input(0, 5, 3, "2").unwrap(); + + // Set Style in column G (column 7) + let column_g_range = Area { + sheet: 0, + row: 1, + column: 7, + width: 1, + height: LAST_ROW, + }; + + model + .update_range_style(&column_g_range, "fill.bg_color", "#333444") + .unwrap(); + model.set_user_input(0, 5, 6, "42").unwrap(); + // Set formula in G5: =F5*C5 + model.set_user_input(0, 5, 7, "=F5*C5").unwrap(); + + assert_eq!(model.get_formatted_cell_value(0, 5, 7).unwrap(), "84"); +} diff --git a/base/src/types.rs b/base/src/types.rs index 726d9e3..a4b0109 100644 --- a/base/src/types.rs +++ b/base/src/types.rs @@ -312,7 +312,7 @@ impl Default for Styles { } } -#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone, Default)] +#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] pub struct Style { #[serde(skip_serializing_if = "Option::is_none")] pub alignment: Option, @@ -323,6 +323,19 @@ pub struct Style { pub quote_prefix: bool, } +impl Default for Style { + fn default() -> Self { + Style { + alignment: None, + num_fmt: "general".to_string(), + fill: Fill::default(), + font: Font::default(), + border: Border::default(), + quote_prefix: false, + } + } +} + #[derive(Encode, Decode, Debug, PartialEq, Eq, Clone)] pub struct NumFmt { pub num_fmt_id: i32, diff --git a/base/src/units.rs b/base/src/units.rs index f313991..1b71865 100644 --- a/base/src/units.rs +++ b/base/src/units.rs @@ -50,8 +50,9 @@ impl Units { fn get_units_from_format_string(num_fmt: &str) -> Option { let mut parser = Parser::new(num_fmt); parser.parse(); + let parts = parser.parts.first()?; // We only care about the first part (positive number) - match &parser.parts[0] { + match parts { ParsePart::Number(part) => { if part.percent > 0 { Some(Units::Percentage {