#[macro_use]
extern crate gong;
#[allow(unused_macros)]
#[allow(dead_code)] #[macro_use]
mod common;
use gong::analysis::*;
use gong::options::*;
use common::{get_base, Actual, Expected, check_result};
#[test]
fn arg_list_owned_set() {
let args: Vec<String> = vec![ String::from("--foo"), String::from("--bah") ];
let _ = get_base().process(&args);
let args: Vec<&str> = vec![ "--foo", "--bah" ];
let _ = get_base().process(&args);
}
#[test]
fn basic() {
let args = arg_list!(
"abc", "-", "z", "--help", "--xxx", "---yy", "version", "-bxs", "ghi", "-a-", "-h-", "--", "--foo", "jkl", );
let expected = expected!(
error: false,
warn: true,
[
expected_item!(0, NonOption, "abc"),
expected_item!(1, NonOption, "-"),
expected_item!(2, NonOption, "z"),
expected_item!(3, Long, "help"),
expected_item!(4, UnknownLong, "xxx"),
expected_item!(5, UnknownLong, "-yy"),
expected_item!(6, NonOption, "version"),
expected_item!(7, UnknownShort, 'b'),
expected_item!(7, Short, 'x'),
expected_item!(7, UnknownShort, 's'),
expected_item!(8, NonOption, "ghi"),
expected_item!(9, UnknownShort, 'a'),
expected_item!(9, UnknownShort, '-'),
expected_item!(10, Short, 'h'),
expected_item!(10, UnknownShort, '-'),
expected_item!(11, EarlyTerminator),
expected_item!(12, NonOption, "--foo"),
expected_item!(13, NonOption, "jkl"),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn case_sensitivity() {
let args = arg_list!("--Foo", "-O");
let expected = expected!(
error: false,
warn: true,
[
expected_item!(0, UnknownLong, "Foo"),
expected_item!(1, UnknownShort, 'O'),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn early_term() {
let args = arg_list!(
"--foo", "--", "--help", "--", "-o", "--foo", "blah", "--bb", "-h", "--hah", "--hah=", "--", "--hah=a", "-oa", "-b",
);
let expected = expected!(
error: false,
warn: false,
[
expected_item!(0, Long, "foo"),
expected_item!(1, EarlyTerminator),
expected_item!(2, NonOption, "--help"),
expected_item!(3, NonOption, "--"),
expected_item!(4, NonOption, "-o"),
expected_item!(5, NonOption, "--foo"),
expected_item!(6, NonOption, "blah"),
expected_item!(7, NonOption, "--bb"),
expected_item!(8, NonOption, "-h"),
expected_item!(9, NonOption, "--hah"),
expected_item!(10, NonOption, "--hah="),
expected_item!(11, NonOption, "--"),
expected_item!(12, NonOption, "--hah=a"),
expected_item!(13, NonOption, "-oa"),
expected_item!(14, NonOption, "-b"),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn long_no_name() {
let args = arg_list!("--=a", "--=");
let expected = expected!(
error: false,
warn: true,
[
expected_item!(0, LongWithNoName),
expected_item!(1, LongWithNoName),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn repetition() {
let args = arg_list!("--foo", "-h", "--version", "-h", "-x", "--blah", "--version", "-hhh");
let expected = expected!(
error: false,
warn: true,
[
expected_item!(0, Long, "foo"),
expected_item!(1, Short, 'h'),
expected_item!(2, Long, "version"),
expected_item!(3, Short, 'h'),
expected_item!(4, Short, 'x'),
expected_item!(5, UnknownLong, "blah"),
expected_item!(6, Long, "version"),
expected_item!(7, Short, 'h'),
expected_item!(7, Short, 'h'),
expected_item!(7, Short, 'h'),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
mod utf8 {
use super::*;
#[test]
fn test1() {
let args = arg_list!("🗻∈🌏", "-🗻∈🌏", "--🗻∈🌏", "--ƒoo", "-❤");
let expected = expected!(
error: false,
warn: true,
[
expected_item!(0, NonOption, "🗻∈🌏"),
expected_item!(1, UnknownShort, '🗻'),
expected_item!(1, UnknownShort, '∈'),
expected_item!(1, UnknownShort, '🌏'),
expected_item!(2, UnknownLong, "🗻∈🌏"),
expected_item!(3, UnknownLong, "ƒoo"),
expected_item!(4, Short, '❤'), ]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn test2() {
let args = arg_list!("y̆", "-y̆", "--y̆", "ëéy̆", "-ëéy̆", "--ëéy̆", "--ábc", "--ábc");
let expected = expected!(
error: false,
warn: true,
[
expected_item!(0, NonOption, "y̆"),
expected_item!(1, UnknownShort, 'y'), expected_item!(1, UnknownShort, '\u{0306}'), expected_item!(2, UnknownLong, "y̆"),
expected_item!(3, NonOption, "ëéy̆"),
expected_item!(4, UnknownShort, 'ë'), expected_item!(4, UnknownShort, 'e'), expected_item!(4, UnknownShort, '\u{0301}'), expected_item!(4, UnknownShort, 'y'), expected_item!(4, UnknownShort, '\u{0306}'), expected_item!(5, UnknownLong, "ëéy̆"),
expected_item!(6, UnknownLong, "ábc"), expected_item!(7, Long, "ábc"), ]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn test3() {
let args = arg_list!("❤️", "-❤️", "--❤️");
let expected = expected!(
error: false,
warn: true,
[
expected_item!(0, NonOption, "❤️"),
expected_item!(1, Short, '\u{2764}'), expected_item!(1, UnknownShort, '\u{fe0f}'), expected_item!(2, UnknownLong, "❤️"),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn test4() {
let args = arg_list!("\u{0306}", "-\u{0306}", "--\u{0306}", "-\u{030a}");
let expected = expected!(
error: false,
warn: true,
[
expected_item!(0, NonOption, "\u{0306}"),
expected_item!(1, UnknownShort, '\u{0306}'),
expected_item!(2, UnknownLong, "\u{0306}"),
expected_item!(3, Short, '\u{030a}'),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
}
mod abbreviations {
use super::*;
#[test]
fn ambiguous() {
let args = arg_list!(
"--f", "--fo", );
let expected = expected!(
error: true,
warn: false,
[
expected_item!(0, AmbiguousLong, "f"),
expected_item!(1, AmbiguousLong, "fo"),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn unambiguous() {
let args = arg_list!(
"--foo", "--foob", "--fooba", "--foobar", );
let expected = expected!(
error: false,
warn: false,
[
expected_item!(0, Long, "foo"),
expected_item!(1, Long, "foobar"),
expected_item!(2, Long, "foobar"),
expected_item!(3, Long, "foobar"),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn disabled() {
let args = arg_list!("--f", "--fo", "--foo", "--foob", "--fooba", "--foobar");
let expected = expected!(
error: false,
warn: true,
[
expected_item!(0, UnknownLong, "f"),
expected_item!(1, UnknownLong, "fo"),
expected_item!(2, Long, "foo"),
expected_item!(3, UnknownLong, "foob"),
expected_item!(4, UnknownLong, "fooba"),
expected_item!(5, Long, "foobar"),
]
);
let mut opts = get_base().clone();
opts.set_allow_abbreviations(false);
check_result(&Actual(opts.process(&args)), &expected);
}
#[test]
fn exact_override() {
let args = arg_list!("--foo");
let expected = expected!(
error: false,
warn: false,
[
expected_item!(0, Long, "foo"),
]
);
let opts = gong_option_set_fixed!(
[
gong_longopt!("fooo"),
gong_longopt!("foooo"),
gong_longopt!("fooooo"),
gong_longopt!("foo"), ],
[]
);
check_result(&Actual(opts.process(&args)), &expected);
}
}
mod data {
use super::*;
#[test]
fn arg_placement_long() {
let args = arg_list!(
"--hah", "def", "--help", "--hah=def", "--help", );
let expected = expected!(
error: false,
warn: false,
[
expected_item!(0, LongWithData, "hah", "def", DataLocation::NextArg),
expected_item!(2, Long, "help"),
expected_item!(3, LongWithData, "hah", "def", DataLocation::SameArg),
expected_item!(4, Long, "help"),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn arg_placement_short_calc() {
let args = arg_list!("-oa", "g");
let expected = expected!(
error: false,
warn: false,
[
expected_item!(0, ShortWithData, 'o', "a", DataLocation::SameArg),
expected_item!(1, NonOption, "g"),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn arg_placement_short_next() {
let args = arg_list!(
"-o", "def", "-bo", "def", "-bxo", "def", "-xao", "def", );
let expected = expected!(
error: false,
warn: true,
[
expected_item!(0, ShortWithData, 'o', "def", DataLocation::NextArg),
expected_item!(2, UnknownShort, 'b'),
expected_item!(2, ShortWithData, 'o', "def", DataLocation::NextArg),
expected_item!(4, UnknownShort, 'b'),
expected_item!(4, Short, 'x'),
expected_item!(4, ShortWithData, 'o', "def", DataLocation::NextArg),
expected_item!(6, Short, 'x'),
expected_item!(6, UnknownShort, 'a'),
expected_item!(6, ShortWithData, 'o', "def", DataLocation::NextArg),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn arg_placement_short_same() {
let args = arg_list!(
"-oa", "-oabc", "-aob", "-aobcd",
"-abcod",
"-abcodef",
"-xoabc",
"-oaxc",
"-oxbc",
"-oabx",
);
let expected = expected!(
error: false,
warn: true,
[
expected_item!(0, ShortWithData, 'o', "a", DataLocation::SameArg),
expected_item!(1, ShortWithData, 'o', "abc", DataLocation::SameArg),
expected_item!(2, UnknownShort, 'a'),
expected_item!(2, ShortWithData, 'o', "b", DataLocation::SameArg),
expected_item!(3, UnknownShort, 'a'),
expected_item!(3, ShortWithData, 'o', "bcd", DataLocation::SameArg),
expected_item!(4, UnknownShort, 'a'),
expected_item!(4, UnknownShort, 'b'),
expected_item!(4, UnknownShort, 'c'),
expected_item!(4, ShortWithData, 'o', "d", DataLocation::SameArg),
expected_item!(5, UnknownShort, 'a'),
expected_item!(5, UnknownShort, 'b'),
expected_item!(5, UnknownShort, 'c'),
expected_item!(5, ShortWithData, 'o', "def", DataLocation::SameArg),
expected_item!(6, Short, 'x'),
expected_item!(6, ShortWithData, 'o', "abc", DataLocation::SameArg),
expected_item!(7, ShortWithData, 'o', "axc", DataLocation::SameArg),
expected_item!(8, ShortWithData, 'o', "xbc", DataLocation::SameArg),
expected_item!(9, ShortWithData, 'o', "abx", DataLocation::SameArg),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn missing_long() {
let args = arg_list!("--hah");
let expected = expected!(
error: true,
warn: false,
[
expected_item!(0, LongMissingData, "hah"),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn missing_short() {
let args = arg_list!("-bxso");
let expected = expected!(
error: true,
warn: true,
[
expected_item!(0, UnknownShort, 'b'),
expected_item!(0, Short, 'x'),
expected_item!(0, UnknownShort, 's'),
expected_item!(0, ShortMissingData, 'o'),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn misc() {
let args = arg_list!(
"--xx=yy", "--tt=", "-x", "--foo=bar", "--foo=", "-x", "-=", "-a=b", "-o=b", );
let expected = expected!(
error: false,
warn: true,
[
expected_item!(0, UnknownLong, "xx"),
expected_item!(1, UnknownLong, "tt"),
expected_item!(2, Short, 'x'),
expected_item!(3, LongWithUnexpectedData, "foo", "bar"),
expected_item!(4, Long, "foo"),
expected_item!(5, Short, 'x'),
expected_item!(6, UnknownShort, '='),
expected_item!(7, UnknownShort, 'a'),
expected_item!(7, UnknownShort, '='),
expected_item!(7, UnknownShort, 'b'),
expected_item!(8, ShortWithData, 'o', "=b", DataLocation::SameArg),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn repetition() {
let args = arg_list!("--hah=a", "-o", "s", "--hah=b", "-obc");
let expected = expected!(
error: false,
warn: false,
[
expected_item!(0, LongWithData, "hah", "a", DataLocation::SameArg),
expected_item!(1, ShortWithData, 'o', "s", DataLocation::NextArg),
expected_item!(3, LongWithData, "hah", "b", DataLocation::SameArg),
expected_item!(4, ShortWithData, 'o', "bc", DataLocation::SameArg),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn same_arg_empty() {
let args = arg_list!(
"--hah=", "--help", "--hah=", "help", );
let expected = expected!(
error: false,
warn: false,
[
expected_item!(0, LongWithData, "hah", "", DataLocation::SameArg),
expected_item!(1, Long, "help"),
expected_item!(2, LongWithData, "hah", "", DataLocation::SameArg),
expected_item!(3, NonOption, "help"),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn containing_equals() {
let args = arg_list!(
"--hah", "d=ef", "--hah", "=", "--hah=d=ef", "--hah==ef", "--help", "--blah=ggg", "-oa=b", "-o=", "-o===o", );
let expected = expected!(
error: false,
warn: true,
[
expected_item!(0, LongWithData, "hah", "d=ef", DataLocation::NextArg),
expected_item!(2, LongWithData, "hah", "=", DataLocation::NextArg),
expected_item!(4, LongWithData, "hah", "d=ef", DataLocation::SameArg),
expected_item!(5, LongWithData, "hah", "=ef", DataLocation::SameArg),
expected_item!(6, Long, "help"),
expected_item!(7, UnknownLong, "blah"),
expected_item!(8, ShortWithData, 'o', "a=b", DataLocation::SameArg),
expected_item!(9, ShortWithData, 'o', "=", DataLocation::SameArg),
expected_item!(10, ShortWithData, 'o', "===o", DataLocation::SameArg),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn looking_like_options() {
let args = arg_list!(
"--hah=--foo", "--hah", "--foo", "--hah=--blah", "--hah", "--blah", "--hah=-h", "--hah", "-h", "--hah=-n", "--hah", "-n", "-o-h", "-o", "-h", "-o-n", "-o", "-n", "-o--foo", "-o", "--hah", "-o--blah", "-o", "--blah", );
let expected = expected!(
error: false,
warn: false,
[
expected_item!(0, LongWithData, "hah", "--foo", DataLocation::SameArg),
expected_item!(1, LongWithData, "hah", "--foo", DataLocation::NextArg),
expected_item!(3, LongWithData, "hah", "--blah", DataLocation::SameArg),
expected_item!(4, LongWithData, "hah", "--blah", DataLocation::NextArg),
expected_item!(6, LongWithData, "hah", "-h", DataLocation::SameArg),
expected_item!(7, LongWithData, "hah", "-h", DataLocation::NextArg),
expected_item!(9, LongWithData, "hah", "-n", DataLocation::SameArg),
expected_item!(10, LongWithData, "hah", "-n", DataLocation::NextArg),
expected_item!(12, ShortWithData, 'o', "-h", DataLocation::SameArg),
expected_item!(13, ShortWithData, 'o', "-h", DataLocation::NextArg),
expected_item!(15, ShortWithData, 'o', "-n", DataLocation::SameArg),
expected_item!(16, ShortWithData, 'o', "-n", DataLocation::NextArg),
expected_item!(18, ShortWithData, 'o', "--foo", DataLocation::SameArg),
expected_item!(19, ShortWithData, 'o', "--hah", DataLocation::NextArg),
expected_item!(21, ShortWithData, 'o', "--blah", DataLocation::SameArg),
expected_item!(22, ShortWithData, 'o', "--blah", DataLocation::NextArg),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn looking_like_early_term() {
let args = arg_list!(
"--hah=--", "--hah", "--", "-o", "--", "-o--", );
let expected = expected!(
error: false,
warn: false,
[
expected_item!(0, LongWithData, "hah", "--", DataLocation::SameArg),
expected_item!(1, LongWithData, "hah", "--", DataLocation::NextArg),
expected_item!(3, ShortWithData, 'o', "--", DataLocation::NextArg),
expected_item!(5, ShortWithData, 'o', "--", DataLocation::SameArg),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn multibyte_long() {
let args = arg_list!("--ƒƒ", "abc", "--ƒƒ=", "--ƒƒ=abc", "--ƒƒ=❤️", "--ƒƒ");
let expected = expected!(
error: true,
warn: false,
[
expected_item!(0, LongWithData, "ƒƒ", "abc", DataLocation::NextArg),
expected_item!(2, LongWithData, "ƒƒ", "", DataLocation::SameArg),
expected_item!(3, LongWithData, "ƒƒ", "abc", DataLocation::SameArg),
expected_item!(4, LongWithData, "ƒƒ", "❤️", DataLocation::SameArg),
expected_item!(5, LongMissingData, "ƒƒ"),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn multibyte_short() {
let args = arg_list!(
"-o", "❤", "-Ɛ", "❤", "-o❤", "-❤oa", "-❤o❤", "-❤o❤Ɛ", "-Ɛa", "-Ɛ❤", "-❤Ɛa", "-❤Ɛ❤", "-❤Ɛa❤", "-x❤Ɛb❤",
);
let expected = expected!(
error: false,
warn: false,
[
expected_item!(0, ShortWithData, 'o', "❤", DataLocation::NextArg),
expected_item!(2, ShortWithData, 'Ɛ', "❤", DataLocation::NextArg),
expected_item!(4, ShortWithData, 'o', "❤", DataLocation::SameArg),
expected_item!(5, Short, '❤'),
expected_item!(5, ShortWithData, 'o', "a", DataLocation::SameArg),
expected_item!(6, Short, '❤'),
expected_item!(6, ShortWithData, 'o', "❤", DataLocation::SameArg),
expected_item!(7, Short, '❤'),
expected_item!(7, ShortWithData, 'o', "❤Ɛ", DataLocation::SameArg),
expected_item!(8, ShortWithData, 'Ɛ', "a", DataLocation::SameArg),
expected_item!(9, ShortWithData, 'Ɛ', "❤", DataLocation::SameArg),
expected_item!(10, Short, '❤'),
expected_item!(10, ShortWithData, 'Ɛ', "a", DataLocation::SameArg),
expected_item!(11, Short, '❤'),
expected_item!(11, ShortWithData, 'Ɛ', "❤", DataLocation::SameArg),
expected_item!(12, Short, '❤'),
expected_item!(12, ShortWithData, 'Ɛ', "a❤", DataLocation::SameArg),
expected_item!(13, Short, 'x'),
expected_item!(13, Short, '❤'),
expected_item!(13, ShortWithData, 'Ɛ', "b❤", DataLocation::SameArg),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
#[test]
fn multibyte_utf8combi_short() {
let args = arg_list!(
"-❤\u{fe0f}oa",
"-❤o\u{030a}a",
"-❤oa\u{030a}",
"-❤\u{fe0f}o\u{030a}a",
"-\u{030a}❤oa",
"-x❤\u{fe0f}Ɛ\u{030a}b❤",
"-x\u{030a}❤\u{fe0f}Ɛ\u{030a}b❤\u{fe0f}",
);
let expected = expected!(
error: false,
warn: true,
[
expected_item!(0, Short, '❤'),
expected_item!(0, UnknownShort, '\u{fe0f}'),
expected_item!(0, ShortWithData, 'o', "a", DataLocation::SameArg),
expected_item!(1, Short, '❤'),
expected_item!(1, ShortWithData, 'o', "\u{030a}a", DataLocation::SameArg),
expected_item!(2, Short, '❤'),
expected_item!(2, ShortWithData, 'o', "a\u{030a}", DataLocation::SameArg),
expected_item!(3, Short, '❤'),
expected_item!(3, UnknownShort, '\u{fe0f}'),
expected_item!(3, ShortWithData, 'o', "\u{030a}a", DataLocation::SameArg),
expected_item!(4, Short, '\u{030a}'),
expected_item!(4, Short, '❤'),
expected_item!(4, ShortWithData, 'o', "a", DataLocation::SameArg),
expected_item!(5, Short, 'x'),
expected_item!(5, Short, '❤'),
expected_item!(5, UnknownShort, '\u{fe0f}'),
expected_item!(5, ShortWithData, 'Ɛ', "\u{030a}b❤", DataLocation::SameArg),
expected_item!(6, Short, 'x'),
expected_item!(6, Short, '\u{030a}'),
expected_item!(6, Short, '❤'),
expected_item!(6, UnknownShort, '\u{fe0f}'),
expected_item!(6, ShortWithData, 'Ɛ', "\u{030a}b❤\u{fe0f}", DataLocation::SameArg),
]
);
check_result(&Actual(get_base().process(&args)), &expected);
}
}
mod alt_mode {
use super::*;
#[test]
fn basic() {
let args = arg_list!(
"abc", "-", "-help", "-hah=abc", "-hah", "cba", "-hah=", "-=", "-=abc", "-bxs", "--foo", "-f", "-foo", "-foob", "-❤", "--", "-help", );
let expected = expected!(
error: true,
warn: true,
[
expected_item!(0, NonOption, "abc"),
expected_item!(1, NonOption, "-"),
expected_item!(2, Long, "help"),
expected_item!(3, LongWithData, "hah", "abc", DataLocation::SameArg),
expected_item!(4, LongWithData, "hah", "cba", DataLocation::NextArg),
expected_item!(6, LongWithData, "hah", "", DataLocation::SameArg),
expected_item!(7, LongWithNoName),
expected_item!(8, LongWithNoName),
expected_item!(9, UnknownLong, "bxs"),
expected_item!(10, UnknownLong, "-foo"),
expected_item!(11, AmbiguousLong, "f"),
expected_item!(12, Long, "foo"),
expected_item!(13, Long, "foobar"),
expected_item!(14, UnknownLong, "❤"),
expected_item!(15, EarlyTerminator),
expected_item!(16, NonOption, "-help"),
]
);
let mut opts = get_base().clone();
opts.set_mode(OptionsMode::Alternate);
check_result(&Actual(opts.process(&args)), &expected);
}
#[test]
fn data_basic() {
let args = arg_list!(
"-foo=abc", "-foo=", "-hah", );
let expected = expected!(
error: true,
warn: true,
[
expected_item!(0, LongWithUnexpectedData, "foo", "abc"),
expected_item!(1, Long, "foo"),
expected_item!(2, LongMissingData, "hah"),
]
);
let mut opts = get_base().clone();
opts.set_mode(OptionsMode::Alternate);
check_result(&Actual(opts.process(&args)), &expected);
}
#[test]
fn data_looking_like_early_term() {
let args = arg_list!(
"-hah=--", "-hah", "--", );
let expected = expected!(
error: false,
warn: false,
[
expected_item!(0, LongWithData, "hah", "--", DataLocation::SameArg),
expected_item!(1, LongWithData, "hah", "--", DataLocation::NextArg),
]
);
let mut opts = get_base().clone();
opts.set_mode(OptionsMode::Alternate);
check_result(&Actual(opts.process(&args)), &expected);
}
}