requestty 0.6.3

An easy-to-use collection of interactive cli prompts
Documentation
use super::*;

macro_rules! test_numbers {
    (mod $mod_name:ident { $prompt_name:ident, $default:expr }) => {
        #[cfg(test)]
        mod $mod_name {
            use ui::{backend::TestBackend, layout::Layout};

            use super::*;

            #[test]
            fn test_render() {
                let size = (50, 20).into();
                let base_layout = Layout::new(5, size);
                let answers = Answers::default();

                let defaults = [(None, 17), (Some($default), 20)];

                let mut backend = TestBackend::new_with_layout(size, base_layout);

                for &(default, line_offset) in defaults.iter() {
                    let mut prompt = $prompt_name {
                        default: default.map(|n| (n, n.to_string())),
                        ..Default::default()
                    }
                    .into_prompt("message", &answers);

                    let base_name = default.map(|_| "default").unwrap_or("no_default");

                    let mut layout = base_layout;
                    backend.reset_with_layout(layout);
                    assert!(prompt.render(&mut layout, &mut backend).is_ok());
                    assert_eq!(layout, base_layout.with_line_offset(line_offset));
                    ui::assert_backend_snapshot!(format!("{}-1", base_name), backend);

                    prompt.input.set_value("3".repeat(50));

                    layout = base_layout;
                    backend.reset_with_layout(layout);
                    assert!(prompt.render(&mut layout, &mut backend).is_ok());
                    assert_eq!(layout, base_layout.with_offset(0, 1).with_line_offset(17));
                    ui::assert_backend_snapshot!(format!("{}-2", base_name), backend);
                }
            }

            #[test]
            fn test_height() {
                let size = (50, 20).into();
                let base_layout = Layout::new(5, size);
                let answers = Answers::default();

                let defaults = [(None, 17), (Some($default), 20)];

                for &(default, line_offset) in defaults.iter() {
                    let mut prompt = $prompt_name {
                        default: default.map(|n| (n, n.to_string())),
                        ..Default::default()
                    }
                    .into_prompt("message", &answers);

                    let mut layout = base_layout;

                    assert_eq!(prompt.height(&mut layout), 1);
                    assert_eq!(layout, base_layout.with_line_offset(line_offset));
                    layout = base_layout;

                    prompt.input.set_value("3".repeat(50));
                    assert_eq!(prompt.height(&mut layout), 2);
                    assert_eq!(layout, base_layout.with_offset(0, 1).with_line_offset(17));
                }
            }

            #[test]
            fn test_cursor_pos() {
                let size = (50, 20).into();
                let layout = Layout::new(5, size);
                let answers = Answers::default();

                let defaults = [None, Some($default)];

                for &default in defaults.iter() {
                    let mut prompt = $prompt_name {
                        default: default.map(|n| (n, n.to_string())),
                        ..Default::default()
                    }
                    .into_prompt("message", &answers);

                    assert_eq!(prompt.cursor_pos(layout), (17, 0));

                    prompt.input.set_value("3".repeat(50));
                    prompt.input.set_at(50);
                    assert_eq!(prompt.cursor_pos(layout), (17, 1));
                }
            }
        }
    };
}

test_numbers!(mod int { Int, 333 });
test_numbers!(mod float { Float, 3.3 });