mirror of
https://github.com/clap-rs/clap
synced 2024-12-14 14:52:33 +00:00
78e4c90326
In experimenting on #1772, I want to write test cases for various combinations of required or not, values vs occurrences, etc. There wasn't really a clear place to put these. On top of that, I wanted there to be a clear place in the tests for describing the behavior of special types, to make it easier to audit and easier to see how a PR for #1772 changes things. As part of this effort in organizing these tests, I reduced the number of tests that use special types. This better focuses these tests on the cases they are intending to cover, rather than pulling in unrelated features. This makes it easier to audit special types and makes it so failures give more focused results, making it easier to see what broke.
120 lines
3.3 KiB
Rust
120 lines
3.3 KiB
Rust
// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,
|
|
// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and
|
|
// Andrew Hobden (@hoverbear) <andrew@hoverbear.org>
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
// option. This file may not be copied, modified, or distributed
|
|
// except according to those terms.
|
|
//
|
|
// This work was derived from Structopt (https://github.com/TeXitoi/structopt)
|
|
// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the
|
|
// MIT/Apache 2.0 license.
|
|
|
|
use clap::IntoApp;
|
|
use clap::Parser;
|
|
|
|
#[test]
|
|
fn required_argument() {
|
|
#[derive(Parser, PartialEq, Debug)]
|
|
struct Opt {
|
|
arg: i32,
|
|
}
|
|
assert_eq!(
|
|
Opt { arg: 42 },
|
|
Opt::try_parse_from(&["test", "42"]).unwrap()
|
|
);
|
|
assert!(Opt::try_parse_from(&["test"]).is_err());
|
|
assert!(Opt::try_parse_from(&["test", "42", "24"]).is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn argument_with_default() {
|
|
#[derive(Parser, PartialEq, Debug)]
|
|
struct Opt {
|
|
#[clap(default_value = "42")]
|
|
arg: i32,
|
|
}
|
|
assert_eq!(
|
|
Opt { arg: 24 },
|
|
Opt::try_parse_from(&["test", "24"]).unwrap()
|
|
);
|
|
assert_eq!(Opt { arg: 42 }, Opt::try_parse_from(&["test"]).unwrap());
|
|
assert!(Opt::try_parse_from(&["test", "42", "24"]).is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn auto_value_name() {
|
|
#[derive(Parser, PartialEq, Debug)]
|
|
struct Opt {
|
|
my_special_arg: i32,
|
|
}
|
|
|
|
let mut help = Vec::new();
|
|
Opt::into_app().write_help(&mut help).unwrap();
|
|
let help = String::from_utf8(help).unwrap();
|
|
|
|
assert!(help.contains("MY_SPECIAL_ARG"));
|
|
// Ensure the implicit `num_vals` is just 1
|
|
assert_eq!(
|
|
Opt { my_special_arg: 10 },
|
|
Opt::try_parse_from(&["test", "10"]).unwrap()
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn explicit_value_name() {
|
|
#[derive(Parser, PartialEq, Debug)]
|
|
struct Opt {
|
|
#[clap(value_name = "BROWNIE_POINTS")]
|
|
my_special_arg: i32,
|
|
}
|
|
|
|
let mut help = Vec::new();
|
|
Opt::into_app().write_help(&mut help).unwrap();
|
|
let help = String::from_utf8(help).unwrap();
|
|
|
|
assert!(help.contains("BROWNIE_POINTS"));
|
|
assert!(!help.contains("MY_SPECIAL_ARG"));
|
|
// Ensure the implicit `num_vals` is just 1
|
|
assert_eq!(
|
|
Opt { my_special_arg: 10 },
|
|
Opt::try_parse_from(&["test", "10"]).unwrap()
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn option_type_is_optional() {
|
|
#[derive(Parser, PartialEq, Debug)]
|
|
struct Opt {
|
|
arg: Option<i32>,
|
|
}
|
|
assert_eq!(
|
|
Opt { arg: Some(42) },
|
|
Opt::try_parse_from(&["test", "42"]).unwrap()
|
|
);
|
|
assert_eq!(Opt { arg: None }, Opt::try_parse_from(&["test"]).unwrap());
|
|
assert!(Opt::try_parse_from(&["test", "42", "24"]).is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn vec_type_is_multiple_values() {
|
|
#[derive(Parser, PartialEq, Debug)]
|
|
struct Opt {
|
|
arg: Vec<i32>,
|
|
}
|
|
assert_eq!(
|
|
Opt { arg: vec![24] },
|
|
Opt::try_parse_from(&["test", "24"]).unwrap()
|
|
);
|
|
assert_eq!(Opt { arg: vec![] }, Opt::try_parse_from(&["test"]).unwrap());
|
|
assert_eq!(
|
|
Opt { arg: vec![24, 42] },
|
|
Opt::try_parse_from(&["test", "24", "42"]).unwrap()
|
|
);
|
|
assert_eq!(
|
|
clap::ErrorKind::ValueValidation,
|
|
Opt::try_parse_from(&["test", "NOPE"]).err().unwrap().kind
|
|
);
|
|
}
|