Skip to content

Commit 196b643

Browse files
committed
clear mini reporter in watch mode
Clear the mini reporter unless the previous run had failures, or "r\n" was entered on stdin.
1 parent b3a1418 commit 196b643

File tree

5 files changed

+76
-2
lines changed

5 files changed

+76
-2
lines changed

lib/logger.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,14 @@ Logger.prototype.finish = function (runStatus) {
5050
this.write(this.reporter.finish(runStatus), runStatus);
5151
};
5252

53+
Logger.prototype.clear = function () {
54+
if (!this.reporter.clear) {
55+
return;
56+
}
57+
58+
this.write(this.reporter.clear());
59+
};
60+
5361
Logger.prototype.write = function (str, runStatus) {
5462
if (typeof str === 'undefined') {
5563
return;

lib/reporters/mini.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,10 @@ MiniReporter.prototype.finish = function (runStatus) {
193193
return status;
194194
};
195195

196+
MiniReporter.prototype.clear = function () {
197+
return '';
198+
};
199+
196200
MiniReporter.prototype.write = function (str) {
197201
cliCursor.hide();
198202
this.currentStatus = str;

lib/watcher.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,16 @@ function Watcher(logger, api, files, sources) {
3939
this.isTest = makeTestMatcher(files, AvaFiles.defaultExcludePatterns());
4040

4141
var isFirstRun = true;
42+
this.clearLogOnNextRun = true;
4243
this.run = function (specificFiles) {
4344
if (isFirstRun) {
4445
isFirstRun = false;
4546
} else {
47+
if (this.clearLogOnNextRun) {
48+
logger.clear();
49+
}
50+
this.clearLogOnNextRun = true;
51+
4652
logger.reset();
4753
logger.start();
4854
}
@@ -64,10 +70,12 @@ function Watcher(logger, api, files, sources) {
6470
}
6571
}
6672

73+
var self = this;
6774
this.busy = api.run(specificFiles || files, {
6875
runOnlyExclusive: runOnlyExclusive
6976
}).then(function (runStatus) {
7077
logger.finish(runStatus);
78+
self.clearLogOnNextRun = self.clearLogOnNextRun && runStatus.failCount === 0;
7179
}, rethrowAsync);
7280
};
7381

@@ -183,6 +191,7 @@ Watcher.prototype.observeStdin = function (stdin) {
183191
// Cancel the debouncer again, it might have restarted while waiting for
184192
// the busy promise to fulfil.
185193
self.debouncer.cancel();
194+
self.clearLogOnNextRun = false;
186195
self.rerunAll();
187196
});
188197
});

test/logger.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,23 @@ test('only write if reset is supported by reporter', function (t) {
4545
t.end();
4646
});
4747

48+
test('only call clear if supported by reporter', function (t) {
49+
var tapReporter = tap();
50+
var logger = new Logger(tapReporter);
51+
tapReporter.clear = undefined;
52+
logger.clear();
53+
t.end();
54+
});
55+
56+
test('only write if clear is supported by reporter', function (t) {
57+
var tapReporter = tap();
58+
var logger = new Logger(tapReporter);
59+
tapReporter.clear = undefined;
60+
logger.write = t.fail;
61+
logger.clear();
62+
t.end();
63+
});
64+
4865
test('writes the reporter reset result', function (t) {
4966
var tapReporter = tap();
5067
var logger = new Logger(tapReporter);

test/watcher.js

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ group('chokidar is installed', function (beforeEach, test, group) {
6060
var logger = {
6161
start: sinon.spy(),
6262
finish: sinon.spy(),
63+
clear: sinon.spy(),
6364
reset: sinon.spy()
6465
};
6566

@@ -102,6 +103,7 @@ group('chokidar is installed', function (beforeEach, test, group) {
102103

103104
logger.start.reset();
104105
logger.finish.reset();
106+
logger.clear.reset();
105107
logger.reset.reset();
106108

107109
avaFiles.reset();
@@ -211,7 +213,7 @@ group('chokidar is installed', function (beforeEach, test, group) {
211213
});
212214

213215
test('starts running the initial tests', function (t) {
214-
t.plan(7);
216+
t.plan(8);
215217

216218
var done;
217219
var runStatus = {};
@@ -222,6 +224,7 @@ group('chokidar is installed', function (beforeEach, test, group) {
222224
}));
223225

224226
start();
227+
t.ok(logger.clear.notCalled);
225228
t.ok(logger.reset.notCalled);
226229
t.ok(logger.start.notCalled);
227230
t.ok(api.run.calledOnce);
@@ -257,7 +260,7 @@ group('chokidar is installed', function (beforeEach, test, group) {
257260
{label: 'is removed', fire: unlink}
258261
].forEach(function (variant) {
259262
test('reruns initial tests when a source file ' + variant.label, function (t) {
260-
t.plan(10);
263+
t.plan(12);
261264

262265
var runStatus = {failCount: 0};
263266
api.run.returns(Promise.resolve(runStatus));
@@ -272,9 +275,12 @@ group('chokidar is installed', function (beforeEach, test, group) {
272275

273276
variant.fire();
274277
return debounce().then(function () {
278+
t.ok(logger.clear.calledOnce);
275279
t.ok(logger.reset.calledOnce);
276280
t.ok(logger.start.calledOnce);
277281
t.ok(api.run.calledTwice);
282+
// clear is called before reset.
283+
t.ok(logger.clear.firstCall.calledBefore(logger.reset.firstCall));
278284
// reset is called before the second run.
279285
t.ok(logger.reset.firstCall.calledBefore(api.run.secondCall));
280286
// reset is called before start
@@ -296,6 +302,24 @@ group('chokidar is installed', function (beforeEach, test, group) {
296302
});
297303
});
298304

305+
test('does not clear logger if the previous run had failures', function (t) {
306+
t.plan(2);
307+
308+
api.run.returns(Promise.resolve({failCount: 1}));
309+
start();
310+
311+
api.run.returns(Promise.resolve({failCount: 0}));
312+
change();
313+
return debounce().then(function () {
314+
t.ok(logger.clear.notCalled);
315+
316+
change();
317+
return debounce();
318+
}).then(function () {
319+
t.ok(logger.clear.calledOnce);
320+
});
321+
});
322+
299323
test('debounces by 10ms', function (t) {
300324
t.plan(1);
301325
api.run.returns(Promise.resolve({}));
@@ -578,6 +602,18 @@ group('chokidar is installed', function (beforeEach, test, group) {
578602
});
579603
});
580604

605+
test('entering "' + input + '" on stdin prevents the logger from being cleared', function (t) {
606+
t.plan(2);
607+
api.run.returns(Promise.resolve({failCount: 0}));
608+
start().observeStdin(stdin);
609+
610+
stdin.write(input + '\n');
611+
return delay().then(function () {
612+
t.ok(api.run.calledTwice);
613+
t.ok(logger.clear.notCalled);
614+
});
615+
});
616+
581617
test('entering "' + input + '" on stdin cancels any debouncing', function (t) {
582618
t.plan(7);
583619
api.run.returns(Promise.resolve({}));

0 commit comments

Comments
 (0)