History

more varied range testing (#427)

Sebastian Thiel committed 4 years ago

Commit bb0a5541 parent 2e498312 files · +50 −12Browse files

Unified · Split

2 files
  1. git-revision/src/spec.rs +10 −10
  2. git-revision/tests/spec/parse.rs +40 −2
git-revision/src/spec.rs+10−10
@@ -68,20 +68,20 @@ pub mod parse { · 67 unmodified lines
6868 let mut cursor = input;
6969 let mut sep_pos = None;
7070 let mut consecutive_hex_chars = Some(0);
71− while let Some((pos, b)) = cursor
72− .iter()
73− .inspect(|b| {
74− if let Some(pos) = consecutive_hex_chars.as_mut() {
71+ while let Some((pos, b)) = cursor.iter().enumerate().find(|(_, b)| {
72+ if b"@~^:.".contains(b) {
73+ true
74+ } else {
75+ if let Some(num) = consecutive_hex_chars.as_mut() {
7576 if b.is_ascii_hexdigit() {
76− *pos += 1;
77+ *num += 1;
7778 } else {
7879 consecutive_hex_chars = None;
7980 }
8081 }
81− })
82− .enumerate()
83− .find(|(_, b)| b"@~^:.".contains(b))
84− {
82+ false
83+ }
84+ }) {
8585 if *b != b'.' || cursor.get(pos + 1) == Some(&b'.') {
8686 sep_pos = Some(pos);
8787 break;
@@ -101,7 +101,7 @@ pub mod parse { · 13 unmodified lines
101101 .and_then(|prefix| delegate.set_prefix(prefix))
102102 })
103103 .flatten()
104− .or_else(|| delegate.set_ref(name))
104+ .or_else(|| name.is_empty().then(|| ()).or_else(|| delegate.set_ref(name)))
105105 .ok_or(Error::Delegate)?;
106106 }
107107
git-revision/tests/spec/parse.rs+40−2
@@ -91,10 +91,12 @@ fn try_parse_opts(spec: &str, options: Options) -> Result<Recorder, spec::parse: · 90 unmodified lines
9191 fn empty_specs_are_valid() {
9292 // they should of course be invalid for the delegate. CLIs may pre-process the input as well if they wish
9393 // but git itself doesn't do that.
94− for spec in ["", " ", "\n\t"] {
94+ for spec in [" ", "\n\t"] {
9595 let rec = parse(spec);
9696 assert_eq!(rec.calls, 1);
9797 }
98+ let rec = parse("");
99+ assert_eq!(rec.calls, 0, "but we do not bother to call the delegate with nothing");
98100 }
99101
100102 #[test]
@@ -227,7 +229,7 @@ mod range { · 126 unmodified lines
227229 .unwrap_err();
228230 assert!(
229231 matches!(err, spec::parse::Error::Delegate),
230− "Delegates can refuse spec kind changes to abort parsing early"
232+ "Delegates can refuse spec kind changes to abort parsing early in case they want single-specs only"
231233 );
232234 }
233235
@@ -236,6 +238,8 @@ mod range { · 2 unmodified lines
236238 let rec = parse("^HEAD");
237239 assert_eq!(rec.kind.unwrap(), spec::Kind::Range);
238240 assert_eq!(rec.resolve_ref_input.unwrap(), "HEAD");
241+ assert_eq!(rec.prefix, None);
242+ assert_eq!(rec.calls, 2);
239243 }
240244
241245 #[test]
@@ -243,6 +247,8 @@ mod range { · 1 unmodified line
243247 let rec = parse("HEAD..");
244248 assert_eq!(rec.kind.unwrap(), spec::Kind::Range);
245249 assert_eq!(rec.resolve_ref_input.unwrap(), "HEAD");
250+ assert_eq!(rec.prefix, None);
251+ assert_eq!(rec.calls, 2);
246252 }
247253
248254 #[test]
@@ -250,6 +256,8 @@ mod range { · 1 unmodified line
250256 let rec = parse("HEAD...");
251257 assert_eq!(rec.kind.unwrap(), spec::Kind::MergeBase);
252258 assert_eq!(rec.resolve_ref_input.unwrap(), "HEAD");
259+ assert_eq!(rec.prefix, None);
260+ assert_eq!(rec.calls, 2);
253261 }
254262
255263 #[test]
@@ -258,6 +266,13 @@ mod range { · 2 unmodified lines
258266 assert_eq!(rec.kind.unwrap(), spec::Kind::MergeBase);
259267 assert_eq!(rec.resolve_ref_input.unwrap(), "HEAD");
260268 assert_eq!(rec.resolve_ref_input2.unwrap(), "HEAD");
269+ assert_eq!(rec.calls, 3);
270+
271+ let rec = parse("r1...abcd");
272+ assert_eq!(rec.kind.unwrap(), spec::Kind::MergeBase);
273+ assert_eq!(rec.resolve_ref_input.unwrap(), "r1");
274+ assert_eq!(rec.prefix, prefix("abcd").into());
275+ assert_eq!(rec.calls, 3);
261276 }
262277
263278 #[test]
@@ -266,5 +281,28 @@ mod range { · 2 unmodified lines
266281 assert_eq!(rec.kind.unwrap(), spec::Kind::Range);
267282 assert_eq!(rec.resolve_ref_input.unwrap(), "HEAD");
268283 assert_eq!(rec.resolve_ref_input2.unwrap(), "HEAD");
284+ assert_eq!(rec.calls, 3);
285+
286+ let rec = parse("r1..r2");
287+ assert_eq!(rec.kind.unwrap(), spec::Kind::Range);
288+ assert_eq!(rec.resolve_ref_input.unwrap(), "r1");
289+ assert_eq!(rec.resolve_ref_input2.unwrap(), "r2");
290+ assert_eq!(rec.calls, 3);
291+
292+ let rec = parse("abcd..1234");
293+ assert_eq!(rec.kind.unwrap(), spec::Kind::Range);
294+ assert_eq!(rec.prefix, prefix("abcd").into());
295+ assert_eq!(rec.prefix2, prefix("1234").into());
296+ assert_eq!(rec.calls, 3);
297+
298+ let rec = parse("r1..abcd");
299+ assert_eq!(rec.kind.unwrap(), spec::Kind::Range);
300+ assert_eq!(rec.resolve_ref_input.unwrap(), "r1");
301+ assert_eq!(rec.prefix, prefix("abcd").into());
302+ assert_eq!(rec.calls, 3);
303+ }
304+
305+ fn prefix(hex: &str) -> git_hash::Prefix {
306+ git_hash::Prefix::from_hex(hex).unwrap()
269307 }
270308 }