@@ -140,21 +140,15 @@ describe('diff', () => {
140140 } )
141141
142142 describe ( 'computeDiff' , ( ) => {
143- const mockLeftDocument = {
144- getText : ( ) => 'line1\nline2' ,
143+ const mockOriginalDocument = {
144+ getText : ( ) => 'line1\nline2\nline3\n ' ,
145145 uri : vscode . Uri . file ( 'test.txt' ) ,
146146 fileName : 'test.txt' ,
147147 }
148148
149- const mockRightDocument = {
150- getText : ( ) => 'line1\nline3\nline4\nline5' ,
151- uri : vscode . Uri . file ( 'test.txt' ) ,
152- fileName : 'test.txt' ,
153- }
154-
155- it ( 'returns 0 added or removed chars and lines for the same file' , async ( ) => {
149+ it ( 'returns no addition or removal for the same file' , async ( ) => {
156150 sandbox . stub ( FileSystem . prototype , 'exists' ) . resolves ( true )
157- sandbox . stub ( vscode . workspace , 'openTextDocument' ) . resolves ( mockLeftDocument as unknown as TextDocument )
151+ sandbox . stub ( vscode . workspace , 'openTextDocument' ) . resolves ( mockOriginalDocument as unknown as TextDocument )
158152
159153 const { changes, charsAdded, linesAdded, charsRemoved, linesRemoved } = await computeDiff (
160154 filePath ,
@@ -164,8 +158,8 @@ describe('diff', () => {
164158
165159 const expectedChanges = [
166160 {
167- count : 2 ,
168- value : 'line1\nline2' ,
161+ count : 3 ,
162+ value : 'line1\nline2\nline3\n ' ,
169163 } ,
170164 ]
171165
@@ -176,14 +170,19 @@ describe('diff', () => {
176170 assert . equal ( linesRemoved , 0 )
177171 } )
178172
179- it ( 'returns expected added or removed chars and lines for different files' , async ( ) => {
173+ it ( 'counts insertion of new line' , async ( ) => {
174+ const mockInsertionDocument = {
175+ getText : ( ) => 'line1\ninserted\nline2\nline3\n' ,
176+ uri : vscode . Uri . file ( 'test.txt' ) ,
177+ fileName : 'test.txt' ,
178+ }
180179 sandbox . stub ( FileSystem . prototype , 'exists' ) . resolves ( true )
181180 sandbox
182181 . stub ( vscode . workspace , 'openTextDocument' )
183182 . onFirstCall ( )
184- . resolves ( mockLeftDocument as unknown as TextDocument )
183+ . resolves ( mockOriginalDocument as unknown as TextDocument )
185184 . onSecondCall ( )
186- . resolves ( mockRightDocument as unknown as TextDocument )
185+ . resolves ( mockInsertionDocument as unknown as TextDocument )
187186
188187 const { changes, charsAdded, linesAdded, charsRemoved, linesRemoved } = await computeDiff (
189188 filePath ,
@@ -197,24 +196,294 @@ describe('diff', () => {
197196 value : 'line1\n' ,
198197 } ,
199198 {
199+ added : true ,
200200 count : 1 ,
201+ removed : undefined ,
202+ value : 'inserted\n' ,
203+ } ,
204+ {
205+ count : 2 ,
206+ value : 'line2\nline3\n' ,
207+ } ,
208+ ]
209+
210+ assert . deepEqual ( changes , expectedChanges )
211+ assert . equal ( charsAdded , 8 )
212+ assert . equal ( linesAdded , 1 )
213+ assert . equal ( charsRemoved , 0 )
214+ assert . equal ( linesRemoved , 0 )
215+ } )
216+
217+ it ( 'counts insertion of multiple lines' , async ( ) => {
218+ const mockMultipleInsertionDocument = {
219+ getText : ( ) => 'line1\ninserted1\ninserted2\nline2\nline3\ninserted3\n' ,
220+ uri : vscode . Uri . file ( 'test.txt' ) ,
221+ fileName : 'test.txt' ,
222+ }
223+ sandbox . stub ( FileSystem . prototype , 'exists' ) . resolves ( true )
224+ sandbox
225+ . stub ( vscode . workspace , 'openTextDocument' )
226+ . onFirstCall ( )
227+ . resolves ( mockOriginalDocument as unknown as TextDocument )
228+ . onSecondCall ( )
229+ . resolves ( mockMultipleInsertionDocument as unknown as TextDocument )
230+
231+ const { changes, charsAdded, linesAdded, charsRemoved, linesRemoved } = await computeDiff (
232+ filePath ,
233+ rightPath ,
234+ tabId
235+ )
236+
237+ const expectedChanges = [
238+ {
239+ count : 1 ,
240+ value : 'line1\n' ,
241+ } ,
242+ {
243+ added : true ,
244+ count : 2 ,
245+ removed : undefined ,
246+ value : 'inserted1\ninserted2\n' ,
247+ } ,
248+ {
249+ count : 2 ,
250+ value : 'line2\nline3\n' ,
251+ } ,
252+ {
253+ added : true ,
254+ count : 1 ,
255+ removed : undefined ,
256+ value : 'inserted3\n' ,
257+ } ,
258+ ]
259+
260+ assert . deepEqual ( changes , expectedChanges )
261+ assert . equal ( charsAdded , 27 )
262+ assert . equal ( linesAdded , 3 )
263+ assert . equal ( charsRemoved , 0 )
264+ assert . equal ( linesRemoved , 0 )
265+ } )
266+
267+ it ( 'counts modification of existing line' , async ( ) => {
268+ const mockModificationDocument = {
269+ getText : ( ) => 'line1\nmodified\nline3\n' ,
270+ uri : vscode . Uri . file ( 'test.txt' ) ,
271+ fileName : 'test.txt' ,
272+ }
273+ sandbox . stub ( FileSystem . prototype , 'exists' ) . resolves ( true )
274+ sandbox
275+ . stub ( vscode . workspace , 'openTextDocument' )
276+ . onFirstCall ( )
277+ . resolves ( mockOriginalDocument as unknown as TextDocument )
278+ . onSecondCall ( )
279+ . resolves ( mockModificationDocument as unknown as TextDocument )
280+
281+ const { changes, charsAdded, linesAdded, charsRemoved, linesRemoved } = await computeDiff (
282+ filePath ,
283+ rightPath ,
284+ tabId
285+ )
286+
287+ const expectedChanges = [
288+ {
289+ count : 1 ,
290+ value : 'line1\n' ,
291+ } ,
292+ {
201293 added : undefined ,
294+ count : 1 ,
202295 removed : true ,
203- value : 'line2' ,
296+ value : 'line2\n ' ,
204297 } ,
205298 {
206- count : 3 ,
207299 added : true ,
300+ count : 1 ,
208301 removed : undefined ,
209- value : 'line3\nline4\nline5' ,
302+ value : 'modified\n' ,
303+ } ,
304+ {
305+ count : 1 ,
306+ value : 'line3\n' ,
210307 } ,
211308 ]
212309
213310 assert . deepEqual ( changes , expectedChanges )
214- assert . equal ( charsAdded , 15 )
215- assert . equal ( linesAdded , 3 )
311+ assert . equal ( charsAdded , 8 )
312+ assert . equal ( linesAdded , 1 )
313+ assert . equal ( charsRemoved , 5 )
314+ assert . equal ( linesRemoved , 1 )
315+ } )
316+
317+ it ( 'counts deletion of existing line' , async ( ) => {
318+ const mockDeletionDocument = {
319+ getText : ( ) => 'line1\nline3\n' ,
320+ uri : vscode . Uri . file ( 'test.txt' ) ,
321+ fileName : 'test.txt' ,
322+ }
323+ sandbox . stub ( FileSystem . prototype , 'exists' ) . resolves ( true )
324+ sandbox
325+ . stub ( vscode . workspace , 'openTextDocument' )
326+ . onFirstCall ( )
327+ . resolves ( mockOriginalDocument as unknown as TextDocument )
328+ . onSecondCall ( )
329+ . resolves ( mockDeletionDocument as unknown as TextDocument )
330+
331+ const { changes, charsAdded, linesAdded, charsRemoved, linesRemoved } = await computeDiff (
332+ filePath ,
333+ rightPath ,
334+ tabId
335+ )
336+
337+ const expectedChanges = [
338+ {
339+ count : 1 ,
340+ value : 'line1\n' ,
341+ } ,
342+ {
343+ added : undefined ,
344+ count : 1 ,
345+ removed : true ,
346+ value : 'line2\n' ,
347+ } ,
348+ {
349+ count : 1 ,
350+ value : 'line3\n' ,
351+ } ,
352+ ]
353+
354+ assert . deepEqual ( changes , expectedChanges )
355+ assert . equal ( charsAdded , 0 )
356+ assert . equal ( linesAdded , 0 )
216357 assert . equal ( charsRemoved , 5 )
217358 assert . equal ( linesRemoved , 1 )
218359 } )
360+
361+ it ( 'counts deletion of existing line and then adding a new line' , async ( ) => {
362+ const mockDeletionAndAdditionDocument = {
363+ getText : ( ) => 'line1\nline3\nline4\n' ,
364+ uri : vscode . Uri . file ( 'test.txt' ) ,
365+ fileName : 'test.txt' ,
366+ }
367+ sandbox . stub ( FileSystem . prototype , 'exists' ) . resolves ( true )
368+ sandbox
369+ . stub ( vscode . workspace , 'openTextDocument' )
370+ . onFirstCall ( )
371+ . resolves ( mockOriginalDocument as unknown as TextDocument )
372+ . onSecondCall ( )
373+ . resolves ( mockDeletionAndAdditionDocument as unknown as TextDocument )
374+
375+ const { changes, charsAdded, linesAdded, charsRemoved, linesRemoved } = await computeDiff (
376+ filePath ,
377+ rightPath ,
378+ tabId
379+ )
380+
381+ const expectedChanges = [
382+ {
383+ count : 1 ,
384+ value : 'line1\n' ,
385+ } ,
386+ {
387+ added : undefined ,
388+ count : 1 ,
389+ removed : true ,
390+ value : 'line2\n' ,
391+ } ,
392+ {
393+ count : 1 ,
394+ value : 'line3\n' ,
395+ } ,
396+ {
397+ added : true ,
398+ count : 1 ,
399+ removed : undefined ,
400+ value : 'line4\n' ,
401+ } ,
402+ ]
403+
404+ assert . deepEqual ( changes , expectedChanges )
405+ assert . equal ( charsAdded , 5 )
406+ assert . equal ( linesAdded , 1 )
407+ assert . equal ( charsRemoved , 5 )
408+ assert . equal ( linesRemoved , 1 )
409+ } )
410+
411+ it ( 'counts a new empty line' , async ( ) => {
412+ const mockEmptyLineDocument = {
413+ getText : ( ) => 'line1\nline2\n\nline3\n' ,
414+ uri : vscode . Uri . file ( 'test.txt' ) ,
415+ fileName : 'test.txt' ,
416+ }
417+ sandbox . stub ( FileSystem . prototype , 'exists' ) . resolves ( true )
418+ sandbox
419+ . stub ( vscode . workspace , 'openTextDocument' )
420+ . onFirstCall ( )
421+ . resolves ( mockOriginalDocument as unknown as TextDocument )
422+ . onSecondCall ( )
423+ . resolves ( mockEmptyLineDocument as unknown as TextDocument )
424+
425+ const { changes, charsAdded, linesAdded, charsRemoved, linesRemoved } = await computeDiff (
426+ filePath ,
427+ rightPath ,
428+ tabId
429+ )
430+
431+ const expectedChanges = [
432+ {
433+ count : 2 ,
434+ value : 'line1\nline2\n' ,
435+ } ,
436+ {
437+ added : true ,
438+ count : 1 ,
439+ removed : undefined ,
440+ value : '\n' ,
441+ } ,
442+ {
443+ count : 1 ,
444+ value : 'line3\n' ,
445+ } ,
446+ ]
447+
448+ assert . deepEqual ( changes , expectedChanges )
449+ assert . equal ( charsAdded , 0 )
450+ assert . equal ( linesAdded , 1 )
451+ assert . equal ( charsRemoved , 0 )
452+ assert . equal ( linesRemoved , 0 )
453+ } )
454+
455+ it ( 'ignores leading and trailing whitespaces' , async ( ) => {
456+ const mockWhitespaceDocument = {
457+ getText : ( ) => ' line1 \n line2 \n line3 \n' ,
458+ uri : vscode . Uri . file ( 'test.txt' ) ,
459+ fileName : 'test.txt' ,
460+ }
461+ sandbox . stub ( FileSystem . prototype , 'exists' ) . resolves ( true )
462+ sandbox
463+ . stub ( vscode . workspace , 'openTextDocument' )
464+ . onFirstCall ( )
465+ . resolves ( mockOriginalDocument as unknown as TextDocument )
466+ . onSecondCall ( )
467+ . resolves ( mockWhitespaceDocument as unknown as TextDocument )
468+
469+ const { changes, charsAdded, linesAdded, charsRemoved, linesRemoved } = await computeDiff (
470+ filePath ,
471+ rightPath ,
472+ tabId
473+ )
474+
475+ const expectedChanges = [
476+ {
477+ count : 3 ,
478+ value : 'line1\nline2\nline3\n' ,
479+ } ,
480+ ]
481+
482+ assert . deepEqual ( changes , expectedChanges )
483+ assert . equal ( charsAdded , 0 )
484+ assert . equal ( linesAdded , 0 )
485+ assert . equal ( charsRemoved , 0 )
486+ assert . equal ( linesRemoved , 0 )
487+ } )
219488 } )
220489} )
0 commit comments