test-merge.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import ist from "ist"
  2. import {Change, Span} from "prosemirror-changeset"
  3. describe("mergeChanges", () => {
  4. it("can merge simple insertions", () => test(
  5. [[1, 1, 1, 2]], [[1, 1, 1, 2]], [[1, 1, 1, 3]]
  6. ))
  7. it("can merge simple deletions", () => test(
  8. [[1, 2, 1, 1]], [[1, 2, 1, 1]], [[1, 3, 1, 1]]
  9. ))
  10. it("can merge insertion before deletion", () => test(
  11. [[2, 3, 2, 2]], [[1, 1, 1, 2]], [[1, 1, 1, 2], [2, 3, 3, 3]]
  12. ))
  13. it("can merge insertion after deletion", () => test(
  14. [[2, 3, 2, 2]], [[2, 2, 2, 3]], [[2, 3, 2, 3]]
  15. ))
  16. it("can merge deletion before insertion", () => test(
  17. [[2, 2, 2, 3]], [[1, 2, 1, 1]], [[1, 2, 1, 2]]
  18. ))
  19. it("can merge deletion after insertion", () => test(
  20. [[2, 2, 2, 3]], [[3, 4, 3, 3]], [[2, 3, 2, 3]]
  21. ))
  22. it("can merge deletion of insertion", () => test(
  23. [[2, 2, 2, 3]], [[2, 3, 2, 2]], []
  24. ))
  25. it("can merge insertion after replace", () => test(
  26. [[2, 3, 2, 3]], [[3, 3, 3, 4]], [[2, 3, 2, 4]]
  27. ))
  28. it("can merge insertion before replace", () => test(
  29. [[2, 3, 2, 3]], [[2, 2, 2, 3]], [[2, 3, 2, 4]]
  30. ))
  31. it("can merge replace after insert", () => test(
  32. [[2, 2, 2, 3]], [[2, 3, 2, 3]], [[2, 2, 2, 3]]
  33. ))
  34. })
  35. function range(array: number[], author = 0) {
  36. let [fromA, toA] = array
  37. let [fromB, toB] = array.length > 2 ? array.slice(2) : array
  38. return new Change(fromA, toA, fromB, toB, [new Span(toA - fromA, author)], [new Span(toB - fromB, author)])
  39. }
  40. function test(changeA: number[][], changeB: number[][], expected: number[][]) {
  41. const result = Change.merge(changeA.map(range), changeB.map(range), a => a)
  42. .map(r => [r.fromA, r.toA, r.fromB, r.toB])
  43. ist(JSON.stringify(result), JSON.stringify(expected))
  44. }