use std::ffi::OsString;
use rstest::*;
use super::*;
use crate::{ExitKind, ProgramExit, constant, helper::*};
mod default_args_parser {
use super::*;
mod try_parse {
use super::*;
mod success {
use super::*;
#[rstest]
#[case("-V")]
#[case("--version")]
#[case("-V rust")]
#[case("rust -V")]
#[case("rust -s foo -V")]
#[case("rust -g bar -V")]
#[case("rust -i bar -V")]
#[case("rust -c bar -V")]
#[case("-aV")]
#[case("rust -l -V")]
fn it_parses_version_cli_option(#[case] cli_args: &str) {
let cli_args = parse_cli_args(cli_args);
let parsed_args = ClapArgsParser::new().try_parse(cli_args);
let actual_error = parsed_args.as_ref().err();
let expected_error = ProgramExit {
message: format!(
"{} {}",
env!("CARGO_PKG_NAME"),
env!("CARGO_PKG_VERSION")
),
exit_status: 0,
styled_message: None,
kind: ExitKind::VersionInfos,
};
let expected_error = Some(&expected_error);
assert!(actual_error.is_some());
assert_eq!(actual_error, expected_error);
}
#[rstest]
#[case("-h")]
#[case("--help")]
#[case("-h rust")]
#[case("rust -h")]
#[case("rust -s foo -h")]
#[case("rust -g bar -h")]
#[case("rust -i bar -h")]
#[case("rust -c bar -h")]
#[case("-aVh")]
#[case("rust -l -h")]
fn it_parses_help_cli_option(#[case] cli_args: &str) {
let cli_args = parse_cli_args(cli_args);
let parsed_args = ClapArgsParser::new().try_parse(cli_args);
let actual_error = parsed_args.as_ref().err();
let expected_error = ProgramExit {
message: get_help_message(),
exit_status: 0,
styled_message: Some(get_ansi_help_message()),
kind: ExitKind::HelpInfos,
};
let expected_error = Some(&expected_error);
assert!(actual_error.is_some());
assert_eq!(actual_error, expected_error);
}
#[rstest]
#[case("-a")]
#[case("--author")]
#[case("-a rust")]
#[case("rust -a")]
#[case("rust -s foo -a")]
#[case("rust -g bar -a")]
#[case("rust -i bar -a")]
#[case("rust -c bar -a")]
#[case("rust -l -a")]
fn it_parses_author_cli_option_preemptively(
#[case] cli_args: &str,
) {
let cli_args = parse_cli_args(cli_args);
let parsed_args = ClapArgsParser::new().try_parse(cli_args);
let actual_error = parsed_args.as_ref().err();
let expected_error = ProgramExit {
message: env!("CARGO_PKG_AUTHORS").to_string(),
exit_status: 0,
styled_message: None,
kind: ExitKind::AuthorInfos,
};
let expected_error = Some(&expected_error);
assert!(actual_error.is_some());
assert_eq!(actual_error, expected_error);
}
#[rstest]
#[case("rust")]
#[case("rust python node")]
fn it_parses_pos_args_without_server_url_cli_option(
#[case] cli_options: &str,
) {
let cli_args = parse_cli_args(cli_options);
let parsed_args = ClapArgsParser::new().try_parse(cli_args);
let actual_result = parsed_args.as_ref().ok();
let expected_result = Args::default()
.with_template_names(make_string_vec(cli_options))
.with_server_url(constant::template_manager::BASE_URL)
.with_generator_uri(
constant::template_manager::GENERATOR_URI,
)
.with_lister_uri(constant::template_manager::LISTER_URI);
let expected_result = Some(&expected_result);
println!("{:?}", parsed_args);
assert!(actual_result.is_some());
assert_eq!(actual_result, expected_result);
}
#[rstest]
#[case("rust -s https://test.com")]
#[case("rust --server-url https://test.com")]
fn it_parses_pos_args_with_server_url_cli_option(
#[case] cli_args: &str,
) {
let cli_args = parse_cli_args(cli_args);
let parsed_args = ClapArgsParser::new().try_parse(cli_args);
let actual_result = parsed_args.as_ref().ok();
let expected_result = Args::default()
.with_template_names(make_string_vec("rust"))
.with_server_url("https://test.com")
.with_generator_uri(
constant::template_manager::GENERATOR_URI,
)
.with_lister_uri(constant::template_manager::LISTER_URI);
let expected_result = Some(&expected_result);
assert!(actual_result.is_some());
assert_eq!(actual_result, expected_result);
}
#[rstest]
#[case("rust -g /test/api")]
#[case("rust --generator-uri /test/api")]
fn it_parses_pos_args_with_generator_uri_cli_option(
#[case] cli_args: &str,
) {
let cli_args = parse_cli_args(cli_args);
let parsed_args = ClapArgsParser::new().try_parse(cli_args);
let actual_result = parsed_args.as_ref().ok();
let expected_result = Args::default()
.with_template_names(make_string_vec("rust"))
.with_server_url(constant::template_manager::BASE_URL)
.with_generator_uri("/test/api")
.with_lister_uri(constant::template_manager::LISTER_URI);
let expected_result = Some(&expected_result);
assert!(actual_result.is_some());
assert_eq!(actual_result, expected_result);
}
#[rstest]
#[case("rust -i /test/api")]
#[case("rust --lister-uri /test/api")]
fn it_parses_pos_args_with_lister_uri_cli_option(
#[case] cli_args: &str,
) {
let cli_args = parse_cli_args(cli_args);
let parsed_args = ClapArgsParser::new().try_parse(cli_args);
let actual_result = parsed_args.as_ref().ok();
let expected_result = Args::default()
.with_template_names(make_string_vec("rust"))
.with_server_url(constant::template_manager::BASE_URL)
.with_generator_uri(
constant::template_manager::GENERATOR_URI,
)
.with_lister_uri("/test/api");
let expected_result = Some(&expected_result);
assert!(actual_result.is_some());
assert_eq!(actual_result, expected_result);
}
#[rstest]
#[case("-l", "")]
#[case("--list", "")]
#[case("rust --list", "rust")]
#[case("rust python --list", "rust python")]
fn it_parses_list_cli_option(
#[case] cli_args: &str,
#[case] template_names: &str,
) {
let cli_args = parse_cli_args(cli_args);
let parsed_args = ClapArgsParser::new().try_parse(cli_args);
let actual_result = parsed_args.as_ref().ok();
let expected_result = Args::default()
.with_template_names(make_string_vec(template_names))
.with_server_url(constant::template_manager::BASE_URL)
.with_generator_uri(
constant::template_manager::GENERATOR_URI,
)
.with_show_list(true)
.with_lister_uri(constant::template_manager::LISTER_URI);
let expected_result = Some(&expected_result);
assert!(actual_result.is_some());
assert_eq!(actual_result, expected_result);
}
#[rstest]
#[case("rust python -c")]
#[case("rust python --check")]
fn it_parses_check_option(#[case] cli_args: &str) {
let cli_args = parse_cli_args(cli_args);
let parsed_args = ClapArgsParser::new().try_parse(cli_args);
let actual_result = parsed_args.as_ref().ok();
let expected_result = Args::default()
.with_template_names(make_string_vec("rust python"))
.with_server_url(constant::template_manager::BASE_URL)
.with_generator_uri(
constant::template_manager::GENERATOR_URI,
)
.with_lister_uri(constant::template_manager::LISTER_URI)
.with_check_template_names(true);
let expected_result = Some(&expected_result);
assert!(actual_result.is_some());
assert_eq!(actual_result, expected_result);
}
}
mod failure {
use super::*;
#[test]
fn it_fails_parsing_when_no_pos_args_given() {
let cli_args = parse_cli_args("");
let parsed_args = ClapArgsParser::new().try_parse(cli_args);
let actual_error = parsed_args.as_ref().err();
let expected_error = ProgramExit {
message: load_expectation_file_as_string(
"no_pos_args_error",
),
exit_status: constant::exit_status::GENERIC,
styled_message: Some(load_expectation_file_as_string(
"ansi_no_pos_args_error",
)),
kind: ExitKind::Error,
};
let expected_error = Some(&expected_error);
assert!(actual_error.is_some());
assert_eq!(actual_error, expected_error);
}
#[test]
fn it_fails_parsing_when_commas_in_pos_args() {
let cli_args = parse_cli_args("python,java");
let parsed_args = ClapArgsParser::new().try_parse(cli_args);
let actual_error = parsed_args.as_ref().err();
let expected_error = ProgramExit {
message: load_expectation_file_as_string(
"comma_pos_args_error",
),
exit_status: constant::exit_status::GENERIC,
styled_message: Some(load_expectation_file_as_string(
"ansi_comma_pos_args_error",
)),
kind: ExitKind::Error,
};
let expected_error = Some(&expected_error);
assert!(actual_error.is_some());
assert_eq!(actual_error, expected_error);
}
#[test]
fn it_fails_parsing_when_whitespaces_in_pos_args() {
let cli_args = vec![
OsString::from(env!("CARGO_PKG_NAME")),
OsString::from("r "),
];
let parsed_args = ClapArgsParser::new().try_parse(cli_args);
let actual_error = parsed_args.as_ref().err();
let expected_error = ProgramExit {
message: load_expectation_file_as_string(
"whitespace_pos_args_error",
),
exit_status: constant::exit_status::GENERIC,
styled_message: Some(load_expectation_file_as_string(
"ansi_whitespace_pos_args_error",
)),
kind: ExitKind::Error,
};
let expected_error = Some(&expected_error);
assert!(actual_error.is_some());
assert_eq!(actual_error, expected_error);
}
#[test]
fn it_fails_parsing_when_commas_and_whitespaces_in_pos_args() {
let cli_args = vec![
OsString::from(env!("CARGO_PKG_NAME")),
OsString::from("r ,"),
];
let parsed_args = ClapArgsParser::new().try_parse(cli_args);
let actual_error = parsed_args.as_ref().err();
let expected_error = ProgramExit {
message: load_expectation_file_as_string(
"comma_whitespace_pos_args_error",
),
exit_status: constant::exit_status::GENERIC,
styled_message: Some(load_expectation_file_as_string(
"ansi_comma_whitespace_pos_args_error",
)),
kind: ExitKind::Error,
};
let expected_error = Some(&expected_error);
assert!(actual_error.is_some());
assert_eq!(actual_error, expected_error);
}
#[test]
fn it_fails_parsing_when_server_url_but_no_pos_args() {
let cli_args = parse_cli_args("-s https://test.com");
let parsed_args = ClapArgsParser::new().try_parse(cli_args);
let actual_error = parsed_args.as_ref().err();
let expected_error = ProgramExit {
message: load_expectation_file_as_string(
"server_url_no_pos_args_error",
),
exit_status: constant::exit_status::GENERIC,
styled_message: Some(load_expectation_file_as_string(
"ansi_server_url_no_pos_args_error",
)),
kind: ExitKind::Error,
};
let expected_error = Some(&expected_error);
assert!(actual_error.is_some());
assert_eq!(actual_error, expected_error);
}
#[test]
fn it_fails_parsing_when_generator_uri_but_no_pos_args() {
let cli_args = parse_cli_args("-g /test/api");
let parsed_args = ClapArgsParser::new().try_parse(cli_args);
let actual_error = parsed_args.as_ref().err();
let expected_error = ProgramExit {
message: load_expectation_file_as_string(
"generator_uri_no_pos_args_error",
),
exit_status: constant::exit_status::GENERIC,
styled_message: Some(load_expectation_file_as_string(
"ansi_generator_uri_no_pos_args_error",
)),
kind: ExitKind::Error,
};
let expected_error = Some(&expected_error);
assert!(actual_error.is_some());
assert_eq!(actual_error, expected_error);
}
#[test]
fn it_fails_parsing_when_lister_uri_but_no_pos_args() {
let cli_args = parse_cli_args("-i /test/api");
let parsed_args = ClapArgsParser::new().try_parse(cli_args);
let actual_error = parsed_args.as_ref().err();
let expected_error = ProgramExit {
message: load_expectation_file_as_string(
"lister_uri_no_pos_args_error",
),
exit_status: constant::exit_status::GENERIC,
styled_message: Some(load_expectation_file_as_string(
"ansi_lister_uri_no_pos_args_error",
)),
kind: ExitKind::Error,
};
let expected_error = Some(&expected_error);
assert!(actual_error.is_some());
assert_eq!(actual_error, expected_error);
}
#[test]
fn it_fails_parsing_when_check_option_but_no_pos_args() {
let cli_args = parse_cli_args("--check");
let parsed_args = ClapArgsParser::new().try_parse(cli_args);
let actual_error = parsed_args.as_ref().err();
let expected_error = ProgramExit {
message: load_expectation_file_as_string(
"check_option_no_pos_args_error",
),
exit_status: constant::exit_status::GENERIC,
styled_message: Some(load_expectation_file_as_string(
"ansi_check_option_no_pos_args_error",
)),
kind: ExitKind::Error,
};
let expected_error = Some(&expected_error);
assert!(actual_error.is_some());
assert_eq!(actual_error, expected_error);
}
#[test]
fn it_fails_parsing_when_inexistent_cli_option() {
let cli_args = parse_cli_args("-x");
let parsed_args = ClapArgsParser::new().try_parse(cli_args);
let actual_error = parsed_args.as_ref().err();
let expected_error = ProgramExit {
message: load_expectation_file_as_string(
"unexpected_argument_error",
),
exit_status: constant::exit_status::GENERIC,
styled_message: Some(load_expectation_file_as_string(
"ansi_unexpected_argument_error",
)),
kind: ExitKind::Error,
};
let expected_error = Some(&expected_error);
assert!(actual_error.is_some());
assert_eq!(actual_error, expected_error);
}
}
}
mod parse {
use super::*;
mod success {
use super::*;
#[test]
fn it_parses_given_cli_options() {
let cli_args = parse_cli_args(
"rust python -s test -g foo -i bar --check --list",
);
let actual_result = ClapArgsParser::new().parse(cli_args);
let expected_result = Args::default()
.with_template_names(make_string_vec("rust python"))
.with_server_url("test")
.with_generator_uri("foo")
.with_lister_uri("bar")
.with_check_template_names(true)
.with_show_list(true);
assert_eq!(actual_result, expected_result);
}
}
}
}