@@ -90,7 +90,8 @@ impl ChangeSet {
9090 return;
9191 }
9292
93− self.len_after += fragment.len();
93+ // Avoiding std::str::len() to account for UTF-8 characters.
94+ self.len_after += fragment.chars().count();
9495
9596 let new_last = match self.changes.as_mut_slice() {
9697 [.., Insert(prev)] | [.., Insert(prev), Delete(_)] => {
@@ -754,4 +755,21 @@ mod test {
754755 use Operation::*;
755756 assert_eq!(changes.changes, &[Insert("a".into())]);
756757 }
758+
759+ #[test]
760+ fn combine_with_utf8() {
761+ const TEST_CASE: &'static str = "Hello, これはヒレクスエディターです!";
762+
763+ let empty = Rope::from("");
764+ let mut a = ChangeSet::new(&empty);
765+
766+ let mut b = ChangeSet::new(&empty);
767+ b.insert(TEST_CASE.into());
768+
769+ let changes = a.compose(b);
770+
771+ use Operation::*;
772+ assert_eq!(changes.changes, &[Insert(TEST_CASE.into())]);
773+ assert_eq!(changes.len_after, TEST_CASE.chars().count());
774+ }
757775}