1 // Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>
2 //
3 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
6 // option. This file may not be copied, modified, or distributed
7 // except according to those terms.
8 
9 mod utils;
10 
11 use structopt::StructOpt;
12 use utils::*;
13 
14 #[test]
doc_comments()15 fn doc_comments() {
16     /// Lorem ipsum
17     #[derive(StructOpt, PartialEq, Debug)]
18     struct LoremIpsum {
19         /// Fooify a bar
20         /// and a baz
21         #[structopt(short, long)]
22         foo: bool,
23     }
24 
25     let help = get_long_help::<LoremIpsum>();
26     assert!(help.contains("Lorem ipsum"));
27     assert!(help.contains("Fooify a bar and a baz"));
28 }
29 
30 #[test]
help_is_better_than_comments()31 fn help_is_better_than_comments() {
32     /// Lorem ipsum
33     #[derive(StructOpt, PartialEq, Debug)]
34     #[structopt(name = "lorem-ipsum", about = "Dolor sit amet")]
35     struct LoremIpsum {
36         /// Fooify a bar
37         #[structopt(short, long, help = "DO NOT PASS A BAR UNDER ANY CIRCUMSTANCES")]
38         foo: bool,
39     }
40 
41     let help = get_long_help::<LoremIpsum>();
42     assert!(help.contains("Dolor sit amet"));
43     assert!(!help.contains("Lorem ipsum"));
44     assert!(help.contains("DO NOT PASS A BAR"));
45 }
46 
47 #[test]
empty_line_in_doc_comment_is_double_linefeed()48 fn empty_line_in_doc_comment_is_double_linefeed() {
49     /// Foo.
50     ///
51     /// Bar
52     #[derive(StructOpt, PartialEq, Debug)]
53     #[structopt(name = "lorem-ipsum", no_version)]
54     struct LoremIpsum {}
55 
56     let help = get_long_help::<LoremIpsum>();
57     assert!(help.starts_with("lorem-ipsum \nFoo.\n\nBar\n\nUSAGE:"));
58 }
59 
60 #[test]
field_long_doc_comment_both_help_long_help()61 fn field_long_doc_comment_both_help_long_help() {
62     /// Lorem ipsumclap
63     #[derive(StructOpt, PartialEq, Debug)]
64     #[structopt(name = "lorem-ipsum", about = "Dolor sit amet")]
65     struct LoremIpsum {
66         /// Dot is removed from multiline comments.
67         ///
68         /// Long help
69         #[structopt(long)]
70         foo: bool,
71 
72         /// Dot is removed from one short comment.
73         #[structopt(long)]
74         bar: bool,
75     }
76 
77     let short_help = get_help::<LoremIpsum>();
78     let long_help = get_long_help::<LoremIpsum>();
79 
80     assert!(short_help.contains("Dot is removed from one short comment"));
81     assert!(!short_help.contains("Dot is removed from one short comment."));
82     assert!(short_help.contains("Dot is removed from multiline comments"));
83     assert!(!short_help.contains("Dot is removed from multiline comments."));
84     assert!(long_help.contains("Long help"));
85     assert!(!short_help.contains("Long help"));
86 }
87 
88 #[test]
top_long_doc_comment_both_help_long_help()89 fn top_long_doc_comment_both_help_long_help() {
90     /// Lorem ipsumclap
91     #[derive(StructOpt, Debug)]
92     #[structopt(name = "lorem-ipsum", about = "Dolor sit amet")]
93     struct LoremIpsum {
94         #[structopt(subcommand)]
95         foo: SubCommand,
96     }
97 
98     #[derive(StructOpt, Debug)]
99     pub enum SubCommand {
100         /// DO NOT PASS A BAR UNDER ANY CIRCUMSTANCES
101         ///
102         /// Or something else
103         Foo {
104             #[structopt(help = "foo")]
105             bars: Vec<String>,
106         },
107     }
108 
109     let short_help = get_help::<LoremIpsum>();
110     let long_help = get_subcommand_long_help::<LoremIpsum>("foo");
111 
112     assert!(!short_help.contains("Or something else"));
113     assert!(long_help.contains("DO NOT PASS A BAR UNDER ANY CIRCUMSTANCES"));
114     assert!(long_help.contains("Or something else"));
115 }
116 
117 #[test]
verbatim_doc_comment()118 fn verbatim_doc_comment() {
119     /// DANCE!
120     ///
121     ///                    ()
122     ///                    |
123     ///               (   ()   )
124     ///     ) ________    //  )
125     ///  ()  |\       \  //
126     /// ( \\__ \ ______\//
127     ///    \__) |       |
128     ///      |  |       |
129     ///       \ |       |
130     ///        \|_______|
131     ///        //    \\
132     ///       ((     ||
133     ///        \\    ||
134     ///      ( ()    ||
135     ///       (      () ) )
136     #[derive(StructOpt, Debug)]
137     #[structopt(verbatim_doc_comment)]
138     struct SeeFigure1 {
139         #[structopt(long)]
140         foo: bool,
141     }
142 
143     let help = get_long_help::<SeeFigure1>();
144     let sample = r#"
145                    ()
146                    |
147               (   ()   )
148     ) ________    //  )
149  ()  |\       \  //
150 ( \\__ \ ______\//
151    \__) |       |
152      |  |       |
153       \ |       |
154        \|_______|
155        //    \\
156       ((     ||
157        \\    ||
158      ( ()    ||
159       (      () ) )"#;
160 
161     assert!(help.contains(sample))
162 }
163 
164 #[test]
verbatim_doc_comment_field()165 fn verbatim_doc_comment_field() {
166     #[derive(StructOpt, Debug)]
167     struct App {
168         /// This help ends in a period.
169         #[structopt(long, verbatim_doc_comment)]
170         foo: bool,
171         /// This help does not end in a period.
172         #[structopt(long)]
173         bar: bool,
174     }
175 
176     let help = get_long_help::<App>();
177     let sample = r#"
178         --bar
179             This help does not end in a period
180 
181         --foo
182             This help ends in a period."#;
183 
184     assert!(help.contains(sample))
185 }
186