cli-barcode PHP
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

342 linhas
11 KiB

  1. <?php
  2. namespace Ulrichsg\Getopt;
  3. class CommandLineParserTest extends \PHPUnit_Framework_TestCase
  4. {
  5. public function testParseNoOptions()
  6. {
  7. $parser = new CommandLineParser(array(
  8. new Option('a', null)
  9. ));
  10. $parser->parse('something');
  11. $this->assertCount(0, $parser->getOptions());
  12. $operands = $parser->getOperands();
  13. $this->assertCount(1, $operands);
  14. $this->assertEquals('something', $operands[0]);
  15. }
  16. public function testParseUnknownOption()
  17. {
  18. $this->setExpectedException('UnexpectedValueException');
  19. $parser = new CommandLineParser(array(
  20. new Option('a', null)
  21. ));
  22. $parser->parse('-b');
  23. }
  24. public function testParseRequiredArgumentMissing()
  25. {
  26. $this->setExpectedException('UnexpectedValueException');
  27. $parser = new CommandLineParser(array(
  28. new Option('a', null, Getopt::REQUIRED_ARGUMENT)
  29. ));
  30. $parser->parse('-a');
  31. }
  32. public function testParseMultipleOptionsWithOneHyphen()
  33. {
  34. $parser = new CommandLineParser(array(
  35. new Option('a', null),
  36. new Option('b', null)
  37. ));
  38. $parser->parse('-ab');
  39. $options = $parser->getOptions();
  40. $this->assertEquals(1, $options['a']);
  41. $this->assertEquals(1, $options['b']);
  42. }
  43. public function testParseCumulativeOption()
  44. {
  45. $parser = new CommandLineParser(array(
  46. new Option('a', null),
  47. new Option('b', null)
  48. ));
  49. $parser->parse('-a -b -a -a');
  50. $options = $parser->getOptions();
  51. $this->assertEquals(3, $options['a']);
  52. $this->assertEquals(1, $options['b']);
  53. }
  54. public function testParseCumulativeOptionShort()
  55. {
  56. $parser = new CommandLineParser(array(
  57. new Option('a', null),
  58. new Option('b', null)
  59. ));
  60. $parser->parse('-abaa');
  61. $options = $parser->getOptions();
  62. $this->assertEquals(3, $options['a']);
  63. $this->assertEquals(1, $options['b']);
  64. }
  65. public function testParseShortOptionWithArgument()
  66. {
  67. $parser = new CommandLineParser(array(
  68. new Option('a', null, Getopt::REQUIRED_ARGUMENT)
  69. ));
  70. $parser->parse('-a value');
  71. $options = $parser->getOptions();
  72. $this->assertEquals('value', $options['a']);
  73. }
  74. public function testParseZeroArgument()
  75. {
  76. $parser = new CommandLineParser(array(
  77. new Option('a', null, Getopt::REQUIRED_ARGUMENT)
  78. ));
  79. $parser->parse('-a 0');
  80. $options = $parser->getOptions();
  81. $this->assertEquals('0', $options['a']);
  82. }
  83. public function testParseNumericOption()
  84. {
  85. $parser = new CommandLineParser(array(
  86. new Option('a', null, Getopt::REQUIRED_ARGUMENT),
  87. new Option('2', null)
  88. ));
  89. $parser->parse('-a 2 -2');
  90. $options = $parser->getOptions();
  91. $this->assertEquals('2', $options['a']);
  92. $this->assertEquals(1, $options['2']);
  93. }
  94. public function testParseCollapsedShortOptionsRequiredArgumentMissing()
  95. {
  96. $this->setExpectedException('UnexpectedValueException');
  97. $parser = new CommandLineParser(array(
  98. new Option('a', null),
  99. new Option('b', null, Getopt::REQUIRED_ARGUMENT)
  100. ));
  101. $parser->parse('-ab');
  102. }
  103. public function testParseCollapsedShortOptionsWithArgument()
  104. {
  105. $parser = new CommandLineParser(array(
  106. new Option('a', null),
  107. new Option('b', null, Getopt::REQUIRED_ARGUMENT)
  108. ));
  109. $parser->parse('-ab value');
  110. $options = $parser->getOptions();
  111. $this->assertEquals(1, $options['a']);
  112. $this->assertEquals('value', $options['b']);
  113. }
  114. public function testParseNoArgumentOptionAndOperand()
  115. {
  116. $parser = new CommandLineParser(array(
  117. new Option('a', null),
  118. ));
  119. $parser->parse('-a b');
  120. $options = $parser->getOptions();
  121. $this->assertEquals(1, $options['a']);
  122. $operands = $parser->getOperands();
  123. $this->assertCount(1, $operands);
  124. $this->assertEquals('b', $operands[0]);
  125. }
  126. public function testParseOperandsOnly()
  127. {
  128. $parser = new CommandLineParser(array(
  129. new Option('a', null, Getopt::REQUIRED_ARGUMENT),
  130. new Option('b', null)
  131. ));
  132. $parser->parse('-- -a -b');
  133. $this->assertCount(0, $parser->getOptions());
  134. $operands = $parser->getOperands();
  135. $this->assertCount(2, $operands);
  136. $this->assertEquals('-a', $operands[0]);
  137. $this->assertEquals('-b', $operands[1]);
  138. }
  139. public function testParseLongOptionWithoutArgument()
  140. {
  141. $parser = new CommandLineParser(array(
  142. new Option('o', 'option', Getopt::OPTIONAL_ARGUMENT)
  143. ));
  144. $parser->parse('--option');
  145. $options = $parser->getOptions();
  146. $this->assertEquals(1, $options['option']);
  147. }
  148. public function testParseLongOptionWithoutArgumentAndOperand()
  149. {
  150. $parser = new CommandLineParser(array(
  151. new Option('o', 'option', Getopt::NO_ARGUMENT)
  152. ));
  153. $parser->parse('--option something');
  154. $options = $parser->getOptions();
  155. $this->assertEquals(1, $options['option']);
  156. $operands = $parser->getOperands();
  157. $this->assertCount(1, $operands);
  158. $this->assertEquals('something', $operands[0]);
  159. }
  160. public function testParseLongOptionWithArgument()
  161. {
  162. $parser = new CommandLineParser(array(
  163. new Option('o', 'option', Getopt::OPTIONAL_ARGUMENT)
  164. ));
  165. $parser->parse('--option value');
  166. $options = $parser->getOptions();
  167. $this->assertEquals('value', $options['option']);
  168. $this->assertEquals('value', $options['o']);
  169. }
  170. public function testParseLongOptionWithEqualsSignAndArgument()
  171. {
  172. $parser = new CommandLineParser(array(
  173. new Option('o', 'option', Getopt::OPTIONAL_ARGUMENT)
  174. ));
  175. $parser->parse('--option=value something');
  176. $options = $parser->getOptions();
  177. $this->assertEquals('value', $options['option']);
  178. $operands = $parser->getOperands();
  179. $this->assertCount(1, $operands);
  180. $this->assertEquals('something', $operands[0]);
  181. }
  182. public function testParseLongOptionWithValueStartingWithHyphen()
  183. {
  184. $parser = new CommandLineParser(array(
  185. new Option('o', 'option', Getopt::REQUIRED_ARGUMENT)
  186. ));
  187. $parser->parse('--option=-value');
  188. $options = $parser->getOptions();
  189. $this->assertEquals('-value', $options['option']);
  190. }
  191. public function testParseNoValueStartingWithHyphenRequired()
  192. {
  193. $this->setExpectedException('UnexpectedValueException');
  194. $parser = new CommandLineParser(array(
  195. new Option('a', null, Getopt::REQUIRED_ARGUMENT),
  196. new Option('b', null)
  197. ));
  198. $parser->parse('-a -b');
  199. }
  200. public function testParseNoValueStartingWithHyphenOptional()
  201. {
  202. $parser = new CommandLineParser(array(
  203. new Option('a', null, Getopt::OPTIONAL_ARGUMENT),
  204. new Option('b', null)
  205. ));
  206. $parser->parse('-a -b');
  207. $options = $parser->getOptions();
  208. $this->assertEquals(1, $options['a']);
  209. $this->assertEquals(1, $options['b']);
  210. }
  211. public function testParseOptionWithDefaultValue()
  212. {
  213. $optionA = new Option('a', null, Getopt::REQUIRED_ARGUMENT);
  214. $optionA->setArgument(new Argument(10));
  215. $optionB = new Option('b', 'beta', Getopt::REQUIRED_ARGUMENT);
  216. $optionB->setArgument(new Argument(20));
  217. $parser = new CommandLineParser(array($optionA, $optionB));
  218. $parser->parse('-a 12');
  219. $options = $parser->getOptions();
  220. $this->assertEquals(12, $options['a']);
  221. $this->assertEquals(20, $options['b']);
  222. $this->assertEquals(20, $options['beta']);
  223. }
  224. public function testDoubleHyphenNotInOperands()
  225. {
  226. $parser = new CommandLineParser(array(
  227. new Option('a', null, Getopt::REQUIRED_ARGUMENT)
  228. ));
  229. $parser->parse('-a 0 foo -- bar baz');
  230. $options = $parser->getOptions();
  231. $this->assertEquals('0', $options['a']);
  232. $operands = $parser->getOperands();
  233. $this->assertCount(3, $operands);
  234. $this->assertEquals('foo', $operands[0]);
  235. $this->assertEquals('bar', $operands[1]);
  236. $this->assertEquals('baz', $operands[2]);
  237. }
  238. public function testSingleHyphenValue()
  239. {
  240. $parser = new CommandLineParser(array(
  241. new Option('a', 'alpha', Getopt::REQUIRED_ARGUMENT)
  242. ));
  243. $parser->parse('-a -');
  244. $options = $parser->getOptions();
  245. $this->assertEquals('-', $options['a']);
  246. $operands = $parser->getOperands();
  247. $this->assertCount(0, $operands);
  248. $parser->parse('--alpha -');
  249. $options = $parser->getOptions();
  250. $this->assertEquals('-', $options['a']);
  251. $operands = $parser->getOperands();
  252. $this->assertCount(0, $operands);
  253. }
  254. public function testSingleHyphenOperand()
  255. {
  256. $parser = new CommandLineParser(array(
  257. new Option('a', null, Getopt::REQUIRED_ARGUMENT)
  258. ));
  259. $parser->parse('-a 0 -');
  260. $options = $parser->getOptions();
  261. $this->assertEquals('0', $options['a']);
  262. $operands = $parser->getOperands();
  263. $this->assertCount(1, $operands);
  264. $this->assertEquals('-', $operands[0]);
  265. }
  266. public function testParseWithArgumentValidation()
  267. {
  268. $validation = 'is_numeric';
  269. $optionA = new Option('a', null, Getopt::OPTIONAL_ARGUMENT);
  270. $optionA->setArgument(new Argument(null, $validation));
  271. $optionB = new Option('b', null, Getopt::REQUIRED_ARGUMENT);
  272. $optionB->setArgument(new Argument(null, $validation));
  273. $optionC = new Option('c', null, Getopt::OPTIONAL_ARGUMENT);
  274. $optionC->setArgument(new Argument(null, $validation));
  275. $parser = new CommandLineParser(array($optionA, $optionB, $optionC));
  276. $parser->parse('-a 1 -b 2 -c');
  277. $options = $parser->getOptions();
  278. $this->assertSame('1', $options['a']);
  279. $this->assertSame('2', $options['b']);
  280. $this->assertSame(1, $options['c']);
  281. }
  282. public function testParseInvalidArgument()
  283. {
  284. $this->setExpectedException('UnexpectedValueException');
  285. $validation = 'is_numeric';
  286. $option = new Option('a', null, Getopt::OPTIONAL_ARGUMENT);
  287. $option->setArgument(new Argument(null, $validation));
  288. $parser = new CommandLineParser(array($option));
  289. $parser->parse('-a nonnumeric');
  290. }
  291. }