72 lines
2.4 KiB
TypeScript
72 lines
2.4 KiB
TypeScript
import { describe, it, expect } from 'vitest'
|
|
import { buildDiff, makeDiff } from '../src/renderer/src/diff'
|
|
|
|
describe('buildDiff', () => {
|
|
it('reports no changes for identical text', () => {
|
|
const d = buildDiff('a\nb\nc\n', 'a\nb\nc\n')
|
|
expect(d.add).toBe(0)
|
|
expect(d.del).toBe(0)
|
|
expect(d.rows.every((r) => r.sign === ' ')).toBe(true)
|
|
})
|
|
|
|
it('counts a single changed line as one add + one del', () => {
|
|
const d = buildDiff('a\nb\nc', 'a\nB\nc')
|
|
expect(d.add).toBe(1)
|
|
expect(d.del).toBe(1)
|
|
const signs = d.rows.map((r) => r.sign).join('')
|
|
expect(signs).toContain('-')
|
|
expect(signs).toContain('+')
|
|
})
|
|
|
|
it('treats an empty original as all additions (new file)', () => {
|
|
const d = buildDiff('', 'x\ny')
|
|
expect(d.add).toBe(2)
|
|
expect(d.del).toBe(0)
|
|
expect(d.left).toHaveLength(0)
|
|
expect(d.right).toHaveLength(2)
|
|
})
|
|
|
|
it('treats an empty updated as all deletions (deleted file)', () => {
|
|
const d = buildDiff('x\ny\nz', '')
|
|
expect(d.del).toBe(3)
|
|
expect(d.add).toBe(0)
|
|
expect(d.right).toHaveLength(0)
|
|
})
|
|
|
|
it('marks the changed line on both sides', () => {
|
|
const d = buildDiff('keep\nold\nkeep', 'keep\nnew\nkeep')
|
|
expect(d.left.find((l) => l.text === 'old')?.mark).toBe('del')
|
|
expect(d.right.find((l) => l.text === 'new')?.mark).toBe('add')
|
|
expect(d.left.find((l) => l.text === 'keep')?.mark).toBeNull()
|
|
})
|
|
|
|
it('aligns split rows: same lines pair, changes stack into the gap', () => {
|
|
const d = buildDiff('a\nold\nb', 'a\nnew\nb')
|
|
// every split row has at least one side
|
|
expect(d.split.every((r) => r.l || r.r)).toBe(true)
|
|
// the matched 'a' and 'b' lines pair on both sides
|
|
const paired = d.split.filter((r) => r.l && r.r && r.l.text === r.r.text)
|
|
expect(paired.map((r) => r.l!.text)).toEqual(['a', 'b'])
|
|
})
|
|
|
|
it('ignores a single trailing newline difference', () => {
|
|
const d = buildDiff('a\nb', 'a\nb\n')
|
|
expect(d.add).toBe(0)
|
|
expect(d.del).toBe(0)
|
|
})
|
|
})
|
|
|
|
describe('makeDiff', () => {
|
|
it('flags added / deleted and carries the text pair', () => {
|
|
const added = makeDiff('A', '', 'hi')
|
|
expect(added.added).toBe(true)
|
|
expect(added.deleted).toBe(false)
|
|
expect(added.original).toBe('')
|
|
expect(added.updated).toBe('hi')
|
|
|
|
const deleted = makeDiff('D', 'bye', '')
|
|
expect(deleted.deleted).toBe(true)
|
|
expect(deleted.added).toBe(false)
|
|
})
|
|
})
|