293 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			293 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								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,
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								};
							 |