From d5593945dde040f94696fbe8ce1ea5badc98cfb1 Mon Sep 17 00:00:00 2001 From: Andrew de Andrade Date: Mon, 24 Nov 2014 20:14:45 -0800 Subject: [PATCH] More tests --- lint-stream.js | 3 +- package.json | 2 + stylish-reporter.js | 1 + test/attenuate-severity.tape.js | 18 +- test/checkstyle-reporter.tape.js | 19 +- test/compact-reporter.tape.js | 18 +- test/fixtures/unit/checkstyle.stdout | 133 ++++ test/fixtures/unit/compact.stdout | 78 ++ test/fixtures/unit/json.stdout | 862 +++++++++++++++++++++ test/fixtures/unit/stylish.stdout | 129 +++ test/group-file-messages-transform.tape.js | 25 +- test/helpers/make-error-stream-fixture.js | 42 +- test/helpers/make-error-stream.js | 51 ++ test/helpers/make-file-error-stream.js | 15 + test/json-reporter.tape.js | 19 +- test/stylish-reporter.tape.js | 20 +- 16 files changed, 1408 insertions(+), 27 deletions(-) create mode 100644 test/fixtures/unit/checkstyle.stdout create mode 100644 test/fixtures/unit/compact.stdout create mode 100644 test/fixtures/unit/json.stdout create mode 100644 test/fixtures/unit/stylish.stdout create mode 100644 test/helpers/make-error-stream.js create mode 100644 test/helpers/make-file-error-stream.js diff --git a/lint-stream.js b/lint-stream.js index 517046a..20ed9ee 100644 --- a/lint-stream.js +++ b/lint-stream.js @@ -117,8 +117,7 @@ function lintTrapStream(linters) { return function lint(files, opts) { files.sort(); var streams = linters.map(function initLinter(linterName) { - var stream = lintStream(linterName, files, opts); - return stream; + return lintStream(linterName, files, opts); }); var mergedLintStream = es.merge.apply(es, streams); diff --git a/package.json b/package.json index 4cad691..cfc7918 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,8 @@ "array.prototype.find": "^1.0.0", "istanbul": "^0.3.2", "mkdirp": "^0.5.0", + "mock-fs": "^2.3.2", + "opn": "^1.0.0", "pre-commit": "0.0.9", "rimraf": "^2.2.8", "tape": "~3.0.0", diff --git a/stylish-reporter.js b/stylish-reporter.js index 25d9c25..2ce71b5 100644 --- a/stylish-reporter.js +++ b/stylish-reporter.js @@ -56,6 +56,7 @@ function printFileErrorTable(message) { } function printStylish(fileMessages) { + isTTY = process.stdout.isTTY; fileMessages = fileMessages.filter(removeEmpty); function removeEmpty(fileMessage) { diff --git a/test/attenuate-severity.tape.js b/test/attenuate-severity.tape.js index d393f28..4f19d52 100644 --- a/test/attenuate-severity.tape.js +++ b/test/attenuate-severity.tape.js @@ -3,7 +3,7 @@ var test = require('tape'); var attenuateSeverity = require('../attenuate-severity'); test('attenuate severity in single file with single lintrc', function tape(t) { - t.plan(1); + t.plan(2); var lintrc = { eslint: { @@ -11,13 +11,23 @@ test('attenuate severity in single file with single lintrc', function tape(t) { } }; - var message = { + var messageA = { type: 'error', linter: 'eslint', rule: 'func-names', severity: 'error' }; - attenuateSeverity(message, lintrc); - t.equal(message.type, 'warning', 'Downgraded severity to warning'); + attenuateSeverity(messageA, lintrc); + t.equal(messageA.type, 'warning', 'Downgraded severity to warning'); + + var messageB = { + type: 'error', + linter: 'eslint', + rule: 'not-func-names', + severity: 'error' + }; + + attenuateSeverity(messageB, lintrc); + t.equal(messageB.type, 'error', 'Did not downgrade severity to warning'); }); diff --git a/test/checkstyle-reporter.tape.js b/test/checkstyle-reporter.tape.js index 81e6a12..acdcd49 100644 --- a/test/checkstyle-reporter.tape.js +++ b/test/checkstyle-reporter.tape.js @@ -1,8 +1,25 @@ 'use strict'; var test = require('tape'); var checkstyleReporter = require('../checkstyle-reporter'); +var makeFileErrorStream = require('./helpers/make-file-error-stream'); +var es = require('event-stream'); +var fs = require('fs'); +var path = require('path'); test('Checkstyle Reporter', function runTests(t) { - t.plan(1); + t.plan(2); t.ok(checkstyleReporter, 'Module exists'); + + var fixture = path.join(__dirname, 'fixtures/unit/checkstyle.stdout'); + + var expectedStdout = fs.readFileSync(fixture).toString(); + + makeFileErrorStream().pipe(es.writeArray(function print(err, array) { + if (err) { + t.fail(); + } + + t.equal(checkstyleReporter(array), expectedStdout, 'Correct stdout'); + })); + }); diff --git a/test/compact-reporter.tape.js b/test/compact-reporter.tape.js index bdaa314..f60241e 100644 --- a/test/compact-reporter.tape.js +++ b/test/compact-reporter.tape.js @@ -1,8 +1,24 @@ 'use strict'; var test = require('tape'); var compactReporter = require('../compact-reporter'); +var makeFileErrorStream = require('./helpers/make-file-error-stream'); +var es = require('event-stream'); +var fs = require('fs'); +var path = require('path'); test('Compact Reporter', function runTests(t) { - t.plan(1); + t.plan(2); t.ok(compactReporter, 'Module exists'); + + var fixture = path.join(__dirname, 'fixtures/unit/compact.stdout'); + + var expectedStdout = fs.readFileSync(fixture).toString(); + + makeFileErrorStream().pipe(es.writeArray(function print(err, array) { + if (err) { + t.fail(); + } + t.equal(compactReporter(array), expectedStdout, 'Correct stdout'); + })); + }); diff --git a/test/fixtures/unit/checkstyle.stdout b/test/fixtures/unit/checkstyle.stdout new file mode 100644 index 0000000..17bd63a --- /dev/null +++ b/test/fixtures/unit/checkstyle.stdout @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/fixtures/unit/compact.stdout b/test/fixtures/unit/compact.stdout new file mode 100644 index 0000000..32d93df --- /dev/null +++ b/test/fixtures/unit/compact.stdout @@ -0,0 +1,78 @@ +a.js: line 0, col 0, Warning - no-alert message (eslint.no-alert) +a.js: line 0, col 0, Warning - indent message (jshint.indent) +a.js: line 0, col 0, Warning - validateIndentation message (jscs.validateIndentation) +b.js: line 1, col 1, Error - no-array-constructor message (eslint.no-array-constructor) +b.js: line 1, col 1, Error - undef message (jshint.undef) +b.js: line 1, col 1, Error - maximumLineLength message (jscs.maximumLineLength) +c.js: line 2, col 2, Warning - no-bitwise message (eslint.no-bitwise) +c.js: line 2, col 2, Warning - validthis message (jshint.validthis) +c.js: line 2, col 2, Warning - requireSpaceAfterKeywords message (jscs.requireSpaceAfterKeywords) +d.js: line 3, col 3, Error - no-caller message (eslint.no-caller) +d.js: line 3, col 3, Error - newcap message (jshint.newcap) +d.js: line 3, col 3, Error - disallowSpacesInFunctionDeclaration message (jscs.disallowSpacesInFunctionDeclaration) +e.js: line 4, col 4, Warning - no-catch-shadow message (eslint.no-catch-shadow) +e.js: line 4, col 4, Warning - indent message (jshint.indent) +e.js: line 4, col 4, Warning - disallowSpacesInNamedFunctionExpression message (jscs.disallowSpacesInNamedFunctionExpression) +f.js: line 5, col 5, Error - no-comma-dangle message (eslint.no-comma-dangle) +f.js: line 5, col 5, Error - undef message (jshint.undef) +f.js: line 5, col 5, Error - requireSpacesInFunctionDeclaration message (jscs.requireSpacesInFunctionDeclaration) +g.js: line 6, col 6, Warning - no-cond-assign message (eslint.no-cond-assign) +g.js: line 6, col 6, Warning - validthis message (jshint.validthis) +g.js: line 6, col 6, Warning - requireSpacesInNamedFunctionExpression message (jscs.requireSpacesInNamedFunctionExpression) +h.js: line 7, col 7, Error - no-console message (eslint.no-console) +h.js: line 7, col 7, Error - newcap message (jshint.newcap) +h.js: line 7, col 7, Error - disallowTrailingComma message (jscs.disallowTrailingComma) +i.js: line 8, col 8, Warning - no-constant-condition message (eslint.no-constant-condition) +i.js: line 8, col 8, Warning - indent message (jshint.indent) +i.js: line 8, col 8, Warning - requireBlocksOnNewline message (jscs.requireBlocksOnNewline) +j.js: line 9, col 9, Error - no-control-regex message (eslint.no-control-regex) +j.js: line 9, col 9, Error - undef message (jshint.undef) +j.js: line 9, col 9, Error - excludeFiles message (jscs.excludeFiles) +k.js: line 10, col 10, Warning - no-debugger message (eslint.no-debugger) +k.js: line 10, col 10, Warning - validthis message (jshint.validthis) +k.js: line 10, col 10, Warning - requireCurlyBraces message (jscs.requireCurlyBraces) +l.js: line 11, col 11, Error - no-delete-var message (eslint.no-delete-var) +l.js: line 11, col 11, Error - newcap message (jshint.newcap) +l.js: line 11, col 11, Error - disallowMultipleVarDecl message (jscs.disallowMultipleVarDecl) +m.js: line 12, col 12, Warning - no-div-regex message (eslint.no-div-regex) +m.js: line 12, col 12, Warning - indent message (jshint.indent) +m.js: line 12, col 12, Warning - disallowEmptyBlocks message (jscs.disallowEmptyBlocks) +n.js: line 13, col 13, Error - no-dupe-keys message (eslint.no-dupe-keys) +n.js: line 13, col 13, Error - undef message (jshint.undef) +n.js: line 13, col 13, Error - disallowSpaceAfterObjectKeys message (jscs.disallowSpaceAfterObjectKeys) +o.js: line 14, col 14, Warning - no-else-return message (eslint.no-else-return) +o.js: line 14, col 14, Warning - validthis message (jshint.validthis) +o.js: line 14, col 14, Warning - requireCommaBeforeLineBreak message (jscs.requireCommaBeforeLineBreak) +p.js: line 15, col 15, Error - no-empty message (eslint.no-empty) +p.js: line 15, col 15, Error - newcap message (jshint.newcap) +p.js: line 15, col 15, Error - requireSpaceBeforeBinaryOperators message (jscs.requireSpaceBeforeBinaryOperators) +q.js: line 16, col 16, Warning - no-empty-class message (eslint.no-empty-class) +q.js: line 16, col 16, Warning - indent message (jshint.indent) +q.js: line 16, col 16, Warning - requireSpacesInConditionalExpression message (jscs.requireSpacesInConditionalExpression) +r.js: line 17, col 17, Error - no-empty-label message (eslint.no-empty-label) +r.js: line 17, col 17, Error - undef message (jshint.undef) +r.js: line 17, col 17, Error - requireSpaceAfterBinaryOperators message (jscs.requireSpaceAfterBinaryOperators) +s.js: line 18, col 18, Warning - no-eq-null message (eslint.no-eq-null) +s.js: line 18, col 18, Warning - validthis message (jshint.validthis) +s.js: line 18, col 18, Warning - disallowSpaceAfterPrefixUnaryOperators message (jscs.disallowSpaceAfterPrefixUnaryOperators) +t.js: line 19, col 19, Error - no-eval message (eslint.no-eval) +t.js: line 19, col 19, Error - newcap message (jshint.newcap) +t.js: line 19, col 19, Error - disallowKeywords message (jscs.disallowKeywords) +u.js: line 20, col 20, Warning - no-ex-assign message (eslint.no-ex-assign) +u.js: line 20, col 20, Warning - indent message (jshint.indent) +u.js: line 20, col 20, Warning - disallowMultipleLineBreaks message (jscs.disallowMultipleLineBreaks) +v.js: line 21, col 21, Error - no-extend-native message (eslint.no-extend-native) +v.js: line 21, col 21, Error - undef message (jshint.undef) +v.js: line 21, col 21, Error - validateLineBreaks message (jscs.validateLineBreaks) +w.js: line 22, col 22, Warning - no-extra-bind message (eslint.no-extra-bind) +w.js: line 22, col 22, Warning - validthis message (jshint.validthis) +w.js: line 22, col 22, Warning - validateQuoteMarks message (jscs.validateQuoteMarks) +x.js: line 23, col 23, Error - no-extra-boolean-cast message (eslint.no-extra-boolean-cast) +x.js: line 23, col 23, Error - newcap message (jshint.newcap) +x.js: line 23, col 23, Error - disallowMixedSpacesAndTabs message (jscs.disallowMixedSpacesAndTabs) +y.js: line 24, col 24, Warning - no-extra-parens message (eslint.no-extra-parens) +y.js: line 24, col 24, Warning - indent message (jshint.indent) +y.js: line 24, col 24, Warning - disallowTrailingWhitespace message (jscs.disallowTrailingWhitespace) +z.js: line 25, col 25, Error - no-extra-semi message (eslint.no-extra-semi) +z.js: line 25, col 25, Error - undef message (jshint.undef) +z.js: line 25, col 25, Error - disallowKeywordsOnNewLine message (jscs.disallowKeywordsOnNewLine) diff --git a/test/fixtures/unit/json.stdout b/test/fixtures/unit/json.stdout new file mode 100644 index 0000000..e7238e4 --- /dev/null +++ b/test/fixtures/unit/json.stdout @@ -0,0 +1,862 @@ +{ + "files": [ + { + "type": "file", + "file": "a.js", + "errors": [ + { + "type": "warning", + "linter": "eslint", + "file": "a.js", + "line": 0, + "column": 0, + "rule": "no-alert", + "message": "no-alert message" + }, + { + "type": "warning", + "linter": "jshint", + "file": "a.js", + "line": 0, + "column": 0, + "rule": "indent", + "message": "indent message" + }, + { + "type": "warning", + "linter": "jscs", + "file": "a.js", + "line": 0, + "column": 0, + "rule": "validateIndentation", + "message": "validateIndentation message" + } + ] + }, + { + "type": "file", + "file": "b.js", + "errors": [ + { + "type": "error", + "linter": "eslint", + "file": "b.js", + "line": 1, + "column": 1, + "rule": "no-array-constructor", + "message": "no-array-constructor message" + }, + { + "type": "error", + "linter": "jshint", + "file": "b.js", + "line": 1, + "column": 1, + "rule": "undef", + "message": "undef message" + }, + { + "type": "error", + "linter": "jscs", + "file": "b.js", + "line": 1, + "column": 1, + "rule": "maximumLineLength", + "message": "maximumLineLength message" + } + ] + }, + { + "type": "file", + "file": "c.js", + "errors": [ + { + "type": "warning", + "linter": "eslint", + "file": "c.js", + "line": 2, + "column": 2, + "rule": "no-bitwise", + "message": "no-bitwise message" + }, + { + "type": "warning", + "linter": "jshint", + "file": "c.js", + "line": 2, + "column": 2, + "rule": "validthis", + "message": "validthis message" + }, + { + "type": "warning", + "linter": "jscs", + "file": "c.js", + "line": 2, + "column": 2, + "rule": "requireSpaceAfterKeywords", + "message": "requireSpaceAfterKeywords message" + } + ] + }, + { + "type": "file", + "file": "d.js", + "errors": [ + { + "type": "error", + "linter": "eslint", + "file": "d.js", + "line": 3, + "column": 3, + "rule": "no-caller", + "message": "no-caller message" + }, + { + "type": "error", + "linter": "jshint", + "file": "d.js", + "line": 3, + "column": 3, + "rule": "newcap", + "message": "newcap message" + }, + { + "type": "error", + "linter": "jscs", + "file": "d.js", + "line": 3, + "column": 3, + "rule": "disallowSpacesInFunctionDeclaration", + "message": "disallowSpacesInFunctionDeclaration message" + } + ] + }, + { + "type": "file", + "file": "e.js", + "errors": [ + { + "type": "warning", + "linter": "eslint", + "file": "e.js", + "line": 4, + "column": 4, + "rule": "no-catch-shadow", + "message": "no-catch-shadow message" + }, + { + "type": "warning", + "linter": "jshint", + "file": "e.js", + "line": 4, + "column": 4, + "rule": "indent", + "message": "indent message" + }, + { + "type": "warning", + "linter": "jscs", + "file": "e.js", + "line": 4, + "column": 4, + "rule": "disallowSpacesInNamedFunctionExpression", + "message": "disallowSpacesInNamedFunctionExpression message" + } + ] + }, + { + "type": "file", + "file": "f.js", + "errors": [ + { + "type": "error", + "linter": "eslint", + "file": "f.js", + "line": 5, + "column": 5, + "rule": "no-comma-dangle", + "message": "no-comma-dangle message" + }, + { + "type": "error", + "linter": "jshint", + "file": "f.js", + "line": 5, + "column": 5, + "rule": "undef", + "message": "undef message" + }, + { + "type": "error", + "linter": "jscs", + "file": "f.js", + "line": 5, + "column": 5, + "rule": "requireSpacesInFunctionDeclaration", + "message": "requireSpacesInFunctionDeclaration message" + } + ] + }, + { + "type": "file", + "file": "g.js", + "errors": [ + { + "type": "warning", + "linter": "eslint", + "file": "g.js", + "line": 6, + "column": 6, + "rule": "no-cond-assign", + "message": "no-cond-assign message" + }, + { + "type": "warning", + "linter": "jshint", + "file": "g.js", + "line": 6, + "column": 6, + "rule": "validthis", + "message": "validthis message" + }, + { + "type": "warning", + "linter": "jscs", + "file": "g.js", + "line": 6, + "column": 6, + "rule": "requireSpacesInNamedFunctionExpression", + "message": "requireSpacesInNamedFunctionExpression message" + } + ] + }, + { + "type": "file", + "file": "h.js", + "errors": [ + { + "type": "error", + "linter": "eslint", + "file": "h.js", + "line": 7, + "column": 7, + "rule": "no-console", + "message": "no-console message" + }, + { + "type": "error", + "linter": "jshint", + "file": "h.js", + "line": 7, + "column": 7, + "rule": "newcap", + "message": "newcap message" + }, + { + "type": "error", + "linter": "jscs", + "file": "h.js", + "line": 7, + "column": 7, + "rule": "disallowTrailingComma", + "message": "disallowTrailingComma message" + } + ] + }, + { + "type": "file", + "file": "i.js", + "errors": [ + { + "type": "warning", + "linter": "eslint", + "file": "i.js", + "line": 8, + "column": 8, + "rule": "no-constant-condition", + "message": "no-constant-condition message" + }, + { + "type": "warning", + "linter": "jshint", + "file": "i.js", + "line": 8, + "column": 8, + "rule": "indent", + "message": "indent message" + }, + { + "type": "warning", + "linter": "jscs", + "file": "i.js", + "line": 8, + "column": 8, + "rule": "requireBlocksOnNewline", + "message": "requireBlocksOnNewline message" + } + ] + }, + { + "type": "file", + "file": "j.js", + "errors": [ + { + "type": "error", + "linter": "eslint", + "file": "j.js", + "line": 9, + "column": 9, + "rule": "no-control-regex", + "message": "no-control-regex message" + }, + { + "type": "error", + "linter": "jshint", + "file": "j.js", + "line": 9, + "column": 9, + "rule": "undef", + "message": "undef message" + }, + { + "type": "error", + "linter": "jscs", + "file": "j.js", + "line": 9, + "column": 9, + "rule": "excludeFiles", + "message": "excludeFiles message" + } + ] + }, + { + "type": "file", + "file": "k.js", + "errors": [ + { + "type": "warning", + "linter": "eslint", + "file": "k.js", + "line": 10, + "column": 10, + "rule": "no-debugger", + "message": "no-debugger message" + }, + { + "type": "warning", + "linter": "jshint", + "file": "k.js", + "line": 10, + "column": 10, + "rule": "validthis", + "message": "validthis message" + }, + { + "type": "warning", + "linter": "jscs", + "file": "k.js", + "line": 10, + "column": 10, + "rule": "requireCurlyBraces", + "message": "requireCurlyBraces message" + } + ] + }, + { + "type": "file", + "file": "l.js", + "errors": [ + { + "type": "error", + "linter": "eslint", + "file": "l.js", + "line": 11, + "column": 11, + "rule": "no-delete-var", + "message": "no-delete-var message" + }, + { + "type": "error", + "linter": "jshint", + "file": "l.js", + "line": 11, + "column": 11, + "rule": "newcap", + "message": "newcap message" + }, + { + "type": "error", + "linter": "jscs", + "file": "l.js", + "line": 11, + "column": 11, + "rule": "disallowMultipleVarDecl", + "message": "disallowMultipleVarDecl message" + } + ] + }, + { + "type": "file", + "file": "m.js", + "errors": [ + { + "type": "warning", + "linter": "eslint", + "file": "m.js", + "line": 12, + "column": 12, + "rule": "no-div-regex", + "message": "no-div-regex message" + }, + { + "type": "warning", + "linter": "jshint", + "file": "m.js", + "line": 12, + "column": 12, + "rule": "indent", + "message": "indent message" + }, + { + "type": "warning", + "linter": "jscs", + "file": "m.js", + "line": 12, + "column": 12, + "rule": "disallowEmptyBlocks", + "message": "disallowEmptyBlocks message" + } + ] + }, + { + "type": "file", + "file": "n.js", + "errors": [ + { + "type": "error", + "linter": "eslint", + "file": "n.js", + "line": 13, + "column": 13, + "rule": "no-dupe-keys", + "message": "no-dupe-keys message" + }, + { + "type": "error", + "linter": "jshint", + "file": "n.js", + "line": 13, + "column": 13, + "rule": "undef", + "message": "undef message" + }, + { + "type": "error", + "linter": "jscs", + "file": "n.js", + "line": 13, + "column": 13, + "rule": "disallowSpaceAfterObjectKeys", + "message": "disallowSpaceAfterObjectKeys message" + } + ] + }, + { + "type": "file", + "file": "o.js", + "errors": [ + { + "type": "warning", + "linter": "eslint", + "file": "o.js", + "line": 14, + "column": 14, + "rule": "no-else-return", + "message": "no-else-return message" + }, + { + "type": "warning", + "linter": "jshint", + "file": "o.js", + "line": 14, + "column": 14, + "rule": "validthis", + "message": "validthis message" + }, + { + "type": "warning", + "linter": "jscs", + "file": "o.js", + "line": 14, + "column": 14, + "rule": "requireCommaBeforeLineBreak", + "message": "requireCommaBeforeLineBreak message" + } + ] + }, + { + "type": "file", + "file": "p.js", + "errors": [ + { + "type": "error", + "linter": "eslint", + "file": "p.js", + "line": 15, + "column": 15, + "rule": "no-empty", + "message": "no-empty message" + }, + { + "type": "error", + "linter": "jshint", + "file": "p.js", + "line": 15, + "column": 15, + "rule": "newcap", + "message": "newcap message" + }, + { + "type": "error", + "linter": "jscs", + "file": "p.js", + "line": 15, + "column": 15, + "rule": "requireSpaceBeforeBinaryOperators", + "message": "requireSpaceBeforeBinaryOperators message" + } + ] + }, + { + "type": "file", + "file": "q.js", + "errors": [ + { + "type": "warning", + "linter": "eslint", + "file": "q.js", + "line": 16, + "column": 16, + "rule": "no-empty-class", + "message": "no-empty-class message" + }, + { + "type": "warning", + "linter": "jshint", + "file": "q.js", + "line": 16, + "column": 16, + "rule": "indent", + "message": "indent message" + }, + { + "type": "warning", + "linter": "jscs", + "file": "q.js", + "line": 16, + "column": 16, + "rule": "requireSpacesInConditionalExpression", + "message": "requireSpacesInConditionalExpression message" + } + ] + }, + { + "type": "file", + "file": "r.js", + "errors": [ + { + "type": "error", + "linter": "eslint", + "file": "r.js", + "line": 17, + "column": 17, + "rule": "no-empty-label", + "message": "no-empty-label message" + }, + { + "type": "error", + "linter": "jshint", + "file": "r.js", + "line": 17, + "column": 17, + "rule": "undef", + "message": "undef message" + }, + { + "type": "error", + "linter": "jscs", + "file": "r.js", + "line": 17, + "column": 17, + "rule": "requireSpaceAfterBinaryOperators", + "message": "requireSpaceAfterBinaryOperators message" + } + ] + }, + { + "type": "file", + "file": "s.js", + "errors": [ + { + "type": "warning", + "linter": "eslint", + "file": "s.js", + "line": 18, + "column": 18, + "rule": "no-eq-null", + "message": "no-eq-null message" + }, + { + "type": "warning", + "linter": "jshint", + "file": "s.js", + "line": 18, + "column": 18, + "rule": "validthis", + "message": "validthis message" + }, + { + "type": "warning", + "linter": "jscs", + "file": "s.js", + "line": 18, + "column": 18, + "rule": "disallowSpaceAfterPrefixUnaryOperators", + "message": "disallowSpaceAfterPrefixUnaryOperators message" + } + ] + }, + { + "type": "file", + "file": "t.js", + "errors": [ + { + "type": "error", + "linter": "eslint", + "file": "t.js", + "line": 19, + "column": 19, + "rule": "no-eval", + "message": "no-eval message" + }, + { + "type": "error", + "linter": "jshint", + "file": "t.js", + "line": 19, + "column": 19, + "rule": "newcap", + "message": "newcap message" + }, + { + "type": "error", + "linter": "jscs", + "file": "t.js", + "line": 19, + "column": 19, + "rule": "disallowKeywords", + "message": "disallowKeywords message" + } + ] + }, + { + "type": "file", + "file": "u.js", + "errors": [ + { + "type": "warning", + "linter": "eslint", + "file": "u.js", + "line": 20, + "column": 20, + "rule": "no-ex-assign", + "message": "no-ex-assign message" + }, + { + "type": "warning", + "linter": "jshint", + "file": "u.js", + "line": 20, + "column": 20, + "rule": "indent", + "message": "indent message" + }, + { + "type": "warning", + "linter": "jscs", + "file": "u.js", + "line": 20, + "column": 20, + "rule": "disallowMultipleLineBreaks", + "message": "disallowMultipleLineBreaks message" + } + ] + }, + { + "type": "file", + "file": "v.js", + "errors": [ + { + "type": "error", + "linter": "eslint", + "file": "v.js", + "line": 21, + "column": 21, + "rule": "no-extend-native", + "message": "no-extend-native message" + }, + { + "type": "error", + "linter": "jshint", + "file": "v.js", + "line": 21, + "column": 21, + "rule": "undef", + "message": "undef message" + }, + { + "type": "error", + "linter": "jscs", + "file": "v.js", + "line": 21, + "column": 21, + "rule": "validateLineBreaks", + "message": "validateLineBreaks message" + } + ] + }, + { + "type": "file", + "file": "w.js", + "errors": [ + { + "type": "warning", + "linter": "eslint", + "file": "w.js", + "line": 22, + "column": 22, + "rule": "no-extra-bind", + "message": "no-extra-bind message" + }, + { + "type": "warning", + "linter": "jshint", + "file": "w.js", + "line": 22, + "column": 22, + "rule": "validthis", + "message": "validthis message" + }, + { + "type": "warning", + "linter": "jscs", + "file": "w.js", + "line": 22, + "column": 22, + "rule": "validateQuoteMarks", + "message": "validateQuoteMarks message" + } + ] + }, + { + "type": "file", + "file": "x.js", + "errors": [ + { + "type": "error", + "linter": "eslint", + "file": "x.js", + "line": 23, + "column": 23, + "rule": "no-extra-boolean-cast", + "message": "no-extra-boolean-cast message" + }, + { + "type": "error", + "linter": "jshint", + "file": "x.js", + "line": 23, + "column": 23, + "rule": "newcap", + "message": "newcap message" + }, + { + "type": "error", + "linter": "jscs", + "file": "x.js", + "line": 23, + "column": 23, + "rule": "disallowMixedSpacesAndTabs", + "message": "disallowMixedSpacesAndTabs message" + } + ] + }, + { + "type": "file", + "file": "y.js", + "errors": [ + { + "type": "warning", + "linter": "eslint", + "file": "y.js", + "line": 24, + "column": 24, + "rule": "no-extra-parens", + "message": "no-extra-parens message" + }, + { + "type": "warning", + "linter": "jshint", + "file": "y.js", + "line": 24, + "column": 24, + "rule": "indent", + "message": "indent message" + }, + { + "type": "warning", + "linter": "jscs", + "file": "y.js", + "line": 24, + "column": 24, + "rule": "disallowTrailingWhitespace", + "message": "disallowTrailingWhitespace message" + } + ] + }, + { + "type": "file", + "file": "z.js", + "errors": [ + { + "type": "error", + "linter": "eslint", + "file": "z.js", + "line": 25, + "column": 25, + "rule": "no-extra-semi", + "message": "no-extra-semi message" + }, + { + "type": "error", + "linter": "jshint", + "file": "z.js", + "line": 25, + "column": 25, + "rule": "undef", + "message": "undef message" + }, + { + "type": "error", + "linter": "jscs", + "file": "z.js", + "line": 25, + "column": 25, + "rule": "disallowKeywordsOnNewLine", + "message": "disallowKeywordsOnNewLine message" + } + ] + } + ] +} diff --git a/test/fixtures/unit/stylish.stdout b/test/fixtures/unit/stylish.stdout new file mode 100644 index 0000000..99b970c --- /dev/null +++ b/test/fixtures/unit/stylish.stdout @@ -0,0 +1,129 @@ +a.js + warning eslint 0:0 no-alert message no-alert + warning jshint 0:0 indent message indent + warning jscs 0:0 validateIndentation message validateIndentation + +b.js + error eslint 1:1 no-array-constructor message no-array-constructor + error jshint 1:1 undef message undef + error jscs 1:1 maximumLineLength message maximumLineLength + +c.js + warning eslint 2:2 no-bitwise message no-bitwise + warning jshint 2:2 validthis message validthis + warning jscs 2:2 requireSpaceAfterKeywords message requireSpaceAfterKeywords + +d.js + error eslint 3:3 no-caller message no-caller + error jshint 3:3 newcap message newcap + error jscs 3:3 disallowSpacesInFunctionDeclaration message disallowSpacesInFunctionDeclaration + +e.js + warning eslint 4:4 no-catch-shadow message no-catch-shadow + warning jshint 4:4 indent message indent + warning jscs 4:4 disallowSpacesInNamedFunctionExpression message disallowSpacesInNamedFunctionExpression + +f.js + error eslint 5:5 no-comma-dangle message no-comma-dangle + error jshint 5:5 undef message undef + error jscs 5:5 requireSpacesInFunctionDeclaration message requireSpacesInFunctionDeclaration + +g.js + warning eslint 6:6 no-cond-assign message no-cond-assign + warning jshint 6:6 validthis message validthis + warning jscs 6:6 requireSpacesInNamedFunctionExpression message requireSpacesInNamedFunctionExpression + +h.js + error eslint 7:7 no-console message no-console + error jshint 7:7 newcap message newcap + error jscs 7:7 disallowTrailingComma message disallowTrailingComma + +i.js + warning eslint 8:8 no-constant-condition message no-constant-condition + warning jshint 8:8 indent message indent + warning jscs 8:8 requireBlocksOnNewline message requireBlocksOnNewline + +j.js + error eslint 9:9 no-control-regex message no-control-regex + error jshint 9:9 undef message undef + error jscs 9:9 excludeFiles message excludeFiles + +k.js + warning eslint 10:10 no-debugger message no-debugger + warning jshint 10:10 validthis message validthis + warning jscs 10:10 requireCurlyBraces message requireCurlyBraces + +l.js + error eslint 11:11 no-delete-var message no-delete-var + error jshint 11:11 newcap message newcap + error jscs 11:11 disallowMultipleVarDecl message disallowMultipleVarDecl + +m.js + warning eslint 12:12 no-div-regex message no-div-regex + warning jshint 12:12 indent message indent + warning jscs 12:12 disallowEmptyBlocks message disallowEmptyBlocks + +n.js + error eslint 13:13 no-dupe-keys message no-dupe-keys + error jshint 13:13 undef message undef + error jscs 13:13 disallowSpaceAfterObjectKeys message disallowSpaceAfterObjectKeys + +o.js + warning eslint 14:14 no-else-return message no-else-return + warning jshint 14:14 validthis message validthis + warning jscs 14:14 requireCommaBeforeLineBreak message requireCommaBeforeLineBreak + +p.js + error eslint 15:15 no-empty message no-empty + error jshint 15:15 newcap message newcap + error jscs 15:15 requireSpaceBeforeBinaryOperators message requireSpaceBeforeBinaryOperators + +q.js + warning eslint 16:16 no-empty-class message no-empty-class + warning jshint 16:16 indent message indent + warning jscs 16:16 requireSpacesInConditionalExpression message requireSpacesInConditionalExpression + +r.js + error eslint 17:17 no-empty-label message no-empty-label + error jshint 17:17 undef message undef + error jscs 17:17 requireSpaceAfterBinaryOperators message requireSpaceAfterBinaryOperators + +s.js + warning eslint 18:18 no-eq-null message no-eq-null + warning jshint 18:18 validthis message validthis + warning jscs 18:18 disallowSpaceAfterPrefixUnaryOperators message disallowSpaceAfterPrefixUnaryOperators + +t.js + error eslint 19:19 no-eval message no-eval + error jshint 19:19 newcap message newcap + error jscs 19:19 disallowKeywords message disallowKeywords + +u.js + warning eslint 20:20 no-ex-assign message no-ex-assign + warning jshint 20:20 indent message indent + warning jscs 20:20 disallowMultipleLineBreaks message disallowMultipleLineBreaks + +v.js + error eslint 21:21 no-extend-native message no-extend-native + error jshint 21:21 undef message undef + error jscs 21:21 validateLineBreaks message validateLineBreaks + +w.js + warning eslint 22:22 no-extra-bind message no-extra-bind + warning jshint 22:22 validthis message validthis + warning jscs 22:22 validateQuoteMarks message validateQuoteMarks + +x.js + error eslint 23:23 no-extra-boolean-cast message no-extra-boolean-cast + error jshint 23:23 newcap message newcap + error jscs 23:23 disallowMixedSpacesAndTabs message disallowMixedSpacesAndTabs + +y.js + warning eslint 24:24 no-extra-parens message no-extra-parens + warning jshint 24:24 indent message indent + warning jscs 24:24 disallowTrailingWhitespace message disallowTrailingWhitespace + +z.js + error eslint 25:25 no-extra-semi message no-extra-semi + error jshint 25:25 undef message undef + error jscs 25:25 disallowKeywordsOnNewLine message disallowKeywordsOnNewLine diff --git a/test/group-file-messages-transform.tape.js b/test/group-file-messages-transform.tape.js index c8895c9..5f73d0d 100644 --- a/test/group-file-messages-transform.tape.js +++ b/test/group-file-messages-transform.tape.js @@ -1,8 +1,31 @@ 'use strict'; var test = require('tape'); var groupFileMessagesTransform = require('../group-file-messages-transform'); +var makeErrorStream = require('./helpers/make-error-stream'); +var es = require('event-stream'); test('Group File Messages Transform', function runTests(t) { - t.plan(1); + t.plan(3); t.ok(groupFileMessagesTransform, 'Module exists'); + + var linters = ['eslint', 'jshint', 'jscs']; + var errorStreams = linters.map(makeErrorStream); + var mergedStream = es.merge.apply(es, errorStreams); + + mergedStream + .pipe(groupFileMessagesTransform(linters)) + .pipe(es.writeArray(testStream)); + + function testStream(err, fileErrors) { + if (err) { + t.fail(); + } + t.equal(fileErrors.length, 26, 'Correct quantity of file errors'); + + var pass = fileErrors.every(function checkErrorQuantity(fileMessage) { + return fileMessage.errors.length === 3; + }); + + t.ok(pass, 'All fileError messages have 3 errors each'); + } }); diff --git a/test/helpers/make-error-stream-fixture.js b/test/helpers/make-error-stream-fixture.js index 4f7e0de..6bdc4f7 100644 --- a/test/helpers/make-error-stream-fixture.js +++ b/test/helpers/make-error-stream-fixture.js @@ -1,6 +1,6 @@ 'use strict'; var path = require('path'); -var fs = require('fs'); +var mockfs = require('mock-fs'); var async = require('async'); var mkdirp = require('mkdirp'); @@ -44,28 +44,38 @@ var data = [ ]; function createJavaScriptFixtures(destination, callback) { - var fixtureFolder = path.resolve(destination, 'files--'); - fs.exists(fixtureFolder, function existsCallback(exists) { + var xfs = mockfs.fs(); + var fixtureFolder = path.resolve(destination); + xfs.exists(fixtureFolder, function existsCallback(exists) { if (exists) { return callback(new Error('destination folder exists')); } - mkdirp(fixtureFolder, function mkdirpCallback(err) { + mkdirp(fixtureFolder, { fs: xfs, mode: '0755' }, mkdirpCallback); + }); + + function mkdirpCallback(err) { + if (err) { + return callback(err); + } + async.each(data, writeFixture, function foo(err) { if (err) { return callback(err); } - async.each(data, function writeFixture(file, done) { - var filename = file[0] + '.js'; - var filePath = path.resolve(fixtureFolder, filename); - var fileContent = [ - file[1] ? '' : disable.jscs, - file[2] ? '' : disable.jshint, - file[3] ? '' : disable.eslint, - baseContent - ].join('\n'); - fs.writeFile(filePath, fileContent, 'utf8', done); - }, callback); + callback(null, xfs); }); - }); + } + + function writeFixture(file, done) { + var filename = file[0] + '.js'; + var filePath = path.resolve(fixtureFolder, filename); + var fileContent = [ + file[1] ? '' : disable.jscs, + file[2] ? '' : disable.jshint, + file[3] ? '' : disable.eslint, + baseContent + ].join('\n'); + xfs.writeFile(filePath, fileContent, 'utf8', done); + } } module.exports = createJavaScriptFixtures; diff --git a/test/helpers/make-error-stream.js b/test/helpers/make-error-stream.js new file mode 100644 index 0000000..bcccf73 --- /dev/null +++ b/test/helpers/make-error-stream.js @@ -0,0 +1,51 @@ +'use strict'; +var path = require('path'); +var jf = require('jsonfile'); +var partial = require('partial'); +var es = require('event-stream'); +var makeFileStream = require('../../error-to-file-transform'); + +var eslintrc = jf.readFileSync(path.join(__dirname, '../../rc/.eslintrc')); +var jshintrc = jf.readFileSync(path.join(__dirname, '../../rc/.jshintrc')); +var jscsrc = jf.readFileSync(path.join(__dirname, '../../rc/.jscsrc')); + +var rules = { + eslint: Object.keys(eslintrc.rules), + jscs: Object.keys(jscsrc), + jshint: Object.keys(jshintrc) +}; + +rules.jshint = rules.jshint.slice(1, rules.jshint.indexOf('globals')); + +function makeFiles() { + // one more than the quantity you want. + return Array(26 + 1).join(' ').split('').map(filename); +} + +function filename(value, index) { + return String.fromCharCode(97 + index) + '.js'; +} + +function isOdd(num) { + return num % 2; +} + +function makeError(linter, filename, index, array) { + return { + type: isOdd(index) ? 'error' : 'warning', + linter: linter, + file: filename, + line: index, + column: index, + rule: rules[linter][index % rules[linter].length], + message: rules[linter][index % rules[linter].length] + ' message' + }; +} + +function makeErrorStream(linter) { + var files = makeFiles(); + var errorsArray = files.map(partial(makeError, linter)); + return es.readArray(errorsArray).pipe(makeFileStream(linter, files)); +} + +module.exports = makeErrorStream; diff --git a/test/helpers/make-file-error-stream.js b/test/helpers/make-file-error-stream.js new file mode 100644 index 0000000..66a4a36 --- /dev/null +++ b/test/helpers/make-file-error-stream.js @@ -0,0 +1,15 @@ +'use strict'; +var makeErrorStream = require('./make-error-stream'); +var groupFileMessagesTransform = require('../../group-file-messages-transform'); +var es = require('event-stream'); + +function makeFileErrorStream() { + var linters = ['eslint', 'jshint', 'jscs']; + var errorStreams = linters.map(makeErrorStream); + var mergedStream = es.merge.apply(es, errorStreams); + + return mergedStream + .pipe(groupFileMessagesTransform(linters)); +} + +module.exports = makeFileErrorStream; diff --git a/test/json-reporter.tape.js b/test/json-reporter.tape.js index e15e5c3..cfbb358 100644 --- a/test/json-reporter.tape.js +++ b/test/json-reporter.tape.js @@ -1,8 +1,25 @@ 'use strict'; var test = require('tape'); var jsonReporter = require('../json-reporter'); +var makeFileErrorStream = require('./helpers/make-file-error-stream'); +var es = require('event-stream'); +var fs = require('fs'); +var path = require('path'); test('JSON Reporter', function runTests(t) { - t.plan(1); + t.plan(2); t.ok(jsonReporter, 'Module exists'); + + var fixture = path.join(__dirname, 'fixtures/unit/json.stdout'); + + var expectedStdout = fs.readFileSync(fixture).toString(); + + makeFileErrorStream().pipe(es.writeArray(function print(err, array) { + if (err) { + t.fail(); + } + + t.equal(jsonReporter(array), expectedStdout, 'Correct stdout'); + })); + }); diff --git a/test/stylish-reporter.tape.js b/test/stylish-reporter.tape.js index af8d07c..1793e80 100644 --- a/test/stylish-reporter.tape.js +++ b/test/stylish-reporter.tape.js @@ -1,8 +1,26 @@ 'use strict'; var test = require('tape'); var stylishReporter = require('../stylish-reporter'); +var makeFileErrorStream = require('./helpers/make-file-error-stream'); +var es = require('event-stream'); +var fs = require('fs'); +var path = require('path'); +var process = require('process'); test('Stylish Reporter', function runTests(t) { - t.plan(1); + t.plan(2); t.ok(stylishReporter, 'Module exists'); + + var fixture = path.join(__dirname, 'fixtures/unit/stylish.stdout'); + + var expectedStdout = fs.readFileSync(fixture).toString(); + + makeFileErrorStream().pipe(es.writeArray(function print(err, array) { + if (err) { + t.fail(); + } + + process.stdout.isTTY = false; + t.equal(stylishReporter(array), expectedStdout, 'Correct stdout'); + })); });