diff.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. var Delta = require('../../lib/delta');
  2. describe('diff()', function () {
  3. it('insert', function () {
  4. var a = new Delta().insert('A');
  5. var b = new Delta().insert('AB');
  6. var expected = new Delta().retain(1).insert('B');
  7. expect(a.diff(b)).toEqual(expected);
  8. });
  9. it('delete', function () {
  10. var a = new Delta().insert('AB');
  11. var b = new Delta().insert('A');
  12. var expected = new Delta().retain(1).delete(1);
  13. expect(a.diff(b)).toEqual(expected);
  14. });
  15. it('retain', function () {
  16. var a = new Delta().insert('A');
  17. var b = new Delta().insert('A');
  18. var expected = new Delta();
  19. expect(a.diff(b)).toEqual(expected);
  20. });
  21. it('format', function () {
  22. var a = new Delta().insert('A');
  23. var b = new Delta().insert('A', { bold: true });
  24. var expected = new Delta().retain(1, { bold: true });
  25. expect(a.diff(b)).toEqual(expected);
  26. });
  27. it('object attributes', function () {
  28. var a = new Delta().insert('A', { font: { family: 'Helvetica', size: '15px' } });
  29. var b = new Delta().insert('A', { font: { family: 'Helvetica', size: '15px' } });
  30. var expected = new Delta();
  31. expect(a.diff(b)).toEqual(expected);
  32. });
  33. it('embed integer match', function () {
  34. var a = new Delta().insert(1);
  35. var b = new Delta().insert(1);
  36. var expected = new Delta();
  37. expect(a.diff(b)).toEqual(expected);
  38. });
  39. it('embed integer mismatch', function () {
  40. var a = new Delta().insert(1);
  41. var b = new Delta().insert(2);
  42. var expected = new Delta().delete(1).insert(2);
  43. expect(a.diff(b)).toEqual(expected);
  44. });
  45. it('embed object match', function () {
  46. var a = new Delta().insert({ image: 'http://quilljs.com' });
  47. var b = new Delta().insert({ image: 'http://quilljs.com' });
  48. var expected = new Delta();
  49. expect(a.diff(b)).toEqual(expected);
  50. });
  51. it('embed object mismatch', function () {
  52. var a = new Delta().insert({ image: 'http://quilljs.com', alt: 'Overwrite' });
  53. var b = new Delta().insert({ image: 'http://quilljs.com' });
  54. var expected = new Delta().insert({ image: 'http://quilljs.com' }).delete(1);
  55. expect(a.diff(b)).toEqual(expected);
  56. });
  57. it('embed object change', function () {
  58. var embed = { image: 'http://quilljs.com' };
  59. var a = new Delta().insert(embed);
  60. embed.image = 'http://github.com';
  61. var b = new Delta().insert(embed);
  62. var expected = new Delta().insert({ image: 'http://github.com' }).delete(1);
  63. expect(a.diff(b)).toEqual(expected);
  64. });
  65. it('embed false positive', function () {
  66. var a = new Delta().insert(1);
  67. var b = new Delta().insert(String.fromCharCode(0)); // Placeholder char for embed in diff()
  68. var expected = new Delta().insert(String.fromCharCode(0)).delete(1);
  69. expect(a.diff(b)).toEqual(expected);
  70. });
  71. it('error on non-documents', function () {
  72. var a = new Delta().insert('A');
  73. var b = new Delta().retain(1).insert('B');
  74. expect(function () {
  75. a.diff(b);
  76. }).toThrow();
  77. expect(function () {
  78. b.diff(a);
  79. }).toThrow();
  80. });
  81. it('inconvenient indexes', function () {
  82. var a = new Delta().insert('12', { bold: true }).insert('34', { italic: true });
  83. var b = new Delta().insert('123', { color: 'red' });
  84. var expected = new Delta().retain(2, { bold: null, color: 'red' }).retain(1, { italic: null, color: 'red' }).delete(1);
  85. expect(a.diff(b)).toEqual(expected);
  86. });
  87. it('combination', function () {
  88. var a = new Delta().insert('Bad', { color: 'red' }).insert('cat', { color: 'blue' });
  89. var b = new Delta().insert('Good', { bold: true }).insert('dog', { italic: true });
  90. var expected = new Delta().insert('Good', { bold: true }).delete(2).retain(1, { italic: true, color: null }).delete(3).insert('og', { italic: true });
  91. expect(a.diff(b)).toEqual(expected);
  92. });
  93. it('same document', function () {
  94. var a = new Delta().insert('A').insert('B', { bold: true });
  95. expected = new Delta();
  96. expect(a.diff(a)).toEqual(expected);
  97. });
  98. it('immutability', function () {
  99. var attr1 = { color: 'red' };
  100. var attr2 = { color: 'red' };
  101. var a1 = new Delta().insert('A', attr1);
  102. var a2 = new Delta().insert('A', attr1);
  103. var b1 = new Delta().insert('A', { bold: true }).insert('B');
  104. var b2 = new Delta().insert('A', { bold: true }).insert('B');
  105. var expected = new Delta().retain(1, { bold: true, color: null }).insert('B');
  106. expect(a1.diff(b1)).toEqual(expected);
  107. expect(a1).toEqual(a2);
  108. expect(b2).toEqual(b2);
  109. expect(attr1).toEqual(attr2);
  110. });
  111. it('non-document', function () {
  112. var a = new Delta().insert('Test');
  113. var b = new Delta().delete(4);
  114. expect(function() {
  115. a.diff(b);
  116. }).toThrow(new Error('diff() called on non-document'));
  117. });
  118. });