You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

parse.js 4.5KB

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