%PDF- %PDF-
Direktori : /www/varak.net/wiki.varak.net/extensions/VisualEditor/lib/ve/tests/dm/ |
Current File : /www/varak.net/wiki.varak.net/extensions/VisualEditor/lib/ve/tests/dm/ve.dm.Surface.test.js |
/*! * VisualEditor DataModel Surface tests. * * @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org */ QUnit.module( 've.dm.Surface' ); ve.dm.SurfaceStub = function VeDmSurfaceStub( data, range ) { var doc = new ve.dm.Document( data || [ { type: 'paragraph' }, 'h', 'i', { type: '/paragraph' } ] ); // Inheritance ve.dm.SurfaceStub.super.call( this, doc ); // Initialize selection to simulate the surface being focused this.setLinearSelection( range || new ve.Range( 1 ) ); }; OO.inheritClass( ve.dm.SurfaceStub, ve.dm.Surface ); // Tests QUnit.test( 'getDocument', 1, function ( assert ) { var surface = new ve.dm.SurfaceStub(); assert.strictEqual( surface.getDocument(), surface.documentModel ); } ); QUnit.test( 'getSelection', 1, function ( assert ) { var surface = new ve.dm.SurfaceStub(); assert.strictEqual( surface.getSelection(), surface.selection ); } ); QUnit.test( 'documentUpdate/select events', 3, function ( assert ) { var surface = new ve.dm.SurfaceStub(), doc = surface.getDocument(), // docmentUpdate doesn't fire for no-op transactions, so make sure there's something there tx = ve.dm.Transaction.newFromInsertion( doc, 3, [ 'i' ] ), events = { documentUpdate: 0, select: 0 }; surface.on( 'documentUpdate', function () { events.documentUpdate++; } ); surface.on( 'select', function () { events.select++; } ); surface.change( tx.clone() ); assert.deepEqual( events, { documentUpdate: 1, select: 0 }, 'change with transaction only' ); surface.setLinearSelection( new ve.Range( 2 ) ); assert.deepEqual( events, { documentUpdate: 1, select: 1 }, 'setSelection' ); surface.change( tx.clone(), new ve.dm.LinearSelection( doc, new ve.Range( 3 ) ) ); assert.deepEqual( events, { documentUpdate: 2, select: 2 }, 'change with transaction and selection' ); } ); QUnit.test( 'breakpoint/undo/redo', 12, function ( assert ) { var range = new ve.Range( 1, 3 ), surface = new ve.dm.SurfaceStub( null, range ), fragment = surface.getFragment(), doc = surface.getDocument(), selection = new ve.dm.LinearSelection( doc, range ), tx = ve.dm.Transaction.newFromInsertion( doc, 1, [ 'x' ] ); assert.strictEqual( surface.breakpoint(), false, 'Returns false if no transactions applied' ); surface.change( tx ); assert.deepEqual( surface.undoStack, [], 'Undo stack data matches before breakpoint' ); assert.deepEqual( surface.newTransactions, [ tx ], 'New transactions match before breakpoint' ); assert.strictEqual( surface.breakpoint(), true, 'Returns true after transaction applied' ); assert.strictEqual( surface.breakpoint(), false, 'Returns false if no transactions applied since last breakpoint' ); assert.deepEqual( surface.undoStack, [ { transactions: [ tx ], selection: new ve.dm.LinearSelection( doc, tx.translateRange( selection.getRange() ) ), selectionBefore: selection } ], 'Undo stack data matches after breakpoint' ); assert.deepEqual( surface.newTransactions, [], 'New transactions empty after breakpoint' ); assert.equalHash( surface.getSelection(), fragment.getSelection(), 'Range changed' ); // Dirty selection to make sure beforeSelection works surface.setLinearSelection( new ve.Range( 3 ) ); surface.undo(); assert.equalHash( surface.getSelection().getRange(), range, 'Range restored after undo' ); assert.strictEqual( fragment.getText(), 'hi', 'Text restored after undo' ); surface.setLinearSelection( new ve.Range( 3 ) ); surface.redo(); assert.equalHash( surface.getSelection(), fragment.getSelection(), 'Range changed after redo' ); assert.strictEqual( fragment.getText(), 'xhi', 'Text changed after redo' ); } ); QUnit.test( 'staging', 37, function ( assert ) { var tx1, tx2, surface = new ve.dm.SurfaceStub( null, new ve.Range( 1, 3 ) ), fragment = surface.getFragment(), doc = surface.getDocument(); assert.strictEqual( surface.isStaging(), false, 'isStaging false when not staging' ); assert.strictEqual( surface.getStagingTransactions(), undefined, 'getStagingTransactions undefined when not staging' ); assert.strictEqual( surface.doesStagingAllowUndo(), undefined, 'doesStagingAllowUndo undefined when not staging' ); assert.equalHash( surface.getSelection(), fragment.getSelection(), 'Surface range matches fragment range' ); surface.change( ve.dm.Transaction.newFromInsertion( doc, 1, [ 'a' ] ) ); surface.pushStaging(); assert.strictEqual( surface.isStaging(), true, 'isStaging true after pushStaging' ); assert.deepEqual( surface.getStagingTransactions(), [], 'getStagingTransactions empty array after pushStaging' ); assert.strictEqual( surface.doesStagingAllowUndo(), false, 'doesStagingAllowUndo false when staging without undo' ); tx1 = ve.dm.Transaction.newFromInsertion( doc, 2, [ 'b' ] ); surface.change( tx1 ); assert.strictEqual( fragment.getText(), 'abhi', 'document contents match after first transaction' ); assert.deepEqual( surface.getStagingTransactions(), [ tx1 ], 'getStagingTransactions contains first transaction after change' ); assert.equalHash( surface.getSelection(), fragment.getSelection(), 'Surface selection matches fragment range' ); surface.pushStaging( true ); assert.strictEqual( surface.isStaging(), true, 'isStaging true after nested pushStaging' ); assert.deepEqual( surface.getStagingTransactions(), [], 'getStagingTransactions empty array after nested pushStaging' ); assert.strictEqual( surface.doesStagingAllowUndo(), true, 'doesStagingAllowUndo true when staging with undo' ); assert.equalHash( surface.getSelection(), fragment.getSelection(), 'Surface selection matches fragment range' ); tx2 = ve.dm.Transaction.newFromInsertion( doc, 3, [ 'c' ] ); surface.change( tx2 ); assert.strictEqual( fragment.getText(), 'abchi', 'document contents match after second transaction' ); assert.deepEqual( surface.getStagingTransactions(), [ tx2 ], 'getStagingTransactions contains second transaction after change in nested staging' ); assert.deepEqual( surface.popStaging(), [ tx2 ], 'popStaging returns second transaction list' ); assert.strictEqual( surface.isStaging(), true, 'isStaging true after nested popStaging' ); assert.strictEqual( fragment.getText(), 'abhi', 'document contents match after nested popStaging' ); assert.equalHash( surface.getSelection(), fragment.getSelection(), 'Surface selection matches fragment range' ); assert.deepEqual( surface.popStaging(), [ tx1 ], 'popStaging returns first transaction list' ); assert.strictEqual( surface.isStaging(), false, 'isStaging false after outer popStaging' ); assert.strictEqual( fragment.getText(), 'ahi', 'document contents match after outer popStaging' ); assert.equalHash( surface.getSelection(), fragment.getSelection(), 'Surface selection matches fragment range' ); surface.pushStaging(); tx1 = ve.dm.Transaction.newFromInsertion( doc, 2, [ 'b' ] ); surface.change( tx1 ); surface.pushStaging(); tx2 = ve.dm.Transaction.newFromInsertion( doc, 3, [ 'c' ] ); surface.change( tx2 ); assert.deepEqual( surface.popAllStaging(), [ tx1, tx2 ], 'popAllStaging returns full transaction list' ); assert.strictEqual( fragment.getText(), 'ahi', 'document contents match after outer clearStaging' ); assert.equalHash( surface.getSelection(), fragment.getSelection(), 'Surface selection matches fragment range' ); surface.pushStaging(); tx1 = ve.dm.Transaction.newFromInsertion( doc, 2, [ 'b' ] ); surface.change( tx1 ); surface.pushStaging(); tx2 = ve.dm.Transaction.newFromInsertion( doc, 3, [ 'c' ] ); surface.change( tx2 ); surface.applyStaging(); assert.deepEqual( surface.getStagingTransactions(), [ tx1, tx2 ], 'applyStaging merges transactions' ); surface.applyStaging(); assert.strictEqual( surface.isStaging(), false, 'isStaging false after outer applyStaging' ); assert.strictEqual( fragment.getText(), 'abchi', 'document contents changed after applyStaging' ); assert.equalHash( surface.getSelection(), fragment.getSelection(), 'Surface selection matches fragment range' ); surface.pushStaging(); tx1 = ve.dm.Transaction.newFromInsertion( doc, 4, [ 'd' ] ); surface.change( tx1 ); surface.pushStaging(); tx2 = ve.dm.Transaction.newFromInsertion( doc, 5, [ 'e' ] ); surface.change( tx2 ); surface.applyAllStaging(); assert.strictEqual( surface.isStaging(), false, 'isStaging false after outer applyAllStaging' ); assert.strictEqual( fragment.getText(), 'abcdehi', 'document contents changed after applyAllStaging' ); assert.equalHash( surface.getSelection(), fragment.getSelection(), 'Surface selection matches fragment range' ); surface.undo(); assert.strictEqual( fragment.getText(), 'abchi', 'document contents changed after undo' ); assert.equalHash( surface.getSelection(), fragment.getSelection(), 'Surface selection matches fragment range' ); surface.pushStaging(); surface.pushStaging(); // Apply transaction at second level, first level is empty and has no selctionBefore tx1 = ve.dm.Transaction.newFromInsertion( doc, 4, [ 'd' ] ); surface.change( tx1 ); surface.applyAllStaging(); // Dirty selection surface.setLinearSelection( new ve.Range( 1 ) ); // Undo should restore the selection from the second level's selectionBefore surface.undo(); assert.equalHash( surface.getSelection(), fragment.getSelection(), 'Surface selection matches fragment range' ); } ); // TODO: ve.dm.Surface#getHistory // TODO: ve.dm.Surface#canRedo // TODO: ve.dm.Surface#canUndo // TODO: ve.dm.Surface#hasBeenModified // TODO: ve.dm.Surface#truncateUndoStack