@@ -19,7 +19,11 @@ import { expect } from 'chai';
19
19
20
20
import { primitiveComparator } from '../../../src/util/misc' ;
21
21
import { forEach } from '../../../src/util/obj' ;
22
- import { LLRBNode , SortedMap } from '../../../src/util/sorted_map' ;
22
+ import {
23
+ LLRBNode ,
24
+ SortedMap ,
25
+ SortedMapIterator
26
+ } from '../../../src/util/sorted_map' ;
23
27
24
28
function shuffle ( arr : number [ ] ) : void {
25
29
for ( let i = arr . length - 1 ; i > 0 ; i -- ) {
@@ -32,6 +36,41 @@ function shuffle(arr: number[]): void {
32
36
// Many of these were adapted from the mugs source code.
33
37
// http://mads379.github.com/mugs/
34
38
describe ( 'SortedMap Tests' , ( ) => {
39
+ /** Returns a map with (i, i) entries for i in [0, 9] inclusive */
40
+ function getMapOfNumbersZeroToNine ( ) : SortedMap < number , number > {
41
+ const items : number [ ] = [ ] ;
42
+ for ( let i = 0 ; i < 10 ; i ++ ) {
43
+ items . push ( i ) ;
44
+ }
45
+ shuffle ( items ) ;
46
+
47
+ let map = new SortedMap < number , number > ( primitiveComparator ) ;
48
+ for ( let i = 0 ; i < 10 ; i ++ ) {
49
+ map = map . insert ( items [ i ] , items [ i ] ) ;
50
+ }
51
+ return map ;
52
+ }
53
+
54
+ /**
55
+ * Validates that the given iterator covers the given range by counting from
56
+ * the given `from` argument to the given `to` argument (inclusive).
57
+ */
58
+ function validateIteratorCoversRange (
59
+ iterator : SortedMapIterator < number , number > ,
60
+ from : number ,
61
+ to : number
62
+ ) : void {
63
+ const countUp = from <= to ;
64
+ let expected = from ;
65
+ while ( iterator . hasNext ( ) ) {
66
+ const n = iterator . getNext ( ) ;
67
+ expect ( n . key ) . to . equal ( expected ) ;
68
+ expect ( n . value ) . to . equal ( expected ) ;
69
+ expected = countUp ? expected + 1 : expected - 1 ;
70
+ }
71
+ expect ( expected ) . to . equal ( countUp ? to + 1 : to - 1 ) ;
72
+ }
73
+
35
74
it ( 'Create node' , ( ) => {
36
75
const map = new SortedMap ( primitiveComparator ) . insert ( 'key' , 'value' ) ;
37
76
expect ( map . root . left . isEmpty ( ) ) . to . equal ( true ) ;
@@ -405,27 +444,46 @@ describe('SortedMap Tests', () => {
405
444
expect ( ( ) => iterator . getNext ( ) ) . to . throw ( ) ;
406
445
} ) ;
407
446
408
- it ( 'SortedMapIterator test with 10 items.' , ( ) => {
409
- const items : number [ ] = [ ] ;
410
- for ( let i = 0 ; i < 10 ; i ++ ) {
411
- items . push ( i ) ;
412
- }
413
- shuffle ( items ) ;
447
+ it ( 'forward iterator without start key' , ( ) => {
448
+ const iterator = getMapOfNumbersZeroToNine ( ) . getIterator ( ) ;
449
+ validateIteratorCoversRange ( iterator , 0 , 9 ) ;
450
+ } ) ;
414
451
415
- let map = new SortedMap ( primitiveComparator ) ;
416
- for ( let i = 0 ; i < 10 ; i ++ ) {
417
- map = map . insert ( items [ i ] , items [ i ] ) ;
418
- }
452
+ it ( 'forward iterator with start key.' , ( ) => {
453
+ const iterator = getMapOfNumbersZeroToNine ( ) . getIteratorFrom ( 5 ) ;
454
+ validateIteratorCoversRange ( iterator , 5 , 9 ) ;
455
+ } ) ;
419
456
420
- const iterator = map . getIterator ( ) ;
421
- let expected = 0 ;
422
- while ( iterator . hasNext ( ) ) {
423
- const n = iterator . getNext ( ) ;
424
- expect ( n . key ) . to . equal ( expected ) ;
425
- expect ( n . value ) . to . equal ( expected ) ;
426
- expected ++ ;
427
- }
428
- expect ( expected ) . to . equal ( 10 ) ;
457
+ it ( 'forward iterator with start key larger than max key' , ( ) => {
458
+ const iterator = getMapOfNumbersZeroToNine ( ) . getIteratorFrom ( 50 ) ;
459
+ expect ( iterator . hasNext ( ) ) . to . equal ( false ) ;
460
+ expect ( ( ) => iterator . getNext ( ) ) . to . throw ( ) ;
461
+ } ) ;
462
+
463
+ it ( 'forward iterator with start key smaller than min key' , ( ) => {
464
+ const iterator = getMapOfNumbersZeroToNine ( ) . getIteratorFrom ( - 50 ) ;
465
+ validateIteratorCoversRange ( iterator , 0 , 9 ) ;
466
+ } ) ;
467
+
468
+ it ( 'reverse iterator without start key' , ( ) => {
469
+ const iterator = getMapOfNumbersZeroToNine ( ) . getReverseIterator ( ) ;
470
+ validateIteratorCoversRange ( iterator , 9 , 0 ) ;
471
+ } ) ;
472
+
473
+ it ( 'reverse iterator with start key.' , ( ) => {
474
+ const iterator = getMapOfNumbersZeroToNine ( ) . getReverseIteratorFrom ( 7 ) ;
475
+ validateIteratorCoversRange ( iterator , 7 , 0 ) ;
476
+ } ) ;
477
+
478
+ it ( 'reverse iterator with start key smaller than min key' , ( ) => {
479
+ const iterator = getMapOfNumbersZeroToNine ( ) . getReverseIteratorFrom ( - 50 ) ;
480
+ expect ( iterator . hasNext ( ) ) . to . equal ( false ) ;
481
+ expect ( ( ) => iterator . getNext ( ) ) . to . throw ( ) ;
482
+ } ) ;
483
+
484
+ it ( 'reverse iterator with start key larger than max key' , ( ) => {
485
+ const iterator = getMapOfNumbersZeroToNine ( ) . getReverseIteratorFrom ( 50 ) ;
486
+ validateIteratorCoversRange ( iterator , 9 , 0 ) ;
429
487
} ) ;
430
488
431
489
it ( 'SortedMap.indexOf returns index.' , ( ) => {
0 commit comments