Skip to content

Commit

Permalink
[FIX] index exceeding bounds edge cases. [TESTS] all cases.
Browse files Browse the repository at this point in the history
  • Loading branch information
kgryte committed Mar 3, 2015
1 parent d188c63 commit 1c9cab4
Show file tree
Hide file tree
Showing 3 changed files with 146 additions and 20 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ This implementation chooses to follow the Python convention such that `[:n]` com
var indexspace = require( 'compute-indexspace' );

var arr = indexspace( '[:]', 5 );
// returns [ 1, 2, 3, 4 ];
// returns [ 0, 1, 2, 3, 4 ]

arr = indexspace( '[2:]', 5 );
// returns [ 2, 3, 4 ]
Expand Down
36 changes: 18 additions & 18 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,7 @@ var re = /^\[(?:(?:-(?=\d+))?\d*|end(?:-\d+|\/\d+)?):(?:(?:-(?=\d+))?\d*|end(?:-
*/

var reEnd = /^end/,
reMatch = /(-|\/)(?=\d+)(\d+)?$/,
reDigit = /(-?\d+)/;
reMatch = /(-|\/)(?=\d+)(\d+)?$/;


// INDEXSPACE
Expand Down Expand Up @@ -122,21 +121,11 @@ function indexspace( str, len ) {
return [];
}
str = str.split( ':' );

tmp = str[ 0 ].match( reDigit );
if ( tmp ) {
x1 = parseInt( tmp[ 1 ], 10 );
} else {
x1 = NaN;
}
tmp = str[ 1 ].match( reDigit );
if ( tmp ) {
x2 = parseInt( tmp[ 1 ], 10 );
} else {
x2 = NaN;
}
x1 = str[ 0 ].substr( 1 );
x2 = str[ 1 ];

if ( str.length === 2 ) {
x2 = x2.substr( 0, x2.length-1 );
inc = 1;
} else {
inc = parseInt( str[ 2 ], 10 );
Expand Down Expand Up @@ -166,6 +155,8 @@ function indexspace( str, len ) {
x1 = len - 1;
}
} else {
x1 = parseInt( x1, 10 );

// Handle empty index...
if ( x1 !== x1 ) {
// [:-?\d*:-?\d+]
Expand All @@ -185,6 +176,10 @@ function indexspace( str, len ) {
x1 = 0;
}
}
// Handle exceeding bounds...
else if ( x1 >= len ) {
return [];
}
}

// END //
Expand All @@ -201,12 +196,14 @@ function indexspace( str, len ) {
}
} else {
x2 = (len-1) / parseInt( tmp[ 2 ], 10 );
x2 = Math.floor( x2 );
x2 = Math.ceil( x2 ) - 1;
}
} else {
x2 = len - 1;
}
} else {
x2 = parseInt( x2, 10 );

// Handle empty index...
if ( x2 !== x2 ) {
// [-?\d*::-?\d+]
Expand All @@ -230,7 +227,11 @@ function indexspace( str, len ) {
else {
if ( inc < 0 ) {
x2 = x2 + 1;
} else {
}
else if ( x2 >= len ) {
x2 = len - 1;
}
else {
x2 = x2 - 1;
}
}
Expand All @@ -244,7 +245,6 @@ function indexspace( str, len ) {
if ( x1 === x2 ) {
return arr;
}
// Handle empty cases...
if ( inc < 0 ) {
if ( x2 > x1 ) {
return arr;
Expand Down
128 changes: 127 additions & 1 deletion test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,99 @@ describe( 'compute-indexspace', function tests() {
});

it( 'should return an index array', function test() {
var actual, expected;

actual = indexspace( '[:]', 5 );
expected = [ 0, 1, 2, 3, 4 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[2:]', 5 );
expected = [ 2, 3, 4 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[:3]', 5 );
expected = [ 0, 1, 2 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[2:4]', 5 );
expected = [ 2, 3 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[1:4:2]', 5 );
expected = [ 1, 3 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[2::2]', 5 );
expected = [ 2, 4 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[:10:3]', 20 );
expected = [ 0, 3, 6, 9 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[:-1:2]', 5 );
expected = [ 0, 2 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[-4:-1:2]', 5 );
expected = [ 0, 2 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[-5:-1]', 5 );
expected = [ 0, 1, 2, 3 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[::-1]', 5 );
expected = [ 4, 3, 2, 1, 0 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[:0:-1]', 5 );
expected = [ 4, 3, 2, 1 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[3:0:-1]', 5 );
expected = [ 3, 2, 1 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[-1:-4:-2]', 5 );
expected = [ 3, 1 ];
assert.deepEqual( actual, expected );
});

it( 'should support an `end` keyword', function test() {
var actual, expected;

actual = indexspace( '[:end]', 5 );
expected = [ 0, 1, 2, 3, 4 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[end::-1]', 5 );
expected = [ 4, 3, 2, 1, 0 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[:end-1]', 5 );
expected = [ 0, 1, 2, 3 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[:end/2]', 5 );
expected = [ 0, 1 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[:end/2]', 6 );
expected = [ 0, 1, 2 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[end-2::-1]', 5 );
expected = [ 2, 1, 0 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[end/2:]', 5 );
expected = [ 2, 3, 4 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[end/2:]', 6 );
expected = [ 3, 4, 5 ];
assert.deepEqual( actual, expected );
});

it( 'should return an empty array if provided a reference array length equal to 0', function test() {
Expand All @@ -97,7 +189,12 @@ describe( 'compute-indexspace', function tests() {
});

it( 'should return an empty array if start and end indices are equal', function test() {
var actual = indexspace( '[2:2]', 10 );
var actual;

actual = indexspace( '[2:]', 3 );
assert.deepEqual( actual, [] );

actual = indexspace( '[:2:-1]', 3 );
assert.deepEqual( actual, [] );
});

Expand All @@ -111,4 +208,33 @@ describe( 'compute-indexspace', function tests() {
assert.deepEqual( actual, [] );
});

it( 'should return an empty array if start index is greater than maximum index', function test() {
var actual = indexspace( '[5:]', 5 );
assert.deepEqual( actual, [] );
});

it( 'should be forgiving if the user exceeds index bounds', function test() {
var actual, expected;

actual = indexspace( '[-10:]', 5 );
expected = [ 0, 1, 2, 3, 4 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[:10]', 5 );
expected = [ 0, 1, 2, 3, 4 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[:-10:-1]', 5 );
expected = [ 4, 3, 2, 1, 0 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[end-10:]', 5 );
expected = [ 0, 1, 2, 3, 4 ];
assert.deepEqual( actual, expected );

actual = indexspace( '[:end-10:-1]', 5 );
expected = [ 4, 3, 2, 1, 0 ];
assert.deepEqual( actual, expected );
});

});

0 comments on commit 1c9cab4

Please sign in to comment.