Fix changeset composition, lengths don't have to match.

This commit is contained in:
Blaž Hrastnik 2020-10-06 14:44:33 +09:00
parent b765c17896
commit eba5b1ef33

View file

@ -45,10 +45,12 @@ pub fn new(doc: &Rope) -> Self {
/// In other words, If `this` goes `docA` → `docB` and `other` represents `docB` → `docC`, the
/// returned value will represent the change `docA` → `docC`.
pub fn compose(self, other: ChangeSet) -> Result<Self, ()> {
if self.len != other.len {
// length mismatch
return Err(());
}
// TODO: len before should match len after
// if self.len != other.len {
// // length mismatch
// return Err(());
// }
let len = self.changes.len();
@ -477,23 +479,23 @@ fn composition() {
Insert("!".into()),
Retain(1),
Delete(2),
Insert("ab".into()),
Insert("abc".into()),
],
len: 7,
len: 8,
};
let b = ChangeSet {
changes: vec![Delete(5), Insert("world".into()), Retain(4)],
len: 7,
changes: vec![Delete(5), Insert("world".into()), Retain(5)],
len: 9,
};
let mut text = Rope::from("hello xz");
// should probably return cloned text
a.compose(b).unwrap().apply(&mut text);
// unimplemented!("{:?}", text);
// TODO: assert
let composed = a.compose(b).unwrap();
assert_eq!(composed.len, 8);
assert!(composed.apply(&mut text));
assert_eq!(text, "world! abc");
}
#[test]