Skip to content

Commit

Permalink
Merge pull request #624 from unexpectedjs/poc/unifiedDiff
Browse files Browse the repository at this point in the history
Truncate large consecutive blocks of unchanged text in the string diff
  • Loading branch information
sunesimonsen committed Apr 24, 2019
2 parents cbe5b25 + 48689df commit 2f2df5c
Show file tree
Hide file tree
Showing 5 changed files with 252 additions and 8 deletions.
64 changes: 64 additions & 0 deletions documentation/assertions/string/to-be.md
Expand Up @@ -33,3 +33,67 @@ expect('Hello world!', 'not to be', 'Hello world!');
```output
expected 'Hello world!' not to be 'Hello world!'
```

If you compare large strings, we truncate the similar parts:

```js
var text = `\
Bacon ipsum amet tri-tip kielbasa kevin spare RIBS. Sirloin chuck jerky
venison leberkas. T-bone alcatra short loin short ribs spare ribs rump, brisket
pastrami frankfurter corned beef kielbasa fatback cupim andouille. Pastrami
shoulder buffalo boudin pork belly salami spare ribs. Bresaola picanha tri-tip,
strip steak swine short loin rump corned beef doner chuck sirloin burgdoggen.
Strip steak fatback frankfurter salami pastrami short ribs spare ribs, sausage
bresaola porchetta turducken shoulder brisket. Tri-tip beef ribs prosciutto
short ribs, biltong boudin sausage turkey.
Pork chop venison beef ribs leberkas pork filet mignon. Boudin leberkas swine
beef ribs. Prosciutto boudin pancetta beef ribs short loin porchetta pastrami,
frankfurter corned beef. Leberkas buffalo alcatra, chuck pancetta sirloin pig.
Pig ground round turducken, pastrami prosciutto ribeye pork ham hock beef
meatloaf turkey kielbasa. Tenderloin porchetta biltong burgdoggen sirloin, strip
steak pastrami ham hock beef spare ribs shank kevin bacon. Pork loin sausage
boudin meatball chuck.`;

var expectedText = `\
Bacon ipsum dolor amet tri-tip kielbasa kevin spare ribs. Sirloin chuck jerky
venison leberkas. T-bone alcatra short loin short ribs spare ribs rump, brisket
pastrami frankfurter corned beef kielbasa fatback cupim andouille. Pastrami
shoulder buffalo boudin pork belly salami spare ribs. Bresaola picanha tri-tip,
strip steak swine short loin rump corned beef doner chuck sirloin burgdoggen.
Strip steak fatback frankfurter salami pastrami short ribs spare ribs, sausage
bresaola porchetta turducken shoulder brisket. Tri-tip beef ribs prosciutto
short ribs, biltong boudin sausage turkey.
Pork chop venison beef ribs leberkas pork filet mignon. Boudin leberkas swine
beef ribs. Prosciutto boudin pancetta ribs beef short loin porchetta pastrami,
frankfurter corned beef. Leberkas buffalo alcatra, chuck pancetta sirloin pig.
Pig ground round turducken, pastrami prosciutto ribeye pork ham hock beef
meatloaf turkey kielbasa. Tenderloin porchetta biltong burgdoggen sirloin, strip
steak pastrami ham hock beef spare ribs shank kevin bacon. Pork loin sausage
boudin meatball chuck.`;

expect(text, 'to be', expectedText);
```

<!-- prettier-ignore -->
```output
expected 'Bacon ipsum amet tri-tip kielbasa kevin spare RIBS. Sirloin chuck jerky\nvenison leberkas. T-bone alcatra short loin short ribs spare ribs rump, brisket\npastrami frankfurter corned beef kielbasa fatback cupim andouille. Pastrami\nshoulder buffalo boudin pork belly salami spare ribs. Bresaola picanha tri-tip,\nstrip steak swine short loin rump corned beef doner chuck sirloin burgdoggen.\nStrip steak fatback frankfurter salami pastrami short ribs spare ribs, sausage\nbresaola porchetta turducken shoulder brisket. Tri-tip beef ribs prosciutto\nshort ribs, biltong boudin sausage turkey.\n\nPork chop venison beef ribs leberkas pork filet mignon. Boudin leberkas swine\nbeef ribs. Prosciutto boudin pancetta beef ribs short loin porchetta pastrami,\nfrankfurter corned beef. Leberkas buffalo alcatra, chuck pancetta sirloin pig.\nPig ground round turducken, pastrami prosciutto ribeye pork ham hock beef\nmeatloaf turkey kielbasa. Tenderloin porchetta biltong burgdoggen sirloin, strip\nsteak pastrami ham hock beef spare ribs shank kevin bacon. Pork loin sausage\nboudin meatball chuck.'
to be 'Bacon ipsum dolor amet tri-tip kielbasa kevin spare ribs. Sirloin chuck jerky\nvenison leberkas. T-bone alcatra short loin short ribs spare ribs rump, brisket\npastrami frankfurter corned beef kielbasa fatback cupim andouille. Pastrami\nshoulder buffalo boudin pork belly salami spare ribs. Bresaola picanha tri-tip,\nstrip steak swine short loin rump corned beef doner chuck sirloin burgdoggen.\nStrip steak fatback frankfurter salami pastrami short ribs spare ribs, sausage\nbresaola porchetta turducken shoulder brisket. Tri-tip beef ribs prosciutto\nshort ribs, biltong boudin sausage turkey.\n\nPork chop venison beef ribs leberkas pork filet mignon. Boudin leberkas swine\nbeef ribs. Prosciutto boudin pancetta ribs beef short loin porchetta pastrami,\nfrankfurter corned beef. Leberkas buffalo alcatra, chuck pancetta sirloin pig.\nPig ground round turducken, pastrami prosciutto ribeye pork ham hock beef\nmeatloaf turkey kielbasa. Tenderloin porchetta biltong burgdoggen sirloin, strip\nsteak pastrami ham hock beef spare ribs shank kevin bacon. Pork loin sausage\nboudin meatball chuck.'
-Bacon ipsum amet tri-tip kielbasa kevin spare RIBS. Sirloin chuck jerky
+Bacon ipsum dolor amet tri-tip kielbasa kevin spare ribs. Sirloin chuck jerky
venison leberkas. T-bone alcatra short loin short ribs spare ribs rump, brisket
pastrami frankfurter corned beef kielbasa fatback cupim andouille. Pastrami
shoulder buffalo boudin pork belly salami spare ribs. Bresaola picanha tri-tip,
... 3 lines omitted ...
short ribs, biltong boudin sausage turkey.
Pork chop venison beef ribs leberkas pork filet mignon. Boudin leberkas swine
-beef ribs. Prosciutto boudin pancetta beef ribs short loin porchetta pastrami,
+beef ribs. Prosciutto boudin pancetta ribs beef short loin porchetta pastrami,
frankfurter corned beef. Leberkas buffalo alcatra, chuck pancetta sirloin pig.
Pig ground round turducken, pastrami prosciutto ribeye pork ham hock beef
meatloaf turkey kielbasa. Tenderloin porchetta biltong burgdoggen sirloin, strip
... 2 lines omitted ...
```
53 changes: 52 additions & 1 deletion lib/styles.js
Expand Up @@ -202,6 +202,12 @@ module.exports = expect => {
this.sp().block(pen);
});

expect.addStyle('diffLinesOmitted', function(lineCount) {
this.jsComment(
`... ${lineCount} line${lineCount === 1 ? '' : 's'} omitted ...`
);
});

expect.addStyle('removedHighlight', function(content) {
this.alt({
text() {
Expand Down Expand Up @@ -440,7 +446,52 @@ module.exports = expect => {
options.markUpSpecialCharacters
);
} else {
this.stringDiffFragment(' ', value, 'text');
const horizon = 3;
if (index === diffLines.length - 1 && part.count > horizon) {
this.stringDiffFragment(
' ',
value
.split('\n')
.slice(0, horizon)
.join('\n'),
'text'
)
.nl()
.diffLinesOmitted(part.count - horizon);
} else if (index === 0 && part.count > horizon) {
this.diffLinesOmitted(part.count - horizon)
.nl()
.stringDiffFragment(
' ',
value
.split('\n')
.slice(-horizon)
.join('\n'),
'text'
);
} else if (part.count > 2 * horizon) {
this.stringDiffFragment(
' ',
value
.split('\n')
.slice(0, horizon)
.join('\n'),
'text'
)
.nl()
.diffLinesOmitted(part.count - 2 * horizon)
.nl()
.stringDiffFragment(
' ',
value
.split('\n')
.slice(-horizon)
.join('\n'),
'text'
);
} else {
this.stringDiffFragment(' ', value, 'text');
}
}
if (endsWithNewline) {
this.nl();
Expand Down
2 changes: 1 addition & 1 deletion lib/types.js
Expand Up @@ -1285,7 +1285,7 @@ module.exports = function(expect) {
inspect(value, depth, output) {
return output.singleQuotedString(value);
},
diffLimit: 4096,
diffLimit: 65536,
diff(actual, expected, output, diff, inspect) {
if (Math.max(actual.length, expected.length) > this.diffLimit) {
output.jsComment(`Diff suppressed due to size > ${this.diffLimit}`);
Expand Down

0 comments on commit 2f2df5c

Please sign in to comment.