@@ -23,3 +23,164 @@ describe('getItemsInRanges', () => {
2323 ) . toEqual ( [ 1 , 3 , 4 ] ) ;
2424 } ) ;
2525} ) ;
26+
27+ describe ( 'isValidRange' , ( ) => {
28+ it ( 'returns true if the range is valid' , ( ) => {
29+ expect ( RangeUtils . isValidRange ( [ 0 , 10 ] ) ) . toBe ( true ) ;
30+ } ) ;
31+
32+ it ( 'returns false if the range is invalid' , ( ) => {
33+ expect ( RangeUtils . isValidRange ( [ 10 , 0 ] ) ) . toBe ( false ) ;
34+ } ) ;
35+ } ) ;
36+
37+ describe ( 'validateRange' , ( ) => {
38+ it ( 'throws an error if a range is invalid' , ( ) => {
39+ expect ( ( ) => RangeUtils . validateRange ( [ 10 , 0 ] ) ) . toThrowError (
40+ 'Invalid range! 10,0'
41+ ) ;
42+ } ) ;
43+ } ) ;
44+
45+ describe ( 'isSelected' , ( ) => {
46+ it ( 'returns true if the index is within the selected ranges' , ( ) => {
47+ expect (
48+ RangeUtils . isSelected (
49+ [
50+ [ 0 , 2 ] ,
51+ [ 3 , 4 ] ,
52+ ] ,
53+ 1
54+ )
55+ ) . toBe ( true ) ;
56+ } ) ;
57+
58+ it ( 'returns false if the index is not within one of the selected ranges' , ( ) => {
59+ expect (
60+ RangeUtils . isSelected (
61+ [
62+ [ 0 , 2 ] ,
63+ [ 3 , 4 ] ,
64+ ] ,
65+ 5
66+ )
67+ ) . toBe ( false ) ;
68+ } ) ;
69+ } ) ;
70+
71+ describe ( 'selectRange' , ( ) => {
72+ it ( 'returns the same selected ranges if the given range is already within a range' , ( ) => {
73+ expect (
74+ RangeUtils . selectRange (
75+ [
76+ [ 0 , 2 ] ,
77+ [ 3 , 4 ] ,
78+ [ 5 , 7 ] ,
79+ ] ,
80+ [ 0 , 1 ]
81+ )
82+ ) . toEqual ( [
83+ [ 0 , 2 ] ,
84+ [ 3 , 4 ] ,
85+ [ 5 , 7 ] ,
86+ ] ) ;
87+ } ) ;
88+
89+ it ( 'consolidates the previous ranges if they overlap' , ( ) => {
90+ expect (
91+ RangeUtils . selectRange (
92+ [
93+ [ 50 , 60 ] ,
94+ [ 10 , 20 ] ,
95+ [ 30 , 40 ] ,
96+ ] ,
97+ [ 15 , 35 ]
98+ )
99+ ) . toEqual ( [
100+ [ 50 , 60 ] ,
101+ [ 10 , 40 ] ,
102+ ] ) ;
103+ } ) ;
104+ } ) ;
105+
106+ describe ( 'deselectRanges' , ( ) => {
107+ it ( 'returns the same selected ranges if the given range is not selected' , ( ) => {
108+ expect (
109+ RangeUtils . deselectRange (
110+ [
111+ [ 50 , 60 ] ,
112+ [ 10 , 20 ] ,
113+ [ 30 , 40 ] ,
114+ ] ,
115+ [ 0 , 1 ]
116+ )
117+ ) . toEqual ( [
118+ [ 50 , 60 ] ,
119+ [ 10 , 20 ] ,
120+ [ 30 , 40 ] ,
121+ ] ) ;
122+ } ) ;
123+
124+ it ( 'splits a range if the given range is fully contained within another range' , ( ) => {
125+ expect (
126+ RangeUtils . deselectRange (
127+ [
128+ [ 50 , 60 ] ,
129+ [ 10 , 20 ] ,
130+ [ 30 , 40 ] ,
131+ ] ,
132+ [ 55 , 57 ]
133+ )
134+ ) . toEqual ( [
135+ [ 50 , 54 ] ,
136+ [ 58 , 60 ] ,
137+ [ 10 , 20 ] ,
138+ [ 30 , 40 ] ,
139+ ] ) ;
140+ } ) ;
141+
142+ it ( 'removes a range if the given range fully engulfs the range' , ( ) => {
143+ expect (
144+ RangeUtils . deselectRange (
145+ [
146+ [ 50 , 60 ] ,
147+ [ 10 , 20 ] ,
148+ [ 30 , 40 ] ,
149+ ] ,
150+ [ 5 , 25 ]
151+ )
152+ ) . toEqual ( [
153+ [ 50 , 60 ] ,
154+ [ 30 , 40 ] ,
155+ ] ) ;
156+ } ) ;
157+
158+ it ( 'trims a range if the given range overlaps the start or end of a range' , ( ) => {
159+ expect (
160+ RangeUtils . deselectRange (
161+ [
162+ [ 50 , 60 ] ,
163+ [ 10 , 20 ] ,
164+ [ 30 , 40 ] ,
165+ ] ,
166+ [ 15 , 35 ]
167+ )
168+ ) . toEqual ( [
169+ [ 50 , 60 ] ,
170+ [ 10 , 14 ] ,
171+ [ 36 , 40 ] ,
172+ ] ) ;
173+ } ) ;
174+ } ) ;
175+
176+ describe ( 'count' , ( ) => {
177+ it ( 'should return the total number of items in the given ranges' , ( ) => {
178+ expect (
179+ RangeUtils . count ( [
180+ [ 50 , 60 ] ,
181+ [ 10 , 20 ] ,
182+ [ 30 , 40 ] ,
183+ ] )
184+ ) . toEqual ( 33 ) ;
185+ } ) ;
186+ } ) ;
0 commit comments