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

Revision: 102041
Author:   catrope
Date:     2011-11-04 20:27:23 +0000 (Fri, 04 Nov 2011)
Log Message:
-----------
Add a metric ton of (mostly generated) selectNodes tests, and change 
selectNodes a little bit to make them pass

Modified Paths:
--------------
    trunk/extensions/VisualEditor/modules/es/bases/es.DocumentBranchNode.js
    trunk/extensions/VisualEditor/tests/es/es.DocumentNode.test.js

Modified: 
trunk/extensions/VisualEditor/modules/es/bases/es.DocumentBranchNode.js
===================================================================
--- trunk/extensions/VisualEditor/modules/es/bases/es.DocumentBranchNode.js     
2011-11-04 20:26:08 UTC (rev 102040)
+++ trunk/extensions/VisualEditor/modules/es/bases/es.DocumentBranchNode.js     
2011-11-04 20:27:23 UTC (rev 102041)
@@ -168,24 +168,6 @@
                        // Empty range outside of any node
                        return [];
                }
-               if ( start == left - 1 && end == right + 1 ) {
-                       // The range covers the entire node, including its 
opening and closing elements
-                       return [ { 'node': this.children[i] } ];
-               }
-               if ( start == left - 1 ) {
-                       // start is between this.children[i-1] and 
this.children[i], move it to left for
-                       // convenience
-                       // We don't need to check for start < end here because 
we already have start != end and
-                       // start <= end
-                       start = left;
-               }
-               if ( end == right + 1 ) {
-                       // end is between this.children[i] and 
this.children[i+1], move it to right for
-                       // convenience
-                       // We don't need to check for start < end here because 
we already have start != end and
-                       // start <= end
-                       end = right;
-               }
                
                startInside = start >= left && start <= right; // is the start 
inside this.children[i]?
                endInside = end >= left && end <= right; // is the end inside 
this.children[i]?
@@ -215,6 +197,18 @@
                        nodes.push( { 'node': this.children[i], 'range': new 
es.Range( 0, end - left ) } );
                        // We've found the end, so we're done
                        return nodes;
+               } else if ( end == right + 1 ) {
+                       // end is between this.children[i] and 
this.children[i+1]
+                       // start is not inside this.children[i], so the 
selection covers
+                       // all of this.children[i], then ends
+                       nodes.push( { 'node': this.children[i] } );
+                       // We've reached the end so we're done
+                       return nodes;
+               } else if ( start == left - 1 ) {
+                       // start is between this.children[i-1] and 
this.children[i]
+                       // end is not inside this.children[i], so the selection 
covers
+                       // all of this.children[i] and more
+                       nodes.push( { 'node': this.children[i] } );
                } else if ( nodes.length > 0 ) {
                        // Neither the start nor the end is inside 
this.children[i], but nodes is non-empty,
                        // so this.children[i] must be between the start and 
the end
@@ -226,11 +220,15 @@
                // We use +2 because we need to jump over the offset between 
this.children[i] and
                // this.children[i+1]
                left = right + 2;
+               if ( end < left ) {
+                       // We've skipped over the end, so we're done
+                       return nodes;
+               }
        }
        
        // If we got here, that means that at least some part of the range is 
out of bounds
        // This is an error
-       if ( nodes.length === 0 ) {
+       if ( start > right + 1 ) {
                throw 'The start offset of the range is past the end of the 
node';
        } else {
                // Apparently the start was inside this node, but the end wasn't

Modified: trunk/extensions/VisualEditor/tests/es/es.DocumentNode.test.js
===================================================================
--- trunk/extensions/VisualEditor/tests/es/es.DocumentNode.test.js      
2011-11-04 20:26:08 UTC (rev 102040)
+++ trunk/extensions/VisualEditor/tests/es/es.DocumentNode.test.js      
2011-11-04 20:27:23 UTC (rev 102041)
@@ -114,7 +114,7 @@
        }
 } );
 
-test( 'es.DocumentBranchNode.selectNodes', 21, function() {
+test( 'es.DocumentBranchNode.selectNodes', 75, function() {
 
        // selectNodes tests
 
@@ -125,11 +125,8 @@
        var f = new DocumentBranchNodeStub( [], 'f', 8 ),
                g = new DocumentBranchNodeStub( [], 'g', 8 ),
                h = new DocumentBranchNodeStub( [], 'h', 8 ),
-               root2 = new DocumentBranchNodeStub( [f, g, h], 'root2', 30 );
-       // FIXME: QUnit thinks f == g because both are empty arrays. Rawr.
-       // TODO make sure there is a test case for everything that is 
special-cased in the code
-       // TODO also nest with a more complicated nested structure, like the 
one from
-       // es.DocumentModel.test.js
+               root2 = new DocumentBranchNodeStub( [f, g, h], 'root2', 30 ),
+               big = es.DocumentModel.newFromPlainObject( esTest.obj );
        
        // Tests 1 ... 22
        // Possible positions are:
@@ -236,59 +233,558 @@
                        'output': [],
                        'desc': 'Zero-length range past the end of a node'
                },
-               // TODO add a complete set of combinations for cross-node ranges
                {
                        'node': root2,
-                       'input': new es.Range( 5, 25 ),
+                       'input': new es.Range( 20, 20 ),
+                       'output': [],
+                       'desc': 'Zero-length range between two nodes'
+               },
+               // Complete set of combinations for cross-node selections. 
Generated with help of a script
+               {
+                       'node': root2,
+                       'input': new es.Range( 0, 11 ),
                        'output': [
-                               { 'node': f, 'range': new es.Range( 4, 8 ) },
+                               { 'node': f },
+                               { 'node': g, 'range': new es.Range( 0, 0 ) }
+                       ],
+                       'desc': 'Range starting before the beginning of the 
first node and ending at the beginning of the second node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 0, 14 ),
+                       'output': [
+                               { 'node': f },
+                               { 'node': g, 'range': new es.Range( 0, 3 ) }
+                       ],
+                       'desc': 'Range starting before the beginning of the 
first node and ending in the middle of the second node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 0, 19 ),
+                       'output': [
+                               { 'node': f },
+                               { 'node': g, 'range': new es.Range( 0, 8 ) }
+                       ],
+                       'desc': 'Range starting before the beginning of the 
first node and ending at the end of the second node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 0, 20 ),
+                       'output': [
+                               { 'node': f },
+                               { 'node': g }
+                       ],
+                       'desc': 'Range starting before the beginning of the 
first node and ending between the second and the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 0, 21 ),
+                       'output': [
+                               { 'node': f },
                                { 'node': g },
-                               { 'node': h, 'range': new es.Range( 0, 4 ) }
+                               { 'node': h, 'range': new es.Range( 0, 0 ) }
                        ],
-                       'desc': 'Range from the middle of the first node to the 
middle of the third'
+                       'desc': 'Range starting before the beginning of the 
first node and ending at the beginning of the third node'
                },
                {
                        'node': root2,
+                       'input': new es.Range( 0, 27 ),
+                       'output': [
+                               { 'node': f },
+                               { 'node': g },
+                               { 'node': h, 'range': new es.Range( 0, 6 ) }
+                       ],
+                       'desc': 'Range starting before the beginning of the 
first node and ending in the middle of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 0, 29 ),
+                       'output': [
+                               { 'node': f },
+                               { 'node': g },
+                               { 'node': h, 'range': new es.Range( 0, 8 ) }
+                       ],
+                       'desc': 'Range starting before the beginning of the 
first node and ending at the end of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 0, 30 ),
+                       'output': [
+                               { 'node': f },
+                               { 'node': g },
+                               { 'node': h }
+                       ],
+                       'desc': 'Range starting before the beginning of the 
first node and ending past the end of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 1, 11 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 0, 8 ) },
+                               { 'node': g, 'range': new es.Range( 0, 0 ) }
+                       ],
+                       'desc': 'Range starting at the beginning of the first 
node and ending at the beginning of the second node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 1, 14 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 0, 8 ) },
+                               { 'node': g, 'range': new es.Range( 0, 3 ) }
+                       ],
+                       'desc': 'Range starting at the beginning of the first 
node and ending in the middle of the second node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 1, 19 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 0, 8 ) },
+                               { 'node': g, 'range': new es.Range( 0, 8 ) }
+                       ],
+                       'desc': 'Range starting at the beginning of the first 
node and ending at the end of the second node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 1, 20 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 0, 8 ) },
+                               { 'node': g }
+                       ],
+                       'desc': 'Range starting at the beginning of the first 
node and ending between the second and the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 1, 21 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 0, 8 ) },
+                               { 'node': g },
+                               { 'node': h, 'range': new es.Range( 0, 0 ) }
+                       ],
+                       'desc': 'Range starting at the beginning of the first 
node and ending at the beginning of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 1, 27 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 0, 8 ) },
+                               { 'node': g },
+                               { 'node': h, 'range': new es.Range( 0, 6 ) }
+                       ],
+                       'desc': 'Range starting at the beginning of the first 
node and ending in the middle of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 1, 29 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 0, 8 ) },
+                               { 'node': g },
+                               { 'node': h, 'range': new es.Range( 0, 8 ) }
+                       ],
+                       'desc': 'Range starting at the beginning of the first 
node and ending at the end of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 1, 30 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 0, 8 ) },
+                               { 'node': g },
+                               { 'node': h }
+                       ],
+                       'desc': 'Range starting at the beginning of the first 
node and ending past the end of the third node'
+               },
+               {
+                       'node': root2,
                        'input': new es.Range( 5, 11 ),
                        'output': [
                                { 'node': f, 'range': new es.Range( 4, 8 ) },
                                { 'node': g, 'range': new es.Range( 0, 0 ) }
                        ],
-                       'desc': 'Range from the middle of a node to the 
beginning of the second'
+                       'desc': 'Range starting in the middle of the first node 
and ending at the beginning of the second node'
                },
                {
                        'node': root2,
-                       'input': new es.Range( 5, 12 ),
+                       'input': new es.Range( 5, 14 ),
                        'output': [
                                { 'node': f, 'range': new es.Range( 4, 8 ) },
-                               { 'node': g, 'range': new es.Range( 0, 1 ) }
+                               { 'node': g, 'range': new es.Range( 0, 3 ) }
                        ],
-                       'desc': 'Range from in the middle of a node to the 
first character of the second'
+                       'desc': 'Range starting in the middle of the first node 
and ending in the middle of the second node'
                },
                {
                        'node': root2,
-                       'input': new es.Range( 8, 16 ),
+                       'input': new es.Range( 5, 19 ),
                        'output': [
-                               { 'node': f, 'range': new es.Range( 7, 8 ) },
-                               { 'node': g, 'range': new es.Range( 0, 5 ) }
+                               { 'node': f, 'range': new es.Range( 4, 8 ) },
+                               { 'node': g, 'range': new es.Range( 0, 8 ) }
                        ],
-                       'desc': 'Range from before the last character of a node 
to the middle of the next node'
+                       'desc': 'Range starting in the middle of the first node 
and ending at the end of the second node'
                },
                {
                        'node': root2,
-                       'input': new es.Range( 9, 16 ),
+                       'input': new es.Range( 5, 20 ),
                        'output': [
+                               { 'node': f, 'range': new es.Range( 4, 8 ) },
+                               { 'node': g }
+                       ],
+                       'desc': 'Range starting in the middle of the first node 
and ending between the second and the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 5, 21 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 4, 8 ) },
+                               { 'node': g },
+                               { 'node': h, 'range': new es.Range( 0, 0 ) }
+                       ],
+                       'desc': 'Range starting in the middle of the first node 
and ending at the beginning of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 5, 27 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 4, 8 ) },
+                               { 'node': g },
+                               { 'node': h, 'range': new es.Range( 0, 6 ) }
+                       ],
+                       'desc': 'Range starting in the middle of the first node 
and ending in the middle of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 5, 29 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 4, 8 ) },
+                               { 'node': g },
+                               { 'node': h, 'range': new es.Range( 0, 8 ) }
+                       ],
+                       'desc': 'Range starting in the middle of the first node 
and ending at the end of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 5, 30 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 4, 8 ) },
+                               { 'node': g },
+                               { 'node': h }
+                       ],
+                       'desc': 'Range starting in the middle of the first node 
and ending past the end of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 9, 11 ),
+                       'output': [
                                { 'node': f, 'range': new es.Range( 8, 8 ) },
-                               { 'node': g, 'range': new es.Range( 0, 5 ) }
+                               { 'node': g, 'range': new es.Range( 0, 0 ) }
                        ],
-                       'desc': 'Range from at the end of a node to the middle 
of the next node'
+                       'desc': 'Range starting at the end of the first node 
and ending at the beginning of the second node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 9, 14 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 8, 8 ) },
+                               { 'node': g, 'range': new es.Range( 0, 3 ) }
+                       ],
+                       'desc': 'Range starting at the end of the first node 
and ending in the middle of the second node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 9, 19 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 8, 8 ) },
+                               { 'node': g, 'range': new es.Range( 0, 8 ) }
+                       ],
+                       'desc': 'Range starting at the end of the first node 
and ending at the end of the second node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 9, 20 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 8, 8 ) },
+                               { 'node': g }
+                       ],
+                       'desc': 'Range starting at the end of the first node 
and ending between the second and the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 9, 21 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 8, 8 ) },
+                               { 'node': g },
+                               { 'node': h, 'range': new es.Range( 0, 0 ) }
+                       ],
+                       'desc': 'Range starting at the end of the first node 
and ending at the beginning of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 9, 27 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 8, 8 ) },
+                               { 'node': g },
+                               { 'node': h, 'range': new es.Range( 0, 6 ) }
+                       ],
+                       'desc': 'Range starting at the end of the first node 
and ending in the middle of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 9, 29 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 8, 8 ) },
+                               { 'node': g },
+                               { 'node': h, 'range': new es.Range( 0, 8 ) }
+                       ],
+                       'desc': 'Range starting at the end of the first node 
and ending at the end of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 9, 30 ),
+                       'output': [
+                               { 'node': f, 'range': new es.Range( 8, 8 ) },
+                               { 'node': g },
+                               { 'node': h }
+                       ],
+                       'desc': 'Range starting at the end of the first node 
and ending past the end of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 10, 21 ),
+                       'output': [
+                               { 'node': g },
+                               { 'node': h, 'range': new es.Range( 0, 0 ) }
+                       ],
+                       'desc': 'Range starting between the first and the 
second node and ending at the beginning of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 10, 27 ),
+                       'output': [
+                               { 'node': g },
+                               { 'node': h, 'range': new es.Range( 0, 6 ) }
+                       ],
+                       'desc': 'Range starting between the first and the 
second node and ending in the middle of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 10, 29 ),
+                       'output': [
+                               { 'node': g },
+                               { 'node': h, 'range': new es.Range( 0, 8 ) }
+                       ],
+                       'desc': 'Range starting between the first and the 
second node and ending at the end of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 10, 30 ),
+                       'output': [
+                               { 'node': g },
+                               { 'node': h }
+                       ],
+                       'desc': 'Range starting between the first and the 
second node and ending past the end of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 11, 21 ),
+                       'output': [
+                               { 'node': g, 'range': new es.Range( 0, 8 ) },
+                               { 'node': h, 'range': new es.Range( 0, 0 ) }
+                       ],
+                       'desc': 'Range starting at the beginning of the second 
node and ending at the beginning of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 11, 27 ),
+                       'output': [
+                               { 'node': g, 'range': new es.Range( 0, 8 ) },
+                               { 'node': h, 'range': new es.Range( 0, 6 ) }
+                       ],
+                       'desc': 'Range starting at the beginning of the second 
node and ending in the middle of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 11, 29 ),
+                       'output': [
+                               { 'node': g, 'range': new es.Range( 0, 8 ) },
+                               { 'node': h, 'range': new es.Range( 0, 8 ) }
+                       ],
+                       'desc': 'Range starting at the beginning of the second 
node and ending at the end of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 11, 30 ),
+                       'output': [
+                               { 'node': g, 'range': new es.Range( 0, 8 ) },
+                               { 'node': h }
+                       ],
+                       'desc': 'Range starting at the beginning of the second 
node and ending past the end of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 14, 21 ),
+                       'output': [
+                               { 'node': g, 'range': new es.Range( 3, 8 ) },
+                               { 'node': h, 'range': new es.Range( 0, 0 ) }
+                       ],
+                       'desc': 'Range starting in the middle of the second 
node and ending at the beginning of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 14, 27 ),
+                       'output': [
+                               { 'node': g, 'range': new es.Range( 3, 8 ) },
+                               { 'node': h, 'range': new es.Range( 0, 6 ) }
+                       ],
+                       'desc': 'Range starting in the middle of the second 
node and ending in the middle of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 14, 29 ),
+                       'output': [
+                               { 'node': g, 'range': new es.Range( 3, 8 ) },
+                               { 'node': h, 'range': new es.Range( 0, 8 ) }
+                       ],
+                       'desc': 'Range starting in the middle of the second 
node and ending at the end of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 14, 30 ),
+                       'output': [
+                               { 'node': g, 'range': new es.Range( 3, 8 ) },
+                               { 'node': h }
+                       ],
+                       'desc': 'Range starting in the middle of the second 
node and ending past the end of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 19, 21 ),
+                       'output': [
+                               { 'node': g, 'range': new es.Range( 8, 8 ) },
+                               { 'node': h, 'range': new es.Range( 0, 0 ) }
+                       ],
+                       'desc': 'Range starting at the end of the second node 
and ending at the beginning of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 19, 27 ),
+                       'output': [
+                               { 'node': g, 'range': new es.Range( 8, 8 ) },
+                               { 'node': h, 'range': new es.Range( 0, 6 ) }
+                       ],
+                       'desc': 'Range starting at the end of the second node 
and ending in the middle of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 19, 29 ),
+                       'output': [
+                               { 'node': g, 'range': new es.Range( 8, 8 ) },
+                               { 'node': h, 'range': new es.Range( 0, 8 ) }
+                       ],
+                       'desc': 'Range starting at the end of the second node 
and ending at the end of the third node'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 19, 30 ),
+                       'output': [
+                               { 'node': g, 'range': new es.Range( 8, 8 ) },
+                               { 'node': h }
+                       ],
+                       'desc': 'Range starting at the end of the second node 
and ending past the end of the third node'
+               },
+               // Tests for childless nodes
+               {
+                       'node': g,
+                       'input': new es.Range( 1, 3 ),
+                       'output': [
+                               { 'node': g, 'range': new es.Range( 1, 3 ) }
+                       ],
+                       'desc': 'Childless node given, range not out of bounds'
+               },
+               {
+                       'node': g,
+                       'input': new es.Range( 0, 8 ),
+                       'output': [
+                               { 'node': g, 'range': new es.Range( 0, 8 ) }
+                       ],
+                       'desc': 'Childless node given, range covers entire node'
+               },
+               // Tests for out-of-bounds cases
+               {
+                       'node': g,
+                       'input': new es.Range( -1, 3 ),
+                       'exception': /^The start offset of the range is 
negative$/,
+                       'desc': 'Childless node given, range start out of 
bounds'
+               },
+               {
+                       'node': g,
+                       'input': new es.Range( 1, 9 ),
+                       'exception': /^The end offset of the range is past the 
end of the node$/,
+                       'desc': 'Childless node given, range end out of bounds'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 31, 35 ),
+                       'exception': /^The start offset of the range is past 
the end of the node$/,
+                       'desc': 'Node with children given, range start out of 
bounds'
+               },
+               {
+                       'node': root2,
+                       'input': new es.Range( 30, 35 ),
+                       'exception': /^The end offset of the range is past the 
end of the node$/,
+                       'desc': 'Node with children given, range end out of 
bounds'
+               },
+               // Tests for recursion cases
+               {
+                       'node': big,
+                       'input': new es.Range( 2, 10 ),
+                       'output': [
+                               { 'node': big.children[0], 'range': new 
es.Range( 1, 3 ) },
+                               { 'node': big.children[1], 'range': new 
es.Range( 0, 4 ) }
+                       ],
+                       'desc': 'Select from before the b to after the d'
+               },
+               {
+                       'node': big,
+                       'input': new es.Range( 3, 27 ),
+                       'output': [
+                               { 'node': big.children[0], 'range': new 
es.Range( 2, 3 ) },
+                               { 'node': big.children[1] },
+                               { 'node': big.children[2], 'range': new 
es.Range( 0, 1 ) }
+                       ],
+                       'desc': 'Select from before the c to after the h'
+               },
+               {
+                       'node': big,
+                       'input': new es.Range( 9, 17 ),
+                       'output': [
+                               { 'node': 
big.children[1].children[0].children[0].children[0], 'range': new es.Range( 0, 
1 ) },
+                               { 'node': 
big.children[1].children[0].children[0].children[1], 'range': new es.Range( 0, 
5 ) }
+                       ],
+                       'desc': 'Select from before the d to after the f, with 
recursion'
+               },
+               {
+                       'node': big,
+                       'input': new es.Range( 9, 17 ),
+                       'shallow': true,
+                       'output': [
+                               { 'node': big.children[1], 'range': new 
es.Range( 3, 11 ) }
+                       ],
+                       'desc': 'Select from before the d to after the f, 
without recursion'
                }
        ];
+       
        for ( var i = 0; i < selectNodesTests.length; i++ ) {
-               deepEqual(
-                       root2.selectNodes( selectNodesTests[i].input ),
-                       selectNodesTests[i].output,
-                       selectNodesTests[i].desc
-               );
+               if ( 'output' in selectNodesTests[i] ) {
+                       deepEqual(
+                               selectNodesTests[i].node.selectNodes( 
selectNodesTests[i].input, selectNodesTests[i].shallow ),
+                               selectNodesTests[i].output,
+                               selectNodesTests[i].desc
+                       );
+               } else if ( 'exception' in selectNodesTests[i] ) {
+                       raises(
+                               function() {
+                                       selectNodesTests[i].node.selectNodes( 
selectNodesTests[i].input, selectNodesTests[i].shallow );
+                               },
+                               selectNodesTests[i].exception,
+                               selectNodesTests[i].desc
+                       );
+               }
        }
 } );


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

Reply via email to