Change rendering of the default value in input, int and float

Earlier, the default value would just be shown on the side at all times.
This is even if the default will not be selected which can be
misleading. This change shows the default as greyed out text in the
input itself. It also allows pressing 'Tab' to make the current input
the default if the current input value is the start of the default.

Implements #4
This commit is contained in:
Lutetium-Vanadium 2021-12-30 15:56:16 +08:00
parent 1d5fadad23
commit 911dd36aad
54 changed files with 442 additions and 124 deletions

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (3.2) 3 
? message  3.2
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (3.2)  
? message  3.2
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (3.2)  
? message  3.2
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (3.2)  
? message  3.2
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (default) s 
? message  s 
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (default)  
? message  default
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (default)  
? message  default
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
✔ message · default
✔ message ·
  │
│ │
│ │

View File

@ -0,0 +1,28 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message  default │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└──────────────────────────────────────────────────┘

View File

@ -0,0 +1,28 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message  default  │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└──────────────────────────────────────────────────┘

View File

@ -0,0 +1,28 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
✔ message · default │
  │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└──────────────────────────────────────────────────┘

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (default)  
? message  default
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (32) 3 
? message  32
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (32)  
? message  32
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (32)  
? message  32
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (32)  
? message  32
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: src/question/input.rs
source: src/question/input/tests.rs
assertion_line: 57
expression: backend
---
┌──────────────────────────────────────────────────┐
? message (default)  
? message  default 
│ │
│ │
│ │

View File

@ -1,11 +1,12 @@
---
source: src/question/input.rs
source: src/question/input/tests.rs
assertion_line: 66
expression: backend
---
┌──────────────────────────────────────────────────┐
? message (default) inputinputinputinputinput
inputinputinputinputinput  │
? message  inputinputinputinputinputinputinp
│utinputinputinput 
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: src/question/number.rs
source: src/question/number/tests.rs
assertion_line: 100
expression: backend
---
┌──────────────────────────────────────────────────┐
? message (3.3)  
? message  3.3 
│ │
│ │
│ │

View File

@ -1,11 +1,12 @@
---
source: src/question/number.rs
source: src/question/number/tests.rs
assertion_line: 100
expression: backend
---
┌──────────────────────────────────────────────────┐
? message (3.3) 33333333333333333333333333333│
│333333333333333333333  │
? message  333333333333333333333333333333333│
│33333333333333333 
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: src/question/number.rs
source: src/question/number/tests.rs
assertion_line: 99
expression: backend
---
┌──────────────────────────────────────────────────┐
? message (333)  
? message  333 
│ │
│ │
│ │

View File

@ -1,11 +1,12 @@
---
source: src/question/number.rs
source: src/question/number/tests.rs
assertion_line: 99
expression: backend
---
┌──────────────────────────────────────────────────┐
? message (333) 33333333333333333333333333333│
│333333333333333333333  │
? message  333333333333333333333333333333333│
│33333333333333333 
│ │
│ │
│ │

View File

@ -1,6 +1,7 @@
fn main() {
let question = requestty::Question::int("age")
.message("What is your age?")
.default(69)
.validate_on_key(|age, _| age > 0 && age < 130)
.validate(|age, _| {
if age > 0 && age < 130 {

View File

@ -64,7 +64,7 @@ pub trait Widget {
fn handle_key(&mut self, key: KeyEvent) -> bool;
}
impl<T: std::ops::Deref<Target = str>> Widget for T {
impl<T: std::ops::Deref<Target = str> + ?Sized> Widget for T {
/// Does not allow multi-line strings. If the string requires more than a single line, it adds
/// cuts it short and adds '...' to the end.
///

16
src/main.rs Normal file
View File

@ -0,0 +1,16 @@
fn main() {
let question = requestty::Question::int("age")
.default(69)
.message("What is your age?")
.validate_on_key(|age, _| age > 0 && age < 130)
.validate(|age, _| {
if age > 0 && age < 130 {
Ok(())
} else {
Err(format!("You cannot be {} years old!", age))
}
})
.build();
println!("{:#?}", requestty::prompt_one(question));
}

View File

@ -96,7 +96,9 @@ impl<'a> InputBuilder<'a> {
/// .build();
/// ```
pub fn default<I: Into<String>>(mut self, default: I) -> Self {
self.input.default = Some(default.into());
let default = default.into();
let len = default.chars().count();
self.input.default = Some((default, len));
self
}

View File

@ -19,7 +19,7 @@ mod tests;
#[derive(Debug)]
pub(super) struct Input<'a> {
default: Option<String>,
default: Option<(String, usize)>,
filter: Filter<'a, String>,
validate: Validate<'a, str>,
validate_on_key: ValidateOnKey<'a, str>,
@ -81,10 +81,25 @@ impl InputPrompt<'_, '_> {
res
}
/// Returns the remaining default text if the current input is a substring of it
fn get_remaining_default(&self) -> Option<&str> {
if self.select.is_none() {
if let Some((ref default, _)) = self.input_opts.default {
let input = self.input.value();
if default.starts_with(self.input.value()) {
return Some(&default[input.len()..]);
}
}
}
None
}
}
impl Widget for InputPrompt<'_, '_> {
fn render<B: Backend>(&mut self, layout: &mut ui::layout::Layout, b: &mut B) -> io::Result<()> {
let mut original_layout = *layout;
self.prompt.render(layout, b)?;
// if the current input does not satisfy the on key validation, then we show its wrong by
@ -97,13 +112,43 @@ impl Widget for InputPrompt<'_, '_> {
b.set_fg(ui::style::Color::Reset)?;
}
self.maybe_select_op(|select| select.render(layout, b))
.transpose()?;
if let Some(default) = self.get_remaining_default() {
b.set_fg(ui::style::Color::DarkGrey)?;
write!(b, "{}", default)?;
b.set_fg(ui::style::Color::Reset)?;
// We need to update the layout to reflect the rest of the hint that is rendered.
// Instead of doing the math to compute where the cursor ends after rendering, we use
// the height function which already calculates it.
self.height(&mut original_layout);
*layout = original_layout;
} else {
self.maybe_select_op(|select| select.render(layout, b))
.transpose()?;
}
Ok(())
}
fn height(&mut self, layout: &mut ui::layout::Layout) -> u16 {
let mut height = self.prompt.height(layout) + self.input.height(layout) - 1;
let mut height = self.prompt.height(layout) - 1;
if self.get_remaining_default().is_some() {
let mut width = self.input_opts.default.as_ref().unwrap().1 as u16;
if width > layout.line_width() {
width -= layout.line_width();
layout.line_offset = width % layout.width;
layout.offset_y += 1 + width / layout.width;
height += 2 + width / layout.width;
} else {
layout.line_offset += width;
height += 1;
}
} else {
height = self.input.height(layout);
}
if let Some(picker_height) = self.maybe_select_op(|select| select.height(layout)) {
height += picker_height - 1;
@ -112,21 +157,20 @@ impl Widget for InputPrompt<'_, '_> {
}
fn handle_key(&mut self, mut key: KeyEvent) -> bool {
let Self {
answers,
input_opts,
input,
select,
..
} = self;
match input_opts.auto_complete {
AutoComplete::Sync(ref mut ac) if key.code == KeyCode::Tab => {
if select.is_some() {
if key.code == KeyCode::Tab {
if let AutoComplete::Sync(ref mut ac) = self.input_opts.auto_complete {
if self.select.is_some() {
key.code = KeyCode::Down;
} else {
let page_size = input_opts.page_size;
let should_loop = input_opts.should_loop;
let page_size = self.input_opts.page_size;
let should_loop = self.input_opts.should_loop;
let Self {
input,
answers,
select,
..
} = self;
input.replace_with(|s| {
let mut completions = ac(s, answers);
@ -148,16 +192,21 @@ impl Widget for InputPrompt<'_, '_> {
});
return true;
}
} else if self.get_remaining_default().is_some() {
let (default, default_len) = self.input_opts.default.as_ref().unwrap();
self.input.set_value(default.clone());
self.input.set_at(*default_len);
self.is_valid = true;
return true;
}
_ => {}
}
if input.handle_key(key) {
if self.input.handle_key(key) {
if let ValidateOnKey::Sync(ref mut validate) = self.input_opts.validate_on_key {
self.is_valid = validate(self.input.value(), self.answers);
}
*select = None;
self.select = None;
return true;
}
@ -208,13 +257,9 @@ impl Prompt for InputPrompt<'_, '_> {
}
impl<'i> Input<'i> {
fn into_input_prompt<'a>(
mut self,
message: &'a str,
answers: &'a Answers,
) -> InputPrompt<'i, 'a> {
fn into_input_prompt<'a>(self, message: &'a str, answers: &'a Answers) -> InputPrompt<'i, 'a> {
InputPrompt {
prompt: widgets::Prompt::new(message).with_optional_hint(self.default.take()),
prompt: widgets::Prompt::new(message),
input_opts: self,
input: widgets::StringInput::default(),
select: None,

View File

@ -12,11 +12,11 @@ fn inputs(answers: &Answers) -> [(InputPrompt<'static, '_>, u16); NINPUTS] {
(Input::default().into_input_prompt("message", &answers), 17),
(
Input {
default: Some("default".into()),
default: Some(("default".into(), 7)),
..Input::default()
}
.into_input_prompt("message", &answers),
25,
24,
),
(
Input {
@ -54,18 +54,15 @@ fn test_render() {
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", INPUT_IDS[i]), backend);
assert_eq!(layout, base_layout.with_line_offset(line_offset));
prompt.input.set_value("input".repeat(10));
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(line_offset)
);
assert_eq!(layout, base_layout.with_offset(0, 1).with_line_offset(17));
ui::assert_backend_snapshot!(format!("{}-2", INPUT_IDS[i]), backend);
}
@ -117,10 +114,7 @@ fn test_height() {
layout = base_layout;
assert_eq!(prompt.height(&mut layout), 2);
assert_eq!(
layout,
base_layout.with_offset(0, 1).with_line_offset(line_offset)
);
assert_eq!(layout, base_layout.with_offset(0, 1).with_line_offset(17));
}
let prompt = &mut inputs[AUTO_COMPLETE_IDX].0;
@ -156,13 +150,11 @@ fn test_cursor_pos() {
let mut inputs = inputs(&answers);
for (prompt, line_offset) in inputs.iter_mut() {
let line_offset = *line_offset;
assert_eq!(prompt.cursor_pos(layout), (line_offset, 0));
for (prompt, _) in inputs.iter_mut() {
assert_eq!(prompt.cursor_pos(layout), (17, 0));
prompt.input.set_value("input".repeat(10));
prompt.input.set_at(50);
assert_eq!(prompt.cursor_pos(layout), (line_offset, 1));
assert_eq!(prompt.cursor_pos(layout), (17, 1));
}
let prompt = &mut inputs[AUTO_COMPLETE_IDX].0;

View File

@ -80,7 +80,9 @@ macro_rules! builder {
/// .build();
/// ```
pub fn default(mut self, default: $inner_ty) -> Self {
self.inner.default = Some(default);
let default_str = default.to_string();
assert!(default_str.is_ascii());
self.inner.default = Some((default, default_str));
self
}

View File

@ -24,7 +24,7 @@ mod tests;
#[derive(Debug, Default)]
pub(super) struct Float<'a> {
default: Option<f64>,
default: Option<(f64, String)>,
filter: Filter<'a, f64>,
validate: Validate<'a, f64>,
validate_on_key: ValidateOnKey<'a, f64>,
@ -33,7 +33,7 @@ pub(super) struct Float<'a> {
#[derive(Debug, Default)]
pub(super) struct Int<'a> {
default: Option<i64>,
default: Option<(i64, String)>,
filter: Filter<'a, i64>,
validate: Validate<'a, i64>,
validate_on_key: ValidateOnKey<'a, i64>,
@ -102,6 +102,17 @@ macro_rules! impl_number_prompt {
.map_err(|e| e.to_string())
}
fn get_remaining_default(&self) -> Option<&str> {
if let Some((_, ref default)) = self.number.default {
let input = self.input.value();
if default.starts_with(self.input.value()) {
return Some(&default[input.len()..]);
}
}
None
}
fn validate_on_key(&mut self, n: $inner_ty) {
if let ValidateOnKey::Sync(ref mut validate) = self.number.validate_on_key {
self.is_valid = validate(n, self.answers);
@ -117,6 +128,7 @@ macro_rules! impl_number_prompt {
layout: &mut ui::layout::Layout,
b: &mut B,
) -> io::Result<()> {
let mut original_layout = *layout;
self.prompt.render(layout, b)?;
// if the current input does not satisfy the on key validation, then we show its wrong by
@ -129,14 +141,53 @@ macro_rules! impl_number_prompt {
b.set_fg(ui::style::Color::Reset)?;
}
if let Some(default) = self.get_remaining_default() {
b.set_fg(ui::style::Color::DarkGrey)?;
write!(b, "{}", default)?;
b.set_fg(ui::style::Color::Reset)?;
// We need to update the layout to reflect the rest of the hint that is
// rendered. Instead of doing the math to compute where the cursor ends after
// rendering, we use the height function which already calculates it.
self.height(&mut original_layout);
*layout = original_layout;
}
Ok(())
}
fn height(&mut self, layout: &mut ui::layout::Layout) -> u16 {
self.prompt.height(layout) + self.input.height(layout) - 1
let mut height = self.prompt.height(layout) - 1;
if self.get_remaining_default().is_some() {
let mut width = self.number.default.as_ref().unwrap().1.len() as u16;
if width > layout.line_width() {
width -= layout.line_width();
layout.line_offset = width % layout.width;
layout.offset_y += 1 + width / layout.width;
height += 2 + width / layout.width;
} else {
layout.line_offset += width;
height += 1;
}
} else {
height = self.input.height(layout);
}
height
}
fn handle_key(&mut self, key: KeyEvent) -> bool {
if self.get_remaining_default().is_some() && key.code == KeyCode::Tab {
let default = &self.number.default.as_ref().unwrap().1;
self.input.set_value(default.clone());
self.input.set_at(default.len());
self.is_valid = true;
return true;
}
if self.input.handle_key(key) {
match self.parse() {
Ok(n) => self.validate_on_key(n),
@ -190,7 +241,7 @@ macro_rules! impl_number_prompt {
fn finish(self) -> Self::Output {
let n = match self.number.default {
Some(default) if self.input.value().is_empty() => default,
Some((default, _)) if self.input.value().is_empty() => default,
_ => self
.parse()
.expect("Validation would fail if number cannot be parsed"),
@ -217,8 +268,7 @@ macro_rules! impl_ask {
answers: &'a Answers,
) -> $prompt_name<'n, 'a> {
$prompt_name {
prompt: widgets::Prompt::new(message)
.with_optional_hint(self.default.as_ref().map(ToString::to_string)),
prompt: widgets::Prompt::new(message),
input: widgets::StringInput::with_filter_map(Self::filter_map),
is_valid: true,
number: self,

View File

@ -14,13 +14,13 @@ macro_rules! test_numbers {
let base_layout = Layout::new(5, size);
let answers = Answers::default();
let defaults = [(None, 17), (Some($default), 21)];
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: default.map(|n| (n, n.to_string())),
..Default::default()
}
.into_prompt("message", &answers);
@ -38,10 +38,7 @@ macro_rules! test_numbers {
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(line_offset)
);
assert_eq!(layout, base_layout.with_offset(0, 1).with_line_offset(17));
ui::assert_backend_snapshot!(format!("{}-2", base_name), backend);
}
}
@ -52,11 +49,11 @@ macro_rules! test_numbers {
let base_layout = Layout::new(5, size);
let answers = Answers::default();
let defaults = [(None, 17), (Some($default), 21)];
let defaults = [(None, 17), (Some($default), 20)];
for &(default, line_offset) in defaults.iter() {
let mut prompt = $prompt_name {
default,
default: default.map(|n| (n, n.to_string())),
..Default::default()
}
.into_prompt("message", &answers);
@ -69,10 +66,7 @@ macro_rules! test_numbers {
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(line_offset)
);
assert_eq!(layout, base_layout.with_offset(0, 1).with_line_offset(17));
}
}
@ -82,20 +76,20 @@ macro_rules! test_numbers {
let layout = Layout::new(5, size);
let answers = Answers::default();
let defaults = [(None, 17), (Some($default), 21)];
let defaults = [None, Some($default)];
for &(default, line_offset) in defaults.iter() {
for default in defaults {
let mut prompt = $prompt_name {
default,
default: default.map(|n| (n, n.to_string())),
..Default::default()
}
.into_prompt("message", &answers);
assert_eq!(prompt.cursor_pos(layout), (line_offset, 0));
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), (line_offset, 1));
assert_eq!(prompt.cursor_pos(layout), (17, 1));
}
}
}

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (3.2) 3 
? message  3.2
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (3.2)  
? message  3.2
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (3.2)  
? message  3.2
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (3.2)  
? message  3.2
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (default) s 
? message  s 
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (default)  
? message  default
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (default)  
? message  default
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
✔ message · default
✔ message ·
  │
│ │
│ │

View File

@ -0,0 +1,28 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message  default │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└──────────────────────────────────────────────────┘

View File

@ -0,0 +1,28 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message  default  │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└──────────────────────────────────────────────────┘

View File

@ -0,0 +1,28 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
✔ message · default │
  │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└──────────────────────────────────────────────────┘

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (default)  
? message  default
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (32) 3 
? message  32
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (32)  
? message  32
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (32)  
? message  32
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: tests/helpers/mod.rs
assertion_line: 31
expression: self.backend
---
┌──────────────────────────────────────────────────┐
? message (32)  
? message  32
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: src/question/input.rs
source: src/question/input/tests.rs
assertion_line: 57
expression: backend
---
┌──────────────────────────────────────────────────┐
? message (default)  
? message  default 
│ │
│ │
│ │

View File

@ -1,11 +1,12 @@
---
source: src/question/input.rs
source: src/question/input/tests.rs
assertion_line: 66
expression: backend
---
┌──────────────────────────────────────────────────┐
? message (default) inputinputinputinputinput
inputinputinputinputinput  │
? message  inputinputinputinputinputinputinp
│utinputinputinput 
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: src/question/number.rs
source: src/question/number/tests.rs
assertion_line: 100
expression: backend
---
┌──────────────────────────────────────────────────┐
? message (3.3)  
? message  3.3 
│ │
│ │
│ │

View File

@ -1,11 +1,12 @@
---
source: src/question/number.rs
source: src/question/number/tests.rs
assertion_line: 100
expression: backend
---
┌──────────────────────────────────────────────────┐
? message (3.3) 33333333333333333333333333333│
│333333333333333333333  │
? message  333333333333333333333333333333333│
│33333333333333333 
│ │
│ │
│ │

View File

@ -1,10 +1,11 @@
---
source: src/question/number.rs
source: src/question/number/tests.rs
assertion_line: 99
expression: backend
---
┌──────────────────────────────────────────────────┐
? message (333)  
? message  333 
│ │
│ │
│ │

View File

@ -1,11 +1,12 @@
---
source: src/question/number.rs
source: src/question/number/tests.rs
assertion_line: 99
expression: backend
---
┌──────────────────────────────────────────────────┐
? message (333) 33333333333333333333333333333│
│333333333333333333333  │
? message  333333333333333333333333333333333│
│33333333333333333 
│ │
│ │
│ │

View File

@ -120,6 +120,16 @@ fn test_default() {
let mut backend = helpers::SnapshotOnFlushBackend::new((50, 20).into());
let mut events = TestEvents::new(Some(KeyCode::Enter.into()));
let ans = requestty::prompt_one_with(prompt, &mut backend, &mut events).unwrap();
assert_eq!(ans, Answer::String("".into()));
let prompt = Question::input("name")
.message("message")
.default("default");
let mut backend = helpers::SnapshotOnFlushBackend::new((50, 20).into());
let mut events = TestEvents::new([KeyCode::Tab.into(), KeyCode::Enter.into()]);
let ans = requestty::prompt_one_with(prompt, &mut backend, &mut events).unwrap();
assert_eq!(ans, Answer::String("default".into()));
}