| var t = require('tap') |
| var spawn = require('child_process').spawn |
| var node = process.execPath |
| var bin = require.resolve('../bin/which') |
| |
| function which (args, extraPath, cb) { |
| if (typeof extraPath === 'function') |
| cb = extraPath, extraPath = null |
| |
| var options = {} |
| if (extraPath) { |
| var sep = process.platform === 'win32' ? ';' : ':' |
| var p = process.env.PATH + sep + extraPath |
| options.env = Object.keys(process.env).reduce(function (env, k) { |
| if (!k.match(/^path$/i)) |
| env[k] = process.env[k] |
| return env |
| }, { PATH: p }) |
| } |
| |
| var out = '' |
| var err = '' |
| var child = spawn(node, [bin].concat(args), options) |
| child.stdout.on('data', function (c) { |
| out += c |
| }) |
| child.stderr.on('data', function (c) { |
| err += c |
| }) |
| child.on('close', function (code, signal) { |
| cb(code, signal, out.trim(), err.trim()) |
| }) |
| } |
| |
| t.test('finds node', function (t) { |
| which('node', function (code, signal, out, err) { |
| t.equal(signal, null) |
| t.equal(code, 0) |
| t.equal(err, '') |
| t.match(out, /[\\\/]node(\.exe)?$/) |
| t.end() |
| }) |
| }) |
| |
| t.test('does not find flergyderp', function (t) { |
| which('flergyderp', function (code, signal, out, err) { |
| t.equal(signal, null) |
| t.equal(code, 1) |
| t.equal(err, '') |
| t.match(out, '') |
| t.end() |
| }) |
| }) |
| |
| t.test('finds node and tap', function (t) { |
| which(['node', 'tap'], function (code, signal, out, err) { |
| t.equal(signal, null) |
| t.equal(code, 0) |
| t.equal(err, '') |
| t.match(out.split(/\n/), [ |
| /[\\\/]node(\.exe)?$/, |
| /[\\\/]tap(\.cmd)?$/ |
| ]) |
| t.end() |
| }) |
| }) |
| |
| t.test('finds node and tap, but not flergyderp', function (t) { |
| which(['node', 'flergyderp', 'tap'], function (code, signal, out, err) { |
| t.equal(signal, null) |
| t.equal(code, 1) |
| t.equal(err, '') |
| t.match(out.split(/\n/), [ |
| /[\\\/]node(\.exe)?$/, |
| /[\\\/]tap(\.cmd)?$/ |
| ]) |
| t.end() |
| }) |
| }) |
| |
| t.test('cli flags', function (t) { |
| var p = require('path').dirname(bin) |
| var cases = [ '-a', '-s', '-as', '-sa' ] |
| t.plan(cases.length) |
| cases.forEach(function (c) { |
| t.test(c, function (t) { |
| which(['which', c], p, function (code, signal, out, err) { |
| t.equal(signal, null) |
| t.equal(code, 0) |
| t.equal(err, '') |
| if (/s/.test(c)) |
| t.equal(out, '', 'should be silent') |
| else if (/a/.test(c)) |
| t.ok(out.split(/\n/).length > 1, 'should have more than 1 result') |
| t.end() |
| }) |
| }) |
| }) |
| }) |
| |
| t.test('shows usage', function (t) { |
| which([], function (code, signal, out, err) { |
| t.equal(signal, null) |
| t.equal(code, 1) |
| t.equal(err, 'usage: which [-as] program ...') |
| t.equal(out, '') |
| t.end() |
| }) |
| }) |
| |
| t.test('complains about unknown flag', function (t) { |
| which(['node', '-sax'], function (code, signal, out, err) { |
| t.equal(signal, null) |
| t.equal(code, 1) |
| t.equal(out, '') |
| t.equal(err, 'which: illegal option -- x\nusage: which [-as] program ...') |
| t.end() |
| }) |
| }) |