https://www.mediawiki.org/wiki/Special:Code/MediaWiki/113340

Revision: 113340
Author:   tparscal
Date:     2012-03-08 00:52:30 +0000 (Thu, 08 Mar 2012)
Log Message:
-----------
Added some basic tests for resize and insert. Fixed some bugs in both of those 
code paths along the way.

Modified Paths:
--------------
    trunk/extensions/VisualEditor/modules/ve/dm/ve.dm.DocumentSynchronizer.js
    trunk/extensions/VisualEditor/tests/ve/index.html

Added Paths:
-----------
    trunk/extensions/VisualEditor/tests/ve/ve.dm.DocumentSynchronizer.test.js

Modified: 
trunk/extensions/VisualEditor/modules/ve/dm/ve.dm.DocumentSynchronizer.js
===================================================================
--- trunk/extensions/VisualEditor/modules/ve/dm/ve.dm.DocumentSynchronizer.js   
2012-03-08 00:49:50 UTC (rev 113339)
+++ trunk/extensions/VisualEditor/modules/ve/dm/ve.dm.DocumentSynchronizer.js   
2012-03-08 00:52:30 UTC (rev 113340)
@@ -19,12 +19,12 @@
  * Adds an action to the synchronizer.
  * 
  * @method
+ * @param {String} type Type of action, can be: "insert", "delete", "rebuild", 
"resize" or "update"
  * @param {ve.dm.Node} node Node this action is related to
  * @param {Integer} offset Offset of node, improves performance if this has 
already been calculated
- * @param {String} type Type of action, can be: "insert", "delete", "rebuild", 
"resize" or "update"
  * @param {Integer} adjustment Node length adjustment, if any
  */
-ve.dm.DocumentSynchronizer.prototype.pushAction = function( node, offset, 
type, adjustment ) {
+ve.dm.DocumentSynchronizer.prototype.pushAction = function( type, node, 
offset, adjustment ) {
        if ( offset === undefined ) {
                offset = this.model.getOffsetFromNode( node );
        }
@@ -54,10 +54,13 @@
                switch ( action.type ) {
                        case 'insert':
                                // Insert the new node at the given offset
-                               var target = this.model.getNodeFromOffset( 
offset );
+                               var target = this.model.getNodeFromOffset( 
offset + 1 );
                                if ( target === this.model ) {
                                        // Insert at the beginning of the 
document
-                                       target.splice( 0, 0, action.node );
+                                       this.model.splice( 0, 0, action.node );
+                               } else if ( target === null ) {
+                                       // Insert at the end of the document
+                                       this.model.splice( 
this.model.getElementLength(), 0, action.node );
                                } else {
                                        // Insert before the element currently 
at the offset
                                        parent = target.getParent();
@@ -85,13 +88,13 @@
                                break;
                        case 'resize':
                                // Adjust node length - causes update events to 
be emitted
-                               node.adjustContentLength( adjustment );
+                               action.node.adjustContentLength( 
action.adjustment );
                                // Adjust proceeding offsets by the amount the 
node is being lengthened or shortened
                                adjustment += action.adjustment;
                                break;
                        case 'update':
                                // Emit update events
-                               node.emit( 'update' );
+                               action.node.emit( 'update' );
                                break;
                }
        }

Modified: trunk/extensions/VisualEditor/tests/ve/index.html
===================================================================
--- trunk/extensions/VisualEditor/tests/ve/index.html   2012-03-08 00:49:50 UTC 
(rev 113339)
+++ trunk/extensions/VisualEditor/tests/ve/index.html   2012-03-08 00:52:30 UTC 
(rev 113340)
@@ -33,6 +33,7 @@
                <script 
src="../../modules/ve/dm/ve.dm.TransactionProcessor.js"></script>
                <script src="../../modules/ve/dm/ve.dm.Transaction.js"></script>
                <script src="../../modules/ve/dm/ve.dm.Surface.js"></script>
+               <script 
src="../../modules/ve/dm/ve.dm.DocumentSynchronizer.js"></script>
 
                <script 
src="../../modules/ve/dm/nodes/ve.dm.DocumentNode.js"></script>
                <script 
src="../../modules/ve/dm/nodes/ve.dm.HeadingNode.js"></script>
@@ -55,6 +56,7 @@
                <script src="ve.Node.test.js"></script>
                <script src="ve.BranchNode.test.js"></script>
                <script src="ve.dm.TransactionProcessor.test.js"></script>
+               <script src="ve.dm.DocumentSynchronizer.test.js"></script>
                <script src="ve.dm.BranchNode.test.js"></script>
                <script src="ve.dm.DocumentNode.test.js"></script>
        </body>

Added: trunk/extensions/VisualEditor/tests/ve/ve.dm.DocumentSynchronizer.test.js
===================================================================
--- trunk/extensions/VisualEditor/tests/ve/ve.dm.DocumentSynchronizer.test.js   
                        (rev 0)
+++ trunk/extensions/VisualEditor/tests/ve/ve.dm.DocumentSynchronizer.test.js   
2012-03-08 00:52:30 UTC (rev 113340)
@@ -0,0 +1,62 @@
+module( 've/dm' );
+
+test( 've.dm.TransactionSynchronizer', function() {
+       var model,
+               sync,
+               node,
+               data;
+
+       // Test 1 - node resizing
+
+       model = ve.dm.DocumentNode.newFromPlainObject( veTest.obj );
+       sync = new ve.dm.DocumentSynchronizer( model );
+       // Delete bold "b" from first paragraph
+       model.data.splice( 2, 1 );
+       // Push resize action
+       sync.pushAction( 'resize', model.getChildren()[0], 0, -1 );
+       // Sync
+       sync.synchronize();
+       equal( model.getChildren()[0].getContentLength(), 2, 'resize actions 
adjust node lengths' );
+
+       // Test 2 - node insertion (in the middle)
+
+       model = ve.dm.DocumentNode.newFromPlainObject( veTest.obj );
+       sync = new ve.dm.DocumentSynchronizer( model );
+       // Insert element after first paragraph
+       data = [{ 'type': 'paragraph' }, 'x', { 'type': '/paragraph' }];
+       node = ve.dm.DocumentNode.createNodesFromData( data )[0];
+       ve.insertIntoArray( model.data, 5, data );
+       // Push insertion action
+       sync.pushAction( 'insert', node, 5 );
+       // Sync
+       sync.synchronize();
+       deepEqual( model.getChildren()[1].getContentData(), ['x'], 'insert 
actions add new nodes' );
+
+       // Test 3 - node insertion (at the start)
+
+       model = ve.dm.DocumentNode.newFromPlainObject( veTest.obj );
+       sync = new ve.dm.DocumentSynchronizer( model );
+       // Insert element after first paragraph
+       data = [{ 'type': 'paragraph' }, 'x', { 'type': '/paragraph' }];
+       node = ve.dm.DocumentNode.createNodesFromData( data )[0];
+       ve.insertIntoArray( model.data, 0, data );
+       // Push insertion action
+       sync.pushAction( 'insert', node, 0 );
+       // Sync
+       sync.synchronize();
+       deepEqual( model.getChildren()[0].getContentData(), ['x'], 'insert 
actions add new nodes' );
+
+       // Test 4 - node insertion (at the end)
+       model = ve.dm.DocumentNode.newFromPlainObject( veTest.obj );
+       sync = new ve.dm.DocumentSynchronizer( model );
+       // Insert element after first paragraph
+       data = [{ 'type': 'paragraph' }, 'x', { 'type': '/paragraph' }];
+       node = ve.dm.DocumentNode.createNodesFromData( data )[0];
+       ve.insertIntoArray( model.data, 34, data );
+       // Push insertion action
+       sync.pushAction( 'insert', node, 34 );
+       // Sync
+       sync.synchronize();
+       deepEqual( model.getChildren()[3].getContentData(), ['x'], 'insert 
actions add new nodes' );
+} );
+


_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to