#[macro_use]
extern crate gong;
#[allow(unused_macros)]
#[allow(dead_code)] #[macro_use]
mod common;
use gong::analysis::*;
use gong::options::*;
use common::{Actual, Expected, check_result, MODE_DEFAULT, ABBR_SUP_DEFAULT};
#[test]
fn basic() {
let mut opts = OptionSetEx::new(3, 3);
opts.add_short('h')
.add_short_data('o')
.add_existing_short(gong_shortopt!('a', false))
.add_long("foo")
.add_long_data("bar")
.add_existing_long(gong_longopt!("foobar", false));
let expected = OptionSetEx {
long: vec![
gong_longopt!("foo", false),
gong_longopt!("bar", true),
gong_longopt!("foobar", false),
],
short: vec![
gong_shortopt!('h', false),
gong_shortopt!('o', true),
gong_shortopt!('a', false),
],
mode: MODE_DEFAULT,
allow_abbreviations: ABBR_SUP_DEFAULT,
};
assert_eq!(opts, expected);
assert!(opts.validate().is_ok());
}
#[test]
fn is_empty() {
let opt_set = OptionSet::default();
assert!(opt_set.is_empty());
let opt_set = gong_option_set_fixed!();
assert!(opt_set.is_empty());
let opt_set = gong_option_set_fixed!([], []);
assert!(opt_set.is_empty());
let opt_set = gong_option_set_fixed!([ gong_longopt!("foo", false) ], []);
assert!(!opt_set.is_empty());
let opt_set = gong_option_set_fixed!([], [ gong_shortopt!('h', false) ]);
assert!(!opt_set.is_empty());
let opt_set = gong_option_set_fixed!(
[ gong_longopt!("foo", false) ],
[ gong_shortopt!('h', false) ]
);
assert!(!opt_set.is_empty());
}
#[test]
fn set_types() {
let opts_fixed = OptionSet {
long: &[
gong_longopt!("foo", false),
gong_longopt!("bar", true),
gong_longopt!("foobar", false),
],
short: &[
gong_shortopt!('h', false),
gong_shortopt!('o', true),
gong_shortopt!('a', false),
],
mode: MODE_DEFAULT,
allow_abbreviations: ABBR_SUP_DEFAULT,
};
let opts_extendible = OptionSetEx {
long: vec![
gong_longopt!("foo", false),
gong_longopt!("bar", true),
gong_longopt!("foobar", false),
],
short: vec![
gong_shortopt!('h', false),
gong_shortopt!('o', true),
gong_shortopt!('a', false),
],
mode: MODE_DEFAULT,
allow_abbreviations: ABBR_SUP_DEFAULT,
};
assert_eq!(true, opts_fixed.eq(&opts_extendible));
assert_eq!(true, opts_extendible.eq(&opts_fixed));
let fixed_from_extendible: OptionSet = opts_extendible.as_fixed();
assert_eq!(true, opts_fixed.eq(&fixed_from_extendible));
assert_eq!(true, opts_extendible.eq(&fixed_from_extendible));
assert_eq!(true, fixed_from_extendible.eq(&opts_fixed));
assert_eq!(true, fixed_from_extendible.eq(&opts_extendible));
let extendible_from_fixed: OptionSetEx = opts_fixed.to_extendible();
assert_eq!(true, opts_fixed.eq(&extendible_from_fixed));
assert_eq!(true, opts_extendible.eq(&extendible_from_fixed));
assert_eq!(true, extendible_from_fixed.eq(&opts_fixed));
assert_eq!(true, extendible_from_fixed.eq(&opts_extendible));
let opts_fixed_2 = OptionSet {
long: &[
gong_longopt!("blah", false),
],
short: &[],
mode: MODE_DEFAULT,
allow_abbreviations: ABBR_SUP_DEFAULT,
};
let opts_extendible_2 = OptionSetEx {
long: vec![
gong_longopt!("blah", false),
],
short: vec![],
mode: MODE_DEFAULT,
allow_abbreviations: ABBR_SUP_DEFAULT,
};
assert!(opts_fixed != opts_fixed_2);
assert!(opts_fixed != opts_extendible_2);
assert!(opts_extendible != opts_fixed_2);
assert!(opts_extendible != opts_extendible_2);
}
mod short_dash {
use super::*;
#[test]
#[cfg_attr(debug_assertions, should_panic)]
fn add_short() {
let mut opts = OptionSetEx::new(0, 1);
opts.add_short('-'); }
#[test]
#[cfg_attr(debug_assertions, should_panic)]
fn add_short_data() {
let mut opts = OptionSetEx::new(0, 1);
opts.add_short_data('-'); }
#[test]
fn add_short_existing() {
let mut opts = OptionSetEx::new(0, 1);
opts.add_existing_short(gong_shortopt!('-', false)); }
#[test]
fn invalid_set() {
let opts = gong_option_set_fixed!(
[], [
gong_shortopt!('a'),
gong_shortopt!('-'),
gong_shortopt!('b'),
]
);
assert_eq!(false, opts.is_valid());
assert_eq!(opts.validate(), Err(vec![ OptionFlaw::ShortDash ]));
}
#[test]
fn bypassed_processing() {
let args = arg_list!(
"--abc", "-a-bc", "--", );
let expected = expected!(
error: false,
warn: true,
[
expected_item!(0, UnknownLong, "abc"),
expected_item!(1, UnknownShort, 'a'),
expected_item!(1, Short, '-'),
expected_item!(1, UnknownShort, 'b'),
expected_item!(1, UnknownShort, 'c'),
expected_item!(2, EarlyTerminator),
]
);
let opts = gong_option_set_fixed!([], [ gong_shortopt!('-') ]);
check_result(&Actual(opts.process(&args)), &expected);
}
}
mod long_no_name {
use super::*;
#[test]
#[cfg_attr(debug_assertions, should_panic)]
fn add_long() {
let mut opts = OptionSetEx::new(1, 0);
opts.add_long(""); }
#[test]
#[cfg_attr(debug_assertions, should_panic)]
fn add_long_data() {
let mut opts = OptionSetEx::new(1, 0);
opts.add_long_data(""); }
#[test]
fn add_long_existing() {
let mut opts = OptionSetEx::new(1, 0);
opts.add_existing_long(gong_longopt!("", false)); }
#[test]
fn invalid_set() {
let opts = gong_option_set_fixed!(
[
gong_longopt!("foo"),
gong_longopt!(""),
gong_longopt!("bar"),
], []
);
assert_eq!(false, opts.is_valid());
assert_eq!(opts.validate(), Err(vec![ OptionFlaw::LongEmpty ]));
}
}
mod long_equals {
use super::*;
#[test]
#[cfg_attr(debug_assertions, should_panic)]
fn add_long() {
let mut opts = OptionSetEx::new(1, 0);
opts.add_long("a=b"); }
#[test]
#[cfg_attr(debug_assertions, should_panic)]
fn add_long_data() {
let mut opts = OptionSetEx::new(1, 0);
opts.add_long_data("a=b"); }
#[test]
fn add_long_existing() {
let mut opts = OptionSetEx::new(1, 0);
opts.add_existing_long(gong_longopt!("=", false)); }
#[test]
fn invalid_set() {
let opts = gong_option_set_fixed!(
[
gong_longopt!("foo"),
gong_longopt!("a=b"),
gong_longopt!("bar"),
], []
);
assert_eq!(false, opts.is_valid());
assert_eq!(opts.validate(), Err(vec![ OptionFlaw::LongIncludesEquals("a=b") ]));
}
#[test]
fn bypassed_processing() {
let args = arg_list!(
"--a", "--a=b", );
let expected = expected!(
error: false,
warn: true,
[
expected_item!(0, Long, "a=b"),
expected_item!(1, LongWithUnexpectedData, "a=b", "b"),
]
);
let opts = gong_option_set_fixed!([ gong_longopt!("a=b") ], []);
check_result(&Actual(opts.process(&args)), &expected);
}
}
mod duplicates {
use super::*;
#[test]
fn short() {
let mut opts = OptionSetEx::new(0, 8);
opts.add_short('a')
.add_short('b')
.add_short('c')
.add_short('c') .add_short_data('d')
.add_short_data('b') .add_short('e')
.add_short('b'); assert_eq!(false, opts.is_valid());
assert_eq!(opts.validate(), Err(vec![
OptionFlaw::ShortDup('c'),
OptionFlaw::ShortDup('b'),
]));
}
#[test]
fn long() {
let mut opts = OptionSetEx::new(8, 0);
opts.add_long("aaa")
.add_long("bbb")
.add_long("ccc")
.add_long("ccc") .add_long_data("ddd")
.add_long_data("bbb") .add_long("eee")
.add_long("bbb"); assert_eq!(false, opts.is_valid());
assert_eq!(opts.validate(), Err(vec![
OptionFlaw::LongDup("ccc"),
OptionFlaw::LongDup("bbb"),
]));
}
}