#[cfg(test)]
mod test_config_options {
use r3bl_rs_utils_core::*;
use super::*;
use crate::*;
#[test]
fn test_multiline_true() {
let mut buffer = EditorBuffer::new_empty(Some(DEFAULT_SYN_HI_FILE_EXT));
let mut engine: EditorEngine = EditorEngine {
config_options: EditorEngineConfig {
multiline_mode: LineMode::MultiLine,
..Default::default()
},
..mock_real_objects_for_editor::make_editor_engine()
};
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::InsertString("abc".into()),
EditorEvent::InsertNewLine,
EditorEvent::InsertString("ab".into()),
EditorEvent::InsertNewLine,
EditorEvent::InsertString("a".into()),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 1, row_index: 2)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::MoveCaret(CaretDirection::Up),
EditorEvent::MoveCaret(CaretDirection::Up),
EditorEvent::MoveCaret(CaretDirection::Down),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 1, row_index: 1)
);
}
#[test]
fn test_multiline_false() {
let mut buffer = EditorBuffer::new_empty(Some(DEFAULT_SYN_HI_FILE_EXT));
let mut engine: EditorEngine = EditorEngine {
config_options: EditorEngineConfig {
multiline_mode: LineMode::SingleLine,
..Default::default()
},
..mock_real_objects_for_editor::make_editor_engine()
};
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::InsertString("abc".into()),
EditorEvent::InsertNewLine,
EditorEvent::InsertString("ab".into()),
EditorEvent::InsertNewLine,
EditorEvent::InsertString("a".into()),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 6, row_index: 0)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::MoveCaret(CaretDirection::Up),
EditorEvent::MoveCaret(CaretDirection::Up),
EditorEvent::MoveCaret(CaretDirection::Down),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 6, row_index: 0)
);
let maybe_line_str: Option<UnicodeString> =
EditorEngineInternalApi::line_at_caret_to_string(&buffer, &engine);
assert_eq2!(maybe_line_str.unwrap().string, "abcaba");
}
}
#[cfg(test)]
mod test_editor_ops {
use r3bl_rs_utils_core::*;
use super::*;
use crate::*;
#[test]
fn editor_delete() {
let mut buffer = EditorBuffer::new_empty(Some(DEFAULT_SYN_HI_FILE_EXT));
let mut engine = mock_real_objects_for_editor::make_editor_engine();
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::InsertString("abc".into()),
EditorEvent::InsertNewLine,
EditorEvent::InsertString("ab".into()),
EditorEvent::InsertNewLine,
EditorEvent::InsertString("a".into()),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 1, row_index: 2)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::MoveCaret(CaretDirection::Left),
EditorEvent::Delete,
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 2)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::MoveCaret(CaretDirection::Up),
EditorEvent::MoveCaret(CaretDirection::Right),
EditorEvent::MoveCaret(CaretDirection::Right),
EditorEvent::Delete,
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(buffer.get_lines().len(), 2);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 2, row_index: 1)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::MoveCaret(CaretDirection::Up),
EditorEvent::MoveCaret(CaretDirection::Right),
EditorEvent::Delete,
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(buffer.get_lines().len(), 1);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 3, row_index: 0)
);
assert::line_at_caret(&buffer, &engine, "abcab");
}
#[test]
fn editor_backspace() {
let mut buffer = EditorBuffer::new_empty(Some(DEFAULT_SYN_HI_FILE_EXT));
let mut engine = mock_real_objects_for_editor::make_editor_engine();
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::InsertString("abc".into()),
EditorEvent::InsertNewLine,
EditorEvent::InsertString("ab".into()),
EditorEvent::InsertNewLine,
EditorEvent::InsertString("a".into()),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 1, row_index: 2)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::Backspace],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 2)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::Backspace],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 2, row_index: 1)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::MoveCaret(CaretDirection::Left),
EditorEvent::MoveCaret(CaretDirection::Left),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 1)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::Backspace],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(buffer.get_lines().len(), 1);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 3, row_index: 0)
);
assert::line_at_caret(&buffer, &engine, "abcab");
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::MoveCaret(CaretDirection::Right),
EditorEvent::MoveCaret(CaretDirection::Right),
EditorEvent::InsertString("😃".into()),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 7, row_index: 0)
);
EditorEvent::apply_editor_event(
&mut engine,
&mut buffer,
EditorEvent::Backspace,
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert::line_at_caret(&buffer, &engine, "abcab");
}
#[test]
fn editor_validate_caret_position_on_up() {
let mut buffer = EditorBuffer::new_empty(Some(DEFAULT_SYN_HI_FILE_EXT));
let mut engine = mock_real_objects_for_editor::make_editor_engine();
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::InsertString("😀".into()),
EditorEvent::InsertNewLine,
EditorEvent::InsertChar('1'),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 1, row_index: 1)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Up)],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 2, row_index: 0)
);
}
#[test]
fn editor_validate_caret_position_on_down() {
let mut buffer = EditorBuffer::new_empty(Some(DEFAULT_SYN_HI_FILE_EXT));
let mut engine = mock_real_objects_for_editor::make_editor_engine();
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::InsertChar('1'),
EditorEvent::InsertNewLine,
EditorEvent::InsertString("😀".into()),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 2, row_index: 1)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::MoveCaret(CaretDirection::Up),
EditorEvent::MoveCaret(CaretDirection::Right),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 1)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Down)],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 2, row_index: 1)
);
}
#[test]
fn editor_move_caret_up_down() {
let mut buffer = EditorBuffer::new_empty(Some(DEFAULT_SYN_HI_FILE_EXT));
let mut engine = mock_real_objects_for_editor::make_editor_engine();
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::InsertString("abc".into()),
EditorEvent::InsertNewLine,
EditorEvent::InsertString("ab".into()),
EditorEvent::InsertNewLine,
EditorEvent::InsertString("a".into()),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 1, row_index: 2)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::MoveCaret(CaretDirection::Down),
EditorEvent::MoveCaret(CaretDirection::Down),
EditorEvent::MoveCaret(CaretDirection::Down),
EditorEvent::MoveCaret(CaretDirection::Down),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 1, row_index: 2)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Up)],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 1, row_index: 1)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Up)],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 1, row_index: 0)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::MoveCaret(CaretDirection::Up),
EditorEvent::MoveCaret(CaretDirection::Up),
EditorEvent::MoveCaret(CaretDirection::Up),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 0)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::MoveCaret(CaretDirection::Right),
EditorEvent::MoveCaret(CaretDirection::Right),
EditorEvent::MoveCaret(CaretDirection::Down),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 2, row_index: 1)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Down)],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 1, row_index: 2)
);
}
#[test]
fn editor_insert_new_line() {
let mut buffer = EditorBuffer::new_empty(Some(DEFAULT_SYN_HI_FILE_EXT));
let mut engine = mock_real_objects_for_editor::make_editor_engine();
assert_eq2!(buffer.get_lines().len(), 1);
assert_eq2!(buffer.get_lines().len(), 1);
assert::none_is_at_caret(&buffer, &engine);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::InsertChar('a')],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert::none_is_at_caret(&buffer, &engine);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 1, row_index: 0)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::InsertNewLine],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(buffer.get_lines().len(), 2);
assert::none_is_at_caret(&buffer, &engine);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 1)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::InsertChar('a')],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Left)],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert::str_is_at_caret(&buffer, &engine, "a");
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::InsertNewLine],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(buffer.get_lines().len(), 3);
assert::str_is_at_caret(&buffer, &engine, "a");
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 2)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::MoveCaret(CaretDirection::Right),
EditorEvent::InsertChar('b'),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert::none_is_at_caret(&buffer, &engine);
assert_eq2!(
EditorEngineInternalApi::line_at_caret_to_string(&buffer, &engine)
.unwrap()
.string,
"ab"
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::MoveCaret(CaretDirection::Left),
EditorEvent::InsertNewLine,
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert::str_is_at_caret(&buffer, &engine, "b");
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 3)
);
assert_eq2!(buffer.get_lines().len(), 4);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::MoveCaret(CaretDirection::Up),
EditorEvent::MoveCaret(CaretDirection::Right),
EditorEvent::InsertNewLine,
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(buffer.get_lines().len(), 5);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 3)
);
}
#[test]
fn editor_move_caret_left_right() {
let mut buffer = EditorBuffer::new_empty(Some(DEFAULT_SYN_HI_FILE_EXT));
let mut engine = mock_real_objects_for_editor::make_editor_engine();
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::InsertChar('a')],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert::none_is_at_caret(&buffer, &engine);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::MoveCaret(CaretDirection::Left),
EditorEvent::MoveCaret(CaretDirection::Left), ],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert::str_is_at_caret(&buffer, &engine, "a");
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::InsertChar('1')],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
EditorEngineInternalApi::line_at_caret_to_string(&buffer, &engine)
.unwrap()
.string,
"1a"
);
assert::str_is_at_caret(&buffer, &engine, "a");
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Left)],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert::str_is_at_caret(&buffer, &engine, "1");
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Right)],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert::str_is_at_caret(&buffer, &engine, "a");
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::InsertChar('2')],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert::str_is_at_caret(&buffer, &engine, "a");
assert_eq2!(
EditorEngineInternalApi::line_at_caret_to_string(&buffer, &engine)
.unwrap()
.string,
"12a"
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::MoveCaret(CaretDirection::Right),
EditorEvent::MoveCaret(CaretDirection::Right), ],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert::none_is_at_caret(&buffer, &engine);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 3, row_index: 0)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::MoveCaret(CaretDirection::Left),
EditorEvent::MoveCaret(CaretDirection::Left),
EditorEvent::MoveCaret(CaretDirection::Left),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 0)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::MoveCaret(CaretDirection::Right),
EditorEvent::MoveCaret(CaretDirection::Right),
EditorEvent::MoveCaret(CaretDirection::Right),
EditorEvent::InsertNewLine,
EditorEvent::MoveCaret(CaretDirection::Left),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 3, row_index: 0)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Right)],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 1)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::InsertNewLine,
EditorEvent::MoveCaret(CaretDirection::Up),
EditorEvent::MoveCaret(CaretDirection::Right),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 2)
);
}
#[test]
fn editor_empty_state() {
let buffer = EditorBuffer::new_empty(Some(DEFAULT_SYN_HI_FILE_EXT));
assert_eq2!(buffer.get_lines().len(), 1);
assert!(!buffer.is_empty());
}
#[test]
fn editor_insertion() {
let mut buffer = EditorBuffer::new_empty(Some(DEFAULT_SYN_HI_FILE_EXT));
let mut engine = mock_real_objects_for_editor::make_editor_engine();
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 0)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::InsertChar('a')],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(*buffer.get_lines(), vec![UnicodeString::from("a")]);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 1, row_index: 0)
);
EditorEngineInternalApi::insert_new_line_at_caret(EditorArgsMut {
editor_buffer: &mut buffer,
editor_engine: &mut engine,
});
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::InsertChar('b')],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
*buffer.get_lines(),
vec![UnicodeString::from("a"), UnicodeString::from("b")]
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 1, row_index: 1)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::InsertNewLine,
EditorEvent::InsertNewLine,
EditorEvent::InsertChar('😀'),
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
*buffer.get_lines(),
vec![
UnicodeString::from("a"),
UnicodeString::from("b"),
UnicodeString::from(""),
UnicodeString::from("😀")
]
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 2, row_index: 3)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::InsertChar('d')],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
*buffer.get_lines(),
vec![
UnicodeString::from("a"),
UnicodeString::from("b"),
UnicodeString::from(""),
UnicodeString::from("😀d")
]
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 3, row_index: 3)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::InsertString("🙏🏽".into())],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
*buffer.get_lines(),
vec![
UnicodeString::from("a"),
UnicodeString::from("b"),
UnicodeString::from(""),
UnicodeString::from("😀d🙏🏽")
]
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 7, row_index: 3)
);
}
#[test]
fn editor_move_caret_home_end() {
let mut buffer = EditorBuffer::new_empty(Some(DEFAULT_SYN_HI_FILE_EXT));
let mut engine = mock_real_objects_for_editor::make_editor_engine();
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::InsertString("hello".to_string()),
EditorEvent::Home,
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 0)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::End],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 5, row_index: 0)
);
}
#[test]
fn editor_move_caret_page_up_page_down() {
let mut buffer = EditorBuffer::new_empty(Some(DEFAULT_SYN_HI_FILE_EXT));
let mut engine = mock_real_objects_for_editor::make_editor_engine();
let max_lines = 20;
let mut count = max_lines;
while count > 0 {
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::InsertString(format!("{count}: {}", "hello")),
EditorEvent::InsertNewLine,
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
count -= 1;
}
assert_eq2!(buffer.len(), ch!(max_lines + 1));
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::PageUp],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 10)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::PageUp],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 0)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::PageUp],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 0)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::PageDown],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 10)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::PageDown],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 20)
);
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::PageDown],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 20)
);
}
#[test]
fn editor_scroll_vertical() {
let mut buffer = EditorBuffer::new_empty(Some(DEFAULT_SYN_HI_FILE_EXT));
let mut engine = mock_real_objects_for_editor::make_editor_engine();
let max_lines = 20;
for count in 1..=max_lines {
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![
EditorEvent::InsertString(format!("{count}: {}", "hello")),
EditorEvent::InsertNewLine,
],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
}
assert_eq2!(buffer.len(), ch!(max_lines + 1));
for _ in 1..12 {
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Up)],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
}
assert_eq2!(
buffer.get_caret(CaretKind::Raw),
position!(col_index: 0, row_index: 0)
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 9)
);
assert_eq2!(
buffer.get_scroll_offset(),
position!(col_index: 0, row_index: 9)
);
for _ in 1..9 {
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Down)],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
}
assert_eq2!(
buffer.get_caret(CaretKind::Raw),
position!(col_index: 0, row_index: 8)
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 17)
);
assert_eq2!(
buffer.get_scroll_offset(),
position!(col_index: 0, row_index: 9)
);
}
#[test]
fn editor_scroll_horizontal() {
let mut buffer = EditorBuffer::new_empty(Some(DEFAULT_SYN_HI_FILE_EXT));
let mut engine = mock_real_objects_for_editor::make_editor_engine();
let max_cols = 15;
for count in 1..=max_cols {
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::InsertString(format!("{count}"))],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
}
assert_eq2!(buffer.len(), ch!(1));
assert_eq2!(
buffer.get_caret(CaretKind::Raw),
position!(col_index: 9, row_index: 0)
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 21, row_index: 0)
);
assert_eq2!(
buffer.get_scroll_offset(),
position!(col_index: 12, row_index: 0)
);
for _ in 1..5 {
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Left)],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
}
assert_eq2!(
buffer.get_caret(CaretKind::Raw),
position!(col_index: 5, row_index: 0)
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 17, row_index: 0)
);
assert_eq2!(
buffer.get_scroll_offset(),
position!(col_index: 12, row_index: 0)
);
for _ in 1..3 {
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Right)],
&mock_real_objects_for_editor::make_shared_global_data(None),
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
}
assert_eq2!(
buffer.get_caret(CaretKind::Raw),
position!(col_index: 7, row_index: 0)
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 19, row_index: 0)
);
assert_eq2!(
buffer.get_scroll_offset(),
position!(col_index: 12, row_index: 0)
);
}
#[test]
fn editor_scroll_right_horizontal_long_line_with_jumbo_emoji() {
let viewport_width = ch!(65);
let viewport_height = ch!(2);
let window_size = size!(col_count: viewport_width, row_count: viewport_height);
let shared_global_data =
mock_real_objects_for_editor::make_shared_global_data(window_size.into());
let mut buffer = EditorBuffer::new_empty(Some(DEFAULT_SYN_HI_FILE_EXT));
let mut engine =
mock_real_objects_for_editor::make_editor_engine_with_bounds(window_size);
let long_line = "# Did he take those two new droids with him? They hit accelerator.🙏🏽😀░ We will deal with your Rebel friends. Commence primary ignition.🙏🏽😀░";
buffer.set_lines(vec![long_line.to_string()]);
{
assert_eq2!(buffer.len(), ch!(1));
assert_eq2!(buffer.get_lines()[0].string, long_line);
assert_eq2!(
buffer.get_caret(CaretKind::Raw),
position!(col_index: 0, row_index: 0)
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 0, row_index: 0)
);
assert_eq2!(
buffer.get_scroll_offset(),
position!(col_index: 0, row_index: 0)
);
}
{
let num_of_right = 67;
for _ in 1..num_of_right {
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Right)],
&shared_global_data,
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
}
assert_eq2!(
buffer.get_scroll_offset(),
position!(col_index: 6, row_index: 0)
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 66, row_index: 0)
);
let result = buffer.get_lines()[0]
.clone()
.get_string_at_display_col_index(
buffer.get_caret(CaretKind::ScrollAdjusted).col_index,
);
assert_eq2!(result.unwrap().unicode_string_seg.string, "🙏🏽");
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Right)],
&shared_global_data,
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 70, row_index: 0)
);
let result = buffer.get_lines()[0]
.clone()
.get_string_at_display_col_index(
buffer.get_caret(CaretKind::ScrollAdjusted).col_index,
);
assert_eq2!(result.unwrap().unicode_string_seg.string, "😀");
}
{
for _ in 1..60 {
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Right)],
&shared_global_data,
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
}
assert_eq2!(
buffer.get_caret(CaretKind::Raw),
position!(col_index: 64, row_index: 0)
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 130, row_index: 0)
);
assert_eq2!(
buffer.get_scroll_offset(),
position!(col_index: 66, row_index: 0)
);
let result = buffer.get_lines()[0]
.clone()
.get_string_at_display_col_index(buffer.get_scroll_offset().col_index);
assert_eq2!(result.unwrap().unicode_string_seg.string, "🙏🏽");
}
{
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Right)],
&shared_global_data,
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
assert_eq2!(
buffer.get_caret(CaretKind::Raw),
position!(col_index: 61, row_index: 0)
);
assert_eq2!(
buffer.get_caret(CaretKind::ScrollAdjusted),
position!(col_index: 131, row_index: 0)
);
assert_eq2!(
buffer.get_scroll_offset(),
position!(col_index: 70, row_index: 0)
);
let result = buffer.get_lines()[0]
.clone()
.get_string_at_display_col_index(buffer.get_scroll_offset().col_index);
assert_eq2!(result.unwrap().unicode_string_seg.string, "😀");
}
{
for _ in 1..4 {
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Right)],
&shared_global_data,
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
}
let result = buffer.get_lines()[0]
.clone()
.get_string_at_display_col_index(buffer.get_scroll_offset().col_index);
assert_eq2!(result.unwrap().unicode_string_seg.string, "😀");
}
{
EditorEvent::apply_editor_events(
&mut engine,
&mut buffer,
vec![EditorEvent::MoveCaret(CaretDirection::Right)],
&shared_global_data,
&mut mock_real_objects_for_editor::make_component_registry(),
FlexBoxId::from(0),
);
let result = buffer.get_lines()[0]
.clone()
.get_string_at_display_col_index(buffer.get_scroll_offset().col_index);
assert_eq2!(result.unwrap().unicode_string_seg.string, "░");
}
}
}
pub mod mock_real_objects_for_editor {
use r3bl_rs_utils_core::*;
use crate::{test_dialog::mock_real_objects_for_dialog::State, *};
pub fn make_shared_global_data(window_size: Option<Size>) -> SharedGlobalData {
use std::sync::Arc;
use tokio::sync::RwLock;
let mut global_data = GlobalData::default();
if let Some(window_size) = window_size {
global_data.window_size = window_size;
}
let shared_global_data: SharedGlobalData = Arc::new(RwLock::new(global_data));
shared_global_data
}
pub fn make_component_registry() -> ComponentRegistry<State, String> {
let component_registry: ComponentRegistry<_, _> = ComponentRegistry::default();
component_registry
}
pub fn make_editor_engine_with_bounds(size: Size) -> EditorEngine {
let flex_box = FlexBox {
style_adjusted_bounds_size: size,
style_adjusted_origin_pos: position!( col_index: 0, row_index: 0 ),
..Default::default()
};
let current_box: PartialFlexBox = (&flex_box).into();
EditorEngine {
current_box,
..Default::default()
}
}
pub fn make_editor_engine() -> EditorEngine {
let flex_box = FlexBox {
style_adjusted_bounds_size: size!( col_count: 10, row_count: 10 ),
style_adjusted_origin_pos: position!( col_index: 0, row_index: 0 ),
..Default::default()
};
let current_box: PartialFlexBox = (&flex_box).into();
EditorEngine {
current_box,
..Default::default()
}
}
}
pub mod assert {
use r3bl_rs_utils_core::*;
use crate::*;
pub fn none_is_at_caret(buffer: &EditorBuffer, engine: &EditorEngine) {
assert_eq2!(
EditorEngineInternalApi::string_at_caret(buffer, engine),
None
);
}
pub fn str_is_at_caret(
editor_buffer: &EditorBuffer,
engine: &EditorEngine,
expected: &str,
) {
match EditorEngineInternalApi::string_at_caret(editor_buffer, engine) {
Some(UnicodeStringSegmentSliceResult {
unicode_string_seg: s,
..
}) => assert_eq2!(s.string, expected),
None => panic!("Expected string at caret, but got None."),
}
}
pub fn line_at_caret(
editor_buffer: &EditorBuffer,
engine: &EditorEngine,
expected: &str,
) {
assert_eq2!(
EditorEngineInternalApi::line_at_caret_to_string(editor_buffer, engine)
.unwrap()
.string,
expected
);
}
}