1070 lines
28 KiB
PHP
1070 lines
28 KiB
PHP
<?php
|
|
|
|
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\wip\php\impl {
|
|
function ntsimple(): int { return 0; }
|
|
}
|
|
|
|
namespace nur\sery\wip\php {
|
|
use nulib\tests\TestCase;
|
|
use nur\sery\wip\php\impl\C0;
|
|
use nur\sery\wip\php\impl\C1;
|
|
use nur\sery\wip\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\wip\php\impl\ntsimple',
|
|
true, [false, 'nur\sery\wip\php\impl\ntsimple'],
|
|
true, [false, 'nur\sery\wip\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\wip\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\wip\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\wip\php\impl\ntsimple'],
|
|
true, [false, 'nur\sery\wip\php\impl\ntsimple'],
|
|
true, [false, 'nur\sery\wip\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\wip\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\wip\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\wip\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\wip\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\wip\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\wip\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\wip\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\wip\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\wip\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\wip\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\wip\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(null, $i1->first);
|
|
$i1 = $func->invoke([]);
|
|
self::assertInstanceOf(C1::class, $i1); self::assertSame(null, $i1->first);
|
|
$i1 = $func->invoke([1]);
|
|
self::assertInstanceOf(C1::class, $i1); self::assertSame(1, $i1->first);
|
|
$i1 = $func->invoke([1, 2]);
|
|
self::assertInstanceOf(C1::class, $i1); self::assertSame(1, $i1->first);
|
|
}
|
|
|
|
function testInvokeStatic() {
|
|
$func = func::with([SC::class, "tstatic"]);
|
|
self::assertSame(10, $func->invoke());
|
|
|
|
$func = func::with([SC::class, "tmethod"]);
|
|
self::assertException(ReflectionException::class, function() use ($func) {
|
|
$func->invoke();
|
|
});
|
|
|
|
$func = func::with([null, "tstatic"]);
|
|
self::assertException(ReflectionException::class, function() use ($func) {
|
|
$func->invoke();
|
|
});
|
|
|
|
$func = func::with([null, "tmethod"]);
|
|
self::assertException(ReflectionException::class, function() use ($func) {
|
|
$func->invoke();
|
|
});
|
|
}
|
|
|
|
function testInvokeMethod() {
|
|
$func = func::with([SC::class, "tstatic"]);
|
|
self::assertSame(10, $func->invoke());
|
|
|
|
$func = func::with([new SC(), "tstatic"]);
|
|
self::assertSame(10, $func->invoke());
|
|
|
|
$func = func::with([SC::class, "tmethod"]);
|
|
self::assertException(ReflectionException::class, function() use ($func) {
|
|
$func->invoke();
|
|
});
|
|
|
|
$func = func::with([new SC(), "tmethod"]);
|
|
self::assertSame(11, $func->invoke());
|
|
}
|
|
}
|
|
}
|