|
var Hash = require('hashish');
|
|
var optimist = require('../index');
|
|
var test = require('tap').test;
|
|
|
|
test('usageFail', function (t) {
|
|
var r = checkUsage(function () {
|
|
return optimist('-x 10 -z 20'.split(' '))
|
|
.usage('Usage: $0 -x NUM -y NUM')
|
|
.demand(['x','y'])
|
|
.argv;
|
|
});
|
|
t.same(
|
|
r.result,
|
|
{ x : 10, z : 20, _ : [], $0 : './usage' }
|
|
);
|
|
|
|
t.same(
|
|
r.errors.join('\n').split(/\n+/),
|
|
[
|
|
'Usage: ./usage -x NUM -y NUM',
|
|
'Options:',
|
|
' -x [required]',
|
|
' -y [required]',
|
|
'Missing required arguments: y',
|
|
]
|
|
);
|
|
t.same(r.logs, []);
|
|
t.ok(r.exit);
|
|
t.end();
|
|
});
|
|
|
|
|
|
test('usagePass', function (t) {
|
|
var r = checkUsage(function () {
|
|
return optimist('-x 10 -y 20'.split(' '))
|
|
.usage('Usage: $0 -x NUM -y NUM')
|
|
.demand(['x','y'])
|
|
.argv;
|
|
});
|
|
t.same(r, {
|
|
result : { x : 10, y : 20, _ : [], $0 : './usage' },
|
|
errors : [],
|
|
logs : [],
|
|
exit : false,
|
|
});
|
|
t.end();
|
|
});
|
|
|
|
test('checkPass', function (t) {
|
|
var r = checkUsage(function () {
|
|
return optimist('-x 10 -y 20'.split(' '))
|
|
.usage('Usage: $0 -x NUM -y NUM')
|
|
.check(function (argv) {
|
|
if (!('x' in argv)) throw 'You forgot about -x';
|
|
if (!('y' in argv)) throw 'You forgot about -y';
|
|
})
|
|
.argv;
|
|
});
|
|
t.same(r, {
|
|
result : { x : 10, y : 20, _ : [], $0 : './usage' },
|
|
errors : [],
|
|
logs : [],
|
|
exit : false,
|
|
});
|
|
t.end();
|
|
});
|
|
|
|
test('checkFail', function (t) {
|
|
var r = checkUsage(function () {
|
|
return optimist('-x 10 -z 20'.split(' '))
|
|
.usage('Usage: $0 -x NUM -y NUM')
|
|
.check(function (argv) {
|
|
if (!('x' in argv)) throw 'You forgot about -x';
|
|
if (!('y' in argv)) throw 'You forgot about -y';
|
|
})
|
|
.argv;
|
|
});
|
|
|
|
t.same(
|
|
r.result,
|
|
{ x : 10, z : 20, _ : [], $0 : './usage' }
|
|
);
|
|
|
|
t.same(
|
|
r.errors.join('\n').split(/\n+/),
|
|
[
|
|
'Usage: ./usage -x NUM -y NUM',
|
|
'You forgot about -y'
|
|
]
|
|
);
|
|
|
|
t.same(r.logs, []);
|
|
t.ok(r.exit);
|
|
t.end();
|
|
});
|
|
|
|
test('checkCondPass', function (t) {
|
|
function checker (argv) {
|
|
return 'x' in argv && 'y' in argv;
|
|
}
|
|
|
|
var r = checkUsage(function () {
|
|
return optimist('-x 10 -y 20'.split(' '))
|
|
.usage('Usage: $0 -x NUM -y NUM')
|
|
.check(checker)
|
|
.argv;
|
|
});
|
|
t.same(r, {
|
|
result : { x : 10, y : 20, _ : [], $0 : './usage' },
|
|
errors : [],
|
|
logs : [],
|
|
exit : false,
|
|
});
|
|
t.end();
|
|
});
|
|
|
|
test('checkCondFail', function (t) {
|
|
function checker (argv) {
|
|
return 'x' in argv && 'y' in argv;
|
|
}
|
|
|
|
var r = checkUsage(function () {
|
|
return optimist('-x 10 -z 20'.split(' '))
|
|
.usage('Usage: $0 -x NUM -y NUM')
|
|
.check(checker)
|
|
.argv;
|
|
});
|
|
|
|
t.same(
|
|
r.result,
|
|
{ x : 10, z : 20, _ : [], $0 : './usage' }
|
|
);
|
|
|
|
t.same(
|
|
r.errors.join('\n').split(/\n+/).join('\n'),
|
|
'Usage: ./usage -x NUM -y NUM\n'
|
|
+ 'Argument check failed: ' + checker.toString()
|
|
);
|
|
|
|
t.same(r.logs, []);
|
|
t.ok(r.exit);
|
|
t.end();
|
|
});
|
|
|
|
test('countPass', function (t) {
|
|
var r = checkUsage(function () {
|
|
return optimist('1 2 3 --moo'.split(' '))
|
|
.usage('Usage: $0 [x] [y] [z] {OPTIONS}')
|
|
.demand(3)
|
|
.argv;
|
|
});
|
|
t.same(r, {
|
|
result : { _ : [ '1', '2', '3' ], moo : true, $0 : './usage' },
|
|
errors : [],
|
|
logs : [],
|
|
exit : false,
|
|
});
|
|
t.end();
|
|
});
|
|
|
|
test('countFail', function (t) {
|
|
var r = checkUsage(function () {
|
|
return optimist('1 2 --moo'.split(' '))
|
|
.usage('Usage: $0 [x] [y] [z] {OPTIONS}')
|
|
.demand(3)
|
|
.argv;
|
|
});
|
|
t.same(
|
|
r.result,
|
|
{ _ : [ '1', '2' ], moo : true, $0 : './usage' }
|
|
);
|
|
|
|
t.same(
|
|
r.errors.join('\n').split(/\n+/),
|
|
[
|
|
'Usage: ./usage [x] [y] [z] {OPTIONS}',
|
|
'Not enough non-option arguments: got 2, need at least 3',
|
|
]
|
|
);
|
|
|
|
t.same(r.logs, []);
|
|
t.ok(r.exit);
|
|
t.end();
|
|
});
|
|
|
|
test('defaultSingles', function (t) {
|
|
var r = checkUsage(function () {
|
|
return optimist('--foo 50 --baz 70 --powsy'.split(' '))
|
|
.default('foo', 5)
|
|
.default('bar', 6)
|
|
.default('baz', 7)
|
|
.argv
|
|
;
|
|
});
|
|
t.same(r.result, {
|
|
foo : '50',
|
|
bar : 6,
|
|
baz : '70',
|
|
powsy : true,
|
|
_ : [],
|
|
$0 : './usage',
|
|
});
|
|
t.end();
|
|
});
|
|
|
|
test('defaultAliases', function (t) {
|
|
var r = checkUsage(function () {
|
|
return optimist('')
|
|
.alias('f', 'foo')
|
|
.default('f', 5)
|
|
.argv
|
|
;
|
|
});
|
|
t.same(r.result, {
|
|
f : '5',
|
|
foo : '5',
|
|
_ : [],
|
|
$0 : './usage',
|
|
});
|
|
t.end();
|
|
});
|
|
|
|
test('defaultHash', function (t) {
|
|
var r = checkUsage(function () {
|
|
return optimist('--foo 50 --baz 70'.split(' '))
|
|
.default({ foo : 10, bar : 20, quux : 30 })
|
|
.argv
|
|
;
|
|
});
|
|
t.same(r.result, {
|
|
_ : [],
|
|
$0 : './usage',
|
|
foo : 50,
|
|
baz : 70,
|
|
bar : 20,
|
|
quux : 30,
|
|
});
|
|
t.end();
|
|
});
|
|
|
|
test('rebase', function (t) {
|
|
t.equal(
|
|
optimist.rebase('/home/substack', '/home/substack/foo/bar/baz'),
|
|
'./foo/bar/baz'
|
|
);
|
|
t.equal(
|
|
optimist.rebase('/home/substack/foo/bar/baz', '/home/substack'),
|
|
'../../..'
|
|
);
|
|
t.equal(
|
|
optimist.rebase('/home/substack/foo', '/home/substack/pow/zoom.txt'),
|
|
'../pow/zoom.txt'
|
|
);
|
|
t.end();
|
|
});
|
|
|
|
function checkUsage (f) {
|
|
|
|
var exit = false;
|
|
|
|
process._exit = process.exit;
|
|
process._env = process.env;
|
|
process._argv = process.argv;
|
|
|
|
process.exit = function (t) { exit = true };
|
|
process.env = Hash.merge(process.env, { _ : 'node' });
|
|
process.argv = [ './usage' ];
|
|
|
|
var errors = [];
|
|
var logs = [];
|
|
|
|
console._error = console.error;
|
|
console.error = function (msg) { errors.push(msg) };
|
|
console._log = console.log;
|
|
console.log = function (msg) { logs.push(msg) };
|
|
|
|
var result = f();
|
|
|
|
process.exit = process._exit;
|
|
process.env = process._env;
|
|
process.argv = process._argv;
|
|
|
|
console.error = console._error;
|
|
console.log = console._log;
|
|
|
|
return {
|
|
errors : errors,
|
|
logs : logs,
|
|
exit : exit,
|
|
result : result,
|
|
};
|
|
};
|