use ui::events::{KeyCode, TestEvents}; mod helpers; fn choices(len: usize) -> impl Iterator { (0..len).map(|choice| choice.to_string()) } #[test] fn test_validate() { let order_select = requestty::Question::order_select("name") .message("order select") .validate(|c, _| { if c[0].text() == "0" { Ok(()) } else { Err("Error".to_string()) } }) .choices(choices(10)); let size = (50, 20).into(); let mut backend = helpers::SnapshotOnFlushBackend::new(size); let mut events = TestEvents::new(vec![ KeyCode::Char(' ').into(), KeyCode::Down.into(), KeyCode::Char(' ').into(), KeyCode::Enter.into(), KeyCode::Up.into(), KeyCode::Char(' ').into(), KeyCode::Down.into(), KeyCode::Char(' ').into(), KeyCode::Enter.into(), ]); let indexes_a = choices(10).enumerate().map(|(i, _)| i).collect::>(); let indexes_b = requestty::prompt_one_with(order_select, &mut backend, &mut events) .unwrap() .try_into_list_items() .unwrap() .into_iter() .map(|a| a.index) .collect::>(); assert_eq!(indexes_a, indexes_b) } #[test] fn test_filter() { let order_select = requestty::Question::order_select("name") .filter(|mut items, _| { items.rotate_left(1); items }) .message("order select") .choices(choices(10)); let size = (50, 20).into(); let mut backend = helpers::SnapshotOnFlushBackend::new(size); let mut events = TestEvents::new(vec![ KeyCode::Char(' ').into(), KeyCode::Down.into(), KeyCode::Char(' ').into(), KeyCode::Enter.into(), ]); let mut indexes_a = choices(10).enumerate().map(|(i, _)| i).collect::>(); indexes_a.swap(0, 1); indexes_a.rotate_left(1); let indexes_b = requestty::prompt_one_with(order_select, &mut backend, &mut events) .unwrap() .try_into_list_items() .unwrap() .into_iter() .map(|a| a.index) .collect::>(); assert_eq!(indexes_a, indexes_b) } #[test] fn test_transform() { let order_select = requestty::Question::order_select("name") .transform(|items, _, b| { b.set_fg(ui::style::Color::Magenta)?; for (i, item) in items.iter().enumerate() { write!(b, "{}: {}", item.initial_index(), item.text())?; if i + 1 != items.len() { write!(b, ", ")?; } } b.set_fg(ui::style::Color::Reset) }) .message("order select") .choices(choices(10)); let size = (50, 20).into(); let mut backend = helpers::SnapshotOnFlushBackend::new(size); let mut events = TestEvents::new(vec![ KeyCode::Char(' ').into(), KeyCode::Down.into(), KeyCode::Char(' ').into(), KeyCode::Enter.into(), ]); let mut indexes_a = choices(10).enumerate().map(|(i, _)| i).collect::>(); indexes_a.swap(0, 1); let indexes_b = requestty::prompt_one_with(order_select, &mut backend, &mut events) .unwrap() .try_into_list_items() .unwrap() .into_iter() .map(|a| a.index) .collect::>(); assert_eq!(indexes_a, indexes_b) } #[test] fn test_on_esc() { let size = (50, 20).into(); let mut backend = helpers::SnapshotOnFlushBackend::new(size); let mut events = TestEvents::new(Some(KeyCode::Esc.into())); let res = requestty::prompt_one_with( requestty::Question::order_select("name") .message("message") .choices(choices(10)) .on_esc(requestty::OnEsc::Terminate), &mut backend, &mut events, ); assert!(matches!(res, Err(requestty::ErrorKind::Aborted))); let size = (50, 20).into(); let mut backend = helpers::SnapshotOnFlushBackend::new(size); let mut events = TestEvents::new(Some(KeyCode::Esc.into())); let res = requestty::prompt_with( Some( requestty::Question::order_select("name") .message("message") .choices(choices(10)) .on_esc(requestty::OnEsc::SkipQuestion) .build(), ), &mut backend, &mut events, ) .unwrap(); assert!(res.is_empty()); }