70 lines
3.3 KiB
JavaScript
70 lines
3.3 KiB
JavaScript
var vows = require("vows"),
|
|
assert = require("assert"),
|
|
fs = require("fs"),
|
|
stream = require("stream"),
|
|
smash = require("../");
|
|
|
|
var suite = vows.describe("smash");
|
|
|
|
suite.addBatch({
|
|
"smash": {
|
|
"on a file with no imports": testCase(["test/data/foo.js"], "test/data/foo.js"),
|
|
"on a file with imports with trailing comments": testCase(["test/data/trailing-comment-import.js"], "test/data/trailing-comment-import-expected.js"),
|
|
"on a file with invalid import syntax": testFailureCase(["test/data/invalid-import-syntax.js"], "invalid import: test/data/invalid-import-syntax.js:0: import foo;"),
|
|
"on a file with that imports a file that does not exist": testFailureCase(["test/data/imports-not-found.js"], "ENOENT, open 'test/data/not-found.js'"),
|
|
"on a file with a commented-out import": testCase(["test/data/commented-import.js"], "test/data/commented-import.js"),
|
|
"on a file with a not-commented-out import": testCase(["test/data/not-commented-import.js"], "test/data/not-commented-import-expected.js"),
|
|
"on a file with one import": testCase(["test/data/imports-foo.js"], "test/data/imports-foo-expected.js"),
|
|
"on a file with multiple imports": testCase(["test/data/imports-foo-bar-baz.js"], "test/data/imports-foo-bar-baz-expected.js"),
|
|
"on a file with nested imports": testCase(["test/data/imports-imports-foo.js"], "test/data/imports-imports-foo-expected.js"),
|
|
"on a file with empty lines": testCase(["test/data/empty-lines.js"], "test/data/empty-lines.js"),
|
|
"on a file which imports a file with empty lines": testCase(["test/data/import-empty-lines.js"], "test/data/empty-lines.js"),
|
|
"on multiple input files": testCase(["test/data/foo.js", "test/data/bar.js", "test/data/baz.js"], "test/data/imports-foo-bar-baz-expected.js"),
|
|
"with redundant input files": testCase(["test/data/foo.js", "test/data/foo.js"], "test/data/foo.js"),
|
|
"on a file with multiple redundant imports": testCase(["test/data/imports-foo-foo-bar-foo.js"], "test/data/imports-foo-foo-bar-foo-expected.js"),
|
|
"when a file imports itself": testCase(["test/data/imports-self.js"], "test/data/foo.js"),
|
|
"when circular imports are encountered": testCase(["test/data/imports-circular-foo.js"], "test/data/imports-circular-foo-expected.js"),
|
|
"when the input is a directory": testCase(["test/data/"], "test/data/index.js"),
|
|
"when the input is missing a file extension": testCase(["test/data/imports-index"], "test/data/index.js")
|
|
}
|
|
});
|
|
|
|
suite.export(module);
|
|
|
|
function testCase(inputs, expected) {
|
|
return {
|
|
topic: function() {
|
|
smash(inputs).pipe(testStream(this.callback));
|
|
},
|
|
"produces the expected output": function(actual) {
|
|
assert.deepEqual(actual, fs.readFileSync(expected, "utf8"));
|
|
}
|
|
};
|
|
}
|
|
|
|
function testFailureCase(inputs, expected) {
|
|
return {
|
|
topic: function() {
|
|
var callback = this.callback;
|
|
smash(inputs).on("error", function(error) {
|
|
callback(null, error);
|
|
});
|
|
},
|
|
"produces the expected error message": function(error) {
|
|
assert.deepEqual(error.message, expected);
|
|
}
|
|
};
|
|
}
|
|
|
|
function testStream(callback) {
|
|
var s = new stream.Writable, chunks = [];
|
|
|
|
s._write = function(chunk, encoding, callback) {
|
|
chunks.push(chunk);
|
|
callback();
|
|
};
|
|
|
|
s.on("error", callback);
|
|
s.on("finish", function() { callback(null, Buffer.concat(chunks).toString("utf8")); });
|
|
return s;
|
|
}
|