You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

119 lines
2.9 KiB

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()
})
})