583 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			583 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
namespace nur\cli;
 | 
						|
 | 
						|
use nur\cli\impl\AbcdDest;
 | 
						|
use nur\cli\impl\SimpleDest;
 | 
						|
use nur\t\TestCase;
 | 
						|
use stdClass;
 | 
						|
 | 
						|
class ArgsParserTest extends TestCase {
 | 
						|
  const SIMPLE_DEFS = [
 | 
						|
    "autohelp" => false,
 | 
						|
    "autoremains" => false,
 | 
						|
    ["-a", "key" => "enabled"],
 | 
						|
    ["-b", "key" => "enabled", "value" => 52],
 | 
						|
    ["-z", "key" => "enabled", "inverse" => true],
 | 
						|
    ["--keep", "key" => "keep"],
 | 
						|
    ["-s", "--long", "key" => "option"],
 | 
						|
    ["-v", "--value", "arg" => "value", "key" => "value"],
 | 
						|
    ["-f", "--file", "arg" => "path", "key" => "file"],
 | 
						|
    ["-h", "--host", "arg" => "host", "key" => "host"],
 | 
						|
  ];
 | 
						|
  const DEBUG_ARGS = ["--keep", "-asvvalue"];
 | 
						|
  const SIMPLE_ARGS0 = [
 | 
						|
    "--keep",
 | 
						|
    "--long",
 | 
						|
    "--value", "value",
 | 
						|
    "--value=value",
 | 
						|
    "--file", "file",
 | 
						|
    "--file=file",
 | 
						|
    "--host", "host",
 | 
						|
    "--host=host",
 | 
						|
  ];
 | 
						|
  const SIMPLE_ARGS1 = [
 | 
						|
    "-a", "-aa",
 | 
						|
    "-s", "-ss",
 | 
						|
    "-aass",
 | 
						|
    "-v", "value",
 | 
						|
    "-vvalue",
 | 
						|
    "-f", "file",
 | 
						|
    "-ffile",
 | 
						|
    "-h", "host",
 | 
						|
    "-hhost",
 | 
						|
    "-asv", "value",
 | 
						|
    "-asvvalue",
 | 
						|
  ];
 | 
						|
 | 
						|
  function testNormArgs() {
 | 
						|
    $parser = new ArgsParser(self::SIMPLE_DEFS);
 | 
						|
 | 
						|
    $args = $parser->normArgs(self::DEBUG_ARGS);
 | 
						|
    #var_dump($args);
 | 
						|
    self::assertCount(6, $args);
 | 
						|
 | 
						|
    $args = $parser->normArgs(self::SIMPLE_ARGS0);
 | 
						|
    #var_dump($args);
 | 
						|
    self::assertCount(15, $args);
 | 
						|
 | 
						|
    $args = $parser->normArgs(self::SIMPLE_ARGS1);
 | 
						|
    #var_dump($args);
 | 
						|
    self::assertCount(31, $args);
 | 
						|
 | 
						|
    self::assertSame(["--"], $parser->normArgs([]));
 | 
						|
    self::assertSame(["--"], $parser->normArgs(["--"]));
 | 
						|
    self::assertSame(["--", "a"], $parser->normArgs(["--", "a"]));
 | 
						|
    self::assertSame(["--", "--"], $parser->normArgs(["--", "--"]));
 | 
						|
    self::assertSame(["--", "--", "a"], $parser->normArgs(["--", "--", "a"]));
 | 
						|
    self::assertSame(["--", "--", "--"], $parser->normArgs(["--", "--", "--"]));
 | 
						|
    self::assertSame(["--", "--", "--", "a"], $parser->normArgs(["--", "--", "--", "a"]));
 | 
						|
    self::assertSame(["--", "a"], $parser->normArgs(["a"]));
 | 
						|
    self::assertSame(["--", "a"], $parser->normArgs(["a", "--"]));
 | 
						|
    self::assertSame(["--", "a", "b"], $parser->normArgs(["a", "--", "b"]));
 | 
						|
    self::assertSame(["--", "a", "--", "b"], $parser->normArgs(["a", "--", "--", "b"]));
 | 
						|
    self::assertSame(["--", "a", "--", "--", "b"], $parser->normArgs(["a", "--", "--", "--", "b"]));
 | 
						|
  }
 | 
						|
 | 
						|
  function testNormArgs2() {
 | 
						|
    $parser = new ArgsParser(self::SIMPLE_DEFS);
 | 
						|
 | 
						|
    self::assertSame(["-a", "--", "a"],
 | 
						|
      $parser->normArgs(["a", "-a"]));
 | 
						|
    self::assertSame(["-a", "--", "a"],
 | 
						|
      $parser->normArgs(["a", "-a", "//"]));
 | 
						|
    self::assertSame(["-a", "--", "a", "//", "--", "b"],
 | 
						|
      $parser->normArgs(["a", "-a", "//", "b"]));
 | 
						|
    self::assertSame(["-a", "--", "a", "//", "-b", "--", "b"],
 | 
						|
      $parser->normArgs(["a", "-a", "//", "b", "-b"]));
 | 
						|
 | 
						|
    self::assertSame(["-a", "--", "a", "\\//"],
 | 
						|
      $parser->normArgs(["a", "-a", "\\//"]));
 | 
						|
    self::assertSame(["-a", "--", "a", "\\//", "b"],
 | 
						|
      $parser->normArgs(["a", "-a", "\\//", "b"]));
 | 
						|
    self::assertSame(["-a", "-b", "--", "a", "\\//", "b"],
 | 
						|
      $parser->normArgs(["a", "-a", "\\//", "b", "-b"]));
 | 
						|
  }
 | 
						|
 | 
						|
  function testParseArgs() {
 | 
						|
    $parser = new ArgsParser(self::SIMPLE_DEFS);
 | 
						|
 | 
						|
    $dest = [];
 | 
						|
    $parser->parseArgs($parser->normArgs(["-asvvalue", "--keep"]));
 | 
						|
    #var_dump($dest);
 | 
						|
    self::assertSame(1, $dest["enabled"]);
 | 
						|
    self::assertSame(1, $dest["keep"]);
 | 
						|
    self::assertSame(1, $dest["option"]);
 | 
						|
    self::assertSame("value", $dest["value"]);
 | 
						|
 | 
						|
    $dest = [];
 | 
						|
    $parser->parseArgs($parser->normArgs(["-aa"]));
 | 
						|
    self::assertSame(2, $dest["enabled"]);
 | 
						|
 | 
						|
    $dest = [];
 | 
						|
    $parser->parseArgs($parser->normArgs(["-aazz"]));
 | 
						|
    self::assertSame(0, $dest["enabled"]);
 | 
						|
 | 
						|
    $dest = [];
 | 
						|
    $parser->parseArgs($parser->normArgs(["-b"]));
 | 
						|
    self::assertSame(52, $dest["enabled"]);
 | 
						|
 | 
						|
    $dest = [];
 | 
						|
    $parser->parseArgs($parser->normArgs(["-bb"]));
 | 
						|
    self::assertSame(52, $dest["enabled"]);
 | 
						|
 | 
						|
    self::assertException(ArgsException::class, function()
 | 
						|
      use ($parser, $dest) {
 | 
						|
      $parser->parseArgs($parser->normArgs(["-a", "arg"]));
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  function testParseArgs2() {
 | 
						|
    $defs = self::SIMPLE_DEFS;
 | 
						|
    $defs["autoremains"] = true;
 | 
						|
    $parser = new ArgsParser($defs);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs([]));
 | 
						|
    self::assertSame([], $dest["args"]);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["--"]));
 | 
						|
    self::assertSame([], $dest["args"]);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["--", "a"]));
 | 
						|
    self::assertSame(["a"], $dest["args"]);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["--", "--"]));
 | 
						|
    self::assertSame(["--"], $dest["args"]);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["--", "--", "a"]));
 | 
						|
    self::assertSame(["--", "a"], $dest["args"]);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["--", "--", "--"]));
 | 
						|
    self::assertSame(["--", "--"], $dest["args"]);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["--", "--", "--", "a"]));
 | 
						|
    self::assertSame(["--", "--", "a"], $dest["args"]);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["a"]));
 | 
						|
    self::assertSame(["a"], $dest["args"]);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["a", "--"]));
 | 
						|
    self::assertSame(["a"], $dest["args"]);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["a", "--", "b"]));
 | 
						|
    self::assertSame(["a", "b"], $dest["args"]);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["a", "--", "--", "b"]));
 | 
						|
    self::assertSame(["a", "--", "b"], $dest["args"]);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["a", "--", "--", "--", "b"]));
 | 
						|
    self::assertSame(["a", "--", "--", "b"], $dest["args"]);
 | 
						|
  }
 | 
						|
 | 
						|
  function testParseArgs3() {
 | 
						|
    $defs = self::SIMPLE_DEFS;
 | 
						|
    $defs["autoremains"] = true;
 | 
						|
    $parser = new ArgsParser($defs);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["a", "-a"]));
 | 
						|
    self::assertSame(["a"], $dest["args"]);
 | 
						|
    self::assertSame(1, $dest["enabled"]);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["a", "-a", "//"]));
 | 
						|
    self::assertSame(["a"], $dest["args"]);
 | 
						|
    self::assertSame(1, $dest["enabled"]);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["a", "-a", "//", "b"]));
 | 
						|
    self::assertSame(["a", "b"], $dest["args"]);
 | 
						|
    self::assertSame(1, $dest["enabled"]);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["a", "-a", "//", "b", "-b"]));
 | 
						|
    self::assertSame(["a", "b"], $dest["args"]);
 | 
						|
    self::assertSame(52, $dest["enabled"]);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["a", "-a", "\\//"]));
 | 
						|
    self::assertSame(["a", "//"], $dest["args"]);
 | 
						|
    self::assertSame(1, $dest["enabled"]);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["a", "-a", "\\//", "b"]));
 | 
						|
    self::assertSame(["a", "//", "b"], $dest["args"]);
 | 
						|
    self::assertSame(1, $dest["enabled"]);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["a", "-a", "\\//", "b", "-b"]));
 | 
						|
    self::assertSame(["a", "//", "b"], $dest["args"]);
 | 
						|
    self::assertSame(52, $dest["enabled"]);
 | 
						|
 | 
						|
    $dest = []; $parser->parseArgs($parser->normArgs(["a", "-a", "\\//", "\\\\//", "b", "-b"]));
 | 
						|
    self::assertSame(["a", "//", "\\//", "b"], $dest["args"]);
 | 
						|
    self::assertSame(52, $dest["enabled"]);
 | 
						|
  }
 | 
						|
 | 
						|
  private static function parse(&$dest, array $defs, ?array $args=null): void {
 | 
						|
    $parser = new ArgsParser($defs);
 | 
						|
    $parser->parse($dest, $args);
 | 
						|
  }
 | 
						|
 | 
						|
  function testAutoprop() {
 | 
						|
    unset($dest);
 | 
						|
    self::parse($dest, [
 | 
						|
      ["-a", "--enable"],
 | 
						|
      ["-b", "--b", "--before", "--before-date", "args" => "value"],
 | 
						|
    ], [
 | 
						|
      "-aa",
 | 
						|
      "-b", "15/02/2002",
 | 
						|
    ]);
 | 
						|
    self::assertSame(2, $dest->enable);
 | 
						|
    self::assertSame("15/02/2002", $dest->beforeDate);
 | 
						|
 | 
						|
    $dest = new AbcdDest();
 | 
						|
    self::parse($dest, [
 | 
						|
      ["-a", "--a"],
 | 
						|
      ["-b", "--b"],
 | 
						|
      ["-c", "--c"],
 | 
						|
    ], [
 | 
						|
      "-abbccc"
 | 
						|
    ]);
 | 
						|
    self::assertSame(1, $dest->getA());
 | 
						|
    self::assertSame(2, $dest->getB());
 | 
						|
    self::assertSame(3, $dest->getC());
 | 
						|
  }
 | 
						|
 | 
						|
  function testArgs() {
 | 
						|
    $defs = [
 | 
						|
      ["-a", "--enable"],
 | 
						|
    ];
 | 
						|
 | 
						|
    unset($dest);
 | 
						|
    self::parse($dest, $defs, []);
 | 
						|
    self::assertObjectNotHasAttribute("enable", $dest);
 | 
						|
    self::assertObjectHasAttribute("args", $dest);
 | 
						|
    self::assertSame([], $dest->args);
 | 
						|
 | 
						|
    unset($dest);
 | 
						|
    self::parse($dest, $defs, ["x"]);
 | 
						|
    self::assertObjectNotHasAttribute("enable", $dest);
 | 
						|
    self::assertObjectHasAttribute("args", $dest);
 | 
						|
    self::assertSame(["x"], $dest->args);
 | 
						|
 | 
						|
    unset($dest);
 | 
						|
    self::parse($dest, $defs, ["x", "-a"]);
 | 
						|
    self::assertObjectHasAttribute("enable", $dest);
 | 
						|
    self::assertObjectHasAttribute("args", $dest);
 | 
						|
    self::assertSame(1, $dest->enable);
 | 
						|
    self::assertSame(["x"], $dest->args);
 | 
						|
 | 
						|
    $dest = [];
 | 
						|
    self::parse($dest, $defs, []);
 | 
						|
    self::assertArrayNotHasKey("enable", $dest);
 | 
						|
    self::assertArrayHasKey("args", $dest);
 | 
						|
    self::assertSame([], $dest["args"]);
 | 
						|
 | 
						|
    $dest = [];
 | 
						|
    self::parse($dest, $defs, ["x"]);
 | 
						|
    self::assertArrayNotHasKey("enable", $dest);
 | 
						|
    self::assertArrayHasKey("args", $dest);
 | 
						|
    self::assertSame(["x"], $dest["args"]);
 | 
						|
 | 
						|
    $dest = [];
 | 
						|
    self::parse($dest, $defs, ["x", "-a"]);
 | 
						|
    self::assertArrayHasKey("enable", $dest);
 | 
						|
    self::assertArrayHasKey("args", $dest);
 | 
						|
    self::assertSame(1, $dest["enable"]);
 | 
						|
    self::assertSame(["x"], $dest["args"]);
 | 
						|
  }
 | 
						|
 | 
						|
  function testOpts() {
 | 
						|
    $defs = [
 | 
						|
      ["-o", "--o", "args" => [["value"]]],
 | 
						|
      ["--mm", "args" => ["value", "value"]],
 | 
						|
      ["--mo", "args" => ["value", ["value"]]],
 | 
						|
      ["--oo", "args" => [["value", "value"]]],
 | 
						|
      ["--ma", "args" => ["value", null]],
 | 
						|
      ["--a", "args" => [null]],
 | 
						|
    ];
 | 
						|
 | 
						|
    unset($dest); self::parse($dest, $defs, ["-o"]);
 | 
						|
    self::assertSame(null, $dest->o);
 | 
						|
    self::assertSame([], $dest->args);
 | 
						|
    unset($dest); self::parse($dest, $defs, ["-o", "1"]);
 | 
						|
    self::assertSame(null, $dest->o);
 | 
						|
    self::assertSame(["1"], $dest->args);
 | 
						|
    unset($dest); self::parse($dest, $defs, ["-o1"]);
 | 
						|
    self::assertSame("1", $dest->o);
 | 
						|
    self::assertSame([], $dest->args);
 | 
						|
    unset($dest); self::parse($dest, $defs, ["-o1", "2"]);
 | 
						|
    self::assertSame("1", $dest->o);
 | 
						|
    self::assertSame(["2"], $dest->args);
 | 
						|
    unset($dest); self::parse($dest, $defs, ["--o"]);
 | 
						|
    self::assertSame(null, $dest->o);
 | 
						|
    self::assertSame([], $dest->args);
 | 
						|
    unset($dest); self::parse($dest, $defs, ["--o", "1"]);
 | 
						|
    self::assertSame(null, $dest->o);
 | 
						|
    self::assertSame(["1"], $dest->args);
 | 
						|
    unset($dest); self::parse($dest, $defs, ["--o=1"]);
 | 
						|
    self::assertSame("1", $dest->o);
 | 
						|
    self::assertSame([], $dest->args);
 | 
						|
    unset($dest); self::parse($dest, $defs, ["--o=1", "2"]);
 | 
						|
    self::assertSame("1", $dest->o);
 | 
						|
    self::assertSame(["2"], $dest->args);
 | 
						|
 | 
						|
    unset($dest); self::parse($dest, $defs, ["--mm", "1", "2"]);
 | 
						|
    self::assertSame(["1", "2"], $dest->mm);
 | 
						|
    self::assertSame([], $dest->args);
 | 
						|
 | 
						|
    unset($dest); self::parse($dest, $defs, ["--mo", "1"]);
 | 
						|
    self::assertSame(["1"], $dest->mo);
 | 
						|
    self::assertSame([], $dest->args);
 | 
						|
    unset($dest); self::parse($dest, $defs, ["--mo", "1", "2"]);
 | 
						|
    self::assertSame(["1", "2"], $dest->mo);
 | 
						|
    self::assertSame([], $dest->args);
 | 
						|
    unset($dest); self::parse($dest, $defs, ["--mo", "1", "2", "3"]);
 | 
						|
    self::assertSame(["1", "2"], $dest->mo);
 | 
						|
    self::assertSame(["3"], $dest->args);
 | 
						|
 | 
						|
    unset($dest); self::parse($dest, $defs, ["--oo"]);
 | 
						|
    self::assertSame([], $dest->oo);
 | 
						|
    self::assertSame([], $dest->args);
 | 
						|
    unset($dest); self::parse($dest, $defs, ["--oo", "1"]);
 | 
						|
    self::assertSame(["1"], $dest->oo);
 | 
						|
    self::assertSame([], $dest->args);
 | 
						|
    unset($dest); self::parse($dest, $defs, ["--oo", "1", "2"]);
 | 
						|
    self::assertSame(["1", "2"], $dest->oo);
 | 
						|
    self::assertSame([], $dest->args);
 | 
						|
    unset($dest); self::parse($dest, $defs, ["--oo", "1", "2", "3"]);
 | 
						|
    self::assertSame(["1", "2"], $dest->oo);
 | 
						|
    self::assertSame(["3"], $dest->args);
 | 
						|
  }
 | 
						|
 | 
						|
  function testDefaultOptArgs() {
 | 
						|
    $defs = [
 | 
						|
      ["-o", "--o", "args" => [["value"]],
 | 
						|
        "value" => "1",
 | 
						|
      ],
 | 
						|
    ];
 | 
						|
 | 
						|
    unset($dest); self::parse($dest, $defs, ["-o"]);
 | 
						|
    self::assertSame("1", $dest->o);
 | 
						|
    self::assertSame([], $dest->args);
 | 
						|
    unset($dest); self::parse($dest, $defs, ["-o2"]);
 | 
						|
    self::assertSame("2", $dest->o);
 | 
						|
    self::assertSame([], $dest->args);
 | 
						|
  }
 | 
						|
 | 
						|
  function testParseDefs() {
 | 
						|
    $defs = [
 | 
						|
      ["-a", "--a"],
 | 
						|
      ["x",
 | 
						|
        "cmd_args" => [
 | 
						|
          ["-b", "--b"],
 | 
						|
        ],
 | 
						|
      ],
 | 
						|
    ];
 | 
						|
    $parser = new ArgsParser($defs);
 | 
						|
    $parser->select(null);
 | 
						|
    $args = $parser->normArgs(["-a", "x", "-b"]);
 | 
						|
    self::assertSame(["-a", "x", "-b", "--"], $args);
 | 
						|
    $dest = new stdClass();
 | 
						|
    $parser->select(null);
 | 
						|
    $parser->parseArgs($args);
 | 
						|
    self::assertSame(["x"], $dest->command);
 | 
						|
    self::assertSame(1, $dest->a);
 | 
						|
    self::assertSame(1, $dest->b);
 | 
						|
 | 
						|
    $defs = [
 | 
						|
      ["-a", "--a"],
 | 
						|
      ["x",
 | 
						|
        "cmd_args" => [
 | 
						|
          ["-b", "--b"],
 | 
						|
          ["y",
 | 
						|
            "cmd_args" => [
 | 
						|
              ["-c", "--c"],
 | 
						|
            ],
 | 
						|
          ],
 | 
						|
        ],
 | 
						|
      ],
 | 
						|
    ];
 | 
						|
    $parser = new ArgsParser($defs);
 | 
						|
    $parser->select(null);
 | 
						|
    $args = $parser->normArgs(["-a", "x", "-b", "y", "-c"]);
 | 
						|
    self::assertSame(["-a", "x", "-b", "y", "-c", "--"], $args);
 | 
						|
    $dest = new stdClass();
 | 
						|
    $parser->select(null);
 | 
						|
    $parser->parseArgs($args);
 | 
						|
    self::assertSame(["x", "y"], $dest->command);
 | 
						|
    self::assertSame(1, $dest->a);
 | 
						|
    self::assertSame(1, $dest->b);
 | 
						|
    self::assertSame(1, $dest->c);
 | 
						|
  }
 | 
						|
 | 
						|
  function testTypes() {
 | 
						|
    $parser = new ArgsParser([
 | 
						|
      ["-a:", "type" => "int"],
 | 
						|
      ["-b:", "type" => "bool"],
 | 
						|
      ["-c:", "type" => "string"],
 | 
						|
      ["-d:", "type" => "array"],
 | 
						|
    ]);
 | 
						|
 | 
						|
    $dest = new AbcdDest();
 | 
						|
    $parser->parse($dest, ["-a0", "-b0", "-c0", "-d", ""]);
 | 
						|
    self::assertSame(0, $dest->getA());
 | 
						|
    self::assertSame(false, $dest->getB());
 | 
						|
    self::assertSame("0", $dest->getC());
 | 
						|
    self::assertSame([""], $dest->getD());
 | 
						|
 | 
						|
    $dest = new AbcdDest();
 | 
						|
    $parser->parse($dest, ["-a1", "-b1", "-c1", "-d1"]);
 | 
						|
    self::assertSame(1, $dest->getA());
 | 
						|
    self::assertSame(true, $dest->getB());
 | 
						|
    self::assertSame("1", $dest->getC());
 | 
						|
    self::assertSame(["1"], $dest->getD());
 | 
						|
 | 
						|
    $dest = new AbcdDest();
 | 
						|
    $parser->parse($dest, [
 | 
						|
      "-a1", "-a2",
 | 
						|
      "-b1", "-b2",
 | 
						|
      "-c1", "-c2",
 | 
						|
      "-d1", "-d2",
 | 
						|
    ]);
 | 
						|
    self::assertSame(2, $dest->getA());
 | 
						|
    self::assertSame(true, $dest->getB());
 | 
						|
    self::assertSame("2", $dest->getC());
 | 
						|
    self::assertSame(["2"], $dest->getD());
 | 
						|
 | 
						|
    $parser = new ArgsParser([
 | 
						|
      ["-a:", "type" => "array", "action" => "--add"],
 | 
						|
      ["-b:", "type" => "array", "action" => "--merge"],
 | 
						|
      ["-c:", "type" => "int", "action" => "--add"],
 | 
						|
      ["-d:", "type" => "int", "action" => "--merge"],
 | 
						|
    ]);
 | 
						|
 | 
						|
    $dest = new AbcdDest();
 | 
						|
    $parser->parse($dest, [
 | 
						|
      "-a1", "-a2",
 | 
						|
      "-b1", "-b2",
 | 
						|
      "-c1", "-c2",
 | 
						|
      "-d1", "-d2",
 | 
						|
    ]);
 | 
						|
    self::assertSame([["1"], ["2"]], $dest->getA());
 | 
						|
    self::assertSame(["1", "2"], $dest->getB());
 | 
						|
    self::assertSame([1, 2], $dest->getC());
 | 
						|
    self::assertSame([1, 2], $dest->getD());
 | 
						|
 | 
						|
    $parser = new ArgsParser([
 | 
						|
      ["-a:", "type" => "array", "action" => "--merge"],
 | 
						|
      ["-b:", "args" => ["value", [null]], "type" => "array", "action" => "--merges"],
 | 
						|
    ]);
 | 
						|
 | 
						|
    $dest = new AbcdDest();
 | 
						|
    $parser->parse($dest, [
 | 
						|
      "-a1", "-a2,3", "-a4,5,6",
 | 
						|
      "-b1", "2,3", "4,5,6", "--",
 | 
						|
    ]);
 | 
						|
    self::assertSame(["1", "2", "3", "4", "5", "6"], $dest->getA());
 | 
						|
    self::assertSame(["1", "2", "3", "4", "5", "6"], $dest->getB());
 | 
						|
  }
 | 
						|
 | 
						|
  function testRemainArgs() {
 | 
						|
    $dest = new SimpleDest();
 | 
						|
 | 
						|
    ## nombre quelconque d'arguments
 | 
						|
    $parser = new ArgsParser([
 | 
						|
      ["args" => [null], "name" => "args"],
 | 
						|
    ]);
 | 
						|
    # 0
 | 
						|
    $dest->reset();
 | 
						|
    $parser->parse($dest, []);
 | 
						|
    self::assertSame([], $dest->args);
 | 
						|
    # 1
 | 
						|
    $dest->reset();
 | 
						|
    $parser->parse($dest, ["a"]);
 | 
						|
    self::assertSame(["a"], $dest->args);
 | 
						|
    # 2
 | 
						|
    $dest->reset();
 | 
						|
    $parser->parse($dest, ["a", "b"]);
 | 
						|
    self::assertSame(["a", "b"], $dest->args);
 | 
						|
 | 
						|
    # un argument
 | 
						|
    $parser = new ArgsParser([
 | 
						|
      ["args" => ["value"], "name" => "args"],
 | 
						|
    ]);
 | 
						|
    # 0
 | 
						|
    $dest->reset();
 | 
						|
    self::assertException(ArgsException::class, function () use ($parser, &$dest) {
 | 
						|
      $parser->parse($dest, []);
 | 
						|
    });
 | 
						|
    # 1
 | 
						|
    $dest->reset();
 | 
						|
    $parser->parse($dest, ["a"]);
 | 
						|
    self::assertSame(["a"], $dest->args);
 | 
						|
    # 2
 | 
						|
    $dest->reset();
 | 
						|
    self::assertException(ArgsException::class, function () use ($parser, &$dest) {
 | 
						|
      $parser->parse($dest, ["a", "b"]);
 | 
						|
    });
 | 
						|
 | 
						|
    # deux arguments
 | 
						|
    $parser = new ArgsParser([
 | 
						|
      ["args" => ["value", "value"], "name" => "args"],
 | 
						|
    ]);
 | 
						|
    # 0
 | 
						|
    $dest->reset();
 | 
						|
    self::assertException(ArgsException::class, function () use ($parser, &$dest) {
 | 
						|
      $parser->parse($dest, []);
 | 
						|
    });
 | 
						|
    # 1
 | 
						|
    $dest->reset();
 | 
						|
    self::assertException(ArgsException::class, function () use ($parser, &$dest) {
 | 
						|
      $parser->parse($dest, ["a"]);
 | 
						|
    });
 | 
						|
    # 2
 | 
						|
    $dest->reset();
 | 
						|
    $parser->parse($dest, ["a", "b"]);
 | 
						|
    self::assertSame(["a", "b"], $dest->args);
 | 
						|
    # 3
 | 
						|
    $dest->reset();
 | 
						|
    self::assertException(ArgsException::class, function () use ($parser, &$dest) {
 | 
						|
      $parser->parse($dest, ["a", "b", "c"]);
 | 
						|
    });
 | 
						|
 | 
						|
    # un arguments obligatoire, un argument facultatif
 | 
						|
    $parser = new ArgsParser([
 | 
						|
      ["args" => ["value", ["value"]], "name" => "args"],
 | 
						|
    ]);
 | 
						|
    # 0
 | 
						|
    $dest->reset();
 | 
						|
    self::assertException(ArgsException::class, function () use ($parser, &$dest) {
 | 
						|
      $parser->parse($dest, []);
 | 
						|
    });
 | 
						|
    # 1
 | 
						|
    $dest->reset();
 | 
						|
    $parser->parse($dest, ["a"]);
 | 
						|
    self::assertSame(["a"], $dest->args);
 | 
						|
    # 2
 | 
						|
    $dest->reset();
 | 
						|
    $parser->parse($dest, ["a", "b"]);
 | 
						|
    self::assertSame(["a", "b"], $dest->args);
 | 
						|
    # 3
 | 
						|
    $dest->reset();
 | 
						|
    self::assertException(ArgsException::class, function () use ($parser, &$dest) {
 | 
						|
      $parser->parse($dest, ["a", "b", "c"]);
 | 
						|
    });
 | 
						|
 | 
						|
    # un arguments obligatoire, nombre infini d'arguments facultatifs
 | 
						|
    $parser = new ArgsParser([
 | 
						|
      ["args" => ["value", null], "name" => "args"],
 | 
						|
    ]);
 | 
						|
    # 0
 | 
						|
    $dest->reset();
 | 
						|
    self::assertException(ArgsException::class, function () use ($parser, &$dest) {
 | 
						|
      $parser->parse($dest, []);
 | 
						|
    });
 | 
						|
    # 1
 | 
						|
    $dest->reset();
 | 
						|
    $parser->parse($dest, ["a"]);
 | 
						|
    self::assertSame(["a"], $dest->args);
 | 
						|
    # 2
 | 
						|
    $dest->reset();
 | 
						|
    $parser->parse($dest, ["a", "b"]);
 | 
						|
    self::assertSame(["a", "b"], $dest->args);
 | 
						|
    # 3
 | 
						|
    $dest->reset();
 | 
						|
    $parser->parse($dest, ["a", "b", "c"]);
 | 
						|
    self::assertSame(["a", "b", "c"], $dest->args);
 | 
						|
  }
 | 
						|
}
 |