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
68 let mut cursor = input;68 let mut cursor = input;
69 let mut sep_pos = None;69 let mut sep_pos = None;
70 let mut consecutive_hex_chars = Some(0);70 let mut consecutive_hex_chars = Some(0);
71 while let Some((pos, b)) = cursor71 while let Some((pos, b)) = cursor.iter().enumerate().find(|(_, b)| {
72 .iter()72 if b"@~^:.".contains(b) {
73 .inspect(|b| {73 true
74 if let Some(pos) = consecutive_hex_chars.as_mut() {74 } else {
75 if let Some(num) = consecutive_hex_chars.as_mut() {
75 if b.is_ascii_hexdigit() {76 if b.is_ascii_hexdigit() {
76 *pos += 1;77 *num += 1;
77 } else {78 } else {
78 consecutive_hex_chars = None;79 consecutive_hex_chars = None;
79 }80 }
80 }81 }
81 })82 false
82 .enumerate()83 }
83 .find(|(_, b)| b"@~^:.".contains(b))84 }) {
84 {
85 if *b != b'.' || cursor.get(pos + 1) == Some(&b'.') {85 if *b != b'.' || cursor.get(pos + 1) == Some(&b'.') {
86 sep_pos = Some(pos);86 sep_pos = Some(pos);
87 break;87 break;
@@ -101,7 +101,7 @@ pub mod parse { · 13 unmodified lines
101 .and_then(|prefix| delegate.set_prefix(prefix))101 .and_then(|prefix| delegate.set_prefix(prefix))
102 })102 })
103 .flatten()103 .flatten()
104 .or_else(|| delegate.set_ref(name))104 .or_else(|| name.is_empty().then(|| ()).or_else(|| delegate.set_ref(name)))
105 .ok_or(Error::Delegate)?;105 .ok_or(Error::Delegate)?;
106 }106 }
107 107
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
91fn empty_specs_are_valid() {91fn empty_specs_are_valid() {
92 // they should of course be invalid for the delegate. CLIs may pre-process the input as well if they wish92 // they should of course be invalid for the delegate. CLIs may pre-process the input as well if they wish
93 // but git itself doesn't do that.93 // but git itself doesn't do that.
94 for spec in ["", " ", "\n\t"] {94 for spec in [" ", "\n\t"] {
95 let rec = parse(spec);95 let rec = parse(spec);
96 assert_eq!(rec.calls, 1);96 assert_eq!(rec.calls, 1);
97 }97 }
98 let rec = parse("");
99 assert_eq!(rec.calls, 0, "but we do not bother to call the delegate with nothing");
98}100}
99 101
100#[test]102#[test]
@@ -227,7 +229,7 @@ mod range { · 126 unmodified lines
227 .unwrap_err();229 .unwrap_err();
228 assert!(230 assert!(
229 matches!(err, spec::parse::Error::Delegate),231 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"
231 );233 );
232 }234 }
233 235
@@ -236,6 +238,8 @@ mod range { · 2 unmodified lines
236 let rec = parse("^HEAD");238 let rec = parse("^HEAD");
237 assert_eq!(rec.kind.unwrap(), spec::Kind::Range);239 assert_eq!(rec.kind.unwrap(), spec::Kind::Range);
238 assert_eq!(rec.resolve_ref_input.unwrap(), "HEAD");240 assert_eq!(rec.resolve_ref_input.unwrap(), "HEAD");
241 assert_eq!(rec.prefix, None);
242 assert_eq!(rec.calls, 2);
239 }243 }
240 244
241 #[test]245 #[test]
@@ -243,6 +247,8 @@ mod range { · 1 unmodified line
243 let rec = parse("HEAD..");247 let rec = parse("HEAD..");
244 assert_eq!(rec.kind.unwrap(), spec::Kind::Range);248 assert_eq!(rec.kind.unwrap(), spec::Kind::Range);
245 assert_eq!(rec.resolve_ref_input.unwrap(), "HEAD");249 assert_eq!(rec.resolve_ref_input.unwrap(), "HEAD");
250 assert_eq!(rec.prefix, None);
251 assert_eq!(rec.calls, 2);
246 }252 }
247 253
248 #[test]254 #[test]
@@ -250,6 +256,8 @@ mod range { · 1 unmodified line
250 let rec = parse("HEAD...");256 let rec = parse("HEAD...");
251 assert_eq!(rec.kind.unwrap(), spec::Kind::MergeBase);257 assert_eq!(rec.kind.unwrap(), spec::Kind::MergeBase);
252 assert_eq!(rec.resolve_ref_input.unwrap(), "HEAD");258 assert_eq!(rec.resolve_ref_input.unwrap(), "HEAD");
259 assert_eq!(rec.prefix, None);
260 assert_eq!(rec.calls, 2);
253 }261 }
254 262
255 #[test]263 #[test]
@@ -258,6 +266,13 @@ mod range { · 2 unmodified lines
258 assert_eq!(rec.kind.unwrap(), spec::Kind::MergeBase);266 assert_eq!(rec.kind.unwrap(), spec::Kind::MergeBase);
259 assert_eq!(rec.resolve_ref_input.unwrap(), "HEAD");267 assert_eq!(rec.resolve_ref_input.unwrap(), "HEAD");
260 assert_eq!(rec.resolve_ref_input2.unwrap(), "HEAD");268 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);
261 }276 }
262 277
263 #[test]278 #[test]
@@ -266,5 +281,28 @@ mod range { · 2 unmodified lines
266 assert_eq!(rec.kind.unwrap(), spec::Kind::Range);281 assert_eq!(rec.kind.unwrap(), spec::Kind::Range);
267 assert_eq!(rec.resolve_ref_input.unwrap(), "HEAD");282 assert_eq!(rec.resolve_ref_input.unwrap(), "HEAD");
268 assert_eq!(rec.resolve_ref_input2.unwrap(), "HEAD");283 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()
269 }307 }
270}308}