v/vlib/flag/v_flag_parser_style_flags_test.v

124 lines
4.0 KiB
V

// Test .v_flag_parser (V flag.FlagParser) parse style
import flag
const exe_and_v_flag_parser_args = ['/path/to/exe', '--version', '-p', 'ident=val', '--o', '/path/to',
'--test', 'abc', '--done', '--pop', 'two', '--live']
const exe_and_v_flag_parser_args_with_tail = ['/path/to/exe', '--version', '-p', 'ident=val',
'--test', 'abc', '--done', '-p', 'two', '--live', 'run', '/path/to', 'platforms;android-21']
const error_wrong_assignment_flags = ['--o=error']
struct Prefs {
version bool @[short: v]
is_live bool @[long: live]
is_done bool @[long: done]
dump_usage bool @[long: 'help'; short: h]
test string
pop_flags []string @[long: pop; short: p]
tail []string @[tail]
out string @[only: o]
not_mapped string = 'not changed'
}
fn test_long_v_style() {
prefs, _ := flag.to_struct[Prefs](exe_and_v_flag_parser_args, skip: 1, style: .v_flag_parser)!
assert prefs.version
assert prefs.is_live
assert prefs.is_done
assert prefs.dump_usage == false
assert prefs.test == 'abc'
assert prefs.pop_flags.len == 2
assert prefs.pop_flags[0] == 'ident=val'
assert prefs.pop_flags[1] == 'two'
assert prefs.tail.len == 0
assert prefs.out == '/path/to'
assert prefs.not_mapped == 'not changed'
}
fn test_long_v_style_no_exe() {
prefs, _ := flag.to_struct[Prefs](exe_and_v_flag_parser_args[1..], style: .v_flag_parser)!
assert prefs.version
assert prefs.is_live
assert prefs.is_done
assert prefs.dump_usage == false
assert prefs.test == 'abc'
assert prefs.pop_flags.len == 2
assert prefs.pop_flags[0] == 'ident=val'
assert prefs.pop_flags[1] == 'two'
assert prefs.tail.len == 0
assert prefs.out == '/path/to'
assert prefs.not_mapped == 'not changed'
}
fn test_long_v_style_with_tail() {
prefs, _ := flag.to_struct[Prefs](exe_and_v_flag_parser_args_with_tail,
skip: 1
style: .v_flag_parser
)!
assert prefs.version
assert prefs.is_live
assert prefs.is_done
assert prefs.dump_usage == false
assert prefs.test == 'abc'
assert prefs.not_mapped == 'not changed'
assert prefs.pop_flags.len == 2
assert prefs.pop_flags[0] == 'ident=val'
assert prefs.pop_flags[1] == 'two'
assert prefs.out == ''
assert prefs.not_mapped == 'not changed'
assert prefs.tail.len == 3
assert prefs.tail[0] == 'run'
assert prefs.tail[1] == '/path/to'
assert prefs.tail[2] == 'platforms;android-21'
}
fn test_long_v_style_with_tail_no_exe() {
prefs, _ := flag.to_struct[Prefs](exe_and_v_flag_parser_args_with_tail[1..],
style: .v_flag_parser
)!
assert prefs.version
assert prefs.is_live
assert prefs.is_done
assert prefs.dump_usage == false
assert prefs.test == 'abc'
assert prefs.not_mapped == 'not changed'
assert prefs.pop_flags.len == 2
assert prefs.pop_flags[0] == 'ident=val'
assert prefs.pop_flags[1] == 'two'
assert prefs.out == ''
assert prefs.not_mapped == 'not changed'
assert prefs.tail.len == 3
assert prefs.tail[0] == 'run'
assert prefs.tail[1] == '/path/to'
assert prefs.tail[2] == 'platforms;android-21'
}
fn test_long_v_style_with_exe_and_short_alias() {
prefs, _ := flag.to_struct[Prefs](['/path/to/exe', '-h'],
skip: 1
style: .v_flag_parser
)!
assert prefs.version == false
assert prefs.is_live == false
assert prefs.is_done == false
assert prefs.dump_usage == true
assert prefs.test == ''
assert prefs.not_mapped == 'not changed'
assert prefs.pop_flags.len == 0
assert prefs.out == ''
assert prefs.not_mapped == 'not changed'
assert prefs.tail.len == 0
}
fn test_long_v_style_error_message() {
if _, _ := flag.to_struct[Prefs](exe_and_v_flag_parser_args[1..], style: .v) {
assert false, 'flags should not have reached this assert'
} else {
assert err.msg() == 'long delimiter `--` encountered in flag `--version` in v (V) style parsing mode. Maybe you meant `.v_flag_parser`?'
}
if _, _ := flag.to_struct[Prefs](error_wrong_assignment_flags, style: .v_flag_parser) {
assert false, 'flags should not have reached this assert'
} else {
assert err.msg() == '`=` in flag `--o=error` is not supported in V `flag.FlagParser` (long) style parsing mode. Use `--flag value` instead'
}
}