| import { describe, expect, test, tier } from 'claude-code/testing' |
|
|
| import Parse from '../../../hooks/git/parse' |
| import Limits from '../../../hooks/limits' |
| import Fixtures from '../../fixtures' |
|
|
| tier('builtin') |
|
|
| describe('parse-file-diff', () => { |
| test('hunk starts and marked lines; header and notes skipped', () => { |
| const parsed = Parse.parseFileDiff( |
| `${Fixtures.FILE_DIFF_HEADER}@@ -1,3 +1,3 @@\n one\n-two\n+two ` + |
| `changed\n three\n\\ No newline at end of file\n@@ -10 +10,2 @@ fn\n ` + |
| `ctx\n+added\n`, |
| ) |
|
|
| expect(parsed.isLarge).toBe(false) |
| expect(parsed.isTruncated).toBe(false) |
|
|
| expect(parsed.hunks).toEqual([ |
| { |
| oldStart: 1, |
| newStart: 1, |
| lines: [' one', '-two', '+two changed', ' three'], |
| }, |
| { oldStart: 10, newStart: 10, lines: [' ctx', '+added'] }, |
| ]) |
| }) |
|
|
| test('a removed line that starts with dashes is body, not a header', () => { |
| expect( |
| Parse.parseFileDiff( |
| `${Fixtures.FILE_DIFF_HEADER}@@ -1 +1 @@\n---- old rule\n+--- new ` + |
| `rule\n`, |
| ).hunks[0]?.lines, |
| ).toEqual(['---- old rule', '+--- new rule']) |
| }) |
|
|
| test('the body is cut at the line cap and marked truncated', () => { |
| const body = Array.from( |
| { length: Limits.MAX_LINES_PER_FILE + Fixtures.PAST_THE_CAP }, |
| (_, at) => `+${at}`, |
| ).join('\n') |
|
|
| const parsed = Parse.parseFileDiff( |
| `${Fixtures.FILE_DIFF_HEADER}@@ -0,0 +1,405 @@\n${body}\n`, |
| ) |
|
|
| expect(parsed.hunks[0]?.lines).toHaveLength(Limits.MAX_LINES_PER_FILE) |
| expect(parsed.isTruncated).toBe(true) |
| }) |
|
|
| test('a diff past the byte cap is large and has no hunks', () => { |
| expect( |
| Parse.parseFileDiff( |
| `${Fixtures.FILE_DIFF_HEADER}@@ -1 +1 ` + |
| `@@\n+${'x'.repeat(Limits.MAX_DIFF_BYTES)}\n`, |
| ), |
| ).toEqual({ hunks: [], isTruncated: false, isLarge: true }) |
| }) |
| }) |
|
|