import SideBySideRenderer from "../side-by-side-renderer"; import HoganJsUtils from "../hoganjs-utils"; import { LineType, DiffLine, DiffFile, LineMatchingType } from "../types"; import { CSSLineClass } from "../render-utils"; describe("SideBySideRenderer", () => { describe("generateEmptyDiff", () => { it("should return an empty diff", () => { const hoganUtils = new HoganJsUtils({}); const sideBySideRenderer = new SideBySideRenderer(hoganUtils, {}); const fileHtml = sideBySideRenderer.generateEmptyDiff(); const expectedRight = ""; const expectedLeft = "\n" + ' \n' + '
\n' + " File without changes\n" + "
\n" + " \n" + ""; expect(fileHtml.right).toEqual(expectedRight); expect(fileHtml.left).toEqual(expectedLeft); }); }); describe("generateSideBySideFileHtml", () => { it("should generate lines with the right prefixes", () => { const hoganUtils = new HoganJsUtils({}); const sideBySideRenderer = new SideBySideRenderer(hoganUtils, {}); const file: DiffFile = { isGitDiff: true, blocks: [ { lines: [ { content: " context", type: LineType.CONTEXT, oldNumber: 19, newNumber: 19 }, { content: "-removed", type: LineType.DELETE, oldNumber: 20, newNumber: undefined }, { content: "+added", type: LineType.INSERT, oldNumber: undefined, newNumber: 20 }, { content: "+another added", type: LineType.INSERT, oldNumber: undefined, newNumber: 21 } ], oldStartLine: 19, newStartLine: 19, header: "@@ -19,7 +19,7 @@" } ], deletedLines: 1, addedLines: 2, checksumBefore: "fc56817", checksumAfter: "e8e7e49", mode: "100644", oldName: "coverage.init", language: "init", newName: "coverage.init", isCombined: false }; const fileHtml = sideBySideRenderer.generateSideBySideFileHtml(file); const expectedLeft = "\n" + ' \n' + ' \n' + '
@@ -19,7 +19,7 @@
\n' + " \n" + "\n" + ' \n' + " 19\n" + " \n" + ' \n' + '
\n' + '  \n' + ' context\n' + "
\n" + " \n" + "\n" + ' \n' + " 20\n" + " \n" + ' \n' + '
\n' + ' -\n' + ' removed\n' + "
\n" + " \n" + "\n" + ' \n' + " " + "\n" + " \n" + ' \n' + '
\n' + '  \n' + '  \n' + "
\n" + " \n" + ""; const expectedRight = "\n" + ' \n' + ' \n' + '
\n' + " \n" + "\n" + ' \n' + " 19\n" + " \n" + ' \n' + '
\n' + '  \n' + ' context\n' + "
\n" + " \n" + "\n" + ' \n' + " 20\n" + " \n" + ' \n' + '
\n' + ' +\n' + ' added\n' + "
\n" + " \n" + "\n" + ' \n' + " 21\n" + " \n" + ' \n' + '
\n' + ' +\n' + ' another added\n' + "
\n" + " \n" + ""; expect(fileHtml.left).toEqual(expectedLeft); expect(fileHtml.right).toEqual(expectedRight); }); }); describe("generateSingleLineHtml", () => { it("should work for insertions", () => { const hoganUtils = new HoganJsUtils({}); const sideBySideRenderer = new SideBySideRenderer(hoganUtils, {}); const fileHtml = sideBySideRenderer.generateSingleLineHtml(false, CSSLineClass.INSERTS, "test", 30, "+"); const expected = "\n" + ' \n' + " 30\n" + " \n" + ' \n' + '
\n' + ' +\n' + ' test\n' + "
\n" + " \n" + ""; expect(fileHtml).toEqual(expected); }); it("should work for deletions", () => { const hoganUtils = new HoganJsUtils({}); const sideBySideRenderer = new SideBySideRenderer(hoganUtils, {}); const fileHtml = sideBySideRenderer.generateSingleLineHtml(false, CSSLineClass.DELETES, "test", 30, "-"); const expected = "\n" + ' \n' + " 30\n" + " \n" + ' \n' + '
\n' + ' -\n' + ' test\n' + "
\n" + " \n" + ""; expect(fileHtml).toEqual(expected); }); }); describe("generateSideBySideJsonHtml", () => { it("should work for list of files", () => { const exampleJson: DiffFile[] = [ { blocks: [ { lines: [ { content: "-test", type: LineType.DELETE, oldNumber: 1, newNumber: undefined }, { content: "+test1r", type: LineType.INSERT, oldNumber: undefined, newNumber: 1 } ], oldStartLine: 1, oldStartLine2: undefined, newStartLine: 1, header: "@@ -1 +1 @@" } ], deletedLines: 1, addedLines: 1, checksumBefore: "0000001", checksumAfter: "0ddf2ba", oldName: "sample", language: "txt", newName: "sample", isCombined: false, isGitDiff: true } ]; const hoganUtils = new HoganJsUtils({}); const sideBySideRenderer = new SideBySideRenderer(hoganUtils, { matching: LineMatchingType.LINES }); const html = sideBySideRenderer.render(exampleJson); const expected = '
\n' + '
\n' + '
\n' + ' \n' + ' sample\n' + ' CHANGED\n' + "
\n" + '
\n' + '
\n' + '
\n' + ' \n' + ' \n' + " \n" + ' \n' + ' \n" + "\n" + ' \n" + ' \n" + "\n" + " \n" + "
\n' + '
@@ -1 +1 @@
\n' + "
\n' + " 1\n" + " \n' + '
\n' + ' -\n' + ' test\n' + "
\n" + "
\n" + "
\n" + "
\n" + '
\n' + '
\n' + ' \n' + ' \n' + " \n" + ' \n' + ' \n" + "\n" + ' \n" + ' \n" + "\n" + " \n" + "
\n' + '
\n' + "
\n' + " 1\n" + " \n' + '
\n' + ' +\n' + ' test1r\n' + "
\n" + "
\n" + "
\n" + "
\n" + "
\n" + "
\n" + "
"; expect(html).toEqual(expected); }); it("should work for files without blocks", () => { const exampleJson: DiffFile[] = [ { blocks: [], oldName: "sample", language: "js", newName: "sample", isCombined: false, addedLines: 0, deletedLines: 0, isGitDiff: false } ]; const hoganUtils = new HoganJsUtils({}); const sideBySideRenderer = new SideBySideRenderer(hoganUtils, {}); const html = sideBySideRenderer.render(exampleJson); const expected = '
\n' + '
\n' + '
\n' + ' \n' + ' sample\n' + ' CHANGED\n' + "
\n" + '
\n' + '
\n' + '
\n' + ' \n' + ' \n' + " \n" + ' \n" + "\n" + " \n" + "
\n' + '
\n' + " File without changes\n" + "
\n" + "
\n" + "
\n" + "
\n" + '
\n' + '
\n' + ' \n' + ' \n' + " \n" + " \n" + "
\n" + "
\n" + "
\n" + "
\n" + "
\n" + "
"; expect(html).toEqual(expected); }); }); describe("processLines", () => { it("should process file lines", () => { const oldLines: DiffLine[] = [ { content: "-test", type: LineType.DELETE, oldNumber: 1, newNumber: undefined } ]; const newLines: DiffLine[] = [ { content: "+test1r", type: LineType.INSERT, oldNumber: undefined, newNumber: 1 } ]; const hoganUtils = new HoganJsUtils({}); const sideBySideRenderer = new SideBySideRenderer(hoganUtils, { matching: LineMatchingType.LINES }); const html = sideBySideRenderer.processLines(false, oldLines, newLines); const expectedLeft = "\n" + ' \n' + " 1\n" + " \n" + ' \n' + '
\n' + ' -\n' + ' test\n' + "
\n" + " \n" + ""; const expectedRight = "\n" + ' \n' + " 1\n" + " \n" + ' \n' + '
\n' + ' +\n' + ' test1r\n' + "
\n" + " \n" + ""; expect(html.left).toEqual(expectedLeft); expect(html.right).toEqual(expectedRight); }); }); });