UPDATE: Adds web app (#79)
Things missing: * Browse mode * Front end tests * Storybook
This commit is contained in:
committed by
GitHub
parent
083548608e
commit
dc23a7f29c
@@ -1,14 +1,20 @@
|
||||
mod test_add_delete_sheets;
|
||||
mod test_autofill_columns;
|
||||
mod test_autofill_rows;
|
||||
mod test_border;
|
||||
mod test_clear_cells;
|
||||
mod test_diff_queue;
|
||||
mod test_evaluation;
|
||||
mod test_general;
|
||||
mod test_grid_lines;
|
||||
mod test_keyboard_navigation;
|
||||
mod test_on_area_selection;
|
||||
mod test_on_expand_selected_range;
|
||||
mod test_on_paste_styles;
|
||||
mod test_rename_sheet;
|
||||
mod test_row_column;
|
||||
mod test_styles;
|
||||
mod test_to_from_bytes;
|
||||
mod test_undo_redo;
|
||||
mod test_view;
|
||||
mod test_window_size;
|
||||
|
||||
@@ -82,3 +82,15 @@ fn delete_sheet_propagates() {
|
||||
let sheets_info = model2.get_worksheets_properties();
|
||||
assert_eq!(sheets_info.len(), 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn delete_last_sheet() {
|
||||
// Deleting the last sheet, selects the previous
|
||||
let mut model = UserModel::new_empty("model", "en", "UTC").unwrap();
|
||||
model.new_sheet();
|
||||
model.new_sheet();
|
||||
model.set_selected_sheet(2).unwrap();
|
||||
model.delete_sheet(2).unwrap();
|
||||
|
||||
assert_eq!(model.get_selected_sheet(), 1);
|
||||
}
|
||||
|
||||
416
base/src/test/user_model/test_border.rs
Normal file
416
base/src/test/user_model/test_border.rs
Normal file
@@ -0,0 +1,416 @@
|
||||
#![allow(clippy::unwrap_used)]
|
||||
|
||||
use crate::{
|
||||
expressions::{types::Area, utils::number_to_column},
|
||||
types::{Border, BorderItem, BorderStyle},
|
||||
BorderArea, UserModel,
|
||||
};
|
||||
|
||||
#[test]
|
||||
fn borders_all() {
|
||||
let mut model = UserModel::new_empty("model", "en", "UTC").unwrap();
|
||||
// We set an outer border in cells F5:H9
|
||||
let range = &Area {
|
||||
sheet: 0,
|
||||
row: 5,
|
||||
column: 6,
|
||||
width: 3,
|
||||
height: 4,
|
||||
};
|
||||
assert_eq!(number_to_column(6).unwrap(), "F");
|
||||
assert_eq!(number_to_column(8).unwrap(), "H");
|
||||
// ATM we don't have a way to create the object from Rust, that's ok.
|
||||
let border_area: BorderArea = serde_json::from_str(
|
||||
r##"{
|
||||
"item": {
|
||||
"style": "thin",
|
||||
"color": "#FF5566"
|
||||
},
|
||||
"type": "All"
|
||||
}"##,
|
||||
)
|
||||
.unwrap();
|
||||
model.set_area_with_border(range, &border_area).unwrap();
|
||||
for row in 5..9 {
|
||||
for column in 6..9 {
|
||||
let style = model.get_cell_style(0, row, column).unwrap();
|
||||
let border_item = BorderItem {
|
||||
style: BorderStyle::Thin,
|
||||
color: Some("#FF5566".to_string()),
|
||||
};
|
||||
let expected_border = Border {
|
||||
diagonal_up: false,
|
||||
diagonal_down: false,
|
||||
left: Some(border_item.clone()),
|
||||
right: Some(border_item.clone()),
|
||||
top: Some(border_item.clone()),
|
||||
bottom: Some(border_item.clone()),
|
||||
diagonal: None,
|
||||
};
|
||||
assert_eq!(style.border, expected_border);
|
||||
}
|
||||
}
|
||||
|
||||
// Lets remove all of them:
|
||||
let border_area: BorderArea = serde_json::from_str(
|
||||
r##"{
|
||||
"item": {
|
||||
"style": "thin",
|
||||
"color": "#FF5566"
|
||||
},
|
||||
"type": "None"
|
||||
}"##,
|
||||
)
|
||||
.unwrap();
|
||||
model.set_area_with_border(range, &border_area).unwrap();
|
||||
for row in 5..9 {
|
||||
for column in 6..9 {
|
||||
let style = model.get_cell_style(0, row, column).unwrap();
|
||||
let expected_border = Border {
|
||||
diagonal_up: false,
|
||||
diagonal_down: false,
|
||||
left: None,
|
||||
right: None,
|
||||
top: None,
|
||||
bottom: None,
|
||||
diagonal: None,
|
||||
};
|
||||
assert_eq!(style.border, expected_border);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn borders_inner() {
|
||||
let mut model = UserModel::new_empty("model", "en", "UTC").unwrap();
|
||||
// We set an outer border in cells F5:H9
|
||||
let range = &Area {
|
||||
sheet: 0,
|
||||
row: 5,
|
||||
column: 6,
|
||||
width: 3,
|
||||
height: 4,
|
||||
};
|
||||
assert_eq!(number_to_column(6).unwrap(), "F");
|
||||
assert_eq!(number_to_column(8).unwrap(), "H");
|
||||
// ATM we don't have a way to create the object from Rust, that's ok.
|
||||
let border_area: BorderArea = serde_json::from_str(
|
||||
r##"{
|
||||
"item": {
|
||||
"style": "thin",
|
||||
"color": "#FF5566"
|
||||
},
|
||||
"type": "Inner"
|
||||
}"##,
|
||||
)
|
||||
.unwrap();
|
||||
model.set_area_with_border(range, &border_area).unwrap();
|
||||
// The inner part all have borders
|
||||
for row in 6..8 {
|
||||
for column in 7..8 {
|
||||
let style = model.get_cell_style(0, row, column).unwrap();
|
||||
let border_item = BorderItem {
|
||||
style: BorderStyle::Thin,
|
||||
color: Some("#FF5566".to_string()),
|
||||
};
|
||||
let expected_border = Border {
|
||||
diagonal_up: false,
|
||||
diagonal_down: false,
|
||||
left: Some(border_item.clone()),
|
||||
right: Some(border_item.clone()),
|
||||
top: Some(border_item.clone()),
|
||||
bottom: Some(border_item.clone()),
|
||||
diagonal: None,
|
||||
};
|
||||
assert_eq!(style.border, expected_border);
|
||||
}
|
||||
}
|
||||
// F5 has border only left and bottom
|
||||
{
|
||||
// We check the border on F5
|
||||
let style = model.get_cell_style(0, 5, 6).unwrap();
|
||||
let border_item = BorderItem {
|
||||
style: BorderStyle::Thin,
|
||||
color: Some("#FF5566".to_string()),
|
||||
};
|
||||
// It should be right and bottom
|
||||
let expected_border = Border {
|
||||
diagonal_up: false,
|
||||
diagonal_down: false,
|
||||
left: None,
|
||||
right: Some(border_item.clone()),
|
||||
top: None,
|
||||
bottom: Some(border_item),
|
||||
diagonal: None,
|
||||
};
|
||||
assert_eq!(style.border, expected_border);
|
||||
}
|
||||
{
|
||||
// Then let's try the bottom-right border
|
||||
let style = model.get_cell_style(0, 8, 8).unwrap();
|
||||
let border_item = BorderItem {
|
||||
style: BorderStyle::Thin,
|
||||
color: Some("#FF5566".to_string()),
|
||||
};
|
||||
// It should be only left and top
|
||||
let expected_border = Border {
|
||||
diagonal_up: false,
|
||||
diagonal_down: false,
|
||||
left: Some(border_item.clone()),
|
||||
right: None,
|
||||
top: Some(border_item.clone()),
|
||||
bottom: None,
|
||||
diagonal: None,
|
||||
};
|
||||
assert_eq!(style.border, expected_border);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn borders_outer() {
|
||||
let mut model = UserModel::new_empty("model", "en", "UTC").unwrap();
|
||||
// We set an outer border in cells F5:H9
|
||||
let range = &Area {
|
||||
sheet: 0,
|
||||
row: 5,
|
||||
column: 6,
|
||||
width: 3,
|
||||
height: 4,
|
||||
};
|
||||
assert_eq!(number_to_column(6).unwrap(), "F");
|
||||
assert_eq!(number_to_column(8).unwrap(), "H");
|
||||
// ATM we don't have a way to create the object from Rust, that's ok.
|
||||
let border_area: BorderArea = serde_json::from_str(
|
||||
r##"{
|
||||
"item": {
|
||||
"style": "thin",
|
||||
"color": "#FF5566"
|
||||
},
|
||||
"type": "Outer"
|
||||
}"##,
|
||||
)
|
||||
.unwrap();
|
||||
model.set_area_with_border(range, &border_area).unwrap();
|
||||
{
|
||||
// We check the border on F5
|
||||
let style = model.get_cell_style(0, 5, 6).unwrap();
|
||||
let border_item = BorderItem {
|
||||
style: BorderStyle::Thin,
|
||||
color: Some("#FF5566".to_string()),
|
||||
};
|
||||
// It should be only left and top
|
||||
let expected_border = Border {
|
||||
diagonal_up: false,
|
||||
diagonal_down: false,
|
||||
left: Some(border_item.clone()),
|
||||
right: None,
|
||||
top: Some(border_item),
|
||||
bottom: None,
|
||||
diagonal: None,
|
||||
};
|
||||
assert_eq!(style.border, expected_border);
|
||||
}
|
||||
{
|
||||
// Then let's try the bottom-right border
|
||||
let style = model.get_cell_style(0, 8, 8).unwrap();
|
||||
let border_item = BorderItem {
|
||||
style: BorderStyle::Thin,
|
||||
color: Some("#FF5566".to_string()),
|
||||
};
|
||||
// It should be only left and top
|
||||
let expected_border = Border {
|
||||
diagonal_up: false,
|
||||
diagonal_down: false,
|
||||
left: None,
|
||||
right: Some(border_item.clone()),
|
||||
top: None,
|
||||
bottom: Some(border_item.clone()),
|
||||
diagonal: None,
|
||||
};
|
||||
assert_eq!(style.border, expected_border);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn borders_top() {
|
||||
let mut model = UserModel::new_empty("model", "en", "UTC").unwrap();
|
||||
// We set an outer border in cells F5:H9
|
||||
let range = &Area {
|
||||
sheet: 0,
|
||||
row: 5,
|
||||
column: 6,
|
||||
width: 3,
|
||||
height: 4,
|
||||
};
|
||||
assert_eq!(number_to_column(6).unwrap(), "F");
|
||||
assert_eq!(number_to_column(8).unwrap(), "H");
|
||||
// ATM we don't have a way to create the object from Rust, that's ok.
|
||||
let border_area: BorderArea = serde_json::from_str(
|
||||
r##"{
|
||||
"item": {
|
||||
"style": "thin",
|
||||
"color": "#FF5566"
|
||||
},
|
||||
"type": "Top"
|
||||
}"##,
|
||||
)
|
||||
.unwrap();
|
||||
model.set_area_with_border(range, &border_area).unwrap();
|
||||
for row in 5..9 {
|
||||
for column in 6..9 {
|
||||
let style = model.get_cell_style(0, row, column).unwrap();
|
||||
let border_item = BorderItem {
|
||||
style: BorderStyle::Thin,
|
||||
color: Some("#FF5566".to_string()),
|
||||
};
|
||||
let expected_border = Border {
|
||||
diagonal_up: false,
|
||||
diagonal_down: false,
|
||||
left: None,
|
||||
right: None,
|
||||
top: Some(border_item.clone()),
|
||||
bottom: None,
|
||||
diagonal: None,
|
||||
};
|
||||
assert_eq!(style.border, expected_border);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn borders_right() {
|
||||
let mut model = UserModel::new_empty("model", "en", "UTC").unwrap();
|
||||
// We set an outer border in cells F5:H9
|
||||
let range = &Area {
|
||||
sheet: 0,
|
||||
row: 5,
|
||||
column: 6,
|
||||
width: 3,
|
||||
height: 4,
|
||||
};
|
||||
assert_eq!(number_to_column(6).unwrap(), "F");
|
||||
assert_eq!(number_to_column(8).unwrap(), "H");
|
||||
// ATM we don't have a way to create the object from Rust, that's ok.
|
||||
let border_area: BorderArea = serde_json::from_str(
|
||||
r##"{
|
||||
"item": {
|
||||
"style": "thin",
|
||||
"color": "#FF5566"
|
||||
},
|
||||
"type": "Right"
|
||||
}"##,
|
||||
)
|
||||
.unwrap();
|
||||
model.set_area_with_border(range, &border_area).unwrap();
|
||||
for row in 5..9 {
|
||||
for column in 6..9 {
|
||||
let style = model.get_cell_style(0, row, column).unwrap();
|
||||
let border_item = BorderItem {
|
||||
style: BorderStyle::Thin,
|
||||
color: Some("#FF5566".to_string()),
|
||||
};
|
||||
let expected_border = Border {
|
||||
diagonal_up: false,
|
||||
diagonal_down: false,
|
||||
left: None,
|
||||
right: Some(border_item.clone()),
|
||||
top: None,
|
||||
bottom: None,
|
||||
diagonal: None,
|
||||
};
|
||||
assert_eq!(style.border, expected_border);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn borders_bottom() {
|
||||
let mut model = UserModel::new_empty("model", "en", "UTC").unwrap();
|
||||
// We set an outer border in cells F5:H9
|
||||
let range = &Area {
|
||||
sheet: 0,
|
||||
row: 5,
|
||||
column: 6,
|
||||
width: 3,
|
||||
height: 4,
|
||||
};
|
||||
assert_eq!(number_to_column(6).unwrap(), "F");
|
||||
assert_eq!(number_to_column(8).unwrap(), "H");
|
||||
// ATM we don't have a way to create the object from Rust, that's ok.
|
||||
let border_area: BorderArea = serde_json::from_str(
|
||||
r##"{
|
||||
"item": {
|
||||
"style": "thin",
|
||||
"color": "#FF5566"
|
||||
},
|
||||
"type": "Bottom"
|
||||
}"##,
|
||||
)
|
||||
.unwrap();
|
||||
model.set_area_with_border(range, &border_area).unwrap();
|
||||
for row in 5..9 {
|
||||
for column in 6..9 {
|
||||
let style = model.get_cell_style(0, row, column).unwrap();
|
||||
let border_item = BorderItem {
|
||||
style: BorderStyle::Thin,
|
||||
color: Some("#FF5566".to_string()),
|
||||
};
|
||||
let expected_border = Border {
|
||||
diagonal_up: false,
|
||||
diagonal_down: false,
|
||||
left: None,
|
||||
right: None,
|
||||
top: None,
|
||||
bottom: Some(border_item.clone()),
|
||||
diagonal: None,
|
||||
};
|
||||
assert_eq!(style.border, expected_border);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn borders_left() {
|
||||
let mut model = UserModel::new_empty("model", "en", "UTC").unwrap();
|
||||
// We set an outer border in cells F5:H9
|
||||
let range = &Area {
|
||||
sheet: 0,
|
||||
row: 5,
|
||||
column: 6,
|
||||
width: 3,
|
||||
height: 4,
|
||||
};
|
||||
assert_eq!(number_to_column(6).unwrap(), "F");
|
||||
assert_eq!(number_to_column(8).unwrap(), "H");
|
||||
// ATM we don't have a way to create the object from Rust, that's ok.
|
||||
let border_area: BorderArea = serde_json::from_str(
|
||||
r##"{
|
||||
"item": {
|
||||
"style": "thin",
|
||||
"color": "#FF5566"
|
||||
},
|
||||
"type": "Left"
|
||||
}"##,
|
||||
)
|
||||
.unwrap();
|
||||
model.set_area_with_border(range, &border_area).unwrap();
|
||||
for row in 5..9 {
|
||||
for column in 6..9 {
|
||||
let style = model.get_cell_style(0, row, column).unwrap();
|
||||
let border_item = BorderItem {
|
||||
style: BorderStyle::Thin,
|
||||
color: Some("#FF5566".to_string()),
|
||||
};
|
||||
let expected_border = Border {
|
||||
diagonal_up: false,
|
||||
diagonal_down: false,
|
||||
left: Some(border_item.clone()),
|
||||
right: None,
|
||||
top: None,
|
||||
bottom: None,
|
||||
diagonal: None,
|
||||
};
|
||||
assert_eq!(style.border, expected_border);
|
||||
}
|
||||
}
|
||||
}
|
||||
136
base/src/test/user_model/test_keyboard_navigation.rs
Normal file
136
base/src/test/user_model/test_keyboard_navigation.rs
Normal file
@@ -0,0 +1,136 @@
|
||||
#![allow(clippy::unwrap_used)]
|
||||
|
||||
use crate::{
|
||||
constants::{
|
||||
DEFAULT_COLUMN_WIDTH, DEFAULT_ROW_HEIGHT, DEFAULT_WINDOW_HEIGH, DEFAULT_WINDOW_WIDTH,
|
||||
LAST_COLUMN,
|
||||
},
|
||||
test::util::new_empty_model,
|
||||
UserModel,
|
||||
};
|
||||
|
||||
#[test]
|
||||
fn basic_navigation() {
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
model.on_arrow_right().unwrap();
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.range, [1, 2, 1, 2]);
|
||||
assert_eq!(view.column, 2);
|
||||
assert_eq!(view.row, 1);
|
||||
|
||||
model.on_arrow_left().unwrap();
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.range, [1, 1, 1, 1]);
|
||||
assert_eq!(view.column, 1);
|
||||
assert_eq!(view.row, 1);
|
||||
|
||||
model.on_arrow_left().unwrap();
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.range, [1, 1, 1, 1]);
|
||||
assert_eq!(view.column, 1);
|
||||
assert_eq!(view.row, 1);
|
||||
|
||||
model.on_arrow_down().unwrap();
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.range, [2, 1, 2, 1]);
|
||||
assert_eq!(view.column, 1);
|
||||
assert_eq!(view.row, 2);
|
||||
|
||||
model.on_arrow_up().unwrap();
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.range, [1, 1, 1, 1]);
|
||||
assert_eq!(view.column, 1);
|
||||
assert_eq!(view.row, 1);
|
||||
|
||||
model.on_arrow_up().unwrap();
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.range, [1, 1, 1, 1]);
|
||||
assert_eq!(view.column, 1);
|
||||
assert_eq!(view.row, 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn scroll_right() {
|
||||
let window_width = DEFAULT_WINDOW_WIDTH as f64;
|
||||
let column_width = DEFAULT_COLUMN_WIDTH;
|
||||
let column_count = f64::floor(window_width / column_width) as i32;
|
||||
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
model.on_arrow_right().unwrap();
|
||||
|
||||
model.set_selected_cell(3, column_count).unwrap();
|
||||
model.on_arrow_right().unwrap();
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.left_column, 2);
|
||||
|
||||
model.on_arrow_right().unwrap();
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.left_column, 3);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn last_colum() {
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
model.set_selected_cell(3, LAST_COLUMN).unwrap();
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.column, LAST_COLUMN);
|
||||
|
||||
model.on_arrow_right().unwrap();
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.column, LAST_COLUMN);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn page_down() {
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
let window_height = DEFAULT_WINDOW_HEIGH as f64;
|
||||
let row_height = DEFAULT_ROW_HEIGHT;
|
||||
let row_count = f64::floor(window_height / row_height) as i32;
|
||||
model.on_page_down().unwrap();
|
||||
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.row, 1 + row_count);
|
||||
let scroll_y = model.get_scroll_y().unwrap();
|
||||
assert_eq!(scroll_y, (row_count as f64) * DEFAULT_ROW_HEIGHT);
|
||||
}
|
||||
|
||||
// we just test that page up and page down are inverse operations
|
||||
#[test]
|
||||
fn page_up() {
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
model.on_page_down().unwrap();
|
||||
let row1 = model.get_selected_view().row;
|
||||
|
||||
model.on_page_down().unwrap();
|
||||
let row2 = model.get_selected_view().row;
|
||||
|
||||
model.on_page_down().unwrap();
|
||||
let row3 = model.get_selected_view().row;
|
||||
|
||||
model.on_page_down().unwrap();
|
||||
|
||||
model.on_page_up().unwrap();
|
||||
assert_eq!(model.get_selected_view().row, row3);
|
||||
|
||||
model.on_page_up().unwrap();
|
||||
assert_eq!(model.get_selected_view().row, row2);
|
||||
|
||||
model.on_page_up().unwrap();
|
||||
assert_eq!(model.get_selected_view().row, row1);
|
||||
|
||||
model.on_page_up().unwrap();
|
||||
assert_eq!(model.get_selected_view().row, 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn page_up_fails_on_row1() {
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
model.on_arrow_up().unwrap();
|
||||
assert_eq!(model.get_selected_view().row, 1);
|
||||
}
|
||||
33
base/src/test/user_model/test_on_area_selection.rs
Normal file
33
base/src/test/user_model/test_on_area_selection.rs
Normal file
@@ -0,0 +1,33 @@
|
||||
#![allow(clippy::unwrap_used)]
|
||||
|
||||
use crate::{
|
||||
constants::{DEFAULT_COLUMN_WIDTH, DEFAULT_WINDOW_WIDTH},
|
||||
test::util::new_empty_model,
|
||||
UserModel,
|
||||
};
|
||||
|
||||
#[test]
|
||||
fn basic_test() {
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
|
||||
model.on_area_selecting(2, 4).unwrap();
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.range, [1, 1, 2, 4]);
|
||||
}
|
||||
|
||||
// this checks that is we select in the boundary we automatically scroll
|
||||
#[test]
|
||||
fn scroll_right() {
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
let window_width = DEFAULT_WINDOW_WIDTH as f64;
|
||||
let column_width = DEFAULT_COLUMN_WIDTH;
|
||||
let column_count = f64::floor(window_width / column_width) as i32;
|
||||
model.set_selected_cell(3, column_count).unwrap();
|
||||
|
||||
model.on_area_selecting(3, column_count + 3).unwrap();
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.range, [3, column_count, 3, column_count + 3]);
|
||||
assert_eq!(view.left_column, 4);
|
||||
}
|
||||
151
base/src/test/user_model/test_on_expand_selected_range.rs
Normal file
151
base/src/test/user_model/test_on_expand_selected_range.rs
Normal file
@@ -0,0 +1,151 @@
|
||||
#![allow(clippy::unwrap_used)]
|
||||
|
||||
use crate::{
|
||||
constants::{DEFAULT_COLUMN_WIDTH, DEFAULT_WINDOW_WIDTH, LAST_COLUMN},
|
||||
test::util::new_empty_model,
|
||||
UserModel,
|
||||
};
|
||||
|
||||
#[test]
|
||||
fn arrow_right() {
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
model.on_expand_selected_range("ArrowRight").unwrap();
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.range, [1, 1, 1, 2]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn arrow_right_decreases() {
|
||||
// if the selected cell is on the upper right corner, right-arrow will decrease the size of teh area
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
let (start_row, start_column, end_row, end_column) = (5, 3, 10, 8);
|
||||
model.set_selected_cell(start_row, end_column).unwrap();
|
||||
model
|
||||
.set_selected_range(start_row, start_column, end_row, end_column)
|
||||
.unwrap();
|
||||
|
||||
model.on_expand_selected_range("ArrowRight").unwrap();
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(
|
||||
view.range,
|
||||
[start_row, start_column + 1, end_row, end_column]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn arrow_right_last_column() {
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
model.set_selected_cell(1, LAST_COLUMN).unwrap();
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.range, [1, LAST_COLUMN, 1, LAST_COLUMN]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn arrow_right_scroll_right() {
|
||||
let window_width = DEFAULT_WINDOW_WIDTH as f64;
|
||||
let column_width = DEFAULT_COLUMN_WIDTH;
|
||||
let column_count = f64::floor(window_width / column_width) as i32;
|
||||
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
|
||||
// initially the column to the left is A
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.left_column, 1);
|
||||
|
||||
// We select all columns from 1 to the last visible
|
||||
let (start_row, start_column, end_row, end_column) = (1, 1, 1, column_count);
|
||||
model.set_selected_cell(start_row, start_column).unwrap();
|
||||
model
|
||||
.set_selected_range(start_row, start_column, end_row, end_column)
|
||||
.unwrap();
|
||||
|
||||
// Now we select one more column
|
||||
model.on_expand_selected_range("ArrowRight").unwrap();
|
||||
|
||||
// The view has updated and the first visible column is B
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(
|
||||
view.range,
|
||||
[start_row, start_column, end_row, end_column + 1]
|
||||
);
|
||||
assert_eq!(view.left_column, 2);
|
||||
|
||||
// now we click on cell B2 and we
|
||||
model.set_selected_cell(2, 2).unwrap();
|
||||
model.on_expand_selected_range("ArrowLeft").unwrap();
|
||||
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.range, [2, 1, 2, 2]);
|
||||
assert_eq!(view.left_column, 1);
|
||||
|
||||
// a second arrow left won't do anything
|
||||
model.on_expand_selected_range("ArrowLeft").unwrap();
|
||||
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.range, [2, 1, 2, 2]);
|
||||
assert_eq!(view.left_column, 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn arrow_left() {
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
model.set_selected_cell(5, 3).unwrap();
|
||||
model.set_selected_range(5, 3, 10, 8).unwrap();
|
||||
model.on_expand_selected_range("ArrowLeft").unwrap();
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.range, [5, 3, 10, 7]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn arrow_left_left_border() {
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
model.on_expand_selected_range("ArrowLeft").unwrap();
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.range, [1, 1, 1, 1]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn arrow_left_increases() {
|
||||
// If the selected cell is on the top right corner
|
||||
// arrow left increases the selected area by
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
|
||||
let (start_row, start_column, end_row, end_column) = (4, 10, 4, 20);
|
||||
model.set_selected_cell(start_row, end_column).unwrap();
|
||||
model
|
||||
.set_selected_range(start_row, start_column, end_row, end_column)
|
||||
.unwrap();
|
||||
model.on_expand_selected_range("ArrowLeft").unwrap();
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(
|
||||
view.range,
|
||||
[start_row, start_column - 1, end_row, end_column]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn arrow_left_scrolls_left() {
|
||||
// If the selected cell is on the top right corner
|
||||
// arrow left increases the selected area by
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
|
||||
model.set_top_left_visible_cell(1, 50).unwrap();
|
||||
|
||||
model.set_selected_cell(1, 50).unwrap();
|
||||
// arrow left x 2
|
||||
model.on_expand_selected_range("ArrowLeft").unwrap();
|
||||
model.on_expand_selected_range("ArrowLeft").unwrap();
|
||||
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.range, [1, 48, 1, 50]);
|
||||
assert_eq!(view.left_column, 48);
|
||||
assert_eq!(view.column, 50);
|
||||
}
|
||||
48
base/src/test/user_model/test_on_paste_styles.rs
Normal file
48
base/src/test/user_model/test_on_paste_styles.rs
Normal file
@@ -0,0 +1,48 @@
|
||||
#![allow(clippy::unwrap_used)]
|
||||
|
||||
use crate::test::util::new_empty_model;
|
||||
use crate::types::Fill;
|
||||
use crate::UserModel;
|
||||
|
||||
#[test]
|
||||
fn simple_pasting() {
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
let mut style = model.get_cell_style(0, 1, 1).unwrap();
|
||||
style.fill = Fill {
|
||||
pattern_type: "solid".to_string(),
|
||||
fg_color: Some("#FF5577".to_string()),
|
||||
bg_color: Some("#33FF44".to_string()),
|
||||
};
|
||||
let styles = vec![vec![style.clone()]];
|
||||
|
||||
model.set_selected_cell(5, 4).unwrap();
|
||||
model.set_selected_range(5, 4, 10, 9).unwrap();
|
||||
model.on_paste_styles(&styles).unwrap();
|
||||
|
||||
for row in 5..10 {
|
||||
for column in 4..9 {
|
||||
let cell_style = model.get_cell_style(0, row, column).unwrap();
|
||||
assert_eq!(cell_style, style);
|
||||
}
|
||||
}
|
||||
|
||||
model.undo().unwrap();
|
||||
let base_style = model.get_cell_style(0, 100, 100).unwrap();
|
||||
|
||||
for row in 5..10 {
|
||||
for column in 4..9 {
|
||||
let cell_style = model.get_cell_style(0, row, column).unwrap();
|
||||
assert_eq!(cell_style, base_style);
|
||||
}
|
||||
}
|
||||
|
||||
model.redo().unwrap();
|
||||
|
||||
for row in 5..10 {
|
||||
for column in 4..9 {
|
||||
let cell_style = model.get_cell_style(0, row, column).unwrap();
|
||||
assert_eq!(cell_style, style);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -52,19 +52,12 @@ fn set_the_cell_sets_the_range() {
|
||||
fn set_the_range_does_not_set_the_cell() {
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
model.set_selected_range(5, 4, 10, 6).unwrap();
|
||||
assert_eq!(model.get_selected_sheet(), 0);
|
||||
assert_eq!(model.get_selected_cell(), (0, 1, 1));
|
||||
assert_eq!(
|
||||
model.get_selected_view(),
|
||||
SelectedView {
|
||||
sheet: 0,
|
||||
row: 1,
|
||||
column: 1,
|
||||
range: [5, 4, 10, 6],
|
||||
top_row: 1,
|
||||
left_column: 1
|
||||
}
|
||||
model.set_selected_range(5, 4, 10, 6),
|
||||
Err(
|
||||
"The selected cells is not in one of the corners. Row: '1' and row range '(5, 10)'"
|
||||
.to_string()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
29
base/src/test/user_model/test_window_size.rs
Normal file
29
base/src/test/user_model/test_window_size.rs
Normal file
@@ -0,0 +1,29 @@
|
||||
#![allow(clippy::unwrap_used)]
|
||||
|
||||
use crate::{
|
||||
constants::{DEFAULT_ROW_HEIGHT, DEFAULT_WINDOW_HEIGH, DEFAULT_WINDOW_WIDTH},
|
||||
test::util::new_empty_model,
|
||||
UserModel,
|
||||
};
|
||||
|
||||
#[test]
|
||||
fn basic_test() {
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
let window_height = model.get_window_height().unwrap();
|
||||
assert_eq!(window_height, DEFAULT_WINDOW_HEIGH);
|
||||
|
||||
let window_width = model.get_window_width().unwrap();
|
||||
assert_eq!(window_width, DEFAULT_WINDOW_WIDTH);
|
||||
|
||||
// Set the window height to double the default and check that page_down behaves as expected
|
||||
model.set_window_height((window_height * 2) as f64);
|
||||
model.on_page_down().unwrap();
|
||||
|
||||
let row_height = DEFAULT_ROW_HEIGHT;
|
||||
let row_count = f64::floor((window_height * 2) as f64 / row_height) as i32;
|
||||
let view = model.get_selected_view();
|
||||
assert_eq!(view.row, 1 + row_count);
|
||||
let scroll_y = model.get_scroll_y().unwrap();
|
||||
assert_eq!(scroll_y, (row_count as f64) * DEFAULT_ROW_HEIGHT);
|
||||
}
|
||||
Reference in New Issue
Block a user