1 var parse = require('../');
2 var test = require('tape');
4 test('parse args', function (t) {
7 { moo : false, _ : [] },
11 parse([ '-v', 'a', '-v', 'b', '-v', 'c' ]),
12 { v : ['a','b','c'], _ : [] },
18 test('comprehensive', function (t) {
21 '--name=meowmers', 'bare', '-cats', 'woo',
22 '-h', 'awesome', '--multi=quux',
24 '-b', '--bool', '--no-meep', '--multi=baz',
25 '--', '--not-a-flag', 'eek'
36 multi : [ 'quux', 'baz' ],
39 _ : [ 'bare', '--not-a-flag', 'eek' ]
45 test('nums', function (t) {
51 '--hex', '0xdeadbeef',
62 t.deepEqual(typeof argv.x, 'number');
63 t.deepEqual(typeof argv.y, 'number');
64 t.deepEqual(typeof argv.z, 'number');
65 t.deepEqual(typeof argv.w, 'string');
66 t.deepEqual(typeof argv.hex, 'number');
67 t.deepEqual(typeof argv._[0], 'number');
71 test('flag boolean', function (t) {
72 var argv = parse([ '-t', 'moo' ], { boolean: 't' });
73 t.deepEqual(argv, { t : true, _ : [ 'moo' ] });
74 t.deepEqual(typeof argv.t, 'boolean');
78 test('flag boolean value', function (t) {
79 var argv = parse(['--verbose', 'false', 'moo', '-t', 'true'], {
80 boolean: [ 't', 'verbose' ],
81 default: { verbose: true }
90 t.deepEqual(typeof argv.verbose, 'boolean');
91 t.deepEqual(typeof argv.t, 'boolean');
95 test('flag boolean default false', function (t) {
96 var argv = parse(['moo'], {
97 boolean: ['t', 'verbose'],
98 default: { verbose: false, t: false }
107 t.deepEqual(typeof argv.verbose, 'boolean');
108 t.deepEqual(typeof argv.t, 'boolean');
113 test('boolean groups', function (t) {
114 var argv = parse([ '-x', '-z', 'one', 'two', 'three' ], {
115 boolean: ['x','y','z']
122 _ : [ 'one', 'two', 'three' ]
125 t.deepEqual(typeof argv.x, 'boolean');
126 t.deepEqual(typeof argv.y, 'boolean');
127 t.deepEqual(typeof argv.z, 'boolean');
131 test('newlines in params' , function (t) {
132 var args = parse([ '-s', "X\nX" ])
133 t.deepEqual(args, { _ : [], s : "X\nX" });
135 // reproduce in bash:
138 // node program.js --s="$VALUE"
139 args = parse([ "--s=X\nX" ])
140 t.deepEqual(args, { _ : [], s : "X\nX" });
144 test('strings' , function (t) {
145 var s = parse([ '-s', '0001234' ], { string: 's' }).s;
146 t.equal(s, '0001234');
147 t.equal(typeof s, 'string');
149 var x = parse([ '-x', '56' ], { string: 'x' }).x;
151 t.equal(typeof x, 'string');
155 test('stringArgs', function (t) {
156 var s = parse([ ' ', ' ' ], { string: '_' })._;
158 t.same(typeof s[0], 'string');
160 t.same(typeof s[1], 'string');
165 test('empty strings', function(t) {
166 var s = parse([ '-s' ], { string: 's' }).s;
168 t.equal(typeof s, 'string');
170 var str = parse([ '--str' ], { string: 'str' }).str;
172 t.equal(typeof str, 'string');
174 var letters = parse([ '-art' ], {
178 t.equal(letters.a, '');
179 t.equal(letters.r, true);
180 t.equal(letters.t, '');
186 test('slashBreak', function (t) {
188 parse([ '-I/foo/bar/baz' ]),
189 { I : '/foo/bar/baz', _ : [] }
192 parse([ '-xyz/foo/bar/baz' ]),
193 { x : true, y : true, z : '/foo/bar/baz', _ : [] }
198 test('alias', function (t) {
199 var argv = parse([ '-f', '11', '--zoom', '55' ], {
202 t.equal(argv.zoom, 55);
203 t.equal(argv.z, argv.zoom);
208 test('multiAlias', function (t) {
209 var argv = parse([ '-f', '11', '--zoom', '55' ], {
210 alias: { z: [ 'zm', 'zoom' ] }
212 t.equal(argv.zoom, 55);
213 t.equal(argv.z, argv.zoom);
214 t.equal(argv.z, argv.zm);
219 test('nested dotted objects', function (t) {
221 '--foo.bar', '3', '--foo.baz', '4',
222 '--foo.quux.quibble', '5', '--foo.quux.o_O',
234 t.same(argv.beep, { boop : true });
238 test('boolean and alias with chainable api', function (t) {
239 var aliased = [ '-h', 'derp' ];
240 var regular = [ '--herp', 'derp' ];
242 herp: { alias: 'h', boolean: true }
244 var aliasedArgv = parse(aliased, {
248 var propertyArgv = parse(regular, {
258 t.same(aliasedArgv, expected);
259 t.same(propertyArgv, expected);
263 test('boolean and alias with options hash', function (t) {
264 var aliased = [ '-h', 'derp' ];
265 var regular = [ '--herp', 'derp' ];
267 alias: { 'h': 'herp' },
270 var aliasedArgv = parse(aliased, opts);
271 var propertyArgv = parse(regular, opts);
277 t.same(aliasedArgv, expected);
278 t.same(propertyArgv, expected);
282 test('boolean and alias using explicit true', function (t) {
283 var aliased = [ '-h', 'true' ];
284 var regular = [ '--herp', 'true' ];
286 alias: { h: 'herp' },
289 var aliasedArgv = parse(aliased, opts);
290 var propertyArgv = parse(regular, opts);
297 t.same(aliasedArgv, expected);
298 t.same(propertyArgv, expected);
302 // regression, see https://github.com/substack/node-optimist/issues/71
303 test('boolean and --x=true', function(t) {
304 var parsed = parse(['--boool', '--other=true'], {
308 t.same(parsed.boool, true);
309 t.same(parsed.other, 'true');
311 parsed = parse(['--boool', '--other=false'], {
315 t.same(parsed.boool, true);
316 t.same(parsed.other, 'false');