Skip to content

Commit f6e8bbc

Browse files
committed
add more tests to diff
1 parent a3d554a commit f6e8bbc

File tree

2 files changed

+292
-21
lines changed

2 files changed

+292
-21
lines changed

packages/core/src/amazonq/commons/diff.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ export async function computeDiff(leftPath: string, rightPath: string, tabId: st
3535
const leftFile = await vscode.workspace.openTextDocument(left)
3636
const rightFile = await vscode.workspace.openTextDocument(right)
3737

38-
const changes = diffLines(leftFile.getText(), rightFile.getText())
38+
const changes = diffLines(leftFile.getText(), rightFile.getText(), {
39+
ignoreWhitespace: true,
40+
})
3941

4042
let charsAdded = 0
4143
let charsRemoved = 0

packages/core/src/test/amazonq/common/diff.test.ts

Lines changed: 289 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)