Skip to content

Commit 37617be

Browse files
committed
minireporter now works well in everything except on OSX Terminal.app
1 parent 26a9603 commit 37617be

File tree

7 files changed

+94
-26
lines changed

7 files changed

+94
-26
lines changed

lib/reporters/mini.js

+23-19
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
'use strict';
2-
var logUpdate = require('log-update');
3-
var colors = require('../colors');
2+
var ansiEscapes = require('ansi-escapes');
3+
var cliCursor = require('cli-cursor');
4+
var lastLineStream = require('last-line-stream');
45
var plur = require('plur');
6+
var colors = require('../colors');
57
var beautifyStack = require('../beautify-stack');
68

79
function MiniReporter() {
@@ -14,8 +16,9 @@ function MiniReporter() {
1416
this.skipCount = 0;
1517
this.rejectionCount = 0;
1618
this.exceptionCount = 0;
17-
this.finished = false;
1819
this.lastWritten = undefined;
20+
this.prevLineCount = 0;
21+
this.stream = lastLineStream(process.stderr);
1922
}
2023

2124
module.exports = MiniReporter;
@@ -62,8 +65,6 @@ MiniReporter.prototype.unhandledError = function (err) {
6265
};
6366

6467
MiniReporter.prototype.finish = function () {
65-
this.finished = true;
66-
6768
var status = '\n';
6869

6970
if (this.passCount > 0) {
@@ -135,24 +136,27 @@ MiniReporter.prototype.finish = function () {
135136
};
136137

137138
MiniReporter.prototype.write = function (str) {
138-
logUpdate.stderr(str);
139-
this.lastWritten = str;
140-
141-
if (this.finished) {
142-
logUpdate.stderr.done();
143-
}
139+
cliCursor.hide();
140+
this.lastWritten = str + '\n';
141+
this.stream.push(this._clear() + this.lastWritten);
142+
this.prevLineCount = str.split('\n').length;
144143
};
145144

146145
MiniReporter.prototype.stdout = MiniReporter.prototype.stderr = function (data) {
147-
var rewrite = this.lastWritten !== undefined && !this.finished;
146+
this.stream.push(this._clear());
147+
this.stream.write(data);
148+
this.stream.push(this.lastWritten);
149+
};
148150

149-
if (rewrite) {
150-
logUpdate.stderr.clear();
151+
MiniReporter.prototype._clear = function () {
152+
var ct = this.prevLineCount;
153+
if (ct === 0) {
154+
return '';
151155
}
152-
153-
process.stderr.write(data);
154-
155-
if (rewrite) {
156-
logUpdate.stderr(this.lastWritten);
156+
var lastLine = this.stream.lastLine;
157+
var columns = process.stdout.columns;
158+
while (lastLine.length > columns) {
159+
lastLine = lastLine.substr(columns);
157160
}
161+
return ansiEscapes.eraseLines(ct + 1) + lastLine;
158162
};

package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
"tap"
7676
],
7777
"dependencies": {
78+
"ansi-escapes": "^1.1.1",
7879
"arr-flatten": "^1.0.1",
7980
"arrify": "^1.0.0",
8081
"ava-init": "^0.1.0",
@@ -87,6 +88,7 @@
8788
"bluebird": "^3.0.0",
8889
"caching-transform": "^1.0.0",
8990
"chalk": "^1.0.0",
91+
"cli-cursor": "^1.0.2",
9092
"co-with-promise": "^4.6.0",
9193
"commondir": "^1.0.1",
9294
"convert-source-map": "^1.1.2",
@@ -101,7 +103,7 @@
101103
"is-generator-fn": "^1.0.0",
102104
"is-observable": "^0.1.0",
103105
"is-promise": "^2.1.0",
104-
"log-update": "^1.0.2",
106+
"last-line-stream": "^0.1.0",
105107
"loud-rejection": "^1.2.0",
106108
"max-timeout": "^1.0.0",
107109
"md5-hex": "^1.2.0",

test/reporters/mini.js

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ var chalk = require('chalk');
33
var test = require('tap').test;
44
var miniReporter = require('../../lib/reporters/mini');
55

6+
process.stderr.setMaxListeners(50);
7+
68
test('start', function (t) {
79
var reporter = miniReporter();
810

test/visual/console-log.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ import delay from 'delay';
33

44
test('testName1', async t => {
55
console.log('foo');
6-
await delay(200);
6+
await delay(2000);
77
console.log('baz');
88
t.pass();
99
});
1010

1111
test('testName2', async t => {
12-
await delay(100);
12+
await delay(1000);
1313
console.log('bar');
14-
await delay(200);
14+
await delay(2000);
1515
console.log('quz');
1616
t.pass();
1717
});

test/visual/lorem-ipsum.js

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
'use strict';
2+
3+
var fs = require('fs');
4+
var path = require('path');
5+
var text = fs.readFileSync(path.join(__dirname, 'lorem-ipsum.txt'), 'utf8');
6+
var test = require('../../');
7+
var delay = require('delay');
8+
9+
var lines = text.split(/\r?\n/g).map(function (line) {
10+
return line.split(' ');
11+
});
12+
13+
setTimeout(function () {
14+
var lineNum = 0;
15+
var wordNum = 0;
16+
17+
var interval = setInterval(function () {
18+
if (lineNum >= lines.length) {
19+
clearInterval(interval);
20+
return;
21+
}
22+
var line = lines[lineNum];
23+
if (wordNum >= line.length) {
24+
process.stdout.write('\n');
25+
lineNum++;
26+
wordNum = 0;
27+
return;
28+
}
29+
var word = line[wordNum];
30+
wordNum++;
31+
if (wordNum < line.length) {
32+
word += ' ';
33+
}
34+
process.stdout.write(word);
35+
}, 50);
36+
}, 200);
37+
38+
async function testFn(t) {
39+
await delay(40);
40+
t.pass();
41+
}
42+
43+
for (var i = 0; i < 250; i++) {
44+
test.serial('test number ' + i, testFn);
45+
}

test/visual/lorem-ipsum.txt

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Lorem ipsum dolor sit amet, est ut alia vitae, commune appetere fabellas et sea, id diam error iisque eum. Has legendos adipiscing ad. Mea everti audiam te. Ne est legendos qualisque, id fabulas nominati eos, vim an magna praesent. Cum eu eius conclusionemque, paulo iudico populo vix eu, dicunt aperiri abhorreant ad est.
2+
3+
Suas constituam sit ea, populo moderatius eam ei. Ei melius nonumes invidunt vim, duo minim veniam cu. Omnis maiorum nam no, eu his choro dolorem disputando. Vel te lorem mandamus, sed in prompta electram. Nam id omnium mandamus erroribus, ut eos duis etiam perfecto.
4+
5+
Qui viris euripidis eloquentiam ut. Eam vide disputando ei, pro no partiendo iracundia, ne sed vocibus graecis. Mel id saepe iracundia philosophia, oratio rationibus te vel. Ad delicata assentior vel, cu sit dicit deseruisse, ne aliquip propriae concludaturque est.
6+
7+
Ipsum munere neglegentur an est. Mundi aliquid delenit ei duo, duis fabellas reformidans pro te. An soluta copiosae indoctum cum. Ut his menandri suavitate.
8+
9+
Alia laoreet pri id. Per solum lorem percipit te, eu diam modus iusto vel, id pro primis noster quaestio. Quot choro lucilius cum no. Nobis alterum habemus duo no. Scripta regione eloquentiam ad eam, ad sonet sententiae pro.

test/visual/stdout-write.js

+9-3
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,21 @@ import delay from 'delay';
33

44
test('testName1', async t => {
55
process.stdout.write('foo ');
6-
await delay(200);
6+
await delay(2000);
77
process.stdout.write('baz ');
88
t.pass();
99
});
1010

1111
test('testName2', async t => {
12-
await delay(100);
12+
await delay(1000);
1313
process.stdout.write('bar ');
14-
await delay(200);
14+
await delay(2000);
1515
process.stdout.write('quz ');
16+
await delay(1000);
17+
t.pass();
18+
});
19+
20+
test('testName3', async t => {
21+
await delay(5000);
1622
t.pass();
1723
});

0 commit comments

Comments
 (0)