requestty 0.6.3

An easy-to-use collection of interactive cli prompts
Documentation
use ui::events::{KeyCode, TestEvents};

mod helpers;

fn choices(len: usize) -> impl Iterator<Item = String> {
    (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::<Vec<_>>();

    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::<Vec<_>>();

    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::<Vec<_>>();
    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::<Vec<_>>();

    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::<Vec<_>>();
    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::<Vec<_>>();

    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());
}