1 //! Checks that types like `::std::option::Option` are not special
2 
3 use structopt::StructOpt;
4 
5 #[rustversion::since(1.37)]
6 #[test]
special_types_bool()7 fn special_types_bool() {
8     mod inner {
9         #[allow(non_camel_case_types)]
10         #[derive(PartialEq, Debug)]
11         pub struct bool(pub String);
12 
13         impl std::str::FromStr for self::bool {
14             type Err = String;
15 
16             fn from_str(s: &str) -> Result<Self, Self::Err> {
17                 Ok(self::bool(s.into()))
18             }
19         }
20     };
21 
22     #[derive(StructOpt, PartialEq, Debug)]
23     struct Opt {
24         arg: inner::bool,
25     }
26 
27     assert_eq!(
28         Opt {
29             arg: inner::bool("success".into())
30         },
31         Opt::from_iter(&["test", "success"])
32     );
33 }
34 
35 #[test]
special_types_option()36 fn special_types_option() {
37     fn parser(s: &str) -> Option<String> {
38         Some(s.to_string())
39     }
40 
41     #[derive(StructOpt, PartialEq, Debug)]
42     struct Opt {
43         #[structopt(parse(from_str = parser))]
44         arg: ::std::option::Option<String>,
45     }
46 
47     assert_eq!(
48         Opt {
49             arg: Some("success".into())
50         },
51         Opt::from_iter(&["test", "success"])
52     );
53 }
54 
55 #[test]
special_types_vec()56 fn special_types_vec() {
57     fn parser(s: &str) -> Vec<String> {
58         vec![s.to_string()]
59     }
60 
61     #[derive(StructOpt, PartialEq, Debug)]
62     struct Opt {
63         #[structopt(parse(from_str = parser))]
64         arg: ::std::vec::Vec<String>,
65     }
66 
67     assert_eq!(
68         Opt {
69             arg: vec!["success".into()]
70         },
71         Opt::from_iter(&["test", "success"])
72     );
73 }
74