v / vlib / flag / v_flag_parser_style_flags_test.v
123 lines · 115 sloc · 4.0 KB · 625e4df49a9ac494c1cf6107cd9903ae8fb79f2f
Raw
1// Test .v_flag_parser (V flag.FlagParser) parse style
2import flag
3
4const exe_and_v_flag_parser_args = ['/path/to/exe', '--version', '-p', 'ident=val', '--o', '/path/to',
5 '--test', 'abc', '--done', '--pop', 'two', '--live']
6const exe_and_v_flag_parser_args_with_tail = ['/path/to/exe', '--version', '-p', 'ident=val',
7 '--test', 'abc', '--done', '-p', 'two', '--live', 'run', '/path/to', 'platforms;android-21']
8const error_wrong_assignment_flags = ['--o=error']
9
10struct Prefs {
11 version bool @[short: v]
12 is_live bool @[long: live]
13 is_done bool @[long: done]
14 dump_usage bool @[long: 'help'; short: h]
15 test string
16 pop_flags []string @[long: pop; short: p]
17 tail []string @[tail]
18 out string @[only: o]
19 not_mapped string = 'not changed'
20}
21
22fn test_long_v_style() {
23 prefs, _ := flag.to_struct[Prefs](exe_and_v_flag_parser_args, skip: 1, style: .v_flag_parser)!
24 assert prefs.version
25 assert prefs.is_live
26 assert prefs.is_done
27 assert prefs.dump_usage == false
28 assert prefs.test == 'abc'
29 assert prefs.pop_flags.len == 2
30 assert prefs.pop_flags[0] == 'ident=val'
31 assert prefs.pop_flags[1] == 'two'
32 assert prefs.tail.len == 0
33 assert prefs.out == '/path/to'
34 assert prefs.not_mapped == 'not changed'
35}
36
37fn test_long_v_style_no_exe() {
38 prefs, _ := flag.to_struct[Prefs](exe_and_v_flag_parser_args[1..], style: .v_flag_parser)!
39 assert prefs.version
40 assert prefs.is_live
41 assert prefs.is_done
42 assert prefs.dump_usage == false
43 assert prefs.test == 'abc'
44 assert prefs.pop_flags.len == 2
45 assert prefs.pop_flags[0] == 'ident=val'
46 assert prefs.pop_flags[1] == 'two'
47 assert prefs.tail.len == 0
48 assert prefs.out == '/path/to'
49 assert prefs.not_mapped == 'not changed'
50}
51
52fn test_long_v_style_with_tail() {
53 prefs, _ := flag.to_struct[Prefs](exe_and_v_flag_parser_args_with_tail,
54 skip: 1
55 style: .v_flag_parser
56 )!
57 assert prefs.version
58 assert prefs.is_live
59 assert prefs.is_done
60 assert prefs.dump_usage == false
61 assert prefs.test == 'abc'
62 assert prefs.not_mapped == 'not changed'
63 assert prefs.pop_flags.len == 2
64 assert prefs.pop_flags[0] == 'ident=val'
65 assert prefs.pop_flags[1] == 'two'
66 assert prefs.out == ''
67 assert prefs.not_mapped == 'not changed'
68 assert prefs.tail.len == 3
69 assert prefs.tail[0] == 'run'
70 assert prefs.tail[1] == '/path/to'
71 assert prefs.tail[2] == 'platforms;android-21'
72}
73
74fn test_long_v_style_with_tail_no_exe() {
75 prefs, _ := flag.to_struct[Prefs](exe_and_v_flag_parser_args_with_tail[1..],
76 style: .v_flag_parser
77 )!
78 assert prefs.version
79 assert prefs.is_live
80 assert prefs.is_done
81 assert prefs.dump_usage == false
82 assert prefs.test == 'abc'
83 assert prefs.not_mapped == 'not changed'
84 assert prefs.pop_flags.len == 2
85 assert prefs.pop_flags[0] == 'ident=val'
86 assert prefs.pop_flags[1] == 'two'
87 assert prefs.out == ''
88 assert prefs.not_mapped == 'not changed'
89 assert prefs.tail.len == 3
90 assert prefs.tail[0] == 'run'
91 assert prefs.tail[1] == '/path/to'
92 assert prefs.tail[2] == 'platforms;android-21'
93}
94
95fn test_long_v_style_with_exe_and_short_alias() {
96 prefs, _ := flag.to_struct[Prefs](['/path/to/exe', '-h'],
97 skip: 1
98 style: .v_flag_parser
99 )!
100 assert prefs.version == false
101 assert prefs.is_live == false
102 assert prefs.is_done == false
103 assert prefs.dump_usage == true
104 assert prefs.test == ''
105 assert prefs.not_mapped == 'not changed'
106 assert prefs.pop_flags.len == 0
107 assert prefs.out == ''
108 assert prefs.not_mapped == 'not changed'
109 assert prefs.tail.len == 0
110}
111
112fn test_long_v_style_error_message() {
113 if _, _ := flag.to_struct[Prefs](exe_and_v_flag_parser_args[1..], style: .v) {
114 assert false, 'flags should not have reached this assert'
115 } else {
116 assert err.msg() == 'long delimiter `--` encountered in flag `--version` in v (V) style parsing mode. Maybe you meant `.v_flag_parser`?'
117 }
118 if _, _ := flag.to_struct[Prefs](error_wrong_assignment_flags, style: .v_flag_parser) {
119 assert false, 'flags should not have reached this assert'
120 } else {
121 assert err.msg() == '`=` in flag `--o=error` is not supported in V `flag.FlagParser` (long) style parsing mode. Use `--flag value` instead'
122 }
123}
124