use super::buffer_struct::EditorBuffer;
use crate::{ArrayBoundsCheck, ArrayOverflowResult, CursorBoundsCheck,
CursorPositionBoundsStatus, LengthOps, NumericValue};
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum RowContentPositionStatus {
OnFirstRow,
OnMiddleRow,
OnLastRow,
BeyondBuffer,
}
#[must_use]
pub fn locate_col(editor_buffer: &EditorBuffer) -> CursorPositionBoundsStatus {
if let Some(_line) = editor_buffer.line_at_caret_scr_adj() {
let col_index = editor_buffer.get_caret_scr_adj().col_index;
let line_display_width = editor_buffer.get_line_display_width_at_caret_scr_adj();
line_display_width.check_cursor_position_bounds(col_index)
} else {
CursorPositionBoundsStatus::AtStart
}
}
#[must_use]
pub fn locate_row(buffer: &EditorBuffer) -> RowContentPositionStatus {
let row_index = buffer.get_caret_scr_adj().row_index;
let buffer_line_count = buffer.get_lines().len();
if buffer_line_count.is_zero() {
RowContentPositionStatus::OnFirstRow
} else if row_index.overflows(buffer_line_count) == ArrayOverflowResult::Overflowed {
RowContentPositionStatus::BeyondBuffer
} else if buffer_line_count == 1.into() {
RowContentPositionStatus::OnFirstRow
} else {
if row_index.is_zero() {
RowContentPositionStatus::OnFirstRow
} else if row_index == buffer_line_count.convert_to_index().into() {
RowContentPositionStatus::OnLastRow
} else {
RowContentPositionStatus::OnMiddleRow
}
}
}
#[must_use]
pub fn col_is_at_start(buffer: &EditorBuffer) -> bool {
locate_col(buffer) == CursorPositionBoundsStatus::AtStart
}
#[must_use]
pub fn col_is_at_end(buffer: &EditorBuffer) -> bool {
locate_col(buffer) == CursorPositionBoundsStatus::AtEnd
}
#[must_use]
pub fn row_is_at_top(buffer: &EditorBuffer) -> bool {
locate_row(buffer) == RowContentPositionStatus::OnFirstRow
}
#[must_use]
pub fn row_is_at_bottom(buffer: &EditorBuffer) -> bool {
locate_row(buffer) == RowContentPositionStatus::OnLastRow
}
#[cfg(test)]
mod locate_col_tests {
use super::*;
use crate::{EditorEngine, EditorEngineConfig, assert_eq2, col, row};
#[test]
fn test_locate_col_at_start() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Hello World"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(0);
}
let location = locate_col(&buffer);
assert_eq2!(location, CursorPositionBoundsStatus::AtStart);
}
#[test]
fn test_locate_col_at_end() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Hello World"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
let line_width = buffer.get_lines().get_line_display_width(row(0)).unwrap();
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = line_width.eol_cursor_position();
}
let location = locate_col(&buffer);
assert_eq2!(location, CursorPositionBoundsStatus::AtEnd);
}
#[test]
fn test_locate_col_in_middle() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Hello World"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(5);
}
let location = locate_col(&buffer);
assert_eq2!(location, CursorPositionBoundsStatus::Within);
}
#[test]
fn test_locate_col_empty_line() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec![""]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(0);
}
let location = locate_col(&buffer);
assert_eq2!(location, CursorPositionBoundsStatus::AtStart);
}
#[test]
fn test_locate_col_with_unicode() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Hello 😄 World"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(6); }
let location = locate_col(&buffer);
assert_eq2!(location, CursorPositionBoundsStatus::Within);
let line_width = buffer.get_lines().get_line_display_width(row(0)).unwrap();
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = line_width.eol_cursor_position();
}
let location = locate_col(&buffer);
assert_eq2!(location, CursorPositionBoundsStatus::AtEnd);
}
#[test]
fn test_locate_col_with_scroll_offset() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Very long line with many characters"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.scr_ofs.row_index = row(0);
buffer_mut.inner.scr_ofs.col_index = col(5);
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(0);
}
let location = locate_col(&buffer);
assert_eq2!(location, CursorPositionBoundsStatus::Within);
}
#[test]
fn test_locate_col_beyond_line_width() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Short"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
let line_width = buffer.get_lines().get_line_display_width(row(0)).unwrap();
assert_eq2!(line_width.as_usize(), 5);
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(10);
}
let location = locate_col(&buffer);
assert_eq2!(location, CursorPositionBoundsStatus::AtEnd);
}
#[test]
fn test_locate_col_no_line_available() {
let mut buffer = EditorBuffer::new_empty(None, None);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(5);
}
let location = locate_col(&buffer);
assert_eq2!(location, CursorPositionBoundsStatus::AtStart);
}
#[test]
fn test_locate_col_multiple_rows() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Line 1", "Different Length Line", "Short"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(1);
buffer_mut.inner.caret_raw.col_index = col(15); }
let location = locate_col(&buffer);
assert_eq2!(location, CursorPositionBoundsStatus::Within);
let line_width = buffer.get_lines().get_line_display_width(row(2)).unwrap();
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(2);
buffer_mut.inner.caret_raw.col_index = line_width.eol_cursor_position();
}
let location = locate_col(&buffer);
assert_eq2!(location, CursorPositionBoundsStatus::AtEnd);
}
#[test]
fn test_locate_col_empty_line_at_end_position() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec![""]);
let engine = EditorEngine::new(EditorEngineConfig::default());
let line_width = buffer.get_lines().get_line_display_width(row(0)).unwrap();
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = line_width.eol_cursor_position();
}
let location = locate_col(&buffer);
assert_eq2!(location, CursorPositionBoundsStatus::AtStart);
}
}
#[cfg(test)]
mod locate_row_tests {
use super::*;
use crate::{EditorEngine, EditorEngineConfig, assert_eq2, col, row};
#[test]
fn test_locate_row_at_top() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Line 1", "Line 2", "Line 3"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(0);
}
let location = locate_row(&buffer);
assert_eq2!(location, RowContentPositionStatus::OnFirstRow);
}
#[test]
fn test_locate_row_at_bottom() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Line 1", "Line 2", "Line 3"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(2);
buffer_mut.inner.caret_raw.col_index = col(0);
}
let location = locate_row(&buffer);
assert_eq2!(location, RowContentPositionStatus::OnLastRow);
}
#[test]
fn test_locate_row_in_middle() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Line 1", "Line 2", "Line 3"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(1);
buffer_mut.inner.caret_raw.col_index = col(0);
}
let location = locate_row(&buffer);
assert_eq2!(location, RowContentPositionStatus::OnMiddleRow);
}
#[test]
fn test_locate_row_single_line() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Only line"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(0);
}
let location = locate_row(&buffer);
assert_eq2!(location, RowContentPositionStatus::OnFirstRow);
}
#[test]
fn test_locate_row_empty_buffer() {
let buffer = EditorBuffer::new_empty(None, None);
let location = locate_row(&buffer);
assert_eq2!(location, RowContentPositionStatus::OnFirstRow);
}
#[test]
fn test_locate_row_beyond_buffer() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Line 1", "Line 2"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(5);
buffer_mut.inner.caret_raw.col_index = col(0);
}
let location = locate_row(&buffer);
assert_eq2!(location, RowContentPositionStatus::BeyondBuffer);
}
#[test]
fn test_locate_row_two_line_buffer() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["First line", "Second line"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(0);
}
let location = locate_row(&buffer);
assert_eq2!(location, RowContentPositionStatus::OnFirstRow);
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(1);
buffer_mut.inner.caret_raw.col_index = col(0);
}
let location = locate_row(&buffer);
assert_eq2!(location, RowContentPositionStatus::OnLastRow);
}
#[test]
fn test_locate_row_column_independent() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Line 1", "Line 2", "Line 3"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(1);
buffer_mut.inner.caret_raw.col_index = col(0); }
let location = locate_row(&buffer);
assert_eq2!(location, RowContentPositionStatus::OnMiddleRow);
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(1);
buffer_mut.inner.caret_raw.col_index = col(5); }
let location = locate_row(&buffer);
assert_eq2!(location, RowContentPositionStatus::OnMiddleRow);
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(2);
buffer_mut.inner.caret_raw.col_index = col(0); }
let location = locate_row(&buffer);
assert_eq2!(location, RowContentPositionStatus::OnLastRow);
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(2);
buffer_mut.inner.caret_raw.col_index = col(3); }
let location = locate_row(&buffer);
assert_eq2!(location, RowContentPositionStatus::OnLastRow);
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{EditorEngine, EditorEngineConfig, col, row};
#[test]
fn test_col_is_at_start_of_line() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Test line"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(0);
}
assert!(col_is_at_start(&buffer));
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(5);
}
assert!(!col_is_at_start(&buffer));
}
#[test]
fn test_col_is_at_start_empty_buffer() {
let buffer = EditorBuffer::new_empty(None, None);
assert!(col_is_at_start(&buffer));
}
#[test]
fn test_col_is_at_start_multiple_rows() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["First line", "Second line is longer", "Short"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(0);
}
assert!(col_is_at_start(&buffer));
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(1);
buffer_mut.inner.caret_raw.col_index = col(0);
}
assert!(col_is_at_start(&buffer));
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(2);
buffer_mut.inner.caret_raw.col_index = col(0);
}
assert!(col_is_at_start(&buffer));
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(1);
buffer_mut.inner.caret_raw.col_index = col(5);
}
assert!(!col_is_at_start(&buffer));
}
#[test]
fn test_col_is_at_start_unicode_text() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Hello 😄 World"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(0);
}
assert!(col_is_at_start(&buffer));
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(6);
}
assert!(!col_is_at_start(&buffer));
}
#[test]
fn test_col_is_at_start_empty_line() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec![""]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(0);
}
assert!(col_is_at_start(&buffer));
}
#[test]
fn test_col_is_at_end_of_line() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Test"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
let line_width = buffer.get_lines().get_line_display_width(row(0)).unwrap();
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = line_width.eol_cursor_position();
}
assert!(col_is_at_end(&buffer));
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(2);
}
assert!(!col_is_at_end(&buffer));
}
#[test]
fn test_col_is_at_end_empty_buffer() {
let buffer = EditorBuffer::new_empty(None, None);
assert!(!col_is_at_end(&buffer));
}
#[test]
fn test_col_is_at_end_multiple_rows() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["First", "Second line is longer", "Short"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
let line_width = buffer.get_lines().get_line_display_width(row(0)).unwrap();
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = line_width.eol_cursor_position();
}
assert!(col_is_at_end(&buffer));
let line_width = buffer.get_lines().get_line_display_width(row(1)).unwrap();
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(1);
buffer_mut.inner.caret_raw.col_index = line_width.eol_cursor_position();
}
assert!(col_is_at_end(&buffer));
let line_width = buffer.get_lines().get_line_display_width(row(2)).unwrap();
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(2);
buffer_mut.inner.caret_raw.col_index = line_width.eol_cursor_position();
}
assert!(col_is_at_end(&buffer));
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(1);
buffer_mut.inner.caret_raw.col_index = col(5);
}
assert!(!col_is_at_end(&buffer));
}
#[test]
fn test_col_is_at_end_unicode_text() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Hello 😄 World"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
let line_width = buffer.get_lines().get_line_display_width(row(0)).unwrap();
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = line_width.eol_cursor_position();
}
assert!(col_is_at_end(&buffer));
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(6);
}
assert!(!col_is_at_end(&buffer));
}
#[test]
fn test_col_is_at_end_empty_line() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec![""]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(0);
}
assert!(!col_is_at_end(&buffer));
}
#[test]
fn test_row_is_at_top_of_buffer() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Line 1", "Line 2", "Line 3"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(0);
}
assert!(row_is_at_top(&buffer));
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(1);
buffer_mut.inner.caret_raw.col_index = col(0);
}
assert!(!row_is_at_top(&buffer));
}
#[test]
fn test_row_is_at_top_empty_buffer() {
let buffer = EditorBuffer::new_empty(None, None);
assert!(row_is_at_top(&buffer));
}
#[test]
fn test_row_is_at_top_single_line() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Only line"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(0);
}
assert!(row_is_at_top(&buffer));
}
#[test]
fn test_row_is_at_top_two_line() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["First line", "Second line"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(0);
}
assert!(row_is_at_top(&buffer));
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(1);
buffer_mut.inner.caret_raw.col_index = col(0);
}
assert!(!row_is_at_top(&buffer));
}
#[test]
fn test_row_is_at_bottom_of_buffer() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["Line 1", "Line 2", "Line 3"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(2);
buffer_mut.inner.caret_raw.col_index = col(0);
}
assert!(row_is_at_bottom(&buffer));
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(1);
buffer_mut.inner.caret_raw.col_index = col(0);
}
assert!(!row_is_at_bottom(&buffer));
let mut single_line_buffer = EditorBuffer::new_empty(None, None);
single_line_buffer.init_with(vec!["Only line"]);
{
let buffer_mut = single_line_buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(0);
}
assert!(!row_is_at_bottom(&single_line_buffer)); }
#[test]
fn test_row_is_at_bottom_empty_buffer() {
let buffer = EditorBuffer::new_empty(None, None);
assert!(!row_is_at_bottom(&buffer));
}
#[test]
fn test_row_is_at_bottom_two_line() {
let mut buffer = EditorBuffer::new_empty(None, None);
buffer.init_with(vec!["First line", "Second line"]);
let engine = EditorEngine::new(EditorEngineConfig::default());
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(0);
buffer_mut.inner.caret_raw.col_index = col(0);
}
assert!(!row_is_at_bottom(&buffer));
{
let buffer_mut = buffer.get_mut(engine.viewport());
buffer_mut.inner.caret_raw.row_index = row(1);
buffer_mut.inner.caret_raw.col_index = col(0);
}
assert!(row_is_at_bottom(&buffer));
}
}