@@ -97,4 +97,195 @@ describe('ResultsUi', () => {
9797 ) ;
9898 } ) ;
9999 } ) ;
100+
101+ describe ( 'selection mode' , ( ) => {
102+ let folders : CliScanFoundFolder [ ] ;
103+
104+ beforeEach ( ( ) => {
105+ folders = [
106+ { path : 'folder/1' , size : 1 , status : 'live' } as CliScanFoundFolder ,
107+ { path : 'folder/2' , size : 1 , status : 'live' } as CliScanFoundFolder ,
108+ { path : 'folder/3' , size : 1 , status : 'live' } as CliScanFoundFolder ,
109+ ] ;
110+
111+ resultsServiceMock . results = folders ;
112+ resultsUi = new ResultsUi ( resultsServiceMock , consoleServiceMock ) ;
113+ } ) ;
114+
115+ it ( 'should toggle select mode on and off with "t"' , ( ) => {
116+ expect ( resultsUi [ 'selectMode' ] ) . toBe ( false ) ;
117+
118+ resultsUi . onKeyInput ( {
119+ name : 't' ,
120+ meta : false ,
121+ ctrl : false ,
122+ shift : false ,
123+ sequence : 't' ,
124+ } ) ;
125+ expect ( resultsUi [ 'selectMode' ] ) . toBe ( true ) ;
126+
127+ resultsUi . onKeyInput ( {
128+ name : 't' ,
129+ meta : false ,
130+ ctrl : false ,
131+ shift : false ,
132+ sequence : 't' ,
133+ } ) ;
134+ expect ( resultsUi [ 'selectMode' ] ) . toBe ( false ) ;
135+ expect ( resultsUi [ 'selectedFolders' ] . size ) . toBe ( 0 ) ;
136+ } ) ;
137+
138+ it ( 'should select and unselect folder with space' , ( ) => {
139+ resultsUi . onKeyInput ( {
140+ name : 't' ,
141+ meta : false ,
142+ ctrl : false ,
143+ shift : false ,
144+ sequence : 't' ,
145+ } ) ; // enable select mode
146+
147+ resultsUi . onKeyInput ( {
148+ name : 'space' ,
149+ meta : false ,
150+ ctrl : false ,
151+ shift : false ,
152+ sequence : ' ' ,
153+ } ) ;
154+ expect ( resultsUi [ 'selectedFolders' ] . has ( 'folder/1' ) ) . toBe ( true ) ;
155+
156+ resultsUi . onKeyInput ( {
157+ name : 'space' ,
158+ meta : false ,
159+ ctrl : false ,
160+ shift : false ,
161+ sequence : ' ' ,
162+ } ) ;
163+ expect ( resultsUi [ 'selectedFolders' ] . has ( 'folder/1' ) ) . toBe ( false ) ;
164+ } ) ;
165+
166+ it ( 'should start and end range selection with "v"' , ( ) => {
167+ resultsUi . onKeyInput ( {
168+ name : 't' ,
169+ meta : false ,
170+ ctrl : false ,
171+ shift : false ,
172+ sequence : 't' ,
173+ } ) ; // select mode on
174+
175+ resultsUi . onKeyInput ( {
176+ name : 'v' ,
177+ meta : false ,
178+ ctrl : false ,
179+ shift : false ,
180+ sequence : 'v' ,
181+ } ) ; // start range
182+ expect ( resultsUi [ 'isRangeSelectionMode' ] ) . toBe ( true ) ;
183+ expect ( resultsUi [ 'rangeSelectionStart' ] ) . toBe ( 0 ) ;
184+
185+ resultsUi . onKeyInput ( {
186+ name : 'down' ,
187+ meta : false ,
188+ ctrl : false ,
189+ shift : false ,
190+ sequence : '\u001b[B' ,
191+ } ) ; // move to folder/2
192+ expect ( resultsUi [ 'selectedFolders' ] . has ( 'folder/1' ) ) . toBe ( true ) ;
193+ expect ( resultsUi [ 'selectedFolders' ] . has ( 'folder/2' ) ) . toBe ( true ) ;
194+
195+ resultsUi . onKeyInput ( {
196+ name : 'v' ,
197+ meta : false ,
198+ ctrl : false ,
199+ shift : false ,
200+ sequence : 'v' ,
201+ } ) ; // end range
202+ expect ( resultsUi [ 'isRangeSelectionMode' ] ) . toBe ( false ) ;
203+ expect ( resultsUi [ 'rangeSelectionStart' ] ) . toBe ( null ) ;
204+ } ) ;
205+
206+ it ( 'should delete all selected folders on enter' , ( ) => {
207+ const spy = jest . spyOn ( resultsUi [ 'delete$' ] , 'next' ) ;
208+
209+ resultsUi . onKeyInput ( {
210+ name : 't' ,
211+ meta : false ,
212+ ctrl : false ,
213+ shift : false ,
214+ sequence : 't' ,
215+ } ) ; // selection mode
216+ resultsUi . onKeyInput ( {
217+ name : 'space' ,
218+ meta : false ,
219+ ctrl : false ,
220+ shift : false ,
221+ sequence : ' ' ,
222+ } ) ; // select folder/1
223+ resultsUi . onKeyInput ( {
224+ name : 'down' ,
225+ meta : false ,
226+ ctrl : false ,
227+ shift : false ,
228+ sequence : '\u001b[B' ,
229+ } ) ;
230+ resultsUi . onKeyInput ( {
231+ name : 'space' ,
232+ meta : false ,
233+ ctrl : false ,
234+ shift : false ,
235+ sequence : ' ' ,
236+ } ) ; // select folder/2
237+
238+ resultsUi . onKeyInput ( {
239+ name : 'enter' ,
240+ meta : false ,
241+ ctrl : false ,
242+ shift : false ,
243+ sequence : '\r' ,
244+ } ) ;
245+
246+ expect ( spy ) . toHaveBeenCalledTimes ( 2 ) ;
247+ expect ( spy ) . toHaveBeenCalledWith ( folders [ 0 ] ) ;
248+ expect ( spy ) . toHaveBeenCalledWith ( folders [ 1 ] ) ;
249+
250+ expect ( resultsUi [ 'selectedFolders' ] . size ) . toBe ( 0 ) ;
251+ } ) ;
252+
253+ it ( 'should clear range selection when toggling mode off' , ( ) => {
254+ resultsUi . onKeyInput ( {
255+ name : 't' ,
256+ meta : false ,
257+ ctrl : false ,
258+ shift : false ,
259+ sequence : 't' ,
260+ } ) ; // selection mode on
261+ resultsUi . onKeyInput ( {
262+ name : 'v' ,
263+ meta : false ,
264+ ctrl : false ,
265+ shift : false ,
266+ sequence : 'v' ,
267+ } ) ; // start range
268+ resultsUi . onKeyInput ( {
269+ name : 'down' ,
270+ meta : false ,
271+ ctrl : false ,
272+ shift : false ,
273+ sequence : '\u001b[B' ,
274+ } ) ; // move and apply range
275+
276+ expect ( resultsUi [ 'selectedFolders' ] . size ) . toBe ( 2 ) ;
277+ expect ( resultsUi [ 'isRangeSelectionMode' ] ) . toBe ( true ) ;
278+
279+ resultsUi . onKeyInput ( {
280+ name : 't' ,
281+ meta : false ,
282+ ctrl : false ,
283+ shift : false ,
284+ sequence : 't' ,
285+ } ) ; // toggle mode off
286+ expect ( resultsUi [ 'selectMode' ] ) . toBe ( false ) ;
287+ expect ( resultsUi [ 'selectedFolders' ] . size ) . toBe ( 0 ) ;
288+ expect ( resultsUi [ 'rangeSelectionStart' ] ) . toBe ( null ) ;
289+ } ) ;
290+ } ) ;
100291} ) ;
0 commit comments