attributedelta.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /**
  2. * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. /* bender-tags: treemodel, operation */
  6. 'use strict';
  7. import transform from '/ckeditor5/core/treemodel/delta/transform.js';
  8. import Text from '/ckeditor5/core/treemodel/text.js';
  9. import Position from '/ckeditor5/core/treemodel/position.js';
  10. import Range from '/ckeditor5/core/treemodel/range.js';
  11. import AttributeDelta from '/ckeditor5/core/treemodel/delta/attributedelta.js';
  12. import AttributeOperation from '/ckeditor5/core/treemodel/operation/attributeoperation.js';
  13. import {
  14. expectDelta,
  15. getFilledDocument,
  16. getAttributeDelta,
  17. getWeakInsertDelta,
  18. } from '/tests/core/treemodel/delta/transform/_utils/utils.js';
  19. describe( 'transform', () => {
  20. let doc, root, baseVersion;
  21. beforeEach( () => {
  22. doc = getFilledDocument();
  23. root = doc.getRoot( 'root' );
  24. baseVersion = doc.version;
  25. } );
  26. describe( 'AttributeDelta by', () => {
  27. let attrDelta;
  28. beforeEach( () => {
  29. let attrRange = new Range( new Position( root, [ 3, 2 ] ), new Position( root, [ 3, 3, 3, 9 ] ) );
  30. attrDelta = getAttributeDelta( attrRange, 'key', 'old', 'new', baseVersion );
  31. } );
  32. describe( 'WeakInsertDelta', () => {
  33. it( 'weak insert inside attribute range should "fix" splitting the range', () => {
  34. let insertPosition = new Position( root, [ 3, 3, 0 ] );
  35. let insertDelta = getWeakInsertDelta(
  36. insertPosition,
  37. [
  38. 'a',
  39. new Text( 'b', { key: 'new' } ),
  40. new Text( 'c', { key: 'different' } ),
  41. 'de'
  42. ],
  43. baseVersion
  44. );
  45. let transformed = transform( attrDelta, insertDelta );
  46. expect( transformed.length ).to.equal( 2 );
  47. baseVersion = insertDelta.operations.length;
  48. expectDelta( transformed[ 0 ], {
  49. type: AttributeDelta,
  50. operations: [
  51. {
  52. type: AttributeOperation,
  53. range: new Range( new Position( root, [ 3, 3, 5 ] ), new Position( root, [ 3, 3, 8, 9 ] ) ),
  54. key: 'key',
  55. oldValue: 'old',
  56. newValue: 'new',
  57. baseVersion: baseVersion
  58. },
  59. {
  60. type: AttributeOperation,
  61. range: new Range( new Position( root, [ 3, 2 ] ), new Position( root, [ 3, 3, 0 ] ) ),
  62. key: 'key',
  63. oldValue: 'old',
  64. newValue: 'new',
  65. baseVersion: baseVersion + 1
  66. }
  67. ]
  68. } );
  69. expectDelta( transformed[ 1 ], {
  70. type: AttributeDelta,
  71. operations: [
  72. {
  73. type: AttributeOperation,
  74. range: new Range( new Position( root, [ 3, 3, 0 ] ), new Position( root, [ 3, 3, 1 ] ) ),
  75. key: 'key',
  76. oldValue: undefined,
  77. newValue: 'new',
  78. baseVersion: baseVersion + 2
  79. },
  80. {
  81. type: AttributeOperation,
  82. range: new Range( new Position( root, [ 3, 3, 2 ] ), new Position( root, [ 3, 3, 3 ] ) ),
  83. key: 'key',
  84. oldValue: 'different',
  85. newValue: 'new',
  86. baseVersion: baseVersion + 3
  87. },
  88. {
  89. type: AttributeOperation,
  90. range: new Range( new Position( root, [ 3, 3, 3 ] ), new Position( root, [ 3, 3, 5 ] ) ),
  91. key: 'key',
  92. oldValue: undefined,
  93. newValue: 'new',
  94. baseVersion: baseVersion + 4
  95. }
  96. ]
  97. } );
  98. } );
  99. it( 'should be normally transformed if weak insert is not in the attribute range', () => {
  100. let insertPosition = new Position( root, [ 5 ] );
  101. let insertDelta = getWeakInsertDelta( insertPosition, 'abc', baseVersion );
  102. let transformed = transform( attrDelta, insertDelta );
  103. expect( transformed.length ).to.equal( 1 );
  104. baseVersion = insertDelta.operations.length;
  105. expectDelta( transformed[ 0 ], {
  106. type: AttributeDelta,
  107. operations: [
  108. {
  109. type: AttributeOperation,
  110. range: new Range( new Position( root, [ 3, 2 ] ), new Position( root, [ 3, 3, 3, 9 ] ) ),
  111. key: 'key',
  112. oldValue: 'old',
  113. newValue: 'new',
  114. baseVersion: baseVersion
  115. }
  116. ]
  117. } );
  118. } );
  119. } );
  120. } );
  121. } );