Skip to content

Commit 9330766

Browse files
committed
prettier string comparison output
make the comarison between huges strings look better close axross#13
1 parent 47f8045 commit 9330766

File tree

3 files changed

+132
-8
lines changed

3 files changed

+132
-8
lines changed

distributions/index.js

+73-3
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ var _jsondiffpatch = require('jsondiffpatch');
3636

3737
var _jsondiffpatch2 = _interopRequireDefault(_jsondiffpatch);
3838

39+
var _pdiff = require('pdiff');
40+
41+
var _pdiff2 = _interopRequireDefault(_pdiff);
42+
3943
var INDENT = ' ';
4044
var FIG_TICK = _figures2['default'].tick;
4145
var FIG_CROSS = _figures2['default'].cross;
@@ -108,6 +112,74 @@ var createReporter = function createReporter() {
108112
});
109113
};
110114

115+
function decodeNewlines(_x3) {
116+
var _again = true;
117+
118+
_function: while (_again) {
119+
var str = _x3;
120+
_again = false;
121+
122+
if (str.match(/([^\\])\\n/g)) {
123+
_x3 = str.replace(/([^\\])\\n/g, '$1\n');
124+
_again = true;
125+
continue _function;
126+
}
127+
return str;
128+
}
129+
}
130+
131+
var diffStrings = function diffStrings(actual, expected) {
132+
var padding = ' ';
133+
var line = 1;
134+
var diff_ = _pdiff2['default'].addLineNumbers(_pdiff2['default'].diff(decodeNewlines(actual), decodeNewlines(expected)));
135+
var diff = _pdiff2['default'].extractDiff(diff_, line);
136+
var maxLine = diff_.length;
137+
var digit = String(maxLine).length;
138+
var spaces = '';
139+
for (var i = 0; i < digit - 1; i++) {
140+
spaces += ' ';
141+
}console.log('');
142+
diff.forEach(function (group, i) {
143+
group.forEach(function (delta) {
144+
var text = padding;
145+
// Add line numbers
146+
if (delta.lineNumberOfLhs != undefined) {
147+
text += _chalk2['default'].magenta((spaces + (delta.lineNumberOfLhs + 1)).substr(-digit));
148+
} else {
149+
text += spaces + _chalk2['default'].magenta('-');
150+
}
151+
text += ' ';
152+
if (delta.lineNumberOfRhs != undefined) {
153+
text += _chalk2['default'].magenta((spaces + (delta.lineNumberOfRhs + 1)).substr(-digit));
154+
} else {
155+
text += spaces + _chalk2['default'].magenta('-');
156+
}
157+
text += ' ';
158+
159+
// Add the value of this line
160+
delta.values.forEach(function (value) {
161+
if (value.added) {
162+
text += _chalk2['default'].green.inverse(value.value);
163+
return;
164+
}
165+
if (value.removed) {
166+
text += _chalk2['default'].red.inverse(value.value);
167+
return;
168+
}
169+
text += _chalk2['default'].dim(value.value);
170+
});
171+
172+
// Ouput the delta
173+
console.log(text);
174+
});
175+
176+
if (i != diff.length - 1) {
177+
console.log(padding + _chalk2['default'].dim('...'));
178+
}
179+
});
180+
console.log('');
181+
};
182+
111183
var _assert$diag = assert.diag;
112184
var at = _assert$diag.at;
113185
var actual = _assert$diag.actual;
@@ -148,9 +220,7 @@ var createReporter = function createReporter() {
148220
} else if (expected === 'undefined' && actual === 'undefined') {
149221
;
150222
} else if (expected_type === 'string') {
151-
var compared = (0, _diff.diffWords)(actual, expected).map(writeDiff).join('');
152-
153-
println(compared, 4);
223+
diffStrings(actual, expected);
154224
} else {
155225
println(_chalk2['default'].red.inverse(actual) + _chalk2['default'].green.inverse(expected), 4);
156226
}

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"duplexer": "^0.1.1",
1919
"figures": "^1.4.0",
2020
"jsondiffpatch": "^0.1.41",
21+
"pdiff": "^2.0.0",
2122
"pretty-ms": "^2.1.0",
2223
"tap-parser": "^1.2.2",
2324
"through2": "^2.0.0"

sources/index.js

+58-5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import through2 from 'through2';
66
import parser from 'tap-parser';
77
import prettyMs from 'pretty-ms';
88
import jsondiffpatch from 'jsondiffpatch';
9+
import pdiff from 'pdiff';
910

1011
const INDENT = ' ';
1112
const FIG_TICK = figures.tick;
@@ -64,6 +65,62 @@ const createReporter = () => {
6465
return value.replace(/(^\s*)(.*)/g, (m, one, two) => one + style(two))
6566
};
6667

68+
function decodeNewlines(str) {
69+
if (str.match(/([^\\])\\n/g)) return decodeNewlines(str.replace(/([^\\])\\n/g, '$1\n'));
70+
return str;
71+
}
72+
73+
const diffStrings = (actual, expected) => {
74+
const padding = ' ';
75+
const line = 1;
76+
const diff_ = pdiff.addLineNumbers(pdiff.diff(decodeNewlines(actual), decodeNewlines(expected)));
77+
const diff = pdiff.extractDiff(diff_, line);
78+
const maxLine = diff_.length;
79+
const digit = String(maxLine).length;
80+
let spaces = '';
81+
for (let i = 0; i < digit - 1; i++) spaces += ' ';
82+
console.log('');
83+
diff.forEach((group, i) => {
84+
group.forEach(delta => {
85+
let text = padding;
86+
// Add line numbers
87+
if (delta.lineNumberOfLhs != undefined) {
88+
text += chalk.magenta((spaces + (delta.lineNumberOfLhs + 1)).substr(-digit));
89+
} else {
90+
text += spaces + chalk.magenta('-');
91+
}
92+
text += ' ';
93+
if (delta.lineNumberOfRhs != undefined) {
94+
text += chalk.magenta((spaces + (delta.lineNumberOfRhs + 1)).substr(-digit));
95+
} else {
96+
text += spaces + chalk.magenta('-');
97+
}
98+
text += ' ';
99+
100+
// Add the value of this line
101+
delta.values.forEach(value => {
102+
if (value.added) {
103+
text += chalk.green.inverse(value.value);
104+
return;
105+
}
106+
if (value.removed) {
107+
text += chalk.red.inverse(value.value);
108+
return;
109+
}
110+
text += chalk.dim(value.value);
111+
})
112+
113+
// Ouput the delta
114+
console.log(text);
115+
});
116+
117+
if (i != diff.length - 1) {
118+
console.log(padding + chalk.dim('...'));
119+
}
120+
});
121+
console.log('');
122+
};
123+
67124
let {
68125
at,
69126
actual,
@@ -108,11 +165,7 @@ const createReporter = () => {
108165
} else if (expected === 'undefined' && actual === 'undefined') {
109166
;
110167
} else if (expected_type === 'string') {
111-
const compared = diffWords(actual, expected)
112-
.map(writeDiff)
113-
.join('');
114-
115-
println(compared, 4);
168+
diffStrings(actual, expected)
116169
} else {
117170
println(
118171
chalk.red.inverse(actual) + chalk.green.inverse(expected),

0 commit comments

Comments
 (0)