1168 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			1168 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace nur\sery\php {
 | 
						|
  use nulib\tests\TestCase;
 | 
						|
  use nur\sery\ValueException;
 | 
						|
  use nur\sery\php\impl\C0;
 | 
						|
  use nur\sery\php\impl\C1;
 | 
						|
  use nur\sery\php\impl\SC;
 | 
						|
  use ReflectionException;
 | 
						|
 | 
						|
  class funcTest extends TestCase {
 | 
						|
    const FUNCTION_TESTS = [
 | 
						|
      # scalaires
 | 
						|
      [null,
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [false,
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      ["",
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      ["::",
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      ["->",
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      ["tsimple",
 | 
						|
        true, [false, "tsimple"],
 | 
						|
        true, [false, "tsimple"],
 | 
						|
      ],
 | 
						|
      ['nur\sery\php\impl\ntsimple',
 | 
						|
        true, [false, 'nur\sery\php\impl\ntsimple'],
 | 
						|
        true, [false, 'nur\sery\php\impl\ntsimple'],
 | 
						|
      ],
 | 
						|
      ['tmissing',
 | 
						|
        false, null,
 | 
						|
        true, [false, 'tmissing'],
 | 
						|
      ],
 | 
						|
      ["::tstatic",
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      ["->tmethod",
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      ["::tmissing",
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      ["->tmissing",
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      ["xxx::tmissing",
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      ["xxx->tmissing",
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [SC::class."::tstatic",
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [SC::class."->tmethod",
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [SC::class."::tmissing",
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [SC::class."->tmissing",
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      # tableaux avec un seul scalaire
 | 
						|
      [[],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[null],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[false],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[""],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["::"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["->"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["tsimple"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [['nur\sery\php\impl\ntsimple'],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["::tstatic"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["->tmethod"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["::tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["->tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["xxx::tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["xxx->tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[SC::class."::tstatic"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[SC::class."->tmethod"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[SC::class."::tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[SC::class."->tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      # tableaux avec deux scalaires
 | 
						|
      [[null, "tsimple"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[null, 'nur\sery\php\impl\ntsimple'],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[null, "tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[null, "::tstatic"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[null, "->tmethod"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[null, "::tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[null, "->tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[false, "tsimple"],
 | 
						|
        true, [false, "tsimple"],
 | 
						|
        true, [false, "tsimple"],
 | 
						|
      ],
 | 
						|
      [[false, 'nur\sery\php\impl\ntsimple'],
 | 
						|
        true, [false, 'nur\sery\php\impl\ntsimple'],
 | 
						|
        true, [false, 'nur\sery\php\impl\ntsimple'],
 | 
						|
      ],
 | 
						|
      [[false, "tmissing"],
 | 
						|
        false, null,
 | 
						|
        true, [false, "tmissing"],
 | 
						|
      ],
 | 
						|
      [[false, "::tstatic"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[false, "->tmethod"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[false, "::tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[false, "->tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["", "tsimple"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["", 'nur\sery\php\impl\ntsimple'],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["", "tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["", "::tstatic"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["", "->tmethod"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["", "::tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["", "->tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["xxx", "tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["xxx", "::tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [["xxx", "->tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[SC::class, "tstatic"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[SC::class, "::tstatic"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[SC::class, "tmethod"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[SC::class, "->tmethod"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[SC::class, "tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[SC::class, "::tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
      [[SC::class, "->tmissing"],
 | 
						|
        false, null,
 | 
						|
        false, null,
 | 
						|
      ],
 | 
						|
    ];
 | 
						|
 | 
						|
    function testFunction() {
 | 
						|
      foreach (self::FUNCTION_TESTS as $args) {
 | 
						|
        [$func,
 | 
						|
          $verifix1, $func1,
 | 
						|
          $verifix2, $func2,
 | 
						|
        ] = $args;
 | 
						|
        if ($func === ["", "tsimple"]) {
 | 
						|
          //echo "breakpoint";
 | 
						|
        }
 | 
						|
 | 
						|
        $workf = $func;
 | 
						|
        $msg = var_export($func, true)." (strict)";
 | 
						|
        self::assertSame($verifix1, func::verifix_function($workf, true), "$msg --> verifix");
 | 
						|
        if ($verifix1) {
 | 
						|
          self::assertSame($func1, $workf, "$msg --> func");
 | 
						|
        }
 | 
						|
 | 
						|
        $workf = $func;
 | 
						|
        $msg = var_export($func, true)." (lenient)";
 | 
						|
        self::assertSame($verifix2, func::verifix_function($workf, false), "$msg --> verifix");
 | 
						|
        if ($verifix2) {
 | 
						|
          self::assertSame($func2, $workf, "$msg --> func");
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    const STATIC_TESTS = [
 | 
						|
      # scalaires
 | 
						|
      [null,
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [false,
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ["",
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ["::",
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ["->",
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ["tsimple",
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ['nur\sery\php\impl\ntsimple',
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ['tmissing',
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ["::tstatic",
 | 
						|
        true, false, [null, "tstatic"],
 | 
						|
        true, false, [null, "tstatic"],
 | 
						|
      ],
 | 
						|
      ["->tmethod",
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ["::tmissing",
 | 
						|
        true, false, [null, "tmissing"],
 | 
						|
        true, false, [null, "tmissing"],
 | 
						|
      ],
 | 
						|
      ["->tmissing",
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ["xxx::tmissing",
 | 
						|
        false, null, null,
 | 
						|
        true, true, ["xxx", "tmissing"],
 | 
						|
      ],
 | 
						|
      ["xxx->tmissing",
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [SC::class."::tstatic",
 | 
						|
        true, true, [SC::class, "tstatic"],
 | 
						|
        true, true, [SC::class, "tstatic"],
 | 
						|
      ],
 | 
						|
      [SC::class."->tmethod",
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [SC::class."::tmissing",
 | 
						|
        false, null, null,
 | 
						|
        true, true, [SC::class, "tmissing"],
 | 
						|
      ],
 | 
						|
      [SC::class."->tmissing",
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      # tableaux avec un seul scalaire
 | 
						|
      [[],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[null],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[false],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[""],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["::"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["->"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["tsimple"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [['nur\sery\php\impl\ntsimple'],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["::tstatic"],
 | 
						|
        true, false, [null, "tstatic"],
 | 
						|
        true, false, [null, "tstatic"],
 | 
						|
      ],
 | 
						|
      [["->tmethod"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["::tmissing"],
 | 
						|
        true, false, [null, "tmissing"],
 | 
						|
        true, false, [null, "tmissing"],
 | 
						|
      ],
 | 
						|
      [["->tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["xxx::tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        true, true, ["xxx", "tmissing"],
 | 
						|
      ],
 | 
						|
      [["xxx->tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[SC::class."::tstatic"],
 | 
						|
        true, true, [SC::class, "tstatic"],
 | 
						|
        true, true, [SC::class, "tstatic"],
 | 
						|
      ],
 | 
						|
      [[SC::class."->tmethod"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[SC::class."::tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        true, true, [SC::class, "tmissing"],
 | 
						|
      ],
 | 
						|
      [[SC::class."->tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      # tableaux avec deux scalaires
 | 
						|
      [[null, "tsimple"],
 | 
						|
        true, false, [null, "tsimple"],
 | 
						|
        true, false, [null, "tsimple"],
 | 
						|
      ],
 | 
						|
      [[null, 'nur\sery\php\impl\ntsimple'],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[null, "tmissing"],
 | 
						|
        true, false, [null, "tmissing"],
 | 
						|
        true, false, [null, "tmissing"],
 | 
						|
      ],
 | 
						|
      [[null, "::tstatic"],
 | 
						|
        true, false, [null, "tstatic"],
 | 
						|
        true, false, [null, "tstatic"],
 | 
						|
      ],
 | 
						|
      [[null, "->tmethod"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[null, "::tmissing"],
 | 
						|
        true, false, [null, "tmissing"],
 | 
						|
        true, false, [null, "tmissing"],
 | 
						|
      ],
 | 
						|
      [[null, "->tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[false, "tsimple"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[false, 'nur\sery\php\impl\ntsimple'],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[false, "tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[false, "::tstatic"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[false, "->tmethod"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[false, "::tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[false, "->tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["", "tsimple"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["", 'nur\sery\php\impl\ntsimple'],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["", "tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["", "::tstatic"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["", "->tmethod"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["", "::tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["", "->tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["xxx", "tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        true, true, ["xxx", "tmissing"],
 | 
						|
      ],
 | 
						|
      [["xxx", "::tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        true, true, ["xxx", "tmissing"],
 | 
						|
      ],
 | 
						|
      [["xxx", "->tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[SC::class, "tstatic"],
 | 
						|
        true, true, [SC::class, "tstatic"],
 | 
						|
        true, true, [SC::class, "tstatic"],
 | 
						|
      ],
 | 
						|
      [[SC::class, "::tstatic"],
 | 
						|
        true, true, [SC::class, "tstatic"],
 | 
						|
        true, true, [SC::class, "tstatic"],
 | 
						|
      ],
 | 
						|
      [[SC::class, "tmethod"],
 | 
						|
        true, true, [SC::class, "tmethod"],
 | 
						|
        true, true, [SC::class, "tmethod"],
 | 
						|
      ],
 | 
						|
      [[SC::class, "->tmethod"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[SC::class, "tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        true, true, [SC::class, "tmissing"],
 | 
						|
      ],
 | 
						|
      [[SC::class, "::tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        true, true, [SC::class, "tmissing"],
 | 
						|
      ],
 | 
						|
      [[SC::class, "->tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
    ];
 | 
						|
 | 
						|
    function testStatic() {
 | 
						|
      foreach (self::STATIC_TESTS as $args) {
 | 
						|
        [$func,
 | 
						|
          $verifix1, $bound1, $func1,
 | 
						|
          $verifix2, $bound2, $func2,
 | 
						|
        ] = $args;
 | 
						|
        if ($func === ["", "tsimple"]) {
 | 
						|
          //echo "breakpoint";
 | 
						|
        }
 | 
						|
 | 
						|
        $workf = $func;
 | 
						|
        $msg = var_export($func, true)." (strict)";
 | 
						|
        self::assertSame($verifix1, func::verifix_static($workf, true, $bound), "$msg --> verifix");
 | 
						|
        if ($verifix1) {
 | 
						|
          self::assertSame($bound1, $bound, "$msg --> bound");
 | 
						|
          self::assertSame($func1, $workf, "$msg --> func");
 | 
						|
        }
 | 
						|
 | 
						|
        $workf = $func;
 | 
						|
        $msg = var_export($func, true)." (lenient)";
 | 
						|
        self::assertSame($verifix2, func::verifix_static($workf, false, $bound), "$msg --> verifix");
 | 
						|
        if ($verifix2) {
 | 
						|
          self::assertSame($bound2, $bound, "$msg --> bound");
 | 
						|
          self::assertSame($func2, $workf, "$msg --> func");
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    const METHOD_TESTS = [
 | 
						|
      # scalaires
 | 
						|
      [null,
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [false,
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ["",
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ["::",
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ["->",
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ["tsimple",
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ['nur\sery\php\impl\ntsimple',
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ['tmissing',
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ["::tstatic",
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ["->tmethod",
 | 
						|
        true, false, [null, "tmethod"],
 | 
						|
        true, false, [null, "tmethod"],
 | 
						|
      ],
 | 
						|
      ["::tmissing",
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ["->tmissing",
 | 
						|
        true, false, [null, "tmissing"],
 | 
						|
        true, false, [null, "tmissing"],
 | 
						|
      ],
 | 
						|
      ["xxx::tmissing",
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      ["xxx->tmissing",
 | 
						|
        false, null, null,
 | 
						|
        true, true, ["xxx", "tmissing"],
 | 
						|
      ],
 | 
						|
      [SC::class."::tstatic",
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [SC::class."->tmethod",
 | 
						|
        true, true, [SC::class, "tmethod"],
 | 
						|
        true, true, [SC::class, "tmethod"],
 | 
						|
      ],
 | 
						|
      [SC::class."::tmissing",
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [SC::class."->tmissing",
 | 
						|
        false, null, null,
 | 
						|
        true, true, [SC::class, "tmissing"],
 | 
						|
      ],
 | 
						|
      # tableaux avec un seul scalaire
 | 
						|
      [[],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[null],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[false],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[""],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["::"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["->"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["tsimple"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [['nur\sery\php\impl\ntsimple'],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["::tstatic"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["->tmethod"],
 | 
						|
        true, false, [null, "tmethod"],
 | 
						|
        true, false, [null, "tmethod"],
 | 
						|
      ],
 | 
						|
      [["::tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["->tmissing"],
 | 
						|
        true, false, [null, "tmissing"],
 | 
						|
        true, false, [null, "tmissing"],
 | 
						|
      ],
 | 
						|
      [["xxx::tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["xxx->tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        true, true, ["xxx", "tmissing"],
 | 
						|
      ],
 | 
						|
      [[SC::class."::tstatic"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[SC::class."->tmethod"],
 | 
						|
        true, true, [SC::class, "tmethod"],
 | 
						|
        true, true, [SC::class, "tmethod"],
 | 
						|
      ],
 | 
						|
      [[SC::class."::tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[SC::class."->tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        true, true, [SC::class, "tmissing"],
 | 
						|
      ],
 | 
						|
      # tableaux avec deux scalaires
 | 
						|
      [[null, "tsimple"],
 | 
						|
        true, false, [null, "tsimple"],
 | 
						|
        true, false, [null, "tsimple"],
 | 
						|
      ],
 | 
						|
      [[null, 'nur\sery\php\impl\ntsimple'],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[null, "tmissing"],
 | 
						|
        true, false, [null, "tmissing"],
 | 
						|
        true, false, [null, "tmissing"],
 | 
						|
      ],
 | 
						|
      [[null, "::tstatic"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[null, "->tmethod"],
 | 
						|
        true, false, [null, "tmethod"],
 | 
						|
        true, false, [null, "tmethod"],
 | 
						|
      ],
 | 
						|
      [[null, "::tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[null, "->tmissing"],
 | 
						|
        true, false, [null, "tmissing"],
 | 
						|
        true, false, [null, "tmissing"],
 | 
						|
      ],
 | 
						|
      [[false, "tsimple"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[false, 'nur\sery\php\impl\ntsimple'],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[false, "tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[false, "::tstatic"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[false, "->tmethod"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[false, "::tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[false, "->tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["", "tsimple"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["", 'nur\sery\php\impl\ntsimple'],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["", "tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["", "::tstatic"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["", "->tmethod"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["", "::tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["", "->tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["xxx", "tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        true, true, ["xxx", "tmissing"],
 | 
						|
      ],
 | 
						|
      [["xxx", "::tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [["xxx", "->tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        true, true, ["xxx", "tmissing"],
 | 
						|
      ],
 | 
						|
      [[SC::class, "tstatic"],
 | 
						|
        true, true, [SC::class, "tstatic"],
 | 
						|
        true, true, [SC::class, "tstatic"],
 | 
						|
      ],
 | 
						|
      [[SC::class, "::tstatic"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[SC::class, "tmethod"],
 | 
						|
        true, true, [SC::class, "tmethod"],
 | 
						|
        true, true, [SC::class, "tmethod"],
 | 
						|
      ],
 | 
						|
      [[SC::class, "->tmethod"],
 | 
						|
        true, true, [SC::class, "tmethod"],
 | 
						|
        true, true, [SC::class, "tmethod"],
 | 
						|
      ],
 | 
						|
      [[SC::class, "tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        true, true, [SC::class, "tmissing"],
 | 
						|
      ],
 | 
						|
      [[SC::class, "::tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        false, null, null,
 | 
						|
      ],
 | 
						|
      [[SC::class, "->tmissing"],
 | 
						|
        false, null, null,
 | 
						|
        true, true, [SC::class, "tmissing"],
 | 
						|
      ],
 | 
						|
    ];
 | 
						|
 | 
						|
    function testMethod() {
 | 
						|
      foreach (self::METHOD_TESTS as $args) {
 | 
						|
        [$func,
 | 
						|
          $verifix1, $bound1, $func1,
 | 
						|
          $verifix2, $bound2, $func2,
 | 
						|
        ] = $args;
 | 
						|
 | 
						|
        $workf = $func;
 | 
						|
        $msg = var_export($func, true)." (strict)";
 | 
						|
        self::assertSame($verifix1, func::verifix_method($workf, true, $bound), "$msg --> verifix");
 | 
						|
        if ($verifix1) {
 | 
						|
          self::assertSame($bound1, $bound, "$msg --> bound");
 | 
						|
          self::assertSame($func1, $workf, "$msg --> func");
 | 
						|
        }
 | 
						|
 | 
						|
        $workf = $func;
 | 
						|
        $msg = var_export($func, true)." (lenient)";
 | 
						|
        self::assertSame($verifix2, func::verifix_method($workf, false, $bound), "$msg --> verifix");
 | 
						|
        if ($verifix2) {
 | 
						|
          self::assertSame($bound2, $bound, "$msg --> bound");
 | 
						|
          self::assertSame($func2, $workf, "$msg --> func");
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    function testInvokeFunction() {
 | 
						|
      # m1
 | 
						|
      self::assertSame([null], func::call("tm1"));
 | 
						|
      self::assertSame([null], func::call("tm1", null));
 | 
						|
      self::assertSame([null], func::call("tm1", null, null));
 | 
						|
      self::assertSame([null], func::call("tm1", null, null, null));
 | 
						|
      self::assertSame([null], func::call("tm1", null, null, null, null));
 | 
						|
      self::assertSame([1], func::call("tm1", 1));
 | 
						|
      self::assertSame([1], func::call("tm1", 1, 2));
 | 
						|
      self::assertSame([1], func::call("tm1", 1, 2, 3));
 | 
						|
      self::assertSame([1], func::call("tm1", 1, 2, 3, 4));
 | 
						|
 | 
						|
      # o1
 | 
						|
      self::assertSame([9], func::call("to1"));
 | 
						|
      self::assertSame([null], func::call("to1", null));
 | 
						|
      self::assertSame([null], func::call("to1", null, null));
 | 
						|
      self::assertSame([null], func::call("to1", null, null, null));
 | 
						|
      self::assertSame([null], func::call("to1", null, null, null, null));
 | 
						|
      self::assertSame([1], func::call("to1", 1));
 | 
						|
      self::assertSame([1], func::call("to1", 1, 2));
 | 
						|
      self::assertSame([1], func::call("to1", 1, 2, 3));
 | 
						|
      self::assertSame([1], func::call("to1", 1, 2, 3, 4));
 | 
						|
 | 
						|
      # v
 | 
						|
      self::assertSame([], func::call("tv"));
 | 
						|
      self::assertSame([null], func::call("tv", null));
 | 
						|
      self::assertSame([null, null], func::call("tv", null, null));
 | 
						|
      self::assertSame([null, null, null], func::call("tv", null, null, null));
 | 
						|
      self::assertSame([null, null, null, null], func::call("tv", null, null, null, null));
 | 
						|
      self::assertSame([1], func::call("tv", 1));
 | 
						|
      self::assertSame([1, 2], func::call("tv", 1, 2));
 | 
						|
      self::assertSame([1, 2, 3], func::call("tv", 1, 2, 3));
 | 
						|
      self::assertSame([1, 2, 3, 4], func::call("tv", 1, 2, 3, 4));
 | 
						|
 | 
						|
      # m1o1
 | 
						|
      self::assertSame([null, 9], func::call("tm1o1"));
 | 
						|
      self::assertSame([null, 9], func::call("tm1o1", null));
 | 
						|
      self::assertSame([null, null], func::call("tm1o1", null, null));
 | 
						|
      self::assertSame([null, null], func::call("tm1o1", null, null, null));
 | 
						|
      self::assertSame([null, null], func::call("tm1o1", null, null, null, null));
 | 
						|
      self::assertSame([1, 9], func::call("tm1o1", 1));
 | 
						|
      self::assertSame([1, 2], func::call("tm1o1", 1, 2));
 | 
						|
      self::assertSame([1, 2], func::call("tm1o1", 1, 2, 3));
 | 
						|
      self::assertSame([1, 2], func::call("tm1o1", 1, 2, 3, 4));
 | 
						|
 | 
						|
      # m1v
 | 
						|
      self::assertSame([null], func::call("tm1v"));
 | 
						|
      self::assertSame([null], func::call("tm1v", null));
 | 
						|
      self::assertSame([null, null], func::call("tm1v", null, null));
 | 
						|
      self::assertSame([null, null, null], func::call("tm1v", null, null, null));
 | 
						|
      self::assertSame([null, null, null, null], func::call("tm1v", null, null, null, null));
 | 
						|
      self::assertSame([1], func::call("tm1v", 1));
 | 
						|
      self::assertSame([1, 2], func::call("tm1v", 1, 2));
 | 
						|
      self::assertSame([1, 2, 3], func::call("tm1v", 1, 2, 3));
 | 
						|
      self::assertSame([1, 2, 3, 4], func::call("tm1v", 1, 2, 3, 4));
 | 
						|
 | 
						|
      # m1o1v
 | 
						|
      self::assertSame([null, 9], func::call("tm1o1v"));
 | 
						|
      self::assertSame([null, 9], func::call("tm1o1v", null));
 | 
						|
      self::assertSame([null, null], func::call("tm1o1v", null, null));
 | 
						|
      self::assertSame([null, null, null], func::call("tm1o1v", null, null, null));
 | 
						|
      self::assertSame([null, null, null, null], func::call("tm1o1v", null, null, null, null));
 | 
						|
      self::assertSame([1, 9], func::call("tm1o1v", 1));
 | 
						|
      self::assertSame([1, 2], func::call("tm1o1v", 1, 2));
 | 
						|
      self::assertSame([1, 2, 3], func::call("tm1o1v", 1, 2, 3));
 | 
						|
      self::assertSame([1, 2, 3, 4], func::call("tm1o1v", 1, 2, 3, 4));
 | 
						|
 | 
						|
      # o1v
 | 
						|
      self::assertSame([9], func::call("to1v"));
 | 
						|
      self::assertSame([null], func::call("to1v", null));
 | 
						|
      self::assertSame([null, null], func::call("to1v", null, null));
 | 
						|
      self::assertSame([null, null, null], func::call("to1v", null, null, null));
 | 
						|
      self::assertSame([null, null, null, null], func::call("to1v", null, null, null, null));
 | 
						|
      self::assertSame([1], func::call("to1v", 1));
 | 
						|
      self::assertSame([1, 2], func::call("to1v", 1, 2));
 | 
						|
      self::assertSame([1, 2, 3], func::call("to1v", 1, 2, 3));
 | 
						|
      self::assertSame([1, 2, 3, 4], func::call("to1v", 1, 2, 3, 4));
 | 
						|
    }
 | 
						|
 | 
						|
    function testInvokeClass() {
 | 
						|
      $func = func::with(SC::class);
 | 
						|
      self::assertInstanceOf(SC::class, $func->invoke());
 | 
						|
      self::assertInstanceOf(SC::class, $func->invoke([]));
 | 
						|
      self::assertInstanceOf(SC::class, $func->invoke([1]));
 | 
						|
      self::assertInstanceOf(SC::class, $func->invoke([1, 2]));
 | 
						|
      self::assertInstanceOf(SC::class, $func->invoke([1, 2, 3]));
 | 
						|
 | 
						|
      $func = func::with(C0::class);
 | 
						|
      self::assertInstanceOf(C0::class, $func->invoke());
 | 
						|
      self::assertInstanceOf(C0::class, $func->invoke([]));
 | 
						|
      self::assertInstanceOf(C0::class, $func->invoke([1]));
 | 
						|
      self::assertInstanceOf(C0::class, $func->invoke([1, 2]));
 | 
						|
      self::assertInstanceOf(C0::class, $func->invoke([1, 2, 3]));
 | 
						|
 | 
						|
      $func = func::with(C1::class);
 | 
						|
      /** @var C1 $i1 */
 | 
						|
      $i1 = $func->invoke();
 | 
						|
      self::assertInstanceOf(C1::class, $i1); self::assertSame(0, $i1->base);
 | 
						|
      $i1 = $func->invoke([]);
 | 
						|
      self::assertInstanceOf(C1::class, $i1); self::assertSame(0, $i1->base);
 | 
						|
      $i1 = $func->invoke([1]);
 | 
						|
      self::assertInstanceOf(C1::class, $i1); self::assertSame(1, $i1->base);
 | 
						|
      $i1 = $func->invoke([1, 2]);
 | 
						|
      self::assertInstanceOf(C1::class, $i1); self::assertSame(1, $i1->base);
 | 
						|
    }
 | 
						|
    
 | 
						|
    private static function invoke_asserts(): array {
 | 
						|
      $inv_ok = function($func) {
 | 
						|
        return func::with($func)->invoke();
 | 
						|
      };
 | 
						|
      $inv_ko = function($func) use ($inv_ok) {
 | 
						|
        return function() use ($func, $inv_ok) {
 | 
						|
          return $inv_ok($func);
 | 
						|
        };
 | 
						|
      };
 | 
						|
      $bind_ok = function($func, $objet) {
 | 
						|
        return func::with($func)->bind($objet)->invoke();
 | 
						|
      };
 | 
						|
      $bind_ko = function($func, $object) use ($bind_ok) {
 | 
						|
        return function() use ($func, $object, $bind_ok) {
 | 
						|
          return $bind_ok($func, $object);
 | 
						|
        };
 | 
						|
      };
 | 
						|
      return [$inv_ok, $inv_ko, $bind_ok, $bind_ko];
 | 
						|
    }
 | 
						|
 | 
						|
    function testInvokeStatic() {
 | 
						|
      [$inv_ok, $inv_ko, $bind_ok, $bind_ko] = self::invoke_asserts();
 | 
						|
      $sc = new SC();
 | 
						|
 | 
						|
      self::assertSame(10, $inv_ok([SC::class, "tstatic"]));
 | 
						|
      self::assertSame(10, $inv_ok([SC::class, "::tstatic"]));
 | 
						|
      self::assertSame(10, $inv_ok([SC::class, "->tstatic"]));
 | 
						|
 | 
						|
      self::assertSame(10, $inv_ok([$sc, "tstatic"]));
 | 
						|
      self::assertSame(10, $inv_ok([$sc, "::tstatic"]));
 | 
						|
      self::assertSame(10, $inv_ok([$sc, "->tstatic"]));
 | 
						|
 | 
						|
      self::assertException(ValueException::class, $inv_ko([null, "tstatic"]));
 | 
						|
      self::assertException(ValueException::class, $inv_ko([null, "::tstatic"]));
 | 
						|
      self::assertException(ValueException::class, $inv_ko([null, "->tstatic"]));
 | 
						|
 | 
						|
      self::assertSame(10, $bind_ok([null, "tstatic"], SC::class));
 | 
						|
      self::assertSame(10, $bind_ok([null, "::tstatic"], SC::class));
 | 
						|
      self::assertSame(10, $bind_ok([null, "->tstatic"], SC::class));
 | 
						|
 | 
						|
      self::assertSame(10, $bind_ok([null, "tstatic"], $sc));
 | 
						|
      self::assertSame(10, $bind_ok([null, "::tstatic"], $sc));
 | 
						|
      self::assertSame(10, $bind_ok([null, "->tstatic"], $sc));
 | 
						|
    }
 | 
						|
 | 
						|
    function testInvokeMethod() {
 | 
						|
      [$inv_ok, $inv_ko, $bind_ok, $bind_ko] = self::invoke_asserts();
 | 
						|
      $sc = new SC();
 | 
						|
 | 
						|
      self::assertException(ReflectionException::class, $inv_ko([SC::class, "tmethod"]));
 | 
						|
      self::assertException(ReflectionException::class, $inv_ko([SC::class, "::tmethod"]));
 | 
						|
      self::assertException(ReflectionException::class, $inv_ko([SC::class, "->tmethod"]));
 | 
						|
 | 
						|
      self::assertSame(11, $inv_ok([$sc, "tmethod"]));
 | 
						|
      self::assertException(ReflectionException::class, $inv_ko([$sc, "::tmethod"]));
 | 
						|
      self::assertSame(11, $inv_ok([$sc, "->tmethod"]));
 | 
						|
 | 
						|
      self::assertException(ValueException::class, $inv_ko([null, "tmethod"]));
 | 
						|
      self::assertException(ValueException::class, $inv_ko([null, "::tmethod"]));
 | 
						|
      self::assertException(ValueException::class, $inv_ko([null, "->tmethod"]));
 | 
						|
 | 
						|
      self::assertException(ReflectionException::class, $bind_ko([null, "tmethod"], SC::class));
 | 
						|
      self::assertException(ReflectionException::class, $bind_ko([null, "::tmethod"], SC::class));
 | 
						|
      self::assertException(ReflectionException::class, $bind_ko([null, "->tmethod"], SC::class));
 | 
						|
 | 
						|
      self::assertSame(11, $bind_ok([null, "tmethod"], $sc));
 | 
						|
      self::assertException(ReflectionException::class, $bind_ko([null, "::tmethod"], $sc));
 | 
						|
      self::assertSame(11, $bind_ok([null, "->tmethod"], $sc));
 | 
						|
    }
 | 
						|
 | 
						|
    function testArgs() {
 | 
						|
      $func = function(int $a, int $b, int $c): int {
 | 
						|
        return $a + $b + $c;
 | 
						|
      };
 | 
						|
 | 
						|
      self::assertSame(6, func::call($func, 1, 2, 3));
 | 
						|
      self::assertSame(6, func::call($func, 1, 2, 3, 4));
 | 
						|
 | 
						|
      self::assertSame(6, func::with($func)->invoke([1, 2, 3]));
 | 
						|
      self::assertSame(6, func::with($func, [1])->invoke([2, 3]));
 | 
						|
      self::assertSame(6, func::with($func, [1, 2])->invoke([3]));
 | 
						|
      self::assertSame(6, func::with($func, [1, 2, 3])->invoke());
 | 
						|
      self::assertSame(6, func::with($func, [1, 2, 3, 4])->invoke());
 | 
						|
    }
 | 
						|
 | 
						|
    function testRebind() {
 | 
						|
      $func = func::with([C1::class, "tmethod"]);
 | 
						|
      self::assertSame(11, $func->bind(new C1(0))->invoke());
 | 
						|
      self::assertSame(12, $func->bind(new C1(1))->invoke());
 | 
						|
      self::assertException(ValueException::class, function() use ($func) {
 | 
						|
        $func->bind(new C0())->invoke();
 | 
						|
      });
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
namespace {
 | 
						|
  function tsimple(): int { return 0; }
 | 
						|
  function tm1($a): array { return [$a]; }
 | 
						|
  function to1($b=9): array { return [$b]; }
 | 
						|
  function tv(...$c): array { return [...$c]; }
 | 
						|
  function tm1o1($a, $b=9): array { return [$a, $b]; }
 | 
						|
  function tm1v($a, ...$c): array { return [$a, ...$c]; }
 | 
						|
  function tm1o1v($a, $b=9, ...$c): array { return [$a, $b, ...$c]; }
 | 
						|
  function to1v($b=9, ...$c): array { return [$b, ...$c]; }
 | 
						|
}
 | 
						|
 | 
						|
namespace nur\sery\php\impl {
 | 
						|
  function ntsimple(): int { return 0; }
 | 
						|
 | 
						|
  class SC {
 | 
						|
    static function tstatic(): int {
 | 
						|
      return 10;
 | 
						|
    }
 | 
						|
 | 
						|
    function tmethod(): int {
 | 
						|
      return 11;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  class C0 {
 | 
						|
    function __construct() {
 | 
						|
    }
 | 
						|
 | 
						|
    static function tstatic(): int {
 | 
						|
      return 10;
 | 
						|
    }
 | 
						|
 | 
						|
    function tmethod(): int {
 | 
						|
      return 11;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  class C1 {
 | 
						|
    function __construct(int $base=0) {
 | 
						|
      $this->base = $base;
 | 
						|
    }
 | 
						|
 | 
						|
    public int $base;
 | 
						|
 | 
						|
    static function tstatic(): int {
 | 
						|
      return 10;
 | 
						|
    }
 | 
						|
 | 
						|
    function tmethod(): int {
 | 
						|
      return 11 + $this->base;
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |