diff --git a/src/__tests__/diff2html-tests.ts b/src/__tests__/diff2html-tests.ts index 6528b404..eeeae5c0 100644 --- a/src/__tests__/diff2html-tests.ts +++ b/src/__tests__/diff2html-tests.ts @@ -157,26 +157,32 @@ describe('Diff2Html', () => { "type": "delete", }, { - "content": "+ TokenRevoked, MissingToken,", + "content": "\\ No newline at end of file", "newNumber": 53, + "oldNumber": 55, + "type": "context", + }, + { + "content": "+ TokenRevoked, MissingToken,", + "newNumber": 54, "oldNumber": undefined, "type": "insert", }, { "content": "+ IndexLock, RepositoryError, NotValidRepo, PullRequestNotMergeable, BranchError,", - "newNumber": 54, + "newNumber": 55, "oldNumber": undefined, "type": "insert", }, { "content": "+ PluginError, CodeParserError, EngineError = Value", - "newNumber": 55, + "newNumber": 56, "oldNumber": undefined, "type": "insert", }, { "content": "+}", - "newNumber": 56, + "newNumber": 57, "oldNumber": undefined, "type": "insert", }, diff --git a/src/__tests__/side-by-side-printer-tests.ts b/src/__tests__/side-by-side-printer-tests.ts index ab886aba..3ea0cb7f 100644 --- a/src/__tests__/side-by-side-printer-tests.ts +++ b/src/__tests__/side-by-side-printer-tests.ts @@ -407,6 +407,357 @@ describe('SideBySideRenderer', () => { `); }); + it('should handle files without newlines at the end', () => { + const exampleJson: DiffFile[] = [ + { + blocks: [ + // Scenario 1: Old file missing newline, new file has newline + { + lines: [ + { + content: '-oldLine1', + type: LineType.DELETE, + oldNumber: 1, + newNumber: undefined, + }, + { + content: '\\ No newline at end of file', + type: LineType.CONTEXT, + oldNumber: 1, + newNumber: 1, + }, + { + content: '+newLine1', + type: LineType.INSERT, + oldNumber: undefined, + newNumber: 1, + }, + ], + oldStartLine: 1, + newStartLine: 1, + header: '@@ -1 +1 @@', + }, + // Scenario 2: Old file has newline, new file missing newline + { + lines: [ + { + content: '-oldLine2', + type: LineType.DELETE, + oldNumber: 2, + newNumber: undefined, + }, + { + content: '+newLine2', + type: LineType.INSERT, + oldNumber: undefined, + newNumber: 2, + }, + { + content: '\\ No newline at end of file', + type: LineType.CONTEXT, + oldNumber: 2, + newNumber: 2, + }, + ], + oldStartLine: 2, + newStartLine: 2, + header: '@@ -2 +2 @@', + }, + // Scenario 3: Both files missing newline + { + lines: [ + { + content: '-oldLine3', + type: LineType.DELETE, + oldNumber: 3, + newNumber: undefined, + }, + { + content: '\\ No newline at end of file', + type: LineType.CONTEXT, + oldNumber: 3, + newNumber: 3, + }, + { + content: '+newLine3', + type: LineType.INSERT, + oldNumber: undefined, + newNumber: 3, + }, + { + content: '\\ No newline at end of file', + type: LineType.CONTEXT, + oldNumber: 3, + newNumber: 3, + }, + ], + oldStartLine: 3, + newStartLine: 3, + header: '@@ -3 +3 @@', + }, + ], + deletedLines: 3, + addedLines: 3, + oldName: 'sample', + language: 'txt', + newName: 'sample', + isCombined: false, + isGitDiff: true, + }, + ]; + + const hoganUtils = new HoganJsUtils({}); + const sideBySideRenderer = new SideBySideRenderer(hoganUtils, {}); + const html = sideBySideRenderer.render(exampleJson); + expect(html).toMatchInlineSnapshot(` + "
+ |
+ @@ -1 +1 @@
+ |
+
+ 1 + | +
+
+ -
+ oldLine1
+
+ |
+
+ 1 + | +
+
+ \\
+ No newline at end of file
+
+ |
+
+ + | +
+
+
+
+ + |
+
+ |
+ @@ -2 +2 @@
+ |
+
+ 2 + | +
+
+ -
+
+ |
+
+ + | +
+
+
+
+ + |
+
+ |
+ @@ -3 +3 @@
+ |
+
+ 3 + | +
+
+ -
+ oldLine3
+
+ |
+
+ 3 + | +
+
+ \\
+ No newline at end of file
+
+ |
+
+ + | +
+
+
+
+ + |
+
+ + | +
+
+
+
+ + |
+
+ |
+ |
+
+ + | +
+
+
+
+ + |
+
+ + | +
+
+
+
+ + |
+
+ 1 + | +
+
+ +
+ newLine1
+
+ |
+
+ |
+ |
+
+ 2 + | +
+
+ +
+ newLine2
+
+ |
+
+ 2 + | +
+
+ \\
+ No newline at end of file
+
+ |
+
+ |
+ |
+
+ + | +
+
+
+
+ + |
+
+ + | +
+
+
+
+ + |
+
+ 3 + | +
+
+ +
+ newLine3
+
+ |
+
+ 3 + | +
+
+ \\
+ No newline at end of file
+
+ |
+