146 lines
2.7 KiB
Rust
146 lines
2.7 KiB
Rust
use structopt::StructOpt;
|
|
|
|
#[test]
|
|
fn generic_struct_flatten() {
|
|
#[derive(StructOpt, PartialEq, Debug)]
|
|
struct Inner {
|
|
pub answer: isize,
|
|
}
|
|
|
|
#[derive(StructOpt, PartialEq, Debug)]
|
|
struct Outer<T: StructOpt> {
|
|
#[structopt(flatten)]
|
|
pub inner: T,
|
|
}
|
|
|
|
assert_eq!(
|
|
Outer {
|
|
inner: Inner { answer: 42 }
|
|
},
|
|
Outer::from_iter(&["--answer", "42"])
|
|
)
|
|
}
|
|
|
|
#[test]
|
|
fn generic_struct_flatten_w_where_clause() {
|
|
#[derive(StructOpt, PartialEq, Debug)]
|
|
struct Inner {
|
|
pub answer: isize,
|
|
}
|
|
|
|
#[derive(StructOpt, PartialEq, Debug)]
|
|
struct Outer<T>
|
|
where
|
|
T: StructOpt,
|
|
{
|
|
#[structopt(flatten)]
|
|
pub inner: T,
|
|
}
|
|
|
|
assert_eq!(
|
|
Outer {
|
|
inner: Inner { answer: 42 }
|
|
},
|
|
Outer::from_iter(&["--answer", "42"])
|
|
)
|
|
}
|
|
|
|
#[test]
|
|
fn generic_enum() {
|
|
#[derive(StructOpt, PartialEq, Debug)]
|
|
struct Inner {
|
|
pub answer: isize,
|
|
}
|
|
|
|
#[derive(StructOpt, PartialEq, Debug)]
|
|
enum GenericEnum<T: StructOpt> {
|
|
Start(T),
|
|
Stop,
|
|
}
|
|
|
|
assert_eq!(
|
|
GenericEnum::Start(Inner { answer: 42 }),
|
|
GenericEnum::from_iter(&["test", "start", "42"])
|
|
)
|
|
}
|
|
|
|
#[test]
|
|
fn generic_enum_w_where_clause() {
|
|
#[derive(StructOpt, PartialEq, Debug)]
|
|
struct Inner {
|
|
pub answer: isize,
|
|
}
|
|
|
|
#[derive(StructOpt, PartialEq, Debug)]
|
|
enum GenericEnum<T>
|
|
where
|
|
T: StructOpt,
|
|
{
|
|
Start(T),
|
|
Stop,
|
|
}
|
|
|
|
assert_eq!(
|
|
GenericEnum::Start(Inner { answer: 42 }),
|
|
GenericEnum::from_iter(&["test", "start", "42"])
|
|
)
|
|
}
|
|
|
|
#[test]
|
|
fn generic_w_fromstr_trait_bound() {
|
|
use std::{fmt, str::FromStr};
|
|
|
|
#[derive(StructOpt, PartialEq, Debug)]
|
|
struct Opt<T>
|
|
where
|
|
T: FromStr,
|
|
<T as FromStr>::Err: fmt::Debug + fmt::Display,
|
|
{
|
|
answer: T,
|
|
}
|
|
|
|
assert_eq!(
|
|
Opt::<isize> { answer: 42 },
|
|
Opt::<isize>::from_iter(&["--answer", "42"])
|
|
)
|
|
}
|
|
|
|
#[test]
|
|
fn generic_wo_trait_bound() {
|
|
use std::time::Duration;
|
|
|
|
#[derive(StructOpt, PartialEq, Debug)]
|
|
struct Opt<T> {
|
|
answer: isize,
|
|
#[structopt(skip)]
|
|
took: Option<T>,
|
|
}
|
|
|
|
assert_eq!(
|
|
Opt::<Duration> {
|
|
answer: 42,
|
|
took: None
|
|
},
|
|
Opt::<Duration>::from_iter(&["--answer", "42"])
|
|
)
|
|
}
|
|
|
|
#[test]
|
|
fn generic_where_clause_w_trailing_comma() {
|
|
use std::{fmt, str::FromStr};
|
|
|
|
#[derive(StructOpt, PartialEq, Debug)]
|
|
struct Opt<T>
|
|
where
|
|
T: FromStr,
|
|
<T as FromStr>::Err: fmt::Debug + fmt::Display,
|
|
{
|
|
pub answer: T,
|
|
}
|
|
|
|
assert_eq!(
|
|
Opt::<isize> { answer: 42 },
|
|
Opt::<isize>::from_iter(&["--answer", "42"])
|
|
)
|
|
}
|