1use clap::{Arg, ArgAction, Command};
2
3#[test]
4fn indices_mult_opts() {
5    let m = Command::new("ind")
6        .args_override_self(true)
7        .arg(
8            Arg::new("exclude")
9                .short('e')
10                .action(ArgAction::Set)
11                .num_args(1..)
12                .action(ArgAction::Append),
13        )
14        .arg(
15            Arg::new("include")
16                .short('i')
17                .action(ArgAction::Set)
18                .num_args(1..),
19        )
20        .try_get_matches_from(vec!["ind", "-e", "A", "B", "-i", "B", "C", "-e", "C"])
21        .unwrap();
22
23    assert_eq!(
24        m.indices_of("exclude").unwrap().collect::<Vec<_>>(),
25        [2, 3, 8]
26    );
27    assert_eq!(m.indices_of("include").unwrap().collect::<Vec<_>>(), [5, 6]);
28}
29
30#[test]
31fn index_mult_opts() {
32    let m = Command::new("ind")
33        .args_override_self(true)
34        .arg(
35            Arg::new("exclude")
36                .short('e')
37                .action(ArgAction::Set)
38                .num_args(1..)
39                .action(ArgAction::Append),
40        )
41        .arg(
42            Arg::new("include")
43                .short('i')
44                .action(ArgAction::Set)
45                .num_args(1..),
46        )
47        .try_get_matches_from(vec!["ind", "-e", "A", "B", "-i", "B", "C", "-e", "C"])
48        .unwrap();
49
50    assert_eq!(m.index_of("exclude"), Some(2));
51    assert_eq!(m.index_of("include"), Some(5));
52}
53
54#[test]
55fn index_flag() {
56    let m = Command::new("ind")
57        .args_override_self(true)
58        .arg(Arg::new("exclude").short('e').action(ArgAction::SetTrue))
59        .arg(Arg::new("include").short('i').action(ArgAction::SetTrue))
60        .try_get_matches_from(vec!["ind", "-e", "-i"])
61        .unwrap();
62
63    assert_eq!(m.index_of("exclude"), Some(1));
64    assert_eq!(m.index_of("include"), Some(2));
65}
66
67#[test]
68fn index_flags() {
69    let m = Command::new("ind")
70        .args_override_self(true)
71        .arg(Arg::new("exclude").short('e').action(ArgAction::SetTrue))
72        .arg(Arg::new("include").short('i').action(ArgAction::SetTrue))
73        .try_get_matches_from(vec!["ind", "-e", "-i", "-e", "-e", "-i"])
74        .unwrap();
75
76    assert_eq!(m.index_of("exclude"), Some(4));
77    assert_eq!(m.index_of("include"), Some(5));
78}
79
80#[test]
81fn indices_mult_flags() {
82    let m = Command::new("ind")
83        .args_override_self(true)
84        .arg(Arg::new("exclude").short('e').action(ArgAction::SetTrue))
85        .arg(Arg::new("include").short('i').action(ArgAction::SetTrue))
86        .try_get_matches_from(vec!["ind", "-e", "-i", "-e", "-e", "-i"])
87        .unwrap();
88
89    assert_eq!(m.indices_of("exclude").unwrap().collect::<Vec<_>>(), [4]);
90    assert_eq!(m.indices_of("include").unwrap().collect::<Vec<_>>(), [5]);
91}
92
93#[test]
94fn indices_mult_flags_combined() {
95    let m = Command::new("ind")
96        .args_override_self(true)
97        .arg(Arg::new("exclude").short('e').action(ArgAction::SetTrue))
98        .arg(Arg::new("include").short('i').action(ArgAction::SetTrue))
99        .try_get_matches_from(vec!["ind", "-eieei"])
100        .unwrap();
101
102    assert_eq!(m.indices_of("exclude").unwrap().collect::<Vec<_>>(), [4]);
103    assert_eq!(m.indices_of("include").unwrap().collect::<Vec<_>>(), [5]);
104}
105
106#[test]
107fn indices_mult_flags_opt_combined() {
108    let m = Command::new("ind")
109        .args_override_self(true)
110        .arg(Arg::new("exclude").short('e').action(ArgAction::SetTrue))
111        .arg(Arg::new("include").short('i').action(ArgAction::SetTrue))
112        .arg(Arg::new("option").short('o').action(ArgAction::Set))
113        .try_get_matches_from(vec!["ind", "-eieeio", "val"])
114        .unwrap();
115
116    assert_eq!(m.indices_of("exclude").unwrap().collect::<Vec<_>>(), [4]);
117    assert_eq!(m.indices_of("include").unwrap().collect::<Vec<_>>(), [5]);
118    assert_eq!(m.indices_of("option").unwrap().collect::<Vec<_>>(), [7]);
119}
120
121#[test]
122fn indices_mult_flags_opt_combined_eq() {
123    let m = Command::new("ind")
124        .args_override_self(true)
125        .arg(Arg::new("exclude").short('e').action(ArgAction::SetTrue))
126        .arg(Arg::new("include").short('i').action(ArgAction::SetTrue))
127        .arg(Arg::new("option").short('o').action(ArgAction::Set))
128        .try_get_matches_from(vec!["ind", "-eieeio=val"])
129        .unwrap();
130
131    assert_eq!(m.indices_of("exclude").unwrap().collect::<Vec<_>>(), [4]);
132    assert_eq!(m.indices_of("include").unwrap().collect::<Vec<_>>(), [5]);
133    assert_eq!(m.indices_of("option").unwrap().collect::<Vec<_>>(), [7]);
134}
135
136#[test]
137fn indices_mult_opt_value_delim_eq() {
138    let m = Command::new("myapp")
139        .args_override_self(true)
140        .arg(
141            Arg::new("option")
142                .short('o')
143                .action(ArgAction::Set)
144                .value_delimiter(',')
145                .num_args(1..),
146        )
147        .try_get_matches_from(vec!["myapp", "-o=val1,val2,val3"])
148        .unwrap();
149    assert_eq!(
150        m.indices_of("option").unwrap().collect::<Vec<_>>(),
151        [2, 3, 4]
152    );
153}
154
155#[test]
156fn indices_mult_opt_value_no_delim_eq() {
157    let m = Command::new("myapp")
158        .args_override_self(true)
159        .arg(
160            Arg::new("option")
161                .short('o')
162                .action(ArgAction::Set)
163                .num_args(1..),
164        )
165        .try_get_matches_from(vec!["myapp", "-o=val1,val2,val3"])
166        .unwrap();
167    assert_eq!(m.indices_of("option").unwrap().collect::<Vec<_>>(), [2]);
168}
169
170#[test]
171fn indices_mult_opt_mult_flag() {
172    let m = Command::new("myapp")
173        .args_override_self(true)
174        .arg(Arg::new("option").short('o').action(ArgAction::Append))
175        .arg(Arg::new("flag").short('f').action(ArgAction::SetTrue))
176        .try_get_matches_from(vec!["myapp", "-o", "val1", "-f", "-o", "val2", "-f"])
177        .unwrap();
178
179    assert_eq!(m.indices_of("option").unwrap().collect::<Vec<_>>(), [2, 5]);
180    assert_eq!(m.indices_of("flag").unwrap().collect::<Vec<_>>(), [6]);
181}
182