|
|
@@ -64,49 +64,73 @@ describe( 'Transaction', () => {
|
|
|
return count;
|
|
|
}
|
|
|
|
|
|
- function assertAttrs( expected ) {
|
|
|
- var range = Range.createFromElement( root );
|
|
|
- var actual = Array.from( range ).map( value => value.node.getAttr( 'a' ) || '-' ).join( '' );
|
|
|
+ function getChangesAttrsCount() {
|
|
|
+ var count = 0;
|
|
|
|
|
|
- // actual: 111---111222---111
|
|
|
- expect( actual ).to.be.deep.equal( expected );
|
|
|
+ for ( var delta of transaction ) {
|
|
|
+ for ( var operation of delta ) {
|
|
|
+ for ( var value of operation.range ) {
|
|
|
+ count++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return count;
|
|
|
+ }
|
|
|
+
|
|
|
+ function getCompressedAttrs() {
|
|
|
+ // default: 111---111222---111
|
|
|
+ var range = Range.createFromElement( root );
|
|
|
+ return Array.from( range ).map( value => value.node.getAttr( 'a' ) || '-' ).join( '' );
|
|
|
}
|
|
|
|
|
|
describe( 'setAttr', () => {
|
|
|
it( 'should set the attribute on the range', () => {
|
|
|
- transaction.setAttr( new Attribute( 'a', 3 ), getRange( 3, 6 ) );
|
|
|
- expect( getOperationsCount() ).
|
|
|
- assertAttrs( '111333111222---111' );
|
|
|
+ transaction.setAttr( 'a', 3, getRange( 3, 6 ) );
|
|
|
+ expect( getOperationsCount() ).to.equal( 1 );
|
|
|
+ expect( getChangesAttrsCount() ).to.equal( 3 );
|
|
|
+ expect( getCompressedAttrs() ).to.equal( '111333111222---111' );
|
|
|
} );
|
|
|
|
|
|
it( 'should split the operations if parts of the range have different attributes', () => {
|
|
|
- transaction.setAttr( new Attribute( 'a', 3 ), getRange( 4, 14 ) );
|
|
|
- assertAttrs( '111-3333333333-111' );
|
|
|
+ transaction.setAttr( 'a', 3, getRange( 4, 14 ) );
|
|
|
+ expect( getOperationsCount() ).to.equal( 4 );
|
|
|
+ expect( getChangesAttrsCount() ).to.equal( 10 );
|
|
|
+ expect( getCompressedAttrs() ).to.equal( '111-3333333333-111' );
|
|
|
} );
|
|
|
|
|
|
it( 'should split the operations if parts of the part of the range have the attribute', () => {
|
|
|
- transaction.setAttr( new Attribute( 'a', 2 ), getRange( 4, 14 ) );
|
|
|
- assertAttrs( '111-2222222222-111' );
|
|
|
+ transaction.setAttr( 'a', 2, getRange( 4, 14 ) );
|
|
|
+ expect( getOperationsCount() ).to.equal( 3 );
|
|
|
+ expect( getChangesAttrsCount() ).to.equal( 7 );
|
|
|
+ expect( getCompressedAttrs() ).to.equal( '111-2222222222-111' );
|
|
|
} );
|
|
|
|
|
|
it( 'should strip the range if the beginning have the attribute', () => {
|
|
|
- transaction.setAttr( new Attribute( 'a', 1 ), getRange( 1, 5 ) );
|
|
|
- assertAttrs( '11111-111222---111' );
|
|
|
+ transaction.setAttr( 'a', 1, getRange( 1, 5 ) );
|
|
|
+ expect( getOperationsCount() ).to.equal( 1 );
|
|
|
+ expect( getChangesAttrsCount() ).to.equal( 2 );
|
|
|
+ expect( getCompressedAttrs() ).to.equal( '11111-111222---111' );
|
|
|
} );
|
|
|
|
|
|
it( 'should strip the range if the ending have the attribute', () => {
|
|
|
- transaction.setAttr( new Attribute( 'a', 3 ), getRange( 13, 17 ) );
|
|
|
- assertAttrs( '111---111222-11111' );
|
|
|
+ transaction.setAttr( 'a', 1, getRange( 13, 17 ) );
|
|
|
+ expect( getOperationsCount() ).to.equal( 1 );
|
|
|
+ expect( getChangesAttrsCount() ).to.equal( 2 );
|
|
|
+ expect( getCompressedAttrs() ).to.equal( '111---111222-11111' );
|
|
|
} );
|
|
|
|
|
|
it( 'should do nothing if the range has attribute', () => {
|
|
|
- transaction.setAttr( new Attribute( 'a', 3 ), getRange( 0, 3 ) );
|
|
|
- assertAttrs( '111---111222---111' );
|
|
|
+ transaction.setAttr( 'a', 1, getRange( 0, 3 ) );
|
|
|
+ expect( getOperationsCount() ).to.equal( 0 );
|
|
|
+ expect( getCompressedAttrs() ).to.equal( '111---111222---111' );
|
|
|
} );
|
|
|
|
|
|
it( 'should create a proper operations for the mixed range', () => {
|
|
|
- transaction.setAttr( new Attribute( 'a', 1 ), getRange( 0, 18 ) );
|
|
|
- assertAttrs( '111111111111111111' );
|
|
|
+ transaction.setAttr( 'a', 1, getRange( 0, 18 ) );
|
|
|
+ expect( getOperationsCount() ).to.equal( 3 );
|
|
|
+ expect( getChangesAttrsCount() ).to.equal( 9 );
|
|
|
+ expect( getCompressedAttrs() ).to.equal( '111111111111111111' );
|
|
|
} );
|
|
|
} );
|
|
|
|
|
|
@@ -114,37 +138,50 @@ describe( 'Transaction', () => {
|
|
|
describe( 'removeAttr', () => {
|
|
|
it( 'should remove the attribute on the range', () => {
|
|
|
transaction.removeAttr( 'a', getRange( 0, 2 ) );
|
|
|
- assertAttrs( '--1---111222---111' );
|
|
|
+ expect( getOperationsCount() ).to.equal( 1 );
|
|
|
+ expect( getChangesAttrsCount() ).to.equal( 2 );
|
|
|
+ expect( getCompressedAttrs() ).to.equal( '--1---111222---111' );
|
|
|
} );
|
|
|
|
|
|
it( 'should split the operations if parts of the range have different attributes', () => {
|
|
|
transaction.removeAttr( 'a', getRange( 7, 11 ) );
|
|
|
- assertAttrs( '111---1----2---111' );
|
|
|
+ expect( getOperationsCount() ).to.equal( 2 );
|
|
|
+ expect( getChangesAttrsCount() ).to.equal( 4 );
|
|
|
+ expect( getCompressedAttrs() ).to.equal( '111---1----2---111' );
|
|
|
} );
|
|
|
|
|
|
it( 'should split the operations if parts of the part of the range have no attribute', () => {
|
|
|
transaction.removeAttr( 'a', getRange( 1, 7 ) );
|
|
|
- assertAttrs( '1------11222---111' );
|
|
|
+ expect( getOperationsCount() ).to.equal( 2 );
|
|
|
+ expect( getChangesAttrsCount() ).to.equal( 2 );
|
|
|
+ expect( getCompressedAttrs() ).to.equal( '1------11222---111' );
|
|
|
} );
|
|
|
|
|
|
it( 'should strip the range if the beginning have no attribute', () => {
|
|
|
transaction.removeAttr( 'a', getRange( 4, 12 ) );
|
|
|
- assertAttrs( '111------------111' );
|
|
|
+ expect( getOperationsCount() ).to.equal( 2 );
|
|
|
+ expect( getChangesAttrsCount() ).to.equal( 6 );
|
|
|
+ expect( getCompressedAttrs() ).to.equal( '111------------111' );
|
|
|
} );
|
|
|
|
|
|
it( 'should strip the range if the ending have no attribute', () => {
|
|
|
transaction.removeAttr( 'a', getRange( 7, 15 ) );
|
|
|
- assertAttrs( '111---1--------111' );
|
|
|
+ expect( getOperationsCount() ).to.equal( 2 );
|
|
|
+ expect( getChangesAttrsCount() ).to.equal( 5 );
|
|
|
+ expect( getCompressedAttrs() ).to.equal( '111---1--------111' );
|
|
|
} );
|
|
|
|
|
|
it( 'should do nothing if the range has no attribute', () => {
|
|
|
transaction.removeAttr( 'a', getRange( 4, 5 ) );
|
|
|
- assertAttrs( '111---111222---111' );
|
|
|
+ expect( getOperationsCount() ).to.equal( 0 );
|
|
|
+ expect( getCompressedAttrs() ).to.equal( '111---111222---111' );
|
|
|
} );
|
|
|
|
|
|
it( 'should create a proper operations for the mixed range', () => {
|
|
|
transaction.removeAttr( 'a', getRange( 3, 15 ) );
|
|
|
- assertAttrs( '111------------111' );
|
|
|
+ expect( getOperationsCount() ).to.equal( 2 );
|
|
|
+ expect( getChangesAttrsCount() ).to.equal( 6 );
|
|
|
+ expect( getCompressedAttrs() ).to.equal( '111------------111' );
|
|
|
} );
|
|
|
} );
|
|
|
} );
|