176 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
namespace nulib\app\cli;
 | 
						|
 | 
						|
use nulib\app\args\SimpleArgsParser;
 | 
						|
use nulib\tests\TestCase;
 | 
						|
 | 
						|
class SimpleArgsParserTest extends TestCase {
 | 
						|
  const NORMALIZE_ARGS = [
 | 
						|
    ["-a"],
 | 
						|
    ["--longb"],
 | 
						|
    ["-c", "--longc"],
 | 
						|
    ["-x", "--x1"],
 | 
						|
    ["-x", "--x2"],
 | 
						|
 | 
						|
    ["-n", "--none"],
 | 
						|
    ["-m:", "--mandatory"],
 | 
						|
    ["-o::", "--optional"],
 | 
						|
    ["--mo02:", "args" => [["value", "value"]]],
 | 
						|
    ["--mo12:", "args" => ["value", ["value"]]],
 | 
						|
    ["--mo22:", "args" => ["value", "value"]],
 | 
						|
  ];
 | 
						|
  const NORMALIZE_TESTS = [
 | 
						|
    [], ["--"],
 | 
						|
    ["--"], ["--"],
 | 
						|
    ["--", "--"], ["--", "--"],
 | 
						|
    ["-aa"], ["-a", "-a", "--"],
 | 
						|
    ["a", "b"], ["--", "a", "b"],
 | 
						|
    ["-a", "--ma", "x", "a", "--ma=y", "b"], ["-a", "--mandatory", "x", "--mandatory", "y", "--", "a", "b"],
 | 
						|
    ["-mx", "-m", "y"], ["-m", "x", "-m", "y", "--"],
 | 
						|
    ["-ox", "-o", "y"], ["-ox", "-o", "--", "y"],
 | 
						|
    ["-a", "--", "-a", "-c"], ["-a", "--", "-a", "-c"],
 | 
						|
 | 
						|
    # -a et -b doivent être considérés comme arguments, -n comme option
 | 
						|
    ["--mo02"],                   ["--mo02", "--", "--"],
 | 
						|
    ["--mo02", "-a"],             ["--mo02", "-a", "--", "--"],
 | 
						|
    ["--mo02", "--"],             ["--mo02", "--", "--"],
 | 
						|
    ["--mo02", "--", "-n"],       ["--mo02", "--", "-n", "--"],
 | 
						|
    ["--mo02", "--", "--", "-b"], ["--mo02", "--", "--", "-b"],
 | 
						|
    #
 | 
						|
    ["--mo02", "-a"],                   ["--mo02", "-a", "--", "--"],
 | 
						|
    ["--mo02", "-a", "-a"],             ["--mo02", "-a", "-a", "--"],
 | 
						|
    ["--mo02", "-a", "--"],             ["--mo02", "-a", "--", "--"],
 | 
						|
    ["--mo02", "-a", "--", "-n"],       ["--mo02", "-a", "--", "-n", "--"],
 | 
						|
    ["--mo02", "-a", "--", "--", "-b"], ["--mo02", "-a", "--", "--", "-b"],
 | 
						|
 | 
						|
    [
 | 
						|
      "--mo02", "--",
 | 
						|
      "--mo02", "x", "--",
 | 
						|
      "--mo02", "x", "y",
 | 
						|
      "--mo12", "x", "--",
 | 
						|
      "--mo12", "x", "y",
 | 
						|
      "--mo22", "x", "y",
 | 
						|
      "z",
 | 
						|
    ], [
 | 
						|
      "--mo02", "--",
 | 
						|
      "--mo02", "x", "--",
 | 
						|
      "--mo02", "x", "y",
 | 
						|
      "--mo12", "x", "--",
 | 
						|
      "--mo12", "x", "y",
 | 
						|
      "--mo22", "x", "y",
 | 
						|
      "--",
 | 
						|
      "z",
 | 
						|
    ],
 | 
						|
  ];
 | 
						|
 | 
						|
  function testNormalize() {
 | 
						|
    $parser = new SimpleArgsParser(self::NORMALIZE_ARGS);
 | 
						|
    $count = count(self::NORMALIZE_TESTS);
 | 
						|
    for ($i = 0; $i < $count; $i += 2) {
 | 
						|
      $args = self::NORMALIZE_TESTS[$i];
 | 
						|
      $expected = self::NORMALIZE_TESTS[$i + 1];
 | 
						|
      $normalized = $parser->normalize($args);
 | 
						|
      self::assertSame($expected, $normalized
 | 
						|
        , "for ".var_export($args, true)
 | 
						|
        .", normalized is ".var_export($normalized, true)
 | 
						|
      );
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  function testArgsNone() {
 | 
						|
    $parser = new SimpleArgsParser([
 | 
						|
      ["-z"],
 | 
						|
      ["-a"],
 | 
						|
      ["-b"],
 | 
						|
      ["-c",],
 | 
						|
      ["-d", "value" => 42],
 | 
						|
    ]);
 | 
						|
 | 
						|
    $dest = []; $parser->parse($dest, ["-a", "-bb", "-ccc", "-dddd"]);
 | 
						|
    self::assertSame(null, $dest["z"] ?? null);
 | 
						|
    self::assertSame(1, $dest["a"] ?? null);
 | 
						|
    self::assertSame(2, $dest["b"] ?? null);
 | 
						|
    self::assertSame(3, $dest["c"] ?? null);
 | 
						|
    self::assertSame(42, $dest["d"] ?? null);
 | 
						|
 | 
						|
    self::assertTrue(true);
 | 
						|
  }
 | 
						|
 | 
						|
  function testArgsMandatory() {
 | 
						|
    $parser = new SimpleArgsParser([
 | 
						|
      ["-z:"],
 | 
						|
      ["-a:"],
 | 
						|
      ["-b:"],
 | 
						|
      ["-c:", "value" => 42],
 | 
						|
    ]);
 | 
						|
 | 
						|
    $dest = []; $parser->parse($dest, [
 | 
						|
      "-a",
 | 
						|
      "-bb",
 | 
						|
      "-c",
 | 
						|
      "-c15",
 | 
						|
      "-c30",
 | 
						|
      "-c45",
 | 
						|
    ]);
 | 
						|
    self::assertSame(null, $dest["z"] ?? null);
 | 
						|
    self::assertSame("-bb", $dest["a"] ?? null);
 | 
						|
    self::assertSame(null, $dest["b"] ?? null);
 | 
						|
    self::assertSame("45", $dest["c"] ?? null);
 | 
						|
 | 
						|
    self::assertTrue(true);
 | 
						|
  }
 | 
						|
 | 
						|
  function testArgsOptional() {
 | 
						|
    $parser = new SimpleArgsParser([
 | 
						|
      ["-z::"],
 | 
						|
      ["-a::"],
 | 
						|
      ["-b::"],
 | 
						|
      ["-c::", "value" => 42],
 | 
						|
      ["-d::", "value" => 42],
 | 
						|
    ]);
 | 
						|
 | 
						|
    $dest = []; $parser->parse($dest, [
 | 
						|
      "-a",
 | 
						|
      "-bb",
 | 
						|
      "-c",
 | 
						|
      "-d15",
 | 
						|
      "-d30",
 | 
						|
    ]);
 | 
						|
    self::assertSame(null, $dest["z"] ?? null);
 | 
						|
    self::assertSame(null, $dest["a"] ?? null);
 | 
						|
    self::assertSame("b", $dest["b"] ?? null);
 | 
						|
    self::assertSame(42, $dest["c"] ?? null);
 | 
						|
    self::assertSame("30", $dest["d"] ?? null);
 | 
						|
 | 
						|
    self::assertTrue(true);
 | 
						|
  }
 | 
						|
 | 
						|
  function testRemains() {
 | 
						|
    $parser = new SimpleArgsParser([]);
 | 
						|
    $dest = []; $parser->parse($dest, ["x", "y"]);
 | 
						|
    self::assertSame(["x", "y"], $dest["args"] ?? null);
 | 
						|
  }
 | 
						|
 | 
						|
  function test() {
 | 
						|
    $parser = new SimpleArgsParser([
 | 
						|
      ["-n", "--none"],
 | 
						|
      ["-m:", "--mandatory"],
 | 
						|
      ["-o::", "--optional"],
 | 
						|
      ["--mo02:", "args" => [["value", "value"]]],
 | 
						|
      ["--mo12:", "args" => ["value", ["value"]]],
 | 
						|
      ["--mo22:", "args" => ["value", "value"]],
 | 
						|
    ]);
 | 
						|
    $parser->parse($dest, [
 | 
						|
      "--mo02", "--",
 | 
						|
      "--mo02", "x", "--",
 | 
						|
      "--mo02", "x", "y",
 | 
						|
      "--mo12", "x", "--",
 | 
						|
      "--mo12", "x", "y",
 | 
						|
      "--mo22", "x", "y",
 | 
						|
      "z",
 | 
						|
    ]);
 | 
						|
 | 
						|
    self::assertTrue(true);
 | 
						|
  }
 | 
						|
}
 |