Implement ask_uint() including tests
This commit is contained in:
parent
747324ae85
commit
860888c06f
1 changed files with 80 additions and 2 deletions
|
@ -44,8 +44,31 @@ fn ask_bool_<R: BufRead>(s: &str, default: Option<bool>, input: &mut R) -> bool
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn ask_uint(s: &str) -> u64 {
|
/// Ask the user for an unsigned number. Optionally provide a default value. If none is provided,
|
||||||
unimplemented!()
|
/// this keeps loop{}ing
|
||||||
|
pub fn ask_uint(s: &str, default: Option<u64>) -> u64 {
|
||||||
|
ask_uint_(s, default, &mut BufReader::new(stdin()))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn ask_uint_<R: BufRead>(s: &str, default: Option<u64>, input: &mut R) -> u64 {
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
loop {
|
||||||
|
ask_question(s, false);
|
||||||
|
|
||||||
|
let mut s = String::new();
|
||||||
|
let _ = input.read_line(&mut s);
|
||||||
|
|
||||||
|
let u : Result<u64, _> = FromStr::from_str(&s[..]);
|
||||||
|
match u {
|
||||||
|
Ok(u) => { return u; },
|
||||||
|
Err(_) => {
|
||||||
|
if default.is_some() {
|
||||||
|
return default.unwrap();
|
||||||
|
} // else keep looping
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn ask_string(s: &str) -> String {
|
pub fn ask_string(s: &str) -> String {
|
||||||
|
@ -73,6 +96,7 @@ mod test {
|
||||||
use std::io::BufReader;
|
use std::io::BufReader;
|
||||||
|
|
||||||
use super::ask_bool_;
|
use super::ask_bool_;
|
||||||
|
use super::ask_uint_;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_ask_bool_nodefault_yes() {
|
fn test_ask_bool_nodefault_yes() {
|
||||||
|
@ -146,4 +170,58 @@ mod test {
|
||||||
assert!(true == ask_bool_(question, default, &mut BufReader::new(answers.as_bytes())));
|
assert!(true == ask_bool_(question, default, &mut BufReader::new(answers.as_bytes())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_ask_uint_nodefault() {
|
||||||
|
let question = "Is this 1";
|
||||||
|
let default = None;
|
||||||
|
let answers = "1";
|
||||||
|
|
||||||
|
assert!(1 == ask_uint_(question, default, &mut BufReader::new(answers.as_bytes())));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_ask_uint_default() {
|
||||||
|
let question = "Is this 1";
|
||||||
|
let default = Some(1);
|
||||||
|
let answers = "1";
|
||||||
|
|
||||||
|
assert!(1 == ask_uint_(question, default, &mut BufReader::new(answers.as_bytes())));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_ask_uint_default_2_input_1() {
|
||||||
|
let question = "Is this 1";
|
||||||
|
let default = Some(2);
|
||||||
|
let answers = "1";
|
||||||
|
|
||||||
|
assert!(1 == ask_uint_(question, default, &mut BufReader::new(answers.as_bytes())));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_ask_uint_default_2_noinput() {
|
||||||
|
let question = "Is this 1";
|
||||||
|
let default = Some(2);
|
||||||
|
let answers = "\n";
|
||||||
|
|
||||||
|
assert!(2 == ask_uint_(question, default, &mut BufReader::new(answers.as_bytes())));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_ask_uint_default_2_several_noinput() {
|
||||||
|
let question = "Is this 1";
|
||||||
|
let default = Some(2);
|
||||||
|
let answers = "\n\n\n\n";
|
||||||
|
|
||||||
|
assert!(2 == ask_uint_(question, default, &mut BufReader::new(answers.as_bytes())));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_ask_uint_default_2_wrong_input() {
|
||||||
|
let question = "Is this 1";
|
||||||
|
let default = Some(2);
|
||||||
|
let answers = "\n\n\nasfb\nsakjf\naskjf\n-2";
|
||||||
|
|
||||||
|
assert!(2 == ask_uint_(question, default, &mut BufReader::new(answers.as_bytes())));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue