diff --git a/src/line-by-line-printer.js b/src/line-by-line-printer.js index 9b0a2c1..6e7e4e6 100644 --- a/src/line-by-line-printer.js +++ b/src/line-by-line-printer.js @@ -38,7 +38,7 @@ fileIcon: fileIconTemplate, fileTag: fileTagTemplate }) - }) + }); }; LineByLinePrinter.prototype.makeLineByLineHtmlWrapper = function(content) { @@ -203,6 +203,7 @@ LineByLinePrinter.prototype._generateEmptyDiff = function() { return hoganUtils.render(genericTemplatesPath, 'empty-diff', { + contentClass: 'd2h-code-line', diffParser: diffParser }); }; diff --git a/src/side-by-side-printer.js b/src/side-by-side-printer.js index 1f25ba0..c990842 100644 --- a/src/side-by-side-printer.js +++ b/src/side-by-side-printer.js @@ -236,6 +236,7 @@ fileHtml.right = ''; fileHtml.left = hoganUtils.render(genericTemplatesPath, 'empty-diff', { + contentClass: 'd2h-code-side-line', diffParser: diffParser }); diff --git a/src/templates/diff2html-templates.js b/src/templates/diff2html-templates.js index 5f27e7c..05d9ba8 100644 --- a/src/templates/diff2html-templates.js +++ b/src/templates/diff2html-templates.js @@ -1,9 +1,9 @@ (function() { if (!!!global.browserTemplates) global.browserTemplates = {}; -var Hogan = require("hogan.js");global.browserTemplates["file-summary-line"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("
  • ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b(t.rp("");t.b("\n" + i);t.b(" ");t.b(t.v(t.f("fileName",c,p,0)));t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b(t.v(t.f("addedLines",c,p,0)));t.b("");t.b("\n" + i);t.b(" ");t.b(t.v(t.f("deletedLines",c,p,0)));t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("
  • ");return t.fl(); },partials: {"");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b(t.rp("");t.b("\n" + i);t.b(" ");t.b(t.v(t.f("fileName",c,p,0)));t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b(t.v(t.f("addedLines",c,p,0)));t.b("");t.b("\n" + i);t.b(" ");t.b(t.v(t.f("deletedLines",c,p,0)));t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("");return t.fl(); },partials: {"");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b(" Files changed (");t.b(t.v(t.f("filesNumber",c,p,0)));t.b(")");t.b("\n" + i);t.b(" hide");t.b("\n" + i);t.b(" show");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("
      ");t.b("\n" + i);t.b(" ");t.b(t.t(t.f("files",c,p,0)));t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b("");return t.fl(); },partials: {}, subs: { }}); global.browserTemplates["generic-column-line-number"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("
    ");t.b(t.t(t.f("blockHeader",c,p,0)));t.b("
    ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("");return t.fl(); },partials: {}, subs: { }}); -global.browserTemplates["generic-empty-diff"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b(" File without changes");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("");return t.fl(); },partials: {}, subs: { }}); +global.browserTemplates["generic-empty-diff"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b(" File without changes");t.b("\n" + i);t.b("
    ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("");return t.fl(); },partials: {}, subs: { }}); global.browserTemplates["generic-file-path"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("");t.b("\n" + i);t.b(" ");t.b(t.rp("");t.b("\n" + i);t.b(" ");t.b(t.v(t.f("fileDiffName",c,p,0)));t.b("");t.b("\n" + i);t.b(t.rp("");return t.fl(); },partials: {"");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b(t.t(t.f("lineNumber",c,p,0)));t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("
    ");t.b("\n" + i);if(t.s(t.f("prefix",c,p,1),c,p,0,171,247,"{{ }}")){t.rs(c,p,function(c,p,t){t.b(" ");t.b(t.t(t.f("prefix",c,p,0)));t.b("");t.b("\n" + i);});c.pop();}if(t.s(t.f("content",c,p,1),c,p,0,279,353,"{{ }}")){t.rs(c,p,function(c,p,t){t.b(" ");t.b(t.t(t.f("content",c,p,0)));t.b("");t.b("\n" + i);});c.pop();}t.b("
    ");t.b("\n" + i);t.b(" ");t.b("\n" + i);t.b("");return t.fl(); },partials: {}, subs: { }}); global.browserTemplates["generic-wrapper"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("
    ");t.b("\n" + i);t.b(" ");t.b(t.t(t.f("content",c,p,0)));t.b("\n" + i);t.b("
    ");return t.fl(); },partials: {}, subs: { }}); diff --git a/src/templates/file-summary-line.mustache b/src/templates/file-summary-line.mustache index bf3b8b9..27d373b 100644 --- a/src/templates/file-summary-line.mustache +++ b/src/templates/file-summary-line.mustache @@ -1,7 +1,7 @@
  • {{>fileIcon}} - {{fileName}} + {{fileName}} {{addedLines}} {{deletedLines}} diff --git a/src/templates/generic-empty-diff.mustache b/src/templates/generic-empty-diff.mustache index c9907a3..c6b1abd 100644 --- a/src/templates/generic-empty-diff.mustache +++ b/src/templates/generic-empty-diff.mustache @@ -1,6 +1,6 @@ -
    +
    File without changes
    diff --git a/src/ui/css/diff2html.css b/src/ui/css/diff2html.css index 595826f..9d4096d 100644 --- a/src/ui/css/diff2html.css +++ b/src/ui/css/diff2html.css @@ -304,6 +304,7 @@ font-size: 10px; margin-left: 5px; padding: 0 2px; + background-color: #fff; } .d2h-deleted-tag { diff --git a/test/diff2html-tests.js b/test/diff2html-tests.js index ef87ef5..99649d0 100644 --- a/test/diff2html-tests.js +++ b/test/diff2html-tests.js @@ -43,40 +43,39 @@ var jsonExample1 = var filesExample1 = '
    \n' + - '
    \n' + - ' Files changed (1)  \n' + - ' hide\n' + - ' show\n' + - '
    \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - '
    \n' + - ' +1\n' + - ' \n' + - ' -1\n' + - ' \n' + - '  sample \n' + - '
    \n'; + '
    \n' + + ' Files changed (1)\n' + + ' hide\n' + + ' show\n' + + '
    \n' + + '
      \n' + + '
    1. \n' + + ' \n' + + ' \n' + + ' sample\n' + + ' \n' + + ' +1\n' + + ' -1\n' + + ' \n' + + ' \n' + + '
    2. \n' + + '
    \n' + + '
    '; + var htmlLineExample1 = '
    \n' + '
    \n' + '
    \n' + - ' \n' + - ' \n' + - ' +1\n' + - ' \n' + - ' \n' + - ' -1\n' + - ' \n' + - ' \n' + ' \n' + - '  sample\n' + - ' \n' + + ' \n' + + ' sample\n' + + ' CHANGED\n' + '
    \n' + '
    \n' + '
    \n' + @@ -85,12 +84,12 @@ var htmlLineExample1 = ' \n' + ' \n' + ' \n' + - '
    \n' + + '
    @@ -1 +1 @@
    \n' + ' \n' + '\n' + ' \n' + - '
    1
    \n' + - '
    \n' + + '
    1
    \n' + + '
    \n' + ' \n' + ' \n' + '
    \n' + @@ -100,8 +99,8 @@ var htmlLineExample1 = ' \n' + '\n' + ' \n' + - '
    \n' + - '
    1
    \n' + + '
    \n' + + '
    1
    \n' + ' \n' + ' \n' + '
    \n' + @@ -121,60 +120,67 @@ var htmlLineExample1WithFilesSummary = filesExample1 + htmlLineExample1; var htmlSideExample1 = '
    \n' + - '
    \n' + - '
    \n' + - ' \n' + - ' \n' + - ' +1\n' + - ' \n' + - ' \n' + - ' -1\n' + - ' \n' + - ' \n' + - ' \n' + - ' sample\n' + - ' \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' sample\n' + + ' CHANGED\n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + - '
    @@ -1 +1 @@
    \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' + + '
    1
    -test
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + + ' \n' + + '
    \n' + - '
    \n' + - '
    \n' + + '
    \n' + + '
    \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' + + ' test1\n' + + '
    \n' + + '
    1
    +test1
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n'; + ' \n' + + ' \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    '; var htmlSideExample1WithFilesSummary = filesExample1 + htmlSideExample1; diff --git a/test/file-list-printer-tests.js b/test/file-list-printer-tests.js new file mode 100644 index 0000000..89e9dc1 --- /dev/null +++ b/test/file-list-printer-tests.js @@ -0,0 +1,105 @@ +var assert = require('assert'); + +var fileListPrinter = require('../src/file-list-printer.js').FileListPrinter; + +describe('FileListPrinter', function() { + describe('generateFileList', function() { + it('should work for all kinds of files', function() { + + var files = [{ + addedLines: 12, + deletedLines: 41, + language: 'js', + oldName: 'my/file/name.js', + newName: 'my/file/name.js' + }, { + addedLines: 12, + deletedLines: 41, + language: 'js', + oldName: 'my/file/name1.js', + newName: 'my/file/name2.js' + }, { + addedLines: 12, + deletedLines: 0, + language: 'js', + oldName: 'dev/null', + newName: 'my/file/name.js', + isNew: true + }, { + addedLines: 0, + deletedLines: 41, + language: 'js', + oldName: 'my/file/name.js', + newName: 'dev/null', + isDeleted: true + }]; + + var fileHtml = fileListPrinter.generateFileList(files); + + var expected = + '
    \n' + + '
    \n' + + ' Files changed (4)\n' + + ' hide\n' + + ' show\n' + + '
    \n' + + '
      \n' + + '
    1. \n' + + ' \n' + + ' \n' + + ' my/file/name.js\n' + + ' \n' + + ' +12\n' + + ' -41\n' + + ' \n' + + ' \n' + + '
    2. \n' + + '
    3. \n' + + ' \n' + + ' \n' + + ' my/file/{name1.js → name2.js}\n' + + ' \n' + + ' +12\n' + + ' -41\n' + + ' \n' + + ' \n' + + '
    4. \n' + + '
    5. \n' + + ' \n' + + ' \n' + + ' my/file/name.js\n' + + ' \n' + + ' +12\n' + + ' -0\n' + + ' \n' + + ' \n' + + '
    6. \n' + + '
    7. \n' + + ' \n' + + ' \n' + + ' my/file/name.js\n' + + ' \n' + + ' +0\n' + + ' -41\n' + + ' \n' + + ' \n' + + '
    8. \n' + + '
    \n' + + '
    '; + + assert.equal(expected, fileHtml); + }); + }); +}); diff --git a/test/hogan-cache-tests.js b/test/hogan-cache-tests.js index c5f65ce..190bf6f 100644 --- a/test/hogan-cache-tests.js +++ b/test/hogan-cache-tests.js @@ -1,28 +1,35 @@ var assert = require('assert'); var HoganJsUtils = require('../src/hoganjs-utils.js').HoganJsUtils; +var diffParser = require('../src/diff-parser.js').DiffParser; describe('HoganJsUtils', function() { describe('render', function() { var emptyDiffHtml = '\n' + - ' \n' + - '
    \n' + + ' \n' + + '
    \n' + ' File without changes\n' + '
    \n' + ' \n' + ''; it('should render view', function() { - var result = HoganJsUtils.render('line-by-line', 'empty-diff', {}); + var result = HoganJsUtils.render('generic', 'empty-diff', { + contentClass: 'd2h-code-line', + diffParser: diffParser + }); assert.equal(emptyDiffHtml, result); }); it('should render view without cache', function() { - var result = HoganJsUtils.render('line-by-line', 'empty-diff', {}, {noCache: true}); + var result = HoganJsUtils.render('generic', 'empty-diff', { + contentClass: 'd2h-code-line', + diffParser: diffParser + }, {noCache: true}); assert.equal(emptyDiffHtml + '\n', result); }); it('should return null if template is missing', function() { - var result = HoganJsUtils.render('line-by-line', 'missing-template', {}, {noCache: true}); + var result = HoganJsUtils.render('generic', 'missing-template', {}, {noCache: true}); assert.equal(null, result); }); }); diff --git a/test/line-by-line-tests.js b/test/line-by-line-tests.js index 16dabbf..a0ba661 100644 --- a/test/line-by-line-tests.js +++ b/test/line-by-line-tests.js @@ -31,8 +31,8 @@ describe('LineByLinePrinter', function() { fileHtml = fileHtml.replace(/\n\n+/g, '\n'); var expected = '\n' + ' \n' + - '
    \n' + - '
    30
    \n' + + '
    \n' + + '
    30
    \n' + ' \n' + ' \n' + '
    \n' + @@ -53,8 +53,8 @@ describe('LineByLinePrinter', function() { fileHtml = fileHtml.replace(/\n\n+/g, '\n'); var expected = '\n' + ' \n' + - '
    30
    \n' + - '
    \n' + + '
    30
    \n' + + '
    \n' + ' \n' + ' \n' + '
    \n' + @@ -75,8 +75,8 @@ describe('LineByLinePrinter', function() { fileHtml = fileHtml.replace(/\n\n+/g, '\n'); var expected = '\n' + ' \n' + - '
    \n' + - '
    30
    \n' + + '
    \n' + + '
    30
    \n' + ' \n' + ' \n' + '
    \n' + @@ -97,8 +97,8 @@ describe('LineByLinePrinter', function() { fileHtml = fileHtml.replace(/\n\n+/g, '\n'); var expected = '\n' + ' \n' + - '
    \n' + - '
    30
    \n' + + '
    \n' + + '
    30
    \n' + ' \n' + ' \n' + '
    \n' + @@ -119,8 +119,9 @@ describe('LineByLinePrinter', function() { fileHtml = fileHtml.replace(/\n\n+/g, '\n'); var expected = '\n' + ' \n' + - '
    \n' + - '
    30
    \n' + + '
    \n' + + '' + + '
    30
    \n' + ' \n' + ' \n' + '
    \n' + @@ -149,19 +150,129 @@ describe('LineByLinePrinter', function() { var fileHtml = lineByLinePrinter.makeFileDiffHtml(file, diffs); - var expected = '
    \n' + + var expected = + '
    \n' + '
    \n' + - ' \n' + - ' \n' + - ' +12\n' + - ' \n' + - ' \n' + - ' -41\n' + - ' \n' + - ' \n' + ' \n' + - '  my/file/name.js\n' + - ' \n' + + ' \n' + + ' my/file/name.js\n' + + ' CHANGED\n' + + '
    \n' + + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' Random Html\n' + + ' \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    '; + + assert.equal(expected, fileHtml); + }); + it('should work for simple added file', function() { + var lineByLinePrinter = new LineByLinePrinter({}); + + var file = { + addedLines: 12, + deletedLines: 0, + language: 'js', + oldName: 'dev/null', + newName: 'my/file/name.js', + isNew: true + }; + var diffs = 'Random Html'; + + var fileHtml = lineByLinePrinter.makeFileDiffHtml(file, diffs); + + var expected = + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' my/file/name.js\n' + + ' ADDED\n' + + '
    \n' + + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' Random Html\n' + + ' \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    '; + + assert.equal(expected, fileHtml); + }); + it('should work for simple deleted file', function() { + var lineByLinePrinter = new LineByLinePrinter({}); + + var file = { + addedLines: 0, + deletedLines: 41, + language: 'js', + oldName: 'my/file/name.js', + newName: 'dev/null', + isDeleted: true + }; + var diffs = 'Random Html'; + + var fileHtml = lineByLinePrinter.makeFileDiffHtml(file, diffs); + + var expected = + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' my/file/name.js\n' + + ' DELETED\n' + + '
    \n' + + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' Random Html\n' + + ' \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    '; + + assert.equal(expected, fileHtml); + }); + it('should work for simple renamed file', function() { + var lineByLinePrinter = new LineByLinePrinter({}); + + var file = { + addedLines: 12, + deletedLines: 41, + language: 'js', + oldName: 'my/file/name1.js', + newName: 'my/file/name2.js', + isRename: true + }; + var diffs = 'Random Html'; + + var fileHtml = lineByLinePrinter.makeFileDiffHtml(file, diffs); + + var expected = + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' my/file/{name1.js → name2.js}\n' + + ' RENAMED\n' + '
    \n' + '
    \n' + '
    \n' + @@ -229,17 +340,12 @@ describe('LineByLinePrinter', function() { '
    \n' + '
    \n' + '
    \n' + - ' \n' + - ' \n' + - ' +1\n' + - ' \n' + - ' \n' + - ' -1\n' + - ' \n' + - ' \n' + ' \n' + - '  sample\n' + - ' \n' + + ' \n' + + ' sample\n' + + ' CHANGED\n' + '
    \n' + '
    \n' + '
    \n' + @@ -248,12 +354,12 @@ describe('LineByLinePrinter', function() { ' \n' + ' \n' + ' \n' + - '
    \n' + + '
    @@ -1 +1 @@
    \n' + ' \n' + '\n' + ' \n' + - '
    1
    \n' + - '
    \n' + + '
    1
    \n' + + '
    \n' + ' \n' + ' \n' + '
    \n' + @@ -263,8 +369,8 @@ describe('LineByLinePrinter', function() { ' \n' + '\n' + ' \n' + - '
    \n' + - '
    1
    \n' + + '
    \n' + + '
    1
    \n' + ' \n' + ' \n' + '
    \n' + @@ -300,17 +406,12 @@ describe('LineByLinePrinter', function() { '
    \n' + '
    \n' + '
    \n' + - ' \n' + - ' \n' + - ' +0\n' + - ' \n' + - ' \n' + - ' -0\n' + - ' \n' + - ' \n' + ' \n' + - '  sample\n' + - ' \n' + + ' \n' + + ' sample\n' + + ' CHANGED\n' + '
    \n' + '
    \n' + '
    \n' + @@ -356,8 +457,8 @@ describe('LineByLinePrinter', function() { var expected = '\n' + ' \n' + - '
    1
    \n' + - '
    \n' + + '
    1
    \n' + + '
    \n' + ' \n' + ' \n' + '
    \n' + @@ -366,8 +467,8 @@ describe('LineByLinePrinter', function() { ' \n' + '\n' + ' \n' + - '
    \n' + - '
    1
    \n' + + '
    \n' + + '
    1
    \n' + ' \n' + ' \n' + '
    \n' + @@ -430,12 +531,12 @@ describe('LineByLinePrinter', function() { '\n' + ' \n' + ' \n' + - '
    \n' + + '
    @@ -1 +1 @@
    \n' + ' \n' + '\n' + ' \n' + - '
    1
    \n' + - '
    1
    \n' + + '
    1
    \n' + + '
    1
    \n' + ' \n' + ' \n' + '
    \n' + @@ -444,8 +545,8 @@ describe('LineByLinePrinter', function() { ' \n' + '\n' + ' \n' + - '
    2
    \n' + - '
    \n' + + '
    2
    \n' + + '
    \n' + ' \n' + ' \n' + '
    \n' + @@ -455,8 +556,8 @@ describe('LineByLinePrinter', function() { ' \n' + '\n' + ' \n' + - '
    \n' + - '
    2
    \n' + + '
    \n' + + '
    2
    \n' + ' \n' + ' \n' + '
    \n' + @@ -466,8 +567,8 @@ describe('LineByLinePrinter', function() { ' \n' + '\n' + ' \n' + - '
    \n' + - '
    3
    \n' + + '
    \n' + + '
    3
    \n' + ' \n' + ' \n' + '
    \n' + diff --git a/test/side-by-side-printer-tests.js b/test/side-by-side-printer-tests.js index e2e2286..b90e2c2 100644 --- a/test/side-by-side-printer-tests.js +++ b/test/side-by-side-printer-tests.js @@ -10,11 +10,11 @@ describe('SideBySidePrinter', function() { var fileHtml = sideBySidePrinter.generateEmptyDiff(); var expectedRight = ''; var expectedLeft = '\n' + - ' ' + - '
    ' + - 'File without changes' + - '
    ' + - ' \n' + + ' \n' + + '
    \n' + + ' File without changes\n' + + '
    \n' + + ' \n' + '\n'; assert.equal(expectedRight, fileHtml.right); @@ -73,43 +73,78 @@ describe('SideBySidePrinter', function() { var expectedLeft = '\n' + - ' \n' + - ' \n' + - '
    @@ -19,7 +19,7 @@
    \n' + - ' \n' + - '\n' + - '\n' + - ' 19\n' + - '
    context
    \n' + - ' \n' + - '\n' + - ' 20\n' + - '
    -removed
    \n' + - ' \n' + - '\n' + - ' \n' + - '
    \n' + - ' \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' + + ''; var expectedRight = '\n' + - ' \n' + - ' \n' + - '
    \n' + - ' \n' + - '\n' + - '\n' + - ' 19\n' + - '
    context
    \n' + - ' \n' + - '\n' + - ' 20\n' + - '
    +added
    \n' + - ' \n' + - '\n' + - ' 21\n' + - '
    +another added
    \n' + - ' \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' + + ''; assert.equal(expectedLeft, fileHtml.left); assert.equal(expectedRight, fileHtml.right); @@ -124,11 +159,16 @@ describe('SideBySidePrinter', function() { var fileHtml = sideBySidePrinter.generateSingleLineHtml( diffParser.LINE_TYPE.INSERTS, 30, 'test', '+'); var expected = '\n' + - ' 30\n' + - ' ' + - '
    +test
    ' + + ' \n' + + ' 30\n' + ' \n' + - ' \n'; + ' \n' + + '
    \n' + + ' +\n' + + ' test\n' + + '
    \n' + + ' \n' + + ''; assert.equal(expected, fileHtml); }); @@ -139,11 +179,16 @@ describe('SideBySidePrinter', function() { var fileHtml = sideBySidePrinter.generateSingleLineHtml( diffParser.LINE_TYPE.DELETES, 30, 'test', '-'); var expected = '\n' + - ' 30\n' + - ' ' + - '
    -test
    ' + + ' \n' + + ' 30\n' + ' \n' + - ' \n'; + ' \n' + + '
    \n' + + ' -\n' + + ' test\n' + + '
    \n' + + ' \n' + + ''; assert.equal(expected, fileHtml); }); @@ -184,60 +229,67 @@ describe('SideBySidePrinter', function() { var html = sideBySidePrinter.generateSideBySideJsonHtml(exampleJson); var expected = '
    \n' + - '
    \n' + - '
    \n' + - ' \n' + - ' \n' + - ' +1\n' + - ' \n' + - ' \n' + - ' -1\n' + - ' \n' + - ' \n' + - ' \n' + - ' sample\n' + - ' \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' sample\n' + + ' CHANGED\n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + - '
    @@ -1 +1 @@
    \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' + + '
    1
    -test
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + + ' \n' + + '
    \n' + - '
    \n' + - '
    \n' + + '
    \n' + + '
    \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' + + '
    1
    +test1r
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n'; + ' \n' + + ' \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    '; assert.equal(expected, html); }); @@ -254,43 +306,44 @@ describe('SideBySidePrinter', function() { var html = sideBySidePrinter.generateSideBySideJsonHtml(exampleJson); var expected = '
    \n' + - '
    \n' + - '
    \n' + - ' \n' + - ' \n' + - ' +undefined\n' + - ' \n' + - ' \n' + - ' -undefined\n' + - ' \n' + - ' \n' + - ' \n' + - ' sample\n' + - ' \n' + - '
    \n' + - '
    \n' + - '
    \n' + - '
    \n' + - ' \n' + - ' \n' + - ' \n' + - ' \n' + + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' sample\n' + + ' CHANGED\n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    File without changes
    \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'; + '\n' + + ' \n' + + ' \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
    '; assert.equal(expected, html); }); @@ -316,24 +369,29 @@ describe('SideBySidePrinter', function() { var html = sideBySidePrinter.processLines(oldLines, newLines); var expectedLeft = '\n' + - ' 1\n' + - ' ' + - '
    ' + - '-' + - 'test
    ' + + ' \n' + + ' 1\n' + ' \n' + - ' \n'; + ' \n' + + '
    \n' + + ' -\n' + + ' test\n' + + '
    \n' + + ' \n' + + ''; var expectedRight = '\n' + - ' 1\n' + - ' ' + - '
    ' + - '+' + - 'test1r' + - '
    ' + + ' \n' + + ' 1\n' + ' \n' + - ' \n'; + ' \n' + + '
    \n' + + ' +\n' + + ' test1r\n' + + '
    \n' + + ' \n' + + ''; assert.equal(expectedLeft, html.left); assert.equal(expectedRight, html.right);