Dotawo/node_modules/import/test/smash-test.js

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;
}