Current File : /home/jvzmxxx/wiki1/extensions/VisualEditor/lib/ve/tests/dm/ve.dm.DocumentSynchronizer.test.js
/*!
 * VisualEditor DataModel DocumentSynchronizer tests.
 *
 * @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org
 */

QUnit.module( 've.dm.DocumentSynchronizer' );

/* Tests */

QUnit.test( 'getDocument', 1, function ( assert ) {
	var doc = ve.dm.example.createExampleDocument(),
		ds = new ve.dm.DocumentSynchronizer( doc );
	assert.strictEqual( ds.getDocument(), doc );
} );

QUnit.test( 'synchronize', 6, function ( assert ) {
	var doc = ve.dm.example.createExampleDocument(),
		ds = new ve.dm.DocumentSynchronizer( doc ),
		firstTextNodeUpdates = 0,
		firstTextNodeAnnotations = 0,
		firstTextNodeLengthChanges = [],
		secondTextNodeUpdates = 0,
		secondTextNodeAnnotations = 0,
		secondTextNodeLengthChanges = [];

	// Annotate "a" with bold formatting
	doc.data[ 1 ] = [ 'a', new ve.dm.AnnotationSet( doc.getStore(),
		doc.getStore().index( new ve.dm.BoldAnnotation() ) )
	];
	ds.pushAnnotation( new ve.Range( 1, 2 ) );
	// Insert "xyz" between "a" and "b"
	doc.data.batchSplice( 2, 0, [ 'x', 'y', 'z' ] );
	ds.pushResize( doc.getDocumentNode().getNodeFromOffset( 2 ), 3 );
	// Annotate "d" with italic formatting (was at 10, now at 13)
	doc.data[ 13 ] = [ 'd', new ve.dm.AnnotationSet( doc.getStore(),
		doc.getStore().index( new ve.dm.ItalicAnnotation() ) )
	];
	ds.pushAnnotation( new ve.Range( 10, 11 ) );

	doc.getDocumentNode().getChildren()[ 0 ].getChildren()[ 0 ].on( 'update', function () {
		firstTextNodeUpdates++;
	} );
	doc.getDocumentNode().getChildren()[ 0 ].getChildren()[ 0 ].on( 'annotation', function () {
		firstTextNodeAnnotations++;
	} );
	doc.getDocumentNode().getChildren()[ 0 ].getChildren()[ 0 ].on( 'lengthChange', function ( diff ) {
		firstTextNodeLengthChanges.push( diff );
	} );
	doc.getDocumentNode().getChildren()[ 1 ].getChildren()[ 0 ].getChildren()[ 0 ].getChildren()[ 0 ].getChildren()[ 0 ].getChildren()[ 0 ]
		.on( 'update', function () {
			secondTextNodeUpdates++;
		} );
	doc.getDocumentNode().getChildren()[ 1 ].getChildren()[ 0 ].getChildren()[ 0 ].getChildren()[ 0 ].getChildren()[ 0 ].getChildren()[ 0 ]
		.on( 'annotation', function () {
			secondTextNodeAnnotations++;
		} );
	doc.getDocumentNode().getChildren()[ 1 ].getChildren()[ 0 ].getChildren()[ 0 ].getChildren()[ 0 ].getChildren()[ 0 ].getChildren()[ 0 ]
		.on( 'lengthChange', function ( diff ) {
			secondTextNodeLengthChanges.push( diff );
		} );
	ds.synchronize();

	// TODO technically this should be 1, not 2, see DocumentSynchronizer.synchronizers.resize
	assert.deepEqual( firstTextNodeUpdates, 2, 'annotation and insertion each trigger update event (1st paragraph)' );
	assert.deepEqual( firstTextNodeAnnotations, 1, 'annotation triggers annotation event (1st paragraph)' );
	assert.deepEqual( firstTextNodeLengthChanges, [ 3 ], 'insertion triggers lengthChange event (1st paragraph)' );
	assert.deepEqual( secondTextNodeUpdates, 1, 'annotation triggers update event (2nd paragraph)' );
	assert.deepEqual( secondTextNodeAnnotations, 1, 'annotation triggers annotation event (2nd paragraph)' );
	assert.deepEqual( secondTextNodeLengthChanges, [], 'lengthChange not triggered for 2nd paragraph' );
} );