UNPKG

18.1 kBJavaScriptView Raw
1'use strict';
2
3var legacyLog = require('../');
4var Log = legacyLog.Log;
5
6// Helper for testing stdout
7var hooker = require('hooker');
8function stdoutEqual(test, callback, expected) {
9 var actual = '';
10 // Hook process.stdout.write
11 hooker.hook(process.stdout, 'write', {
12 // This gets executed before the original process.stdout.write.
13 pre: function(result) {
14 // Concatenate uncolored result onto actual.
15 actual += result;
16 // Prevent the original process.stdout.write from executing.
17 return hooker.preempt();
18 },
19 });
20 // Execute the logging code to be tested.
21 callback();
22 // Restore process.stdout.write to its original value.
23 stdoutUnmute();
24 // Actually test the actually-logged stdout string to the expected value.
25 // test.equal(legacyLog.uncolor(actual), expected);
26 test.equal(actual, expected);
27}
28
29// Outright mute stdout.
30function stdoutMute() {
31 hooker.hook(process.stdout, 'write', {
32 pre: function() {
33 return hooker.preempt();
34 },
35 });
36}
37
38// Unmute stdout.
39function stdoutUnmute() {
40 hooker.unhook(process.stdout, 'write');
41}
42
43// Helper function: repeat('a', 3) -> 'aaa', repeat('a', 3, '-') -> 'a-a-a'
44function repeat(str, n, separator) {
45 var result = str;
46 for (var i = 1; i < n; i++) {
47 result += (separator || '') + str;
48 }
49 return result;
50}
51
52var fooBuffer = new Buffer('foo');
53
54exports['Log instance'] = {
55 setUp: function(done) {
56 this.grunt = {fail: {errorcount: 0}};
57 done();
58 },
59 'write': function(test) {
60 test.expect(4);
61 var log = new Log();
62
63 stdoutEqual(test, function() { log.write(''); }, '');
64 stdoutEqual(test, function() { log.write('foo'); }, 'foo');
65 stdoutEqual(test, function() { log.write('%s', 'foo'); }, 'foo');
66 stdoutEqual(test, function() { log.write(fooBuffer); }, 'foo');
67
68 test.done();
69 },
70 'writeln': function(test) {
71 test.expect(4);
72 var log = new Log();
73
74 stdoutEqual(test, function() { log.writeln(); }, '\n');
75 stdoutEqual(test, function() { log.writeln('foo'); }, 'foo\n');
76 stdoutEqual(test, function() { log.writeln('%s', 'foo'); }, 'foo\n');
77 stdoutEqual(test, function() { log.writeln(fooBuffer); }, 'foo\n');
78
79 test.done();
80 },
81 'warn': function(test) {
82 test.expect(5);
83 var log = new Log({grunt: this.grunt});
84
85 stdoutEqual(test, function() { log.warn(); }, 'ERROR'.red + '\n');
86 stdoutEqual(test, function() { log.warn('foo'); }, '>> '.red + 'foo\n');
87 stdoutEqual(test, function() { log.warn('%s', 'foo'); }, '>> '.red + 'foo\n');
88 stdoutEqual(test, function() { log.warn(fooBuffer); }, '>> '.red + 'foo\n');
89 test.equal(this.grunt.fail.errorcount, 0);
90
91 test.done();
92 },
93 'error': function(test) {
94 test.expect(5);
95 var log = new Log({grunt: this.grunt});
96
97 stdoutEqual(test, function() { log.error(); }, 'ERROR'.red + '\n');
98 stdoutEqual(test, function() { log.error('foo'); }, '>> '.red + 'foo\n');
99 stdoutEqual(test, function() { log.error('%s', 'foo'); }, '>> '.red + 'foo\n');
100 stdoutEqual(test, function() { log.error(fooBuffer); }, '>> '.red + 'foo\n');
101 test.equal(this.grunt.fail.errorcount, 4);
102
103 test.done();
104 },
105 'ok': function(test) {
106 test.expect(4);
107 var log = new Log({grunt: this.grunt});
108
109 stdoutEqual(test, function() { log.ok(); }, 'OK'.green + '\n');
110 stdoutEqual(test, function() { log.ok('foo'); }, '>> '.green + 'foo\n');
111 stdoutEqual(test, function() { log.ok('%s', 'foo'); }, '>> '.green + 'foo\n');
112 stdoutEqual(test, function() { log.ok(fooBuffer); }, '>> '.green + 'foo\n');
113
114 test.done();
115 },
116 'errorlns': function(test) {
117 test.expect(2);
118 var log = new Log({grunt: this.grunt});
119
120 stdoutEqual(test, function() {
121 log.errorlns(repeat('foo', 30, ' '));
122 }, '>> '.red + repeat('foo', 19, ' ') +
123 '\n>> '.red + repeat('foo', 11, ' ') + '\n');
124 test.equal(this.grunt.fail.errorcount, 1);
125
126 test.done();
127 },
128 'oklns': function(test) {
129 test.expect(1);
130 var log = new Log();
131
132 stdoutEqual(test, function() {
133 log.oklns(repeat('foo', 30, ' '));
134 }, '>> '.green + repeat('foo', 19, ' ') +
135 '\n>> '.green + repeat('foo', 11, ' ') + '\n');
136
137 test.done();
138 },
139 'success': function(test) {
140 test.expect(4);
141 var log = new Log();
142
143 stdoutEqual(test, function() { log.success(); }, ''.green + '\n');
144 stdoutEqual(test, function() { log.success('foo'); }, 'foo'.green + '\n');
145 stdoutEqual(test, function() { log.success('%s', 'foo'); }, 'foo'.green + '\n');
146 stdoutEqual(test, function() { log.success(fooBuffer); }, 'foo'.green + '\n');
147
148 test.done();
149 },
150 'fail': function(test) {
151 test.expect(4);
152 var log = new Log();
153
154 stdoutEqual(test, function() { log.fail(); }, ''.red + '\n');
155 stdoutEqual(test, function() { log.fail('foo'); }, 'foo'.red + '\n');
156 stdoutEqual(test, function() { log.fail('%s', 'foo'); }, 'foo'.red + '\n');
157 stdoutEqual(test, function() { log.fail(fooBuffer); }, 'foo'.red + '\n');
158
159 test.done();
160 },
161 'header': function(test) {
162 test.expect(5);
163 var log = new Log();
164
165 stdoutEqual(test, function() { log.header(); }, ''.underline + '\n');
166 stdoutEqual(test, function() { log.header(); }, '\n' + ''.underline + '\n');
167 stdoutEqual(test, function() { log.header('foo'); }, '\n' + 'foo'.underline + '\n');
168 stdoutEqual(test, function() { log.header('%s', 'foo'); }, '\n' + 'foo'.underline + '\n');
169 stdoutEqual(test, function() { log.header(fooBuffer); }, '\n' + 'foo'.underline + '\n');
170
171 test.done();
172 },
173 'subhead': function(test) {
174 test.expect(5);
175 var log = new Log();
176
177 stdoutEqual(test, function() { log.subhead(); }, ''.bold + '\n');
178 stdoutEqual(test, function() { log.subhead(); }, '\n' + ''.bold + '\n');
179 stdoutEqual(test, function() { log.subhead('foo'); }, '\n' + 'foo'.bold + '\n');
180 stdoutEqual(test, function() { log.subhead('%s', 'foo'); }, '\n' + 'foo'.bold + '\n');
181 stdoutEqual(test, function() { log.subhead(fooBuffer); }, '\n' + 'foo'.bold + '\n');
182
183 test.done();
184 },
185 'writetableln': function(test) {
186 test.expect(1);
187 var log = new Log();
188
189 stdoutEqual(test, function() {
190 log.writetableln([10], [repeat('foo', 10)]);
191 }, 'foofoofoof\noofoofoofo\nofoofoofoo\n');
192
193 test.done();
194 },
195 'writelns': function(test) {
196 test.expect(1);
197 var log = new Log();
198
199 stdoutEqual(test, function() {
200 log.writelns(repeat('foo', 30, ' '));
201 }, repeat('foo', 20, ' ') + '\n' +
202 repeat('foo', 10, ' ') + '\n');
203
204 test.done();
205 },
206 'writeflags': function(test) {
207 test.expect(3);
208 var log = new Log();
209
210 stdoutEqual(test, function() {
211 log.writeflags(['a', 'b']);
212 }, 'Flags: ' + 'a'.cyan + ', ' + 'b'.cyan + '\n');
213 stdoutEqual(test, function() {
214 log.writeflags(['a', 'b'], 'Prefix');
215 }, 'Prefix: ' + 'a'.cyan + ', ' + 'b'.cyan + '\n');
216 stdoutEqual(test, function() {
217 log.writeflags({a: true, b: false, c: 0, d: null}, 'Prefix');
218 }, 'Prefix: ' + 'a'.cyan + ', ' + 'b=false'.cyan + ', ' + 'c=0'.cyan + ', ' + 'd=null'.cyan + '\n');
219
220 test.done();
221 },
222 'always': function(test) {
223 test.expect(3);
224 var log = new Log();
225
226 test.strictEqual(log.always, log);
227 test.strictEqual(log.verbose.always, log);
228 test.strictEqual(log.notverbose.always, log);
229
230 test.done();
231 },
232 'or': function(test) {
233 test.expect(2);
234 var log = new Log();
235
236 test.strictEqual(log.verbose.or, log.notverbose);
237 test.strictEqual(log.notverbose.or, log.verbose);
238
239 test.done();
240 },
241 'hasLogged': function(test) {
242 // Should only be true if output has been written!
243 test.expect(24);
244 var log = new Log();
245 test.equal(log.hasLogged, false);
246 test.equal(log.verbose.hasLogged, false);
247 test.equal(log.notverbose.hasLogged, false);
248 log.write('');
249 test.equal(log.hasLogged, true);
250 test.equal(log.verbose.hasLogged, true);
251 test.equal(log.notverbose.hasLogged, true);
252
253 log = new Log({verbose: true});
254 log.verbose.write('');
255 test.equal(log.hasLogged, true);
256 test.equal(log.verbose.hasLogged, true);
257 test.equal(log.notverbose.hasLogged, true);
258
259 log = new Log();
260 log.notverbose.write('');
261 test.equal(log.hasLogged, true);
262 test.equal(log.verbose.hasLogged, true);
263 test.equal(log.notverbose.hasLogged, true);
264
265 stdoutMute();
266 log = new Log({debug: true});
267 log.debug('');
268 test.equal(log.hasLogged, true);
269 test.equal(log.verbose.hasLogged, true);
270 test.equal(log.notverbose.hasLogged, true);
271 stdoutUnmute();
272
273 // The following should be false since there's a verbose mismatch!
274 log = new Log();
275 log.verbose.write('');
276 test.equal(log.hasLogged, false);
277 test.equal(log.verbose.hasLogged, false);
278 test.equal(log.notverbose.hasLogged, false);
279
280 log = new Log({verbose: true});
281 log.notverbose.write('');
282 test.equal(log.hasLogged, false);
283 test.equal(log.verbose.hasLogged, false);
284 test.equal(log.notverbose.hasLogged, false);
285
286 // The following should be false since there's a debug mismatch!
287 log = new Log();
288 log.debug('');
289 test.equal(log.hasLogged, false);
290 test.equal(log.verbose.hasLogged, false);
291 test.equal(log.notverbose.hasLogged, false);
292
293 test.done();
294 },
295 'muted': function(test) {
296 test.expect(30);
297 var log = new Log();
298
299 test.equal(log.muted, false);
300 test.equal(log.verbose.muted, false);
301 test.equal(log.notverbose.muted, false);
302 test.equal(log.options.muted, false);
303 test.equal(log.verbose.options.muted, false);
304 test.equal(log.notverbose.options.muted, false);
305
306 log.muted = true;
307 test.equal(log.muted, true);
308 test.equal(log.verbose.muted, true);
309 test.equal(log.notverbose.muted, true);
310 test.equal(log.options.muted, true);
311 test.equal(log.verbose.options.muted, true);
312 test.equal(log.notverbose.options.muted, true);
313
314 log.muted = false;
315 test.equal(log.muted, false);
316 test.equal(log.verbose.muted, false);
317 test.equal(log.notverbose.muted, false);
318 test.equal(log.options.muted, false);
319 test.equal(log.verbose.options.muted, false);
320 test.equal(log.notverbose.options.muted, false);
321
322 log.options.muted = true;
323 test.equal(log.muted, true);
324 test.equal(log.verbose.muted, true);
325 test.equal(log.notverbose.muted, true);
326 test.equal(log.options.muted, true);
327 test.equal(log.verbose.options.muted, true);
328 test.equal(log.notverbose.options.muted, true);
329
330 log.options.muted = false;
331 test.equal(log.muted, false);
332 test.equal(log.verbose.muted, false);
333 test.equal(log.notverbose.muted, false);
334 test.equal(log.options.muted, false);
335 test.equal(log.verbose.options.muted, false);
336 test.equal(log.notverbose.options.muted, false);
337
338 test.done();
339 },
340 'verbose': function(test) {
341 test.expect(15);
342 var log = new Log();
343 log.muted = true;
344
345 // Test verbose methods to make sure they always return the verbose object.
346 test.strictEqual(log.verbose.write(''), log.verbose);
347 test.strictEqual(log.verbose.writeln(''), log.verbose);
348 test.strictEqual(log.verbose.warn(''), log.verbose);
349 test.strictEqual(log.verbose.error(''), log.verbose);
350 test.strictEqual(log.verbose.ok(''), log.verbose);
351 test.strictEqual(log.verbose.errorlns(''), log.verbose);
352 test.strictEqual(log.verbose.oklns(''), log.verbose);
353 test.strictEqual(log.verbose.success(''), log.verbose);
354 test.strictEqual(log.verbose.fail(''), log.verbose);
355 test.strictEqual(log.verbose.header(''), log.verbose);
356 test.strictEqual(log.verbose.subhead(''), log.verbose);
357 test.strictEqual(log.verbose.debug(''), log.verbose);
358 test.strictEqual(log.verbose.writetableln([]), log.verbose);
359 test.strictEqual(log.verbose.writelns(''), log.verbose);
360 test.strictEqual(log.verbose.writeflags([]), log.verbose);
361
362 test.done();
363 },
364 'notverbose': function(test) {
365 test.expect(15);
366 var log = new Log();
367 log.muted = true;
368
369 // Test notverbose methods to make sure they always return the notverbose object.
370 test.strictEqual(log.notverbose.write(''), log.notverbose);
371 test.strictEqual(log.notverbose.writeln(''), log.notverbose);
372 test.strictEqual(log.notverbose.warn(''), log.notverbose);
373 test.strictEqual(log.notverbose.error(''), log.notverbose);
374 test.strictEqual(log.notverbose.ok(''), log.notverbose);
375 test.strictEqual(log.notverbose.errorlns(''), log.notverbose);
376 test.strictEqual(log.notverbose.oklns(''), log.notverbose);
377 test.strictEqual(log.notverbose.success(''), log.notverbose);
378 test.strictEqual(log.notverbose.fail(''), log.notverbose);
379 test.strictEqual(log.notverbose.header(''), log.notverbose);
380 test.strictEqual(log.notverbose.subhead(''), log.notverbose);
381 test.strictEqual(log.notverbose.debug(''), log.notverbose);
382 test.strictEqual(log.notverbose.writetableln([]), log.notverbose);
383 test.strictEqual(log.notverbose.writelns(''), log.notverbose);
384 test.strictEqual(log.notverbose.writeflags([]), log.notverbose);
385
386 test.done();
387 },
388 'options.debug = true': function(test) {
389 test.expect(4);
390 var log = new Log({debug: true});
391
392 stdoutEqual(test, function() { log.debug(); }, '[D] ' + ''.magenta + '\n');
393 stdoutEqual(test, function() { log.debug('foo'); }, '[D] ' + 'foo'.magenta + '\n');
394 stdoutEqual(test, function() { log.debug('%s', 'foo'); }, '[D] ' + 'foo'.magenta + '\n');
395 stdoutEqual(test, function() { log.debug(fooBuffer); }, '[D] ' + 'foo'.magenta + '\n');
396
397 test.done();
398 },
399 'options.verbose = false': function(test) {
400 test.expect(7);
401 var log = new Log({verbose: false});
402
403 stdoutEqual(test, function() { log.notverbose.write('foo'); }, 'foo');
404 stdoutEqual(test, function() { log.notverbose.write('%s', 'foo'); }, 'foo');
405 stdoutEqual(test, function() { log.notverbose.write(fooBuffer); }, 'foo');
406 stdoutEqual(test, function() { log.verbose.write('foo'); }, '');
407 stdoutEqual(test, function() { log.verbose.write('%s', 'foo'); }, '');
408 stdoutEqual(test, function() { log.verbose.write(fooBuffer); }, '');
409 stdoutEqual(test, function() { log.verbose.write('a').or.write('b'); }, 'b');
410
411 test.done();
412 },
413 'options.verbose = true': function(test) {
414 test.expect(7);
415 var log = new Log({verbose: true});
416
417 stdoutEqual(test, function() { log.verbose.write('foo'); }, 'foo');
418 stdoutEqual(test, function() { log.verbose.write('%s', 'foo'); }, 'foo');
419 stdoutEqual(test, function() { log.verbose.write(fooBuffer); }, 'foo');
420 stdoutEqual(test, function() { log.notverbose.write('foo'); }, '');
421 stdoutEqual(test, function() { log.notverbose.write('%s', 'foo'); }, '');
422 stdoutEqual(test, function() { log.notverbose.write(fooBuffer); }, '');
423 stdoutEqual(test, function() { log.notverbose.write('a').or.write('b'); }, 'b');
424
425 test.done();
426 },
427 'options.debug = false': function(test) {
428 test.expect(1);
429 var log = new Log({debug: false});
430
431 stdoutEqual(test, function() { log.debug('foo'); }, '');
432
433 test.done();
434 },
435 'options.color = true': function(test) {
436 test.expect(1);
437 var log = new Log({color: true});
438
439 stdoutEqual(test, function() { log.write('foo'.blue + 'bar'.underline); }, 'foo'.blue + 'bar'.underline);
440
441 test.done();
442 },
443 'options.color = false': function(test) {
444 test.expect(1);
445 var log = new Log({color: false});
446
447 stdoutEqual(test, function() { log.write('foo'.blue + 'bar'.underline); }, 'foobar');
448
449 test.done();
450 },
451 'perma-bind this when passing grunt in (backcompat)': function(test) {
452 test.expect(43);
453 var log = new Log({grunt: this.grunt});
454 stdoutMute();
455 [
456 'write',
457 'writeln',
458 'warn',
459 'error',
460 'ok',
461 'errorlns',
462 'oklns',
463 'success',
464 'fail',
465 'header',
466 'subhead',
467 'debug',
468 ].forEach(function(method) {
469 var fn = log[method];
470 var verboseFn = log.verbose[method];
471 var notVerboseFn = log.notverbose[method];
472 test.equal(fn(), log, 'Should return log if invoked in a way where this is not log.');
473 test.equal(verboseFn(), log.verbose, 'Should return log.verbose if invoked in a way where this is not log.');
474 test.equal(notVerboseFn(), log.notverbose, 'Should return log.notverbose if invoked in a way where this is not log.');
475 });
476
477 test.doesNotThrow(function() { var fn = log.writetableln; fn([]); }, 'Should not throw if invoked in a way where this is not log.');
478 test.doesNotThrow(function() { var fn = log.writelns; fn([]); }, 'Should not throw if invoked in a way where this is not log.');
479 test.doesNotThrow(function() { var fn = log.writeflags; fn([]); }, 'Should not throw if invoked in a way where this is not log.');
480 test.doesNotThrow(function() { var fn = log.wordlist; fn([]); }, 'Should not throw if invoked in a way where this is not log.');
481 test.doesNotThrow(function() { var fn = log.uncolor; fn(''); }, 'Should not throw if invoked in a way where this is not log.');
482 test.doesNotThrow(function() { var fn = log.wraptext; fn(1,''); }, 'Should not throw if invoked in a way where this is not log.');
483 test.doesNotThrow(function() { var fn = log.table; fn([],''); }, 'Should not throw if invoked in a way where this is not log.');
484 stdoutUnmute();
485
486 test.done();
487 },
488};
489
490exports['Helpers'] = {
491 'uncolor': function(test) {
492 test.expect(2);
493 var log = new Log();
494 test.ok(log.uncolor);
495 test.strictEqual(log.uncolor, legacyLog.uncolor);
496 test.done();
497 },
498 'wordlist': function(test) {
499 test.expect(2);
500 var log = new Log();
501 test.ok(log.wordlist);
502 test.strictEqual(log.wordlist, legacyLog.wordlist);
503 test.done();
504 },
505 'wraptext': function(test) {
506 test.expect(2);
507 var log = new Log();
508 test.ok(log.wraptext);
509 test.strictEqual(log.wraptext, legacyLog.wraptext);
510 test.done();
511 },
512 'table': function(test) {
513 test.expect(2);
514 var log = new Log();
515 test.ok(log.table);
516 test.strictEqual(log.table, legacyLog.table);
517 test.done();
518 },
519};