1'use strict'; 2 3var parse = require('../'); 4var test = require('tape'); 5 6test('parse args', function (t) { 7 t.deepEqual( 8 parse(['--no-moo']), 9 { moo: false, _: [] }, 10 'no' 11 ); 12 t.deepEqual( 13 parse(['-v', 'a', '-v', 'b', '-v', 'c']), 14 { v: ['a', 'b', 'c'], _: [] }, 15 'multi' 16 ); 17 t.end(); 18}); 19 20test('comprehensive', function (t) { 21 t.deepEqual( 22 parse([ 23 '--name=meowmers', 'bare', '-cats', 'woo', 24 '-h', 'awesome', '--multi=quux', 25 '--key', 'value', 26 '-b', '--bool', '--no-meep', '--multi=baz', 27 '--', '--not-a-flag', 'eek', 28 ]), 29 { 30 c: true, 31 a: true, 32 t: true, 33 s: 'woo', 34 h: 'awesome', 35 b: true, 36 bool: true, 37 key: 'value', 38 multi: ['quux', 'baz'], 39 meep: false, 40 name: 'meowmers', 41 _: ['bare', '--not-a-flag', 'eek'], 42 } 43 ); 44 t.end(); 45}); 46 47test('flag boolean', function (t) { 48 var argv = parse(['-t', 'moo'], { boolean: 't' }); 49 t.deepEqual(argv, { t: true, _: ['moo'] }); 50 t.deepEqual(typeof argv.t, 'boolean'); 51 t.end(); 52}); 53 54test('flag boolean value', function (t) { 55 var argv = parse(['--verbose', 'false', 'moo', '-t', 'true'], { 56 boolean: ['t', 'verbose'], 57 default: { verbose: true }, 58 }); 59 60 t.deepEqual(argv, { 61 verbose: false, 62 t: true, 63 _: ['moo'], 64 }); 65 66 t.deepEqual(typeof argv.verbose, 'boolean'); 67 t.deepEqual(typeof argv.t, 'boolean'); 68 t.end(); 69}); 70 71test('newlines in params', function (t) { 72 var args = parse(['-s', 'X\nX']); 73 t.deepEqual(args, { _: [], s: 'X\nX' }); 74 75 // reproduce in bash: 76 // VALUE="new 77 // line" 78 // node program.js --s="$VALUE" 79 args = parse(['--s=X\nX']); 80 t.deepEqual(args, { _: [], s: 'X\nX' }); 81 t.end(); 82}); 83 84test('strings', function (t) { 85 var s = parse(['-s', '0001234'], { string: 's' }).s; 86 t.equal(s, '0001234'); 87 t.equal(typeof s, 'string'); 88 89 var x = parse(['-x', '56'], { string: 'x' }).x; 90 t.equal(x, '56'); 91 t.equal(typeof x, 'string'); 92 t.end(); 93}); 94 95test('stringArgs', function (t) { 96 var s = parse([' ', ' '], { string: '_' })._; 97 t.same(s.length, 2); 98 t.same(typeof s[0], 'string'); 99 t.same(s[0], ' '); 100 t.same(typeof s[1], 'string'); 101 t.same(s[1], ' '); 102 t.end(); 103}); 104 105test('empty strings', function (t) { 106 var s = parse(['-s'], { string: 's' }).s; 107 t.equal(s, ''); 108 t.equal(typeof s, 'string'); 109 110 var str = parse(['--str'], { string: 'str' }).str; 111 t.equal(str, ''); 112 t.equal(typeof str, 'string'); 113 114 var letters = parse(['-art'], { 115 string: ['a', 't'], 116 }); 117 118 t.equal(letters.a, ''); 119 t.equal(letters.r, true); 120 t.equal(letters.t, ''); 121 122 t.end(); 123}); 124 125test('string and alias', function (t) { 126 var x = parse(['--str', '000123'], { 127 string: 's', 128 alias: { s: 'str' }, 129 }); 130 131 t.equal(x.str, '000123'); 132 t.equal(typeof x.str, 'string'); 133 t.equal(x.s, '000123'); 134 t.equal(typeof x.s, 'string'); 135 136 var y = parse(['-s', '000123'], { 137 string: 'str', 138 alias: { str: 's' }, 139 }); 140 141 t.equal(y.str, '000123'); 142 t.equal(typeof y.str, 'string'); 143 t.equal(y.s, '000123'); 144 t.equal(typeof y.s, 'string'); 145 146 var z = parse(['-s123'], { 147 alias: { str: ['s', 'S'] }, 148 string: ['str'], 149 }); 150 151 t.deepEqual( 152 z, 153 { _: [], s: '123', S: '123', str: '123' }, 154 'opt.string works with multiple aliases' 155 ); 156 t.end(); 157}); 158 159test('slashBreak', function (t) { 160 t.same( 161 parse(['-I/foo/bar/baz']), 162 { I: '/foo/bar/baz', _: [] } 163 ); 164 t.same( 165 parse(['-xyz/foo/bar/baz']), 166 { x: true, y: true, z: '/foo/bar/baz', _: [] } 167 ); 168 t.end(); 169}); 170 171test('alias', function (t) { 172 var argv = parse(['-f', '11', '--zoom', '55'], { 173 alias: { z: 'zoom' }, 174 }); 175 t.equal(argv.zoom, 55); 176 t.equal(argv.z, argv.zoom); 177 t.equal(argv.f, 11); 178 t.end(); 179}); 180 181test('multiAlias', function (t) { 182 var argv = parse(['-f', '11', '--zoom', '55'], { 183 alias: { z: ['zm', 'zoom'] }, 184 }); 185 t.equal(argv.zoom, 55); 186 t.equal(argv.z, argv.zoom); 187 t.equal(argv.z, argv.zm); 188 t.equal(argv.f, 11); 189 t.end(); 190}); 191 192test('nested dotted objects', function (t) { 193 var argv = parse([ 194 '--foo.bar', '3', '--foo.baz', '4', 195 '--foo.quux.quibble', '5', '--foo.quux.o_O', 196 '--beep.boop', 197 ]); 198 199 t.same(argv.foo, { 200 bar: 3, 201 baz: 4, 202 quux: { 203 quibble: 5, 204 o_O: true, 205 }, 206 }); 207 t.same(argv.beep, { boop: true }); 208 t.end(); 209}); 210