File list tests

This commit is contained in:
veeso 2021-03-04 13:55:10 +01:00
parent 3ecf172fb5
commit f3cbbb8d81
3 changed files with 101 additions and 14 deletions

View file

@ -74,8 +74,8 @@ impl OwnStates {
/// Incremenet list index
pub fn incr_list_index(&mut self) {
// Check if index is at last element
if self.list_len + 1 < self.list_len {
self.list_len += 1;
if self.list_index + 1 < self.list_len {
self.list_index += 1;
}
}
@ -84,8 +84,8 @@ impl OwnStates {
/// Decrement list index
pub fn decr_list_index(&mut self) {
// Check if index is bigger than 0
if self.list_len > 0 {
self.list_len -= 1;
if self.list_index > 0 {
self.list_index -= 1;
}
}
@ -93,7 +93,7 @@ impl OwnStates {
///
/// Reset list index to 0
pub fn reset_list_index(&mut self) {
self.list_len = 0;
self.list_index = 0;
}
}
@ -172,7 +172,7 @@ impl Component for FileList {
.add_modifier(self.props.get_modifiers()),
),
),
value: self.get_value(),
cursor: self.states.list_index,
})
}
}
@ -237,7 +237,7 @@ impl Component for FileList {
}
KeyCode::Enter => {
// Report event
Msg::OnSubmit(Payload::Unumber(self.states.get_list_index()))
Msg::OnSubmit(self.get_value())
}
_ => {
// Return key event to activity
@ -251,8 +251,8 @@ impl Component for FileList {
}
/// ### get_value
///
/// Return component value
///
/// Return component value. File list return index
fn get_value(&self) -> Payload {
Payload::Unumber(self.states.get_list_index())
}
@ -268,3 +268,90 @@ impl Component for FileList {
false
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::ui::layout::props::TextParts;
use crossterm::event::KeyEvent;
#[test]
fn test_ui_layout_components_file_list() {
// Make component
let mut component: FileList = FileList::new(
PropsBuilder::default()
.with_texts(TextParts::new(
Some(String::from("filelist")),
Some(vec![String::from("file1"), String::from("file2")]),
))
.build(),
);
// Verify states
assert_eq!(component.states.list_index, 0);
assert_eq!(component.states.list_len, 2);
// Increment list index
component.states.list_index += 1;
assert_eq!(component.render().unwrap().cursor, 1);
// Should umount
assert_eq!(component.should_umount(), false);
// Update
component.update(
component
.get_props()
.with_texts(TextParts::new(
Some(String::from("filelist")),
Some(vec![
String::from("file1"),
String::from("file2"),
String::from("file3"),
]),
))
.build(),
);
// Verify states
assert_eq!(component.states.list_index, 0);
assert_eq!(component.states.list_len, 3);
// Render
assert_eq!(component.render().unwrap().cursor, 0);
// Handle inputs
assert_eq!(
component.on(InputEvent::Key(KeyEvent::from(KeyCode::Down))),
Msg::None
);
// Index should be incremented
assert_eq!(component.states.list_index, 1);
// Index should be decremented
assert_eq!(
component.on(InputEvent::Key(KeyEvent::from(KeyCode::Up))),
Msg::None
);
// Index should be incremented
assert_eq!(component.states.list_index, 0);
// Index should be 2
assert_eq!(
component.on(InputEvent::Key(KeyEvent::from(KeyCode::PageDown))),
Msg::None
);
// Index should be incremented
assert_eq!(component.states.list_index, 2);
// Index should be 0
assert_eq!(
component.on(InputEvent::Key(KeyEvent::from(KeyCode::PageUp))),
Msg::None
);
// Index should be incremented
assert_eq!(component.states.list_index, 0);
// Enter
assert_eq!(
component.on(InputEvent::Key(KeyEvent::from(KeyCode::Enter))),
Msg::OnSubmit(Payload::Unumber(0))
);
// On key
assert_eq!(
component.on(InputEvent::Key(KeyEvent::from(KeyCode::Backspace))),
Msg::OnKey(KeyEvent::from(KeyCode::Backspace))
);
}
}

View file

@ -40,7 +40,7 @@ use tui::widgets::Widget;
///
/// Msg is an enum returned after an event is raised for a certain component
/// Yep, I took inspiration from Elm.
#[derive(std::fmt::Debug)]
#[derive(std::fmt::Debug, PartialEq)]
pub enum Msg {
OnSubmit(Payload),
OnKey(KeyEvent),
@ -50,7 +50,7 @@ pub enum Msg {
/// ## Payload
///
/// Payload describes a component value
#[derive(std::fmt::Debug)]
#[derive(std::fmt::Debug, PartialEq)]
pub enum Payload {
Text(String),
Number(isize),
@ -64,8 +64,8 @@ pub enum Payload {
///
/// Render is the object which contains data related to the component render
pub struct Render {
pub widget: Box<dyn Widget>,
pub value: Payload,
pub widget: Box<dyn Widget>, // Widget
pub cursor: usize, // Cursor position
}
// -- States

View file

@ -351,7 +351,7 @@ mod tests {
assert_eq!(props.italic, true);
assert_eq!(props.texts.title.as_ref().unwrap().as_str(), "hello");
assert_eq!(props.input_type, InputType::Password);
assert_eq!(props.input_len.as_ref().unwrap(), 16);
assert_eq!(*props.input_len.as_ref().unwrap(), 16);
assert_eq!(props.value.as_ref().unwrap().as_str(), "Hello");
assert_eq!(
props.texts.body.as_ref().unwrap().get(0).unwrap().as_str(),