Skip to content

Commit

Permalink
[FIX] negative indices and out of range bugs.
Browse files Browse the repository at this point in the history
  • Loading branch information
kgryte committed Mar 3, 2015
1 parent 9722179 commit df435a4
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 37 deletions.
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Notes about the notation:
* Both `start` and `stop` can be negative, in which case they specify the number of indices from the __maximum__ `array` index.

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

Expand Down Expand Up @@ -104,14 +104,17 @@ arr = indexspace( '[2::2]', 5 );
arr = indexspace( '[:10:3]', 20 );
// returns [ 0, 3, 6, 9 ]

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

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

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

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

arr = indexspace( '[::-1]', 5 );
// returns [ 4, 3, 2, 1, 0 ]
Expand Down
7 changes: 6 additions & 1 deletion examples/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@ console.log( '\n[:10:3]' );
console.log( arr );
// returns [ 0, 3, 6, 9 ]

arr = indexspace( '[:-2]', 5 );
console.log( '\n[:-2]' );
console.log( arr );
// returns [ 0, 1 ]

arr = indexspace( '[:-1:2]', 5 );
console.log( '\n[:-1:2]' );
console.log( arr );
Expand All @@ -50,7 +55,7 @@ console.log( arr );
arr = indexspace( '[-5:-1]', 5 );
console.log( '\n[-5:-1]' );
console.log( arr );
// returns [ 0, 1, 2, 3 ]
// returns [ 0, 1, 2 ]

arr = indexspace( '[::-1]', 5 );
console.log( '\n[::-1]' );
Expand Down
5 changes: 3 additions & 2 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -219,11 +219,12 @@ function indexspace( str, len ) {
}
// Handle negative index...
else if ( x2 < 0 ) {
x2 = len - 1 + x2; // len-1-x2 = (end)-x2
x2 = len - 2 + x2; // len-1-x2 = (end)-x2
if ( x2 < 0 ) {
// WARNING: forgive the user for exceeding index bounds...
x2 = 0;
} else if ( x2 === x1 ) {
}
if ( x2 === x1 ) {
return [];
}
}
Expand Down
84 changes: 52 additions & 32 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -92,95 +92,103 @@ describe( 'compute-indexspace', function tests() {

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

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

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

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

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

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 );
assert.deepEqual( actual, expected, '[2::2]' );

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

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

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

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

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

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

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

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

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

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 );
assert.deepEqual( actual, expected, '[:end]' );

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

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

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

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

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

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

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

it( 'should return an empty array if provided a reference array length equal to 0', function test() {
Expand All @@ -192,13 +200,13 @@ describe( 'compute-indexspace', function tests() {
var actual;

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

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

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

it( 'should return an empty array if start is greater than the end for a positive increment', function test() {
Expand All @@ -212,32 +220,44 @@ describe( 'compute-indexspace', function tests() {
});

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

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

actual = indexspace( '[20:25]', 5 );
assert.deepEqual( actual, [], '[20:25]' );
});

it( 'should return an empty array if both indices are less than 0', function test() {
var actual;

actual = indexspace( '[-25:-20]', 5 );
assert.deepEqual( actual, [], '[-25:-20]' );
});

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 );
assert.deepEqual( actual, expected, '[-10:]' );

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

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

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

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

});

0 comments on commit df435a4

Please sign in to comment.