367 lines
12 KiB
JavaScript
367 lines
12 KiB
JavaScript
|
'use strict'
|
||
|
const TestRunner = require('test-runner')
|
||
|
const a = require('assert')
|
||
|
const runner = new TestRunner()
|
||
|
const ArgvParser = require('../../lib/argv-parser')
|
||
|
|
||
|
runner.test('argv-parser: long option, string', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one' }
|
||
|
]
|
||
|
const argv = [ '--one', '1' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(result[0].def)
|
||
|
a.ok(result[1].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'set', arg: '--one', name: 'one', value: null },
|
||
|
{ event: 'set', arg: '1', name: 'one', value: '1' }
|
||
|
])
|
||
|
})
|
||
|
|
||
|
runner.test('argv-parser: long option, string repeated', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one' }
|
||
|
]
|
||
|
const argv = [ '--one', '1', '--one', '2' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(result[0].def)
|
||
|
a.ok(result[1].def)
|
||
|
a.ok(result[2].def)
|
||
|
a.ok(result[3].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'set', arg: '--one', name: 'one', value: null },
|
||
|
{ event: 'set', arg: '1', name: 'one', value: '1' },
|
||
|
{ event: 'set', arg: '--one', name: 'one', value: null },
|
||
|
{ event: 'set', arg: '2', name: 'one', value: '2' }
|
||
|
])
|
||
|
})
|
||
|
|
||
|
runner.test('argv-parser: long option, string multiple', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one', multiple: true }
|
||
|
]
|
||
|
const argv = [ '--one', '1', '2' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(result[0].def)
|
||
|
a.ok(result[1].def)
|
||
|
a.ok(result[2].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'set', arg: '--one', name: 'one', value: null },
|
||
|
{ event: 'set', arg: '1', name: 'one', value: '1' },
|
||
|
{ event: 'set', arg: '2', name: 'one', value: '2' }
|
||
|
])
|
||
|
})
|
||
|
|
||
|
runner.test('argv-parser: long option, string multiple then boolean', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one', multiple: true },
|
||
|
{ name: 'two', type: Boolean }
|
||
|
]
|
||
|
const argv = [ '--one', '1', '2', '--two' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(result[0].def)
|
||
|
a.ok(result[1].def)
|
||
|
a.ok(result[2].def)
|
||
|
a.ok(result[3].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'set', arg: '--one', name: 'one', value: null },
|
||
|
{ event: 'set', arg: '1', name: 'one', value: '1' },
|
||
|
{ event: 'set', arg: '2', name: 'one', value: '2' },
|
||
|
{ event: 'set', arg: '--two', name: 'two', value: true }
|
||
|
])
|
||
|
})
|
||
|
|
||
|
runner.test('argv-parser: long option, boolean', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one', type: Boolean }
|
||
|
]
|
||
|
const argv = [ '--one', '1' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(result[0].def)
|
||
|
a.ok(!result[1].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'set', arg: '--one', name: 'one', value: true },
|
||
|
{ event: 'unknown_value', arg: '1', name: '_unknown', value: undefined }
|
||
|
])
|
||
|
})
|
||
|
|
||
|
runner.test('argv-parser: simple, with unknown values', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one', type: Number }
|
||
|
]
|
||
|
const argv = [ 'clive', '--one', '1', 'yeah' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(!result[0].def)
|
||
|
a.ok(result[1].def)
|
||
|
a.ok(result[2].def)
|
||
|
a.ok(!result[3].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'unknown_value', arg: 'clive', name: '_unknown', value: undefined },
|
||
|
{ event: 'set', arg: '--one', name: 'one', value: null },
|
||
|
{ event: 'set', arg: '1', name: 'one', value: '1' },
|
||
|
{ event: 'unknown_value', arg: 'yeah', name: '_unknown', value: undefined }
|
||
|
])
|
||
|
})
|
||
|
|
||
|
runner.test('argv-parser: simple, with singular defaultOption', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one', type: Number },
|
||
|
{ name: 'two', defaultOption: true }
|
||
|
]
|
||
|
const argv = [ 'clive', '--one', '1', 'yeah' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(result[0].def)
|
||
|
a.ok(result[1].def)
|
||
|
a.ok(result[2].def)
|
||
|
a.ok(!result[3].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'set', arg: 'clive', name: 'two', value: 'clive' },
|
||
|
{ event: 'set', arg: '--one', name: 'one', value: null },
|
||
|
{ event: 'set', arg: '1', name: 'one', value: '1' },
|
||
|
{ event: 'unknown_value', arg: 'yeah', name: '_unknown', value: undefined }
|
||
|
])
|
||
|
})
|
||
|
|
||
|
runner.test('argv-parser: simple, with multiple defaultOption', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one', type: Number },
|
||
|
{ name: 'two', defaultOption: true, multiple: true }
|
||
|
]
|
||
|
const argv = [ 'clive', '--one', '1', 'yeah' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(result[0].def)
|
||
|
a.ok(result[1].def)
|
||
|
a.ok(result[2].def)
|
||
|
a.ok(result[3].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'set', arg: 'clive', name: 'two', value: 'clive' },
|
||
|
{ event: 'set', arg: '--one', name: 'one', value: null },
|
||
|
{ event: 'set', arg: '1', name: 'one', value: '1' },
|
||
|
{ event: 'set', arg: 'yeah', name: 'two', value: 'yeah' }
|
||
|
])
|
||
|
})
|
||
|
|
||
|
runner.test('argv-parser: long option, string lazyMultiple bad', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one', lazyMultiple: true }
|
||
|
]
|
||
|
const argv = [ '--one', '1', '2' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(result[0].def)
|
||
|
a.ok(result[1].def)
|
||
|
a.ok(!result[2].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'set', arg: '--one', name: 'one', value: null },
|
||
|
{ event: 'set', arg: '1', name: 'one', value: '1' },
|
||
|
{ event: 'unknown_value', arg: '2', name: '_unknown', value: undefined }
|
||
|
])
|
||
|
})
|
||
|
|
||
|
runner.test('argv-parser: long option, string lazyMultiple good', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one', lazyMultiple: true }
|
||
|
]
|
||
|
const argv = [ '--one', '1', '--one', '2' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(result[0].def)
|
||
|
a.ok(result[1].def)
|
||
|
a.ok(result[2].def)
|
||
|
a.ok(result[3].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'set', arg: '--one', name: 'one', value: null },
|
||
|
{ event: 'set', arg: '1', name: 'one', value: '1' },
|
||
|
{ event: 'set', arg: '--one', name: 'one', value: null },
|
||
|
{ event: 'set', arg: '2', name: 'one', value: '2' }
|
||
|
])
|
||
|
})
|
||
|
|
||
|
runner.test('argv-parser: long option, stopAtFirstUnknown', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one' },
|
||
|
{ name: 'two' }
|
||
|
]
|
||
|
const argv = [ '--one', '1', 'asdf', '--two', '2' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv, stopAtFirstUnknown: true })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(result[0].def)
|
||
|
a.ok(result[1].def)
|
||
|
a.ok(!result[2].def)
|
||
|
a.ok(!result[3].def)
|
||
|
a.ok(!result[4].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'set', arg: '--one', name: 'one', value: null },
|
||
|
{ event: 'set', arg: '1', name: 'one', value: '1' },
|
||
|
{ event: 'unknown_value', arg: 'asdf', name: '_unknown', value: undefined },
|
||
|
{ event: 'unknown_value', arg: '--two', name: '_unknown', value: undefined },
|
||
|
{ event: 'unknown_value', arg: '2', name: '_unknown', value: undefined }
|
||
|
])
|
||
|
})
|
||
|
|
||
|
runner.test('argv-parser: long option, stopAtFirstUnknown with defaultOption', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one', defaultOption: true },
|
||
|
{ name: 'two' }
|
||
|
]
|
||
|
const argv = [ '1', 'asdf', '--two', '2' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv, stopAtFirstUnknown: true })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(result[0].def)
|
||
|
a.ok(!result[1].def)
|
||
|
a.ok(!result[2].def)
|
||
|
a.ok(!result[3].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'set', arg: '1', name: 'one', value: '1' },
|
||
|
{ event: 'unknown_value', arg: 'asdf', name: '_unknown', value: undefined },
|
||
|
{ event: 'unknown_value', arg: '--two', name: '_unknown', value: undefined },
|
||
|
{ event: 'unknown_value', arg: '2', name: '_unknown', value: undefined }
|
||
|
])
|
||
|
})
|
||
|
|
||
|
runner.test('argv-parser: long option, stopAtFirstUnknown with defaultOption 2', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one', defaultOption: true },
|
||
|
{ name: 'two' }
|
||
|
]
|
||
|
const argv = [ '--one', '1', '--', '--two', '2' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv, stopAtFirstUnknown: true })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(result[0].def)
|
||
|
a.ok(result[1].def)
|
||
|
a.ok(!result[2].def)
|
||
|
a.ok(!result[3].def)
|
||
|
a.ok(!result[4].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'set', arg: '--one', name: 'one', value: null },
|
||
|
{ event: 'set', arg: '1', name: 'one', value: '1' },
|
||
|
{ event: 'unknown_value', arg: '--', name: '_unknown', value: undefined },
|
||
|
{ event: 'unknown_value', arg: '--two', name: '_unknown', value: undefined },
|
||
|
{ event: 'unknown_value', arg: '2', name: '_unknown', value: undefined }
|
||
|
])
|
||
|
})
|
||
|
|
||
|
runner.test('argv-parser: --option=value', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one' },
|
||
|
{ name: 'two' }
|
||
|
]
|
||
|
const argv = [ '--one=1', '--two=2', '--two=' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(result[0].def)
|
||
|
a.ok(result[1].def)
|
||
|
a.ok(result[2].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'set', arg: '--one=1', name: 'one', value: '1' },
|
||
|
{ event: 'set', arg: '--two=2', name: 'two', value: '2' },
|
||
|
{ event: 'set', arg: '--two=', name: 'two', value: '' }
|
||
|
])
|
||
|
})
|
||
|
|
||
|
runner.test('argv-parser: --option=value, unknown option', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one' }
|
||
|
]
|
||
|
const argv = [ '--three=3' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(!result[0].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'unknown_option', arg: '--three=3', name: '_unknown', value: undefined }
|
||
|
])
|
||
|
})
|
||
|
|
||
|
runner.test('argv-parser: --option=value where option is boolean', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one', type: Boolean }
|
||
|
]
|
||
|
const argv = [ '--one=1' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(result[0].def)
|
||
|
a.ok(result[1].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'unknown_value', arg: '--one=1', name: '_unknown', value: undefined },
|
||
|
{ event: 'set', arg: '--one=1', name: 'one', value: true }
|
||
|
])
|
||
|
})
|
||
|
|
||
|
runner.test('argv-parser: short option, string', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one', alias: 'o' }
|
||
|
]
|
||
|
const argv = [ '-o', '1' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(result[0].def)
|
||
|
a.ok(result[1].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'set', arg: '-o', name: 'one', value: null },
|
||
|
{ event: 'set', arg: '1', name: 'one', value: '1' }
|
||
|
])
|
||
|
})
|
||
|
|
||
|
runner.test('argv-parser: combined short option, string', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one', alias: 'o' },
|
||
|
{ name: 'two', alias: 't' }
|
||
|
]
|
||
|
const argv = [ '-ot', '1' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(result[0].def)
|
||
|
a.ok(result[1].def)
|
||
|
a.ok(result[2].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'set', arg: '-ot', subArg: '-o', name: 'one', value: null },
|
||
|
{ event: 'set', arg: '-ot', subArg: '-t', name: 'two', value: null },
|
||
|
{ event: 'set', arg: '1', name: 'two', value: '1' }
|
||
|
])
|
||
|
})
|
||
|
|
||
|
runner.test('argv-parser: combined short option, one unknown', function () {
|
||
|
const optionDefinitions = [
|
||
|
{ name: 'one', alias: 'o' },
|
||
|
{ name: 'two', alias: 't' }
|
||
|
]
|
||
|
const argv = [ '-xt', '1' ]
|
||
|
const parser = new ArgvParser(optionDefinitions, { argv })
|
||
|
const result = Array.from(parser)
|
||
|
a.ok(!result[0].def)
|
||
|
a.ok(result[1].def)
|
||
|
a.ok(result[2].def)
|
||
|
result.forEach(r => delete r.def)
|
||
|
a.deepStrictEqual(result, [
|
||
|
{ event: 'unknown_option', arg: '-xt', subArg: '-x', name: '_unknown', value: undefined },
|
||
|
{ event: 'set', arg: '-xt', subArg: '-t', name: 'two', value: null },
|
||
|
{ event: 'set', arg: '1', name: 'two', value: '1' }
|
||
|
])
|
||
|
})
|