Always call finish (#58)
This commit is contained in:
parent
f5c1afa8f4
commit
18712783da
4 changed files with 94 additions and 0 deletions
|
|
@ -2,6 +2,10 @@
|
||||||
|
|
||||||
All notable changes to similar are documented here.
|
All notable changes to similar are documented here.
|
||||||
|
|
||||||
|
## 2.4.0
|
||||||
|
|
||||||
|
* Fixed a bug where the LCS diff algorithm didn't always call `D::finish`. (#58)
|
||||||
|
|
||||||
## 2.3.0
|
## 2.3.0
|
||||||
|
|
||||||
* Added support for `Change::value_ref` and `Change::value_mut`.
|
* Added support for `Change::value_ref` and `Change::value_mut`.
|
||||||
|
|
|
||||||
|
|
@ -55,9 +55,11 @@ where
|
||||||
{
|
{
|
||||||
if is_empty_range(&new_range) {
|
if is_empty_range(&new_range) {
|
||||||
d.delete(old_range.start, old_range.len(), new_range.start)?;
|
d.delete(old_range.start, old_range.len(), new_range.start)?;
|
||||||
|
d.finish()?;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
} else if is_empty_range(&old_range) {
|
} else if is_empty_range(&old_range) {
|
||||||
d.insert(old_range.start, new_range.start, new_range.len())?;
|
d.insert(old_range.start, new_range.start, new_range.len())?;
|
||||||
|
d.finish()?;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -67,6 +69,7 @@ where
|
||||||
// If the sequences are not different then we're done
|
// If the sequences are not different then we're done
|
||||||
if common_prefix_len == old_range.len() && (old_range.len() == new_range.len()) {
|
if common_prefix_len == old_range.len() && (old_range.len() == new_range.len()) {
|
||||||
d.equal(0, 0, old_range.len())?;
|
d.equal(0, 0, old_range.len())?;
|
||||||
|
d.finish()?;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -234,3 +237,32 @@ fn test_same() {
|
||||||
diff(&mut d, a, 0..a.len(), b, 0..b.len()).unwrap();
|
diff(&mut d, a, 0..a.len(), b, 0..b.len()).unwrap();
|
||||||
insta::assert_debug_snapshot!(d.ops());
|
insta::assert_debug_snapshot!(d.ops());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_finish_called() {
|
||||||
|
struct HasRunFinish(bool);
|
||||||
|
|
||||||
|
impl DiffHook for HasRunFinish {
|
||||||
|
type Error = ();
|
||||||
|
fn finish(&mut self) -> Result<(), Self::Error> {
|
||||||
|
self.0 = true;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut d = HasRunFinish(false);
|
||||||
|
let slice = &[1, 2];
|
||||||
|
let slice2 = &[1, 2, 3];
|
||||||
|
diff(&mut d, slice, 0..slice.len(), slice2, 0..slice2.len()).unwrap();
|
||||||
|
assert!(d.0);
|
||||||
|
|
||||||
|
let mut d = HasRunFinish(false);
|
||||||
|
let slice = &[1, 2];
|
||||||
|
diff(&mut d, slice, 0..slice.len(), slice, 0..slice.len()).unwrap();
|
||||||
|
assert!(d.0);
|
||||||
|
|
||||||
|
let mut d = HasRunFinish(false);
|
||||||
|
let slice: &[u8] = &[];
|
||||||
|
diff(&mut d, slice, 0..slice.len(), slice, 0..slice.len()).unwrap();
|
||||||
|
assert!(d.0);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -413,3 +413,32 @@ fn test_deadline_reached() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
insta::assert_debug_snapshot!(d.into_inner().ops());
|
insta::assert_debug_snapshot!(d.into_inner().ops());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_finish_called() {
|
||||||
|
struct HasRunFinish(bool);
|
||||||
|
|
||||||
|
impl DiffHook for HasRunFinish {
|
||||||
|
type Error = ();
|
||||||
|
fn finish(&mut self) -> Result<(), Self::Error> {
|
||||||
|
self.0 = true;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut d = HasRunFinish(false);
|
||||||
|
let slice = &[1, 2];
|
||||||
|
let slice2 = &[1, 2, 3];
|
||||||
|
diff(&mut d, slice, 0..slice.len(), slice2, 0..slice2.len()).unwrap();
|
||||||
|
assert!(d.0);
|
||||||
|
|
||||||
|
let mut d = HasRunFinish(false);
|
||||||
|
let slice = &[1, 2];
|
||||||
|
diff(&mut d, slice, 0..slice.len(), slice, 0..slice.len()).unwrap();
|
||||||
|
assert!(d.0);
|
||||||
|
|
||||||
|
let mut d = HasRunFinish(false);
|
||||||
|
let slice: &[u8] = &[];
|
||||||
|
diff(&mut d, slice, 0..slice.len(), slice, 0..slice.len()).unwrap();
|
||||||
|
assert!(d.0);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -167,3 +167,32 @@ fn test_patience_out_of_bounds_bug() {
|
||||||
|
|
||||||
insta::assert_debug_snapshot!(d.into_inner().ops());
|
insta::assert_debug_snapshot!(d.into_inner().ops());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_finish_called() {
|
||||||
|
struct HasRunFinish(bool);
|
||||||
|
|
||||||
|
impl DiffHook for HasRunFinish {
|
||||||
|
type Error = ();
|
||||||
|
fn finish(&mut self) -> Result<(), Self::Error> {
|
||||||
|
self.0 = true;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut d = HasRunFinish(false);
|
||||||
|
let slice = &[1, 2];
|
||||||
|
let slice2 = &[1, 2, 3];
|
||||||
|
diff(&mut d, slice, 0..slice.len(), slice2, 0..slice2.len()).unwrap();
|
||||||
|
assert!(d.0);
|
||||||
|
|
||||||
|
let mut d = HasRunFinish(false);
|
||||||
|
let slice = &[1, 2];
|
||||||
|
diff(&mut d, slice, 0..slice.len(), slice, 0..slice.len()).unwrap();
|
||||||
|
assert!(d.0);
|
||||||
|
|
||||||
|
let mut d = HasRunFinish(false);
|
||||||
|
let slice: &[u8] = &[];
|
||||||
|
diff(&mut d, slice, 0..slice.len(), slice, 0..slice.len()).unwrap();
|
||||||
|
assert!(d.0);
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue