Skip to content

Commit

Permalink
Add tests/utils.rs
Browse files Browse the repository at this point in the history
  • Loading branch information
CreepySkeleton committed Dec 5, 2019
1 parent 8869d2f commit 405f51c
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 72 deletions.
16 changes: 6 additions & 10 deletions tests/author_version_about.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,18 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

mod utils;

use structopt::StructOpt;
use utils::*;

#[test]
fn no_author_version_about() {
#[derive(StructOpt, PartialEq, Debug)]
#[structopt(name = "foo", no_version)]
struct Opt {}

let mut output = Vec::new();
Opt::clap().write_long_help(&mut output).unwrap();
let output = String::from_utf8(output).unwrap();

let output = get_long_help::<Opt>();
assert!(output.starts_with("foo \n\nUSAGE:"));
}

Expand All @@ -27,9 +27,7 @@ fn use_env() {
#[structopt(author, about)]
struct Opt {}

let mut output = Vec::new();
Opt::clap().write_long_help(&mut output).unwrap();
let output = String::from_utf8(output).unwrap();
let output = get_long_help::<Opt>();
assert!(output.starts_with("structopt 0."));
assert!(output.contains("Guillaume Pinot <texitoi@texitoi.eu>, others"));
assert!(output.contains("Parse command line argument by defining a struct."));
Expand All @@ -43,8 +41,6 @@ fn explicit_version_not_str() {
#[structopt(version = VERSION)]
pub struct Opt {}

let mut output = Vec::new();
Opt::clap().write_long_help(&mut output).unwrap();
let output = String::from_utf8(output).unwrap();
let output = get_long_help::<Opt>();
assert!(output.contains("custom version"));
}
74 changes: 19 additions & 55 deletions tests/doc-comments-help.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,13 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

mod utils;

use structopt::StructOpt;
use utils::*;

#[test]
fn commets_intead_of_actual_help() {
fn doc_comments() {
/// Lorem ipsum
#[derive(StructOpt, PartialEq, Debug)]
struct LoremIpsum {
Expand All @@ -19,12 +22,9 @@ fn commets_intead_of_actual_help() {
foo: bool,
}

let mut output = Vec::new();
LoremIpsum::clap().write_long_help(&mut output).unwrap();
let output = String::from_utf8(output).unwrap();

assert!(output.contains("Lorem ipsum"));
assert!(output.contains("Fooify a bar and a baz"));
let help = get_long_help::<LoremIpsum>();
assert!(help.contains("Lorem ipsum"));
assert!(help.contains("Fooify a bar and a baz"));
}

#[test]
Expand All @@ -38,17 +38,10 @@ fn help_is_better_than_comments() {
foo: bool,
}

let mut output = Vec::new();
LoremIpsum::clap().write_long_help(&mut output).unwrap();
let output = String::from_utf8(output).unwrap();

for line in output.split("\n") {
println!("{:#?}", line);
}

assert!(output.contains("Dolor sit amet"));
assert!(!output.contains("Lorem ipsum"));
assert!(output.contains("DO NOT PASS A BAR"));
let help = get_long_help::<LoremIpsum>();
assert!(help.contains("Dolor sit amet"));
assert!(!help.contains("Lorem ipsum"));
assert!(help.contains("DO NOT PASS A BAR"));
}

#[test]
Expand All @@ -60,16 +53,12 @@ fn empty_line_in_doc_comment_is_double_linefeed() {
#[structopt(name = "lorem-ipsum", no_version)]
struct LoremIpsum {}

let mut output = Vec::new();
LoremIpsum::clap().write_long_help(&mut output).unwrap();
let output = String::from_utf8(output).unwrap();

println!("{}", output);
assert!(output.starts_with("lorem-ipsum \nFoo.\n\nBar\n\nUSAGE:"));
let help = get_long_help::<LoremIpsum>();
assert!(help.starts_with("lorem-ipsum \nFoo.\n\nBar\n\nUSAGE:"));
}

#[test]
fn splits_flag_doc_comment_between_short_and_long() {
fn field_long_doc_comment_both_help_long_help() {
/// Lorem ipsumclap
#[derive(StructOpt, PartialEq, Debug)]
#[structopt(name = "lorem-ipsum", about = "Dolor sit amet")]
Expand All @@ -81,21 +70,8 @@ fn splits_flag_doc_comment_between_short_and_long() {
foo: bool,
}

let mut app = LoremIpsum::clap();

let short_help = {
let mut buffer = Vec::new();
app.write_help(&mut buffer).ok();

String::from_utf8(buffer).unwrap()
};

let long_help = {
let mut buffer = Vec::new();
app.write_long_help(&mut buffer).ok();

String::from_utf8(buffer).unwrap()
};
let short_help = get_help::<LoremIpsum>();
let long_help = get_long_help::<LoremIpsum>();

assert!(short_help.contains("CIRCUMSTANCES"));
assert!(!short_help.contains("CIRCUMSTANCES."));
Expand All @@ -105,7 +81,7 @@ fn splits_flag_doc_comment_between_short_and_long() {
}

#[test]
fn splits_subcommand_doc_comment_between_short_and_long() {
fn top_long_doc_comment_both_help_long_help() {
/// Lorem ipsumclap
#[derive(StructOpt, Debug)]
#[structopt(name = "lorem-ipsum", about = "Dolor sit amet")]
Expand All @@ -125,20 +101,8 @@ fn splits_subcommand_doc_comment_between_short_and_long() {
},
}

let app = LoremIpsum::clap();

let short_help = {
let mut buffer = Vec::new();
app.write_help(&mut buffer).ok();

String::from_utf8(buffer).unwrap()
};

let long_help = {
app.get_matches_from_safe(vec!["test", "foo", "--help"])
.expect_err("")
.message
};
let short_help = get_help::<LoremIpsum>();
let long_help = get_subcommand_long_help::<LoremIpsum>("foo");

assert!(!short_help.contains("Or something else"));
assert!(long_help.contains("DO NOT PASS A BAR UNDER ANY CIRCUMSTANCES"));
Expand Down
8 changes: 4 additions & 4 deletions tests/explicit_name_no_renaming.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
mod utils;

use structopt::StructOpt;
use utils::*;

#[test]
fn explicit_short_long_no_rename() {
Expand All @@ -24,9 +27,6 @@ fn explicit_name_no_rename() {
foo: Vec<String>,
}

let mut output = Vec::new();
Opt::clap().write_long_help(&mut output).unwrap();
let help = String::from_utf8(output).unwrap();

let help = get_long_help::<Opt>();
assert!(help.contains("[.options]..."))
}
7 changes: 4 additions & 3 deletions tests/subcommands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

mod utils;

use structopt::StructOpt;
use utils::*;

#[derive(StructOpt, PartialEq, Debug)]
enum Opt {
Expand Down Expand Up @@ -157,9 +160,7 @@ fn test_tuple_commands() {
Opt4::from_clap(&Opt4::clap().get_matches_from(&["test", "fetch", "origin"]))
);

let mut output = Vec::new();
Opt4::clap().write_long_help(&mut output).unwrap();
let output = String::from_utf8(output).unwrap();
let output = get_long_help::<Opt4>();

assert!(output.contains("download history from remote"));
assert!(output.contains("Add a file"));
Expand Down
45 changes: 45 additions & 0 deletions tests/utils.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#![allow(unused)]

use structopt::StructOpt;

pub fn get_help<T: StructOpt>() -> String {
let mut output = Vec::new();
<T as StructOpt>::clap().write_help(&mut output).unwrap();
let output = String::from_utf8(output).unwrap();

eprintln!("\n%%% HELP %%%:=====\n{}\n=====\n", output);
eprintln!("\n%%% HELP (DEBUG) %%%:=====\n{:?}\n=====\n", output);

output
}

pub fn get_long_help<T: StructOpt>() -> String {
let mut output = Vec::new();
<T as StructOpt>::clap()
.write_long_help(&mut output)
.unwrap();
let output = String::from_utf8(output).unwrap();

eprintln!("\n%%% LONG_HELP %%%:=====\n{}\n=====\n", output);
eprintln!("\n%%% LONG_HELP (DEBUG) %%%:=====\n{:?}\n=====\n", output);

output
}

pub fn get_subcommand_long_help<T: StructOpt>(subcmd: &str) -> String {
let output = <T as StructOpt>::clap()
.get_matches_from_safe(vec!["test", subcmd, "--help"])
.expect_err("")
.message;

eprintln!(
"\n%%% SUBCOMMAND `{}` HELP %%%:=====\n{}\n=====\n",
subcmd, output
);
eprintln!(
"\n%%% SUBCOMMAND `{}` HELP (DEBUG) %%%:=====\n{:?}\n=====\n",
subcmd, output
);

output
}

0 comments on commit 405f51c

Please sign in to comment.