edit_file_operation.test.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // @ts-check
  2. 'use strict'
  3. const { expect } = require('chai')
  4. const ot = require('..')
  5. const EditOperationBuilder = require('../lib/operation/edit_operation_builder')
  6. const File = ot.File
  7. const Operation = ot.Operation
  8. describe('EditFileOperation', function () {
  9. function edit(pathname, textOperationJsonObject) {
  10. return Operation.editFile(
  11. pathname,
  12. EditOperationBuilder.fromJSON({ textOperation: textOperationJsonObject })
  13. )
  14. }
  15. describe('canBeComposedWith', function () {
  16. it('on the same file', function () {
  17. const editFileOperation1 = edit('foo.tex', ['x'])
  18. const editFileOperation2 = edit('foo.tex', [1, 'y'])
  19. expect(editFileOperation1.canBeComposedWith(editFileOperation2)).to.be
  20. .true
  21. })
  22. it('on different files', function () {
  23. const editFileOperation1 = edit('foo.tex', ['x'])
  24. const editFileOperation2 = edit('bar.tex', ['y'])
  25. expect(editFileOperation1.canBeComposedWith(editFileOperation2)).to.be
  26. .false
  27. })
  28. it('with a different type of opperation', function () {
  29. const editFileOperation1 = edit('foo.tex', ['x'])
  30. const editFileOperation2 = Operation.addFile(
  31. 'bar.tex',
  32. File.fromString('')
  33. )
  34. expect(editFileOperation1.canBeComposedWith(editFileOperation2)).to.be
  35. .false
  36. })
  37. it('with incompatible lengths', function () {
  38. const editFileOperation1 = edit('foo.tex', ['x'])
  39. const editFileOperation2 = edit('foo.tex', [2, 'y'])
  40. expect(editFileOperation1.canBeComposedWith(editFileOperation2)).to.be
  41. .false
  42. })
  43. })
  44. describe('canBeComposedWithForUndo', function () {
  45. it('can', function () {
  46. const editFileOperation1 = edit('foo.tex', ['x'])
  47. const editFileOperation2 = edit('foo.tex', [1, 'y'])
  48. expect(editFileOperation1.canBeComposedWithForUndo(editFileOperation2)).to
  49. .be.true
  50. })
  51. it('cannot', function () {
  52. const editFileOperation1 = edit('foo.tex', ['x'])
  53. const editFileOperation2 = edit('foo.tex', ['y', 1, 'z'])
  54. expect(editFileOperation1.canBeComposedWithForUndo(editFileOperation2)).to
  55. .be.false
  56. })
  57. })
  58. describe('compose', function () {
  59. it('composes text operations', function () {
  60. const editFileOperation1 = edit('foo.tex', ['x'])
  61. const editFileOperation2 = edit('foo.tex', [1, 'y'])
  62. const composedFileOperation =
  63. editFileOperation1.compose(editFileOperation2)
  64. const expectedComposedFileOperation = edit('foo.tex', ['xy'])
  65. expect(composedFileOperation).to.deep.equal(expectedComposedFileOperation)
  66. // check that the original operation wasn't modified
  67. expect(editFileOperation1).to.deep.equal(edit('foo.tex', ['x']))
  68. })
  69. })
  70. })