clap/tests/builder/env.rs

426 lines
11 KiB
Rust
Raw Permalink Normal View History

2021-08-14 00:04:49 +00:00
#![cfg(feature = "env")]
2017-10-03 23:23:03 +00:00
use std::env;
use std::ffi::OsStr;
use clap::{arg, builder::FalseyValueParser, Arg, ArgAction, Command};
2017-10-03 23:23:03 +00:00
#[test]
2017-10-05 17:41:36 +00:00
fn env() {
2017-10-03 23:23:03 +00:00
env::set_var("CLP_TEST_ENV", "env");
2022-02-12 03:48:29 +00:00
let r = Command::new("df")
.arg(
arg!([arg] "some opt")
.env("CLP_TEST_ENV")
.action(ArgAction::Set),
)
.try_get_matches_from(vec![""]);
2017-10-04 18:24:54 +00:00
2021-12-27 19:57:38 +00:00
assert!(r.is_ok(), "{}", r.unwrap_err());
2017-10-03 23:23:03 +00:00
let m = r.unwrap();
assert!(m.contains_id("arg"));
2022-11-30 02:26:37 +00:00
assert_eq!(
m.value_source("arg").unwrap(),
clap::parser::ValueSource::EnvVariable
);
assert_eq!(
m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
"env"
);
2017-10-03 23:23:03 +00:00
}
2017-10-05 17:41:36 +00:00
#[test]
fn env_bool_literal() {
env::set_var("CLP_TEST_FLAG_TRUE", "On");
env::set_var("CLP_TEST_FLAG_FALSE", "nO");
2022-02-12 03:48:29 +00:00
let r = Command::new("df")
.arg(
Arg::new("present")
.short('p')
.env("CLP_TEST_FLAG_TRUE")
.action(ArgAction::SetTrue)
.value_parser(FalseyValueParser::new()),
)
.arg(
Arg::new("negated")
.short('n')
.env("CLP_TEST_FLAG_FALSE")
.action(ArgAction::SetTrue)
.value_parser(FalseyValueParser::new()),
)
.arg(
Arg::new("absent")
.short('a')
.env("CLP_TEST_FLAG_ABSENT")
.action(ArgAction::SetTrue)
.value_parser(FalseyValueParser::new()),
)
.try_get_matches_from(vec![""]);
2021-12-27 19:57:38 +00:00
assert!(r.is_ok(), "{}", r.unwrap_err());
let m = r.unwrap();
assert!(*m.get_one::<bool>("present").expect("defaulted by clap"));
assert!(!*m.get_one::<bool>("negated").expect("defaulted by clap"));
assert!(!*m.get_one::<bool>("absent").expect("defaulted by clap"));
}
2017-10-05 17:41:36 +00:00
#[test]
fn env_os() {
env::set_var("CLP_TEST_ENV_OS", "env");
2017-10-05 17:41:36 +00:00
2022-02-12 03:48:29 +00:00
let r = Command::new("df")
.arg(
2021-11-19 20:33:11 +00:00
arg!([arg] "some opt")
.env(OsStr::new("CLP_TEST_ENV_OS"))
.action(ArgAction::Set),
)
.try_get_matches_from(vec![""]);
2017-10-05 17:41:36 +00:00
2021-12-27 19:57:38 +00:00
assert!(r.is_ok(), "{}", r.unwrap_err());
2017-10-05 17:41:36 +00:00
let m = r.unwrap();
assert!(m.contains_id("arg"));
assert_eq!(
m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
"env"
);
2017-10-05 17:41:36 +00:00
}
#[test]
fn no_env() {
// All the other tests use the presence of the Environment variable...
// we need another variable just in case one of the others is running at the same time...
env::remove_var("CLP_TEST_ENV_NONE");
2022-02-12 03:48:29 +00:00
let r = Command::new("df")
.arg(
2021-11-19 20:33:11 +00:00
arg!([arg] "some opt")
.env("CLP_TEST_ENV_NONE")
.action(ArgAction::Set),
)
.try_get_matches_from(vec![""]);
2021-12-27 19:57:38 +00:00
assert!(r.is_ok(), "{}", r.unwrap_err());
let m = r.unwrap();
assert!(!m.contains_id("arg"));
2022-11-30 02:26:37 +00:00
assert_eq!(m.value_source("arg"), None);
assert_eq!(m.get_one::<String>("arg").map(|v| v.as_str()), None);
}
#[test]
fn no_env_no_takes_value() {
// All the other tests use the presence of the Environment variable...
// we need another variable just in case one of the others is running at the same time...
env::remove_var("CLP_TEST_ENV_NONE");
2022-02-12 03:48:29 +00:00
let r = Command::new("df")
2021-11-19 20:33:11 +00:00
.arg(arg!([arg] "some opt").env("CLP_TEST_ENV_NONE"))
.try_get_matches_from(vec![""]);
2017-10-05 17:41:36 +00:00
2021-12-27 19:57:38 +00:00
assert!(r.is_ok(), "{}", r.unwrap_err());
2017-10-05 17:41:36 +00:00
let m = r.unwrap();
assert!(!m.contains_id("arg"));
2022-11-30 02:26:37 +00:00
assert_eq!(m.value_source("arg"), None);
assert_eq!(m.get_one::<String>("arg").map(|v| v.as_str()), None);
2017-10-05 17:41:36 +00:00
}
#[test]
fn with_default() {
env::set_var("CLP_TEST_ENV_WD", "env");
2017-10-05 17:41:36 +00:00
2022-02-12 03:48:29 +00:00
let r = Command::new("df")
2017-10-05 17:41:36 +00:00
.arg(
2021-11-19 20:33:11 +00:00
arg!([arg] "some opt")
.env("CLP_TEST_ENV_WD")
.action(ArgAction::Set)
2017-10-05 17:41:36 +00:00
.default_value("default"),
)
.try_get_matches_from(vec![""]);
2017-10-05 17:41:36 +00:00
2021-12-27 19:57:38 +00:00
assert!(r.is_ok(), "{}", r.unwrap_err());
2017-10-05 17:41:36 +00:00
let m = r.unwrap();
assert!(m.contains_id("arg"));
2022-11-30 02:26:37 +00:00
assert_eq!(
m.value_source("arg").unwrap(),
clap::parser::ValueSource::EnvVariable
);
assert_eq!(
m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
"env"
);
2017-10-05 17:41:36 +00:00
}
#[test]
fn opt_user_override() {
env::set_var("CLP_TEST_ENV_OR", "env");
2017-10-05 17:41:36 +00:00
2022-02-12 03:48:29 +00:00
let r = Command::new("df")
.arg(
2021-11-19 20:33:11 +00:00
arg!(--arg [FILE] "some arg")
.env("CLP_TEST_ENV_OR")
.action(ArgAction::Set),
)
.try_get_matches_from(vec!["", "--arg", "opt"]);
2017-10-05 17:41:36 +00:00
2021-12-27 19:57:38 +00:00
assert!(r.is_ok(), "{}", r.unwrap_err());
2017-10-05 17:41:36 +00:00
let m = r.unwrap();
assert!(m.contains_id("arg"));
2022-11-30 02:26:37 +00:00
assert_eq!(
m.value_source("arg").unwrap(),
clap::parser::ValueSource::CommandLine
);
assert_eq!(
m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
"opt"
);
// see https://github.com/clap-rs/clap/issues/1835
let values: Vec<_> = m
.get_many::<String>("arg")
.unwrap()
.map(|v| v.as_str())
.collect();
assert_eq!(values, vec!["opt"]);
2017-10-05 17:41:36 +00:00
}
#[test]
fn positionals() {
env::set_var("CLP_TEST_ENV_P", "env");
2017-10-05 17:41:36 +00:00
2022-02-12 03:48:29 +00:00
let r = Command::new("df")
.arg(
2021-11-19 20:33:11 +00:00
arg!([arg] "some opt")
.env("CLP_TEST_ENV_P")
.action(ArgAction::Set),
)
.try_get_matches_from(vec![""]);
2017-10-05 17:41:36 +00:00
2021-12-27 19:57:38 +00:00
assert!(r.is_ok(), "{}", r.unwrap_err());
2017-10-05 17:41:36 +00:00
let m = r.unwrap();
assert!(m.contains_id("arg"));
2022-11-30 02:26:37 +00:00
assert_eq!(
m.value_source("arg").unwrap(),
clap::parser::ValueSource::EnvVariable
);
assert_eq!(
m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
"env"
);
2017-10-05 17:41:36 +00:00
}
#[test]
fn positionals_user_override() {
env::set_var("CLP_TEST_ENV_POR", "env");
2017-10-05 17:41:36 +00:00
2022-02-12 03:48:29 +00:00
let r = Command::new("df")
.arg(
2021-11-19 20:33:11 +00:00
arg!([arg] "some opt")
.env("CLP_TEST_ENV_POR")
.action(ArgAction::Set),
)
.try_get_matches_from(vec!["", "opt"]);
2017-10-05 17:41:36 +00:00
2021-12-27 19:57:38 +00:00
assert!(r.is_ok(), "{}", r.unwrap_err());
2017-10-05 17:41:36 +00:00
let m = r.unwrap();
assert!(m.contains_id("arg"));
2022-11-30 02:26:37 +00:00
assert_eq!(
m.value_source("arg").unwrap(),
clap::parser::ValueSource::CommandLine
);
assert_eq!(
m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
"opt"
);
// see https://github.com/clap-rs/clap/issues/1835
let values: Vec<_> = m
.get_many::<String>("arg")
.unwrap()
.map(|v| v.as_str())
.collect();
assert_eq!(values, vec!["opt"]);
2017-10-05 17:41:36 +00:00
}
#[test]
fn multiple_one() {
env::set_var("CLP_TEST_ENV_MO", "env");
2017-10-05 17:41:36 +00:00
2022-02-12 03:48:29 +00:00
let r = Command::new("df")
2017-10-05 17:41:36 +00:00
.arg(
2021-11-19 20:33:11 +00:00
arg!([arg] "some opt")
.env("CLP_TEST_ENV_MO")
.action(ArgAction::Set)
.value_delimiter(',')
.num_args(1..),
2017-10-05 17:41:36 +00:00
)
.try_get_matches_from(vec![""]);
2017-10-05 17:41:36 +00:00
2021-12-27 19:57:38 +00:00
assert!(r.is_ok(), "{}", r.unwrap_err());
2017-10-05 17:41:36 +00:00
let m = r.unwrap();
assert!(m.contains_id("arg"));
assert_eq!(
m.get_many::<String>("arg")
.unwrap()
.map(|v| v.as_str())
.collect::<Vec<_>>(),
vec!["env"]
);
2017-10-05 17:41:36 +00:00
}
#[test]
fn multiple_three() {
env::set_var("CLP_TEST_ENV_MULTI1", "env1,env2,env3");
2022-02-12 03:48:29 +00:00
let r = Command::new("df")
2017-10-05 17:41:36 +00:00
.arg(
2021-11-19 20:33:11 +00:00
arg!([arg] "some opt")
2017-10-05 17:41:36 +00:00
.env("CLP_TEST_ENV_MULTI1")
.action(ArgAction::Set)
.value_delimiter(',')
.num_args(1..),
2017-10-05 17:41:36 +00:00
)
.try_get_matches_from(vec![""]);
2017-10-05 17:41:36 +00:00
2021-12-27 19:57:38 +00:00
assert!(r.is_ok(), "{}", r.unwrap_err());
2017-10-05 17:41:36 +00:00
let m = r.unwrap();
assert!(m.contains_id("arg"));
2017-10-05 17:41:36 +00:00
assert_eq!(
m.get_many::<String>("arg")
.unwrap()
.map(|v| v.as_str())
.collect::<Vec<_>>(),
2017-10-05 17:41:36 +00:00
vec!["env1", "env2", "env3"]
);
}
#[test]
fn multiple_no_delimiter() {
env::set_var("CLP_TEST_ENV_MULTI2", "env1 env2 env3");
2022-02-12 03:48:29 +00:00
let r = Command::new("df")
2017-10-05 17:41:36 +00:00
.arg(
2021-11-19 20:33:11 +00:00
arg!([arg] "some opt")
2017-10-05 17:41:36 +00:00
.env("CLP_TEST_ENV_MULTI2")
.action(ArgAction::Set)
.num_args(1..),
2017-10-05 17:41:36 +00:00
)
.try_get_matches_from(vec![""]);
2017-10-05 17:41:36 +00:00
2021-12-27 19:57:38 +00:00
assert!(r.is_ok(), "{}", r.unwrap_err());
2017-10-05 17:41:36 +00:00
let m = r.unwrap();
assert!(m.contains_id("arg"));
2017-10-05 17:41:36 +00:00
assert_eq!(
m.get_many::<String>("arg")
.unwrap()
.map(|v| v.as_str())
.collect::<Vec<_>>(),
2017-10-05 17:41:36 +00:00
vec!["env1 env2 env3"]
);
}
2017-10-05 18:36:50 +00:00
#[test]
fn possible_value() {
env::set_var("CLP_TEST_ENV_PV", "env");
2017-10-05 18:36:50 +00:00
2022-02-12 03:48:29 +00:00
let r = Command::new("df")
2017-10-05 18:36:50 +00:00
.arg(
2021-11-19 20:33:11 +00:00
arg!([arg] "some opt")
.env("CLP_TEST_ENV_PV")
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser(["env"]),
2017-10-05 18:36:50 +00:00
)
.try_get_matches_from(vec![""]);
2017-10-05 18:36:50 +00:00
2021-12-27 19:57:38 +00:00
assert!(r.is_ok(), "{}", r.unwrap_err());
2017-10-05 18:36:50 +00:00
let m = r.unwrap();
assert!(m.contains_id("arg"));
assert_eq!(
m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
"env"
);
2017-10-05 18:36:50 +00:00
}
#[test]
fn not_possible_value() {
env::set_var("CLP_TEST_ENV_NPV", "env");
2017-10-05 18:36:50 +00:00
2022-02-12 03:48:29 +00:00
let r = Command::new("df")
2017-10-05 18:36:50 +00:00
.arg(
2021-11-19 20:33:11 +00:00
arg!([arg] "some opt")
.env("CLP_TEST_ENV_NPV")
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser(["never"]),
2017-10-05 18:36:50 +00:00
)
.try_get_matches_from(vec![""]);
2017-10-05 18:36:50 +00:00
assert!(r.is_err());
}
#[test]
fn value_parser() {
env::set_var("CLP_TEST_ENV_VDOR", "env");
2017-10-05 18:36:50 +00:00
2022-02-12 03:48:29 +00:00
let r = Command::new("df")
2017-10-05 18:36:50 +00:00
.arg(
2021-11-19 20:33:11 +00:00
arg!([arg] "some opt")
.env("CLP_TEST_ENV_VDOR")
.action(ArgAction::Set)
.value_parser(|s: &str| -> Result<String, String> {
2018-01-25 04:05:05 +00:00
if s == "env" {
Ok(s.to_owned())
2018-01-25 04:05:05 +00:00
} else {
Err("not equal".to_owned())
2018-01-25 04:05:05 +00:00
}
2017-10-05 18:36:50 +00:00
}),
)
.try_get_matches_from(vec![""]);
2017-10-05 18:36:50 +00:00
2021-12-27 19:57:38 +00:00
assert!(r.is_ok(), "{}", r.unwrap_err());
2017-10-05 18:36:50 +00:00
let m = r.unwrap();
assert!(m.contains_id("arg"));
assert_eq!(
m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
"env"
);
2017-10-05 18:36:50 +00:00
}
2018-04-05 00:45:22 +00:00
#[test]
fn value_parser_output() {
env::set_var("CLP_TEST_ENV_VO", "42");
2018-04-05 00:45:22 +00:00
2022-02-12 03:48:29 +00:00
let m = Command::new("df")
2018-04-05 00:45:22 +00:00
.arg(
2021-11-19 20:33:11 +00:00
arg!([arg] "some opt")
.env("CLP_TEST_ENV_VO")
.action(ArgAction::Set)
.value_parser(clap::value_parser!(i32)),
2018-11-14 17:05:06 +00:00
)
.try_get_matches_from(vec![""])
.unwrap();
2018-04-05 00:45:22 +00:00
assert_eq!(*m.get_one::<i32>("arg").unwrap(), 42);
2018-04-05 00:45:22 +00:00
}
2017-10-05 18:36:50 +00:00
#[test]
fn value_parser_invalid() {
env::set_var("CLP_TEST_ENV_IV", "env");
2017-10-05 18:36:50 +00:00
2022-02-12 03:48:29 +00:00
let r = Command::new("df")
2017-10-05 18:36:50 +00:00
.arg(
2021-11-19 20:33:11 +00:00
arg!([arg] "some opt")
.env("CLP_TEST_ENV_IV")
.action(ArgAction::Set)
.value_parser(|s: &str| -> Result<String, String> {
2018-01-25 04:05:05 +00:00
if s != "env" {
Ok(s.to_owned())
2018-01-25 04:05:05 +00:00
} else {
Err("is equal".to_string())
}
2017-10-05 18:36:50 +00:00
}),
)
.try_get_matches_from(vec![""]);
2017-10-05 18:36:50 +00:00
assert!(r.is_err());
}