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