From 73bfc8ddae111eb8feb13ecbe9781f84086d20a9 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Wed, 11 Sep 2024 23:35:46 +0400 Subject: [PATCH] modifs.mineures sans commentaires --- tests/wip/php/funcTest.php | 1366 +++++++++++++++++++++--------------- wip/php/func.php | 280 +++++++- 2 files changed, 1038 insertions(+), 608 deletions(-) diff --git a/tests/wip/php/funcTest.php b/tests/wip/php/funcTest.php index 540c67c..b0c2dfe 100644 --- a/tests/wip/php/funcTest.php +++ b/tests/wip/php/funcTest.php @@ -13,591 +13,815 @@ namespace nur\sery\wip\php { use nur\sery\wip\php\impl\MyClass; class funcTest extends TestCase { + const SIMPLE_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, + ], + [MyClass::class."::tstatic", + false, null, + false, null, + ], + [MyClass::class."->tmethod", + false, null, + false, null, + ], + [MyClass::class."::tmissing", + false, null, + false, null, + ], + [MyClass::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, + ], + [[MyClass::class."::tstatic"], + false, null, + false, null, + ], + [[MyClass::class."->tmethod"], + false, null, + false, null, + ], + [[MyClass::class."::tmissing"], + false, null, + false, null, + ], + [[MyClass::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, + ], + [[MyClass::class, "tstatic"], + false, null, + false, null, + ], + [[MyClass::class, "::tstatic"], + false, null, + false, null, + ], + [[MyClass::class, "tmethod"], + false, null, + false, null, + ], + [[MyClass::class, "->tmethod"], + false, null, + false, null, + ], + [[MyClass::class, "tmissing"], + false, null, + false, null, + ], + [[MyClass::class, "::tmissing"], + false, null, + false, null, + ], + [[MyClass::class, "->tmissing"], + false, null, + false, null, + ], + ]; + function testSimple() { + foreach (self::SIMPLE_TESTS as $args) { + [$func, + $verifix1, $func1, + $verifix2, $func2, + ] = $args; + + $workf = $func; + $msg = var_export($func, true)." (strict)"; + self::assertSame($verifix1, func::verifix_simple($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_simple($workf, false), "$msg --> verifix"); + if ($verifix2) { + self::assertSame($func2, $workf, "$msg --> func"); + } + } + } + + const STATIC_TESTS = [ # scalaires - $func = null; self::assertFalse(func::verifix_simple($func)); - $func = null; self::assertFalse(func::verifix_simple($func, false)); - - $func = false; self::assertFalse(func::verifix_simple($func)); - $func = false; self::assertFalse(func::verifix_simple($func, false)); - - $func = ""; self::assertFalse(func::verifix_simple($func)); - $func = ""; self::assertFalse(func::verifix_simple($func, false)); - - $func = "::"; self::assertFalse(func::verifix_simple($func)); - $func = "::"; self::assertFalse(func::verifix_simple($func, false)); - - $func = "->"; self::assertFalse(func::verifix_simple($func)); - $func = "->"; self::assertFalse(func::verifix_simple($func, false)); - - $func = "tsimple"; self::assertTrue(func::verifix_simple($func)); - $func = "tsimple"; self::assertTrue(func::verifix_simple($func, false)); - - $func = 'nur\sery\wip\php\impl\ntsimple'; self::assertTrue(func::verifix_simple($func)); - $func = 'nur\sery\wip\php\impl\ntsimple'; self::assertTrue(func::verifix_simple($func, false)); - - $func = 'tmissing'; self::assertFalse(func::verifix_simple($func)); - $func = 'tmissing'; self::assertTrue(func::verifix_simple($func, false)); - - $func = "::tstatic"; self::assertFalse(func::verifix_simple($func)); - $func = "::tstatic"; self::assertFalse(func::verifix_simple($func, false)); - - $func = "->tmethod"; self::assertFalse(func::verifix_simple($func)); - $func = "->tmethod"; self::assertFalse(func::verifix_simple($func, false)); - - $func = "::tmissing"; self::assertFalse(func::verifix_simple($func)); - $func = "::tmissing"; self::assertFalse(func::verifix_simple($func, false)); - - $func = "->tmissing"; self::assertFalse(func::verifix_simple($func)); - $func = "->tmissing"; self::assertFalse(func::verifix_simple($func, false)); - - $func = MyClass::class."::tstatic"; self::assertFalse(func::verifix_simple($func)); - $func = MyClass::class."::tstatic"; self::assertFalse(func::verifix_simple($func, false)); - - $func = MyClass::class."->tmethod"; self::assertFalse(func::verifix_simple($func)); - $func = MyClass::class."->tmethod"; self::assertFalse(func::verifix_simple($func, false)); - - $func = MyClass::class."::tmissing"; self::assertFalse(func::verifix_simple($func)); - $func = MyClass::class."::tmissing"; self::assertFalse(func::verifix_simple($func, false)); - - $func = MyClass::class."->tmissing"; self::assertFalse(func::verifix_simple($func)); - $func = MyClass::class."->tmissing"; self::assertFalse(func::verifix_simple($func, false)); - + [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, + ], + [MyClass::class."::tstatic", + true, true, [MyClass::class, "tstatic"], + true, true, [MyClass::class, "tstatic"], + ], + [MyClass::class."->tmethod", + false, null, null, + false, null, null, + ], + [MyClass::class."::tmissing", + false, null, null, + true, true, [MyClass::class, "tmissing"], + ], + [MyClass::class."->tmissing", + false, null, null, + false, null, null, + ], # tableaux avec un seul scalaire - $func = []; self::assertFalse(func::verifix_simple($func)); - $func = []; self::assertFalse(func::verifix_simple($func, false)); - - $func = [null]; self::assertFalse(func::verifix_simple($func)); - $func = [null]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [false]; self::assertFalse(func::verifix_simple($func)); - $func = [false]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [""]; self::assertFalse(func::verifix_simple($func)); - $func = [""]; self::assertFalse(func::verifix_simple($func, false)); - - $func = ["::"]; self::assertFalse(func::verifix_simple($func)); - $func = ["::"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = ["->"]; self::assertFalse(func::verifix_simple($func)); - $func = ["->"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = ["tsimple"]; self::assertFalse(func::verifix_simple($func)); - $func = ["tsimple"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = ['nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_simple($func)); - $func = ['nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_simple($func, false)); - - $func = ["::tstatic"]; self::assertFalse(func::verifix_simple($func)); - $func = ["::tstatic"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = ["->tmethod"]; self::assertFalse(func::verifix_simple($func)); - $func = ["->tmethod"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = ["::tmissing"]; self::assertFalse(func::verifix_simple($func)); - $func = ["::tmissing"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = ["->tmissing"]; self::assertFalse(func::verifix_simple($func)); - $func = ["->tmissing"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [MyClass::class."::tstatic"]; self::assertFalse(func::verifix_simple($func)); - $func = [MyClass::class."::tstatic"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [MyClass::class."->tmethod"]; self::assertFalse(func::verifix_simple($func)); - $func = [MyClass::class."->tmethod"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [MyClass::class."::tmissing"]; self::assertFalse(func::verifix_simple($func)); - $func = [MyClass::class."::tmissing"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [MyClass::class."->tmissing"]; self::assertFalse(func::verifix_simple($func)); - $func = [MyClass::class."->tmissing"]; self::assertFalse(func::verifix_simple($func, false)); - + [[], + 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, + ], + [[MyClass::class."::tstatic"], + true, true, [MyClass::class, "tstatic"], + true, true, [MyClass::class, "tstatic"], + ], + [[MyClass::class."->tmethod"], + false, null, null, + false, null, null, + ], + [[MyClass::class."::tmissing"], + false, null, null, + true, true, [MyClass::class, "tmissing"], + ], + [[MyClass::class."->tmissing"], + false, null, null, + false, null, null, + ], # tableaux avec deux scalaires - $func = [null, "tsimple"]; self::assertFalse(func::verifix_simple($func)); - $func = [null, "tsimple"]; self::assertFalse(func::verifix_simple($func, false)); + [[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"], + true, false, [null, "tsimple"], + true, false, [null, "tsimple"], + ], + [["", 'nur\sery\wip\php\impl\ntsimple'], + false, null, null, + false, null, null, + ], + [["", "tmissing"], + true, false, [null, "tmissing"], + true, false, [null, "tmissing"], + ], + [["", "::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, + ], + [[MyClass::class, "tstatic"], + true, true, [MyClass::class, "tstatic"], + true, true, [MyClass::class, "tstatic"], + ], + [[MyClass::class, "::tstatic"], + true, true, [MyClass::class, "tstatic"], + true, true, [MyClass::class, "tstatic"], + ], + [[MyClass::class, "tmethod"], + true, true, [MyClass::class, "tmethod"], + true, true, [MyClass::class, "tmethod"], + ], + [[MyClass::class, "->tmethod"], + false, null, null, + false, null, null, + ], + [[MyClass::class, "tmissing"], + false, null, null, + true, true, [MyClass::class, "tmissing"], + ], + [[MyClass::class, "::tmissing"], + false, null, null, + true, true, [MyClass::class, "tmissing"], + ], + [[MyClass::class, "->tmissing"], + false, null, null, + false, null, null, + ], + ]; - $func = [null, 'nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_simple($func)); - $func = [null, 'nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_simple($func, false)); - - $func = [null, "tmissing"]; self::assertFalse(func::verifix_simple($func)); - $func = [null, "tmissing"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [null, "::tstatic"]; self::assertFalse(func::verifix_simple($func)); - $func = [null, "::tstatic"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [null, "->tmethod"]; self::assertFalse(func::verifix_simple($func)); - $func = [null, "->tmethod"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [null, "::tmissing"]; self::assertFalse(func::verifix_simple($func)); - $func = [null, "::tmissing"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [null, "->tmissing"]; self::assertFalse(func::verifix_simple($func)); - $func = [null, "->tmissing"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [false, "tsimple"]; self::assertTrue(func::verifix_simple($func)); - $func = [false, "tsimple"]; self::assertTrue(func::verifix_simple($func, false)); - - $func = [false, 'nur\sery\wip\php\impl\ntsimple']; self::assertTrue(func::verifix_simple($func)); - $func = [false, 'nur\sery\wip\php\impl\ntsimple']; self::assertTrue(func::verifix_simple($func, false)); - - $func = [false, "tmissing"]; self::assertFalse(func::verifix_simple($func)); - $func = [false, "tmissing"]; self::assertTrue(func::verifix_simple($func, false)); - - $func = [false, "::tstatic"]; self::assertFalse(func::verifix_simple($func)); - $func = [false, "::tstatic"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [false, "->tmethod"]; self::assertFalse(func::verifix_simple($func)); - $func = [false, "->tmethod"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [false, "::tmissing"]; self::assertFalse(func::verifix_simple($func)); - $func = [false, "::tmissing"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [false, "->tmissing"]; self::assertFalse(func::verifix_simple($func)); - $func = [false, "->tmissing"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = ["", "tsimple"]; self::assertFalse(func::verifix_simple($func)); - $func = ["", "tsimple"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = ["", 'nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_simple($func)); - $func = ["", 'nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_simple($func, false)); - - $func = ["", "tmissing"]; self::assertFalse(func::verifix_simple($func)); - $func = ["", "tmissing"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = ["", "::tstatic"]; self::assertFalse(func::verifix_simple($func)); - $func = ["", "::tstatic"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = ["", "->tmethod"]; self::assertFalse(func::verifix_simple($func)); - $func = ["", "->tmethod"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = ["", "::tmissing"]; self::assertFalse(func::verifix_simple($func)); - $func = ["", "::tmissing"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = ["", "->tmissing"]; self::assertFalse(func::verifix_simple($func)); - $func = ["", "->tmissing"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [MyClass::class, "tstatic"]; self::assertFalse(func::verifix_simple($func)); - $func = [MyClass::class, "tstatic"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [MyClass::class, "::tstatic"]; self::assertFalse(func::verifix_simple($func)); - $func = [MyClass::class, "::tstatic"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [MyClass::class, "tmethod"]; self::assertFalse(func::verifix_simple($func)); - $func = [MyClass::class, "tmethod"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [MyClass::class, "->tmethod"]; self::assertFalse(func::verifix_simple($func)); - $func = [MyClass::class, "->tmethod"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [MyClass::class, "tmissing"]; self::assertFalse(func::verifix_simple($func)); - $func = [MyClass::class, "tmissing"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [MyClass::class, "::tmissing"]; self::assertFalse(func::verifix_simple($func)); - $func = [MyClass::class, "::tmissing"]; self::assertFalse(func::verifix_simple($func, false)); - - $func = [MyClass::class, "->tmissing"]; self::assertFalse(func::verifix_simple($func)); - $func = [MyClass::class, "->tmissing"]; self::assertFalse(func::verifix_simple($func, false)); - } - - function testSimpleResults() { - $func = "tsimple"; self::assertTrue(func::verifix_simple($func)); - self::assertSame([false, "tsimple"], $func); - $func = "tsimple"; self::assertTrue(func::verifix_simple($func, false)); - self::assertSame([false, "tsimple"], $func); - - $func = 'nur\sery\wip\php\impl\ntsimple'; self::assertTrue(func::verifix_simple($func)); - self::assertSame([false, 'nur\sery\wip\php\impl\ntsimple'], $func); - $func = 'nur\sery\wip\php\impl\ntsimple'; self::assertTrue(func::verifix_simple($func, false)); - self::assertSame([false, 'nur\sery\wip\php\impl\ntsimple'], $func); - - $func = 'tmissing'; self::assertTrue(func::verifix_simple($func, false)); - self::assertSame([false, "tmissing"], $func); - - $func = [false, "tsimple"]; self::assertTrue(func::verifix_simple($func)); - self::assertSame([false, "tsimple"], $func); - $func = [false, "tsimple"]; self::assertTrue(func::verifix_simple($func, false)); - self::assertSame([false, "tsimple"], $func); - - $func = [false, 'nur\sery\wip\php\impl\ntsimple']; self::assertTrue(func::verifix_simple($func)); - self::assertSame([false, 'nur\sery\wip\php\impl\ntsimple'], $func); - $func = [false, 'nur\sery\wip\php\impl\ntsimple']; self::assertTrue(func::verifix_simple($func, false)); - self::assertSame([false, 'nur\sery\wip\php\impl\ntsimple'], $func); - - $func = [false, "tmissing"]; self::assertTrue(func::verifix_simple($func, false)); - self::assertSame([false, "tmissing"], $func); - } - function testStatic() { - # scalaires - $func = null; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = null; self::assertFalse(func::verifix_static($func, false, $bound)); + foreach (self::STATIC_TESTS as $args) { + [$func, + $verifix1, $bound1, $func1, + $verifix2, $bound2, $func2, + ] = $args; - $func = false; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = false; self::assertFalse(func::verifix_static($func, false, $bound)); + $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"); + } - $func = ""; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = ""; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = "::"; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = "::"; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = "->"; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = "->"; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = "tsimple"; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = "tsimple"; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = 'nur\sery\wip\php\impl\ntsimple'; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = 'nur\sery\wip\php\impl\ntsimple'; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = 'tmissing'; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = 'tmissing'; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = "::tstatic"; self::assertTrue(func::verifix_static($func, true, $bound)); - $func = "::tstatic"; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = "->tmethod"; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = "->tmethod"; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = "::tmissing"; self::assertTrue(func::verifix_static($func, true, $bound)); - $func = "::tmissing"; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = "->tmissing"; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = "->tmissing"; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = MyClass::class."::tstatic"; self::assertTrue(func::verifix_static($func, true, $bound)); - $func = MyClass::class."::tstatic"; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = MyClass::class."->tmethod"; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = MyClass::class."->tmethod"; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = MyClass::class."::tmissing"; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = MyClass::class."::tmissing"; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = MyClass::class."->tmissing"; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = MyClass::class."->tmissing"; self::assertFalse(func::verifix_static($func, false, $bound)); - - # tableaux avec un seul scalaire - $func = []; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = []; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = [null]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = [null]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = [false]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = [false]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = [""]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = [""]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = ["::"]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = ["::"]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = ["->"]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = ["->"]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = ["tsimple"]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = ["tsimple"]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = ['nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = ['nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = ["::tstatic"]; self::assertTrue(func::verifix_static($func, true, $bound)); - $func = ["::tstatic"]; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = ["->tmethod"]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = ["->tmethod"]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = ["::tmissing"]; self::assertTrue(func::verifix_static($func, true, $bound)); - $func = ["::tmissing"]; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = ["->tmissing"]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = ["->tmissing"]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = [MyClass::class."::tstatic"]; self::assertTrue(func::verifix_static($func, true, $bound)); - $func = [MyClass::class."::tstatic"]; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = [MyClass::class."->tmethod"]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = [MyClass::class."->tmethod"]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = [MyClass::class."::tmissing"]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = [MyClass::class."::tmissing"]; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = [MyClass::class."->tmissing"]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = [MyClass::class."->tmissing"]; self::assertFalse(func::verifix_static($func, false, $bound)); - - # tableaux avec deux scalaires - $func = [null, "tsimple"]; self::assertTrue(func::verifix_static($func, true, $bound)); - $func = [null, "tsimple"]; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = [null, 'nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = [null, 'nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = [null, "tmissing"]; self::assertTrue(func::verifix_static($func, true, $bound)); - $func = [null, "tmissing"]; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = [null, "::tstatic"]; self::assertTrue(func::verifix_static($func, true, $bound)); - $func = [null, "::tstatic"]; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = [null, "->tmethod"]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = [null, "->tmethod"]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = [null, "::tmissing"]; self::assertTrue(func::verifix_static($func, true, $bound)); - $func = [null, "::tmissing"]; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = [null, "->tmissing"]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = [null, "->tmissing"]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = [false, "tsimple"]; self::assertFalse(func::verifix_static($func, False, $bound)); - $func = [false, "tsimple"]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = [false, 'nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_static($func, False, $bound)); - $func = [false, 'nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = [false, "tmissing"]; self::assertFalse(func::verifix_static($func, False, $bound)); - $func = [false, "tmissing"]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = [false, "::tstatic"]; self::assertFalse(func::verifix_static($func, False, $bound)); - $func = [false, "::tstatic"]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = [false, "->tmethod"]; self::assertFalse(func::verifix_static($func, False, $bound)); - $func = [false, "->tmethod"]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = [false, "::tmissing"]; self::assertFalse(func::verifix_static($func, False, $bound)); - $func = [false, "::tmissing"]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = [false, "->tmissing"]; self::assertFalse(func::verifix_static($func, False, $bound)); - $func = [false, "->tmissing"]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = ["", "tsimple"]; self::assertTrue(func::verifix_static($func, true, $bound)); - $func = ["", "tsimple"]; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = ["", 'nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = ["", 'nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = ["", "tmissing"]; self::assertTrue(func::verifix_static($func, true, $bound)); - $func = ["", "tmissing"]; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = ["", "::tstatic"]; self::assertTrue(func::verifix_static($func, true, $bound)); - $func = ["", "::tstatic"]; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = ["", "->tmethod"]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = ["", "->tmethod"]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = ["", "::tmissing"]; self::assertTrue(func::verifix_static($func, true, $bound)); - $func = ["", "::tmissing"]; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = ["", "->tmissing"]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = ["", "->tmissing"]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = [MyClass::class, "tstatic"]; self::assertTrue(func::verifix_static($func, true, $bound)); - $func = [MyClass::class, "tstatic"]; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = [MyClass::class, "::tstatic"]; self::assertTrue(func::verifix_static($func, true, $bound)); - $func = [MyClass::class, "::tstatic"]; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = [MyClass::class, "tmethod"]; self::assertTrue(func::verifix_static($func, true, $bound)); - $func = [MyClass::class, "tmethod"]; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = [MyClass::class, "->tmethod"]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = [MyClass::class, "->tmethod"]; self::assertFalse(func::verifix_static($func, false, $bound)); - - $func = [MyClass::class, "tmissing"]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = [MyClass::class, "tmissing"]; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = [MyClass::class, "::tmissing"]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = [MyClass::class, "::tmissing"]; self::assertTrue(func::verifix_static($func, false, $bound)); - - $func = [MyClass::class, "->tmissing"]; self::assertFalse(func::verifix_static($func, true, $bound)); - $func = [MyClass::class, "->tmissing"]; self::assertFalse(func::verifix_static($func, false, $bound)); + $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"); + } + } } - //function testStaticResults() {} + 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"], + ], + [MyClass::class."::tstatic", + false, null, null, + false, null, null, + ], + [MyClass::class."->tmethod", + true, true, [MyClass::class, "tmethod"], + true, true, [MyClass::class, "tmethod"], + ], + [MyClass::class."::tmissing", + false, null, null, + false, null, null, + ], + [MyClass::class."->tmissing", + false, null, null, + true, true, [MyClass::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"], + ], + [[MyClass::class."::tstatic"], + false, null, null, + false, null, null, + ], + [[MyClass::class."->tmethod"], + true, true, [MyClass::class, "tmethod"], + true, true, [MyClass::class, "tmethod"], + ], + [[MyClass::class."::tmissing"], + false, null, null, + false, null, null, + ], + [[MyClass::class."->tmissing"], + false, null, null, + true, true, [MyClass::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"], + true, false, [null, "tsimple"], + true, false, [null, "tsimple"], + ], + [["", 'nur\sery\wip\php\impl\ntsimple'], + false, null, null, + false, null, null, + ], + [["", "tmissing"], + true, false, [null, "tmissing"], + true, false, [null, "tmissing"], + ], + [["", "::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"], + ], + [[MyClass::class, "tstatic"], + true, true, [MyClass::class, "tstatic"], + true, true, [MyClass::class, "tstatic"], + ], + [[MyClass::class, "::tstatic"], + false, null, null, + false, null, null, + ], + [[MyClass::class, "tmethod"], + true, true, [MyClass::class, "tmethod"], + true, true, [MyClass::class, "tmethod"], + ], + [[MyClass::class, "->tmethod"], + true, true, [MyClass::class, "tmethod"], + true, true, [MyClass::class, "tmethod"], + ], + [[MyClass::class, "tmissing"], + false, null, null, + true, true, [MyClass::class, "tmissing"], + ], + [[MyClass::class, "::tmissing"], + false, null, null, + false, null, null, + ], + [[MyClass::class, "->tmissing"], + false, null, null, + true, true, [MyClass::class, "tmissing"], + ], + ]; function testMethod() { - # scalaires - $func = null; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = null; self::assertFalse(func::verifix_method($func, false, $bound)); + foreach (self::METHOD_TESTS as $args) { + [$func, + $verifix1, $bound1, $func1, + $verifix2, $bound2, $func2, + ] = $args; - $func = false; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = false; self::assertFalse(func::verifix_method($func, false, $bound)); + $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"); + } - $func = ""; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = ""; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = "::"; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = "::"; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = "->"; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = "->"; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = "tsimple"; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = "tsimple"; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = 'nur\sery\wip\php\impl\ntsimple'; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = 'nur\sery\wip\php\impl\ntsimple'; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = 'tmissing'; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = 'tmissing'; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = "::tmethod"; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = "::tmethod"; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = "->tmethod"; self::assertTrue(func::verifix_method($func, true, $bound)); - $func = "->tmethod"; self::assertTrue(func::verifix_method($func, false, $bound)); - - $func = "::tmissing"; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = "::tmissing"; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = "->tmissing"; self::assertTrue(func::verifix_method($func, true, $bound)); - $func = "->tmissing"; self::assertTrue(func::verifix_method($func, false, $bound)); - - $func = MyClass::class."::tmethod"; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = MyClass::class."::tmethod"; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = MyClass::class."->tmethod"; self::assertTrue(func::verifix_method($func, true, $bound)); - $func = MyClass::class."->tmethod"; self::assertTrue(func::verifix_method($func, false, $bound)); - - $func = MyClass::class."::tmissing"; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = MyClass::class."::tmissing"; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = MyClass::class."->tmissing"; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = MyClass::class."->tmissing"; self::assertTrue(func::verifix_method($func, false, $bound)); - - # tableaux avec un seul scalaire - $func = []; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = []; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = [null]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = [null]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = [false]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = [false]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = [""]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = [""]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = ["::"]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = ["::"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = ["->"]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = ["->"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = ["tsimple"]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = ["tsimple"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = ['nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = ['nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = ["::tmethod"]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = ["::tmethod"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = ["->tmethod"]; self::assertTrue(func::verifix_method($func, true, $bound)); - $func = ["->tmethod"]; self::assertTrue(func::verifix_method($func, false, $bound)); - - $func = ["::tmissing"]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = ["::tmissing"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = ["->tmissing"]; self::assertTrue(func::verifix_method($func, true, $bound)); - $func = ["->tmissing"]; self::assertTrue(func::verifix_method($func, false, $bound)); - - $func = [MyClass::class."::tmethod"]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = [MyClass::class."::tmethod"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = [MyClass::class."->tmethod"]; self::assertTrue(func::verifix_method($func, true, $bound)); - $func = [MyClass::class."->tmethod"]; self::assertTrue(func::verifix_method($func, false, $bound)); - - $func = [MyClass::class."::tmissing"]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = [MyClass::class."::tmissing"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = [MyClass::class."->tmissing"]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = [MyClass::class."->tmissing"]; self::assertTrue(func::verifix_method($func, false, $bound)); - - # tableaux avec deux scalaires - $func = [null, "tsimple"]; self::assertTrue(func::verifix_method($func, true, $bound)); - $func = [null, "tsimple"]; self::assertTrue(func::verifix_method($func, false, $bound)); - - $func = [null, 'nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = [null, 'nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = [null, "tmissing"]; self::assertTrue(func::verifix_method($func, true, $bound)); - $func = [null, "tmissing"]; self::assertTrue(func::verifix_method($func, false, $bound)); - - $func = [null, "::tmethod"]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = [null, "::tmethod"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = [null, "->tmethod"]; self::assertTrue(func::verifix_method($func, true, $bound)); - $func = [null, "->tmethod"]; self::assertTrue(func::verifix_method($func, false, $bound)); - - $func = [null, "::tmissing"]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = [null, "::tmissing"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = [null, "->tmissing"]; self::assertTrue(func::verifix_method($func, true, $bound)); - $func = [null, "->tmissing"]; self::assertTrue(func::verifix_method($func, false, $bound)); - - $func = [false, "tsimple"]; self::assertFalse(func::verifix_method($func, False, $bound)); - $func = [false, "tsimple"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = [false, 'nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_method($func, False, $bound)); - $func = [false, 'nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = [false, "tmissing"]; self::assertFalse(func::verifix_method($func, False, $bound)); - $func = [false, "tmissing"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = [false, "::tmethod"]; self::assertFalse(func::verifix_method($func, False, $bound)); - $func = [false, "::tmethod"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = [false, "->tmethod"]; self::assertFalse(func::verifix_method($func, False, $bound)); - $func = [false, "->tmethod"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = [false, "::tmissing"]; self::assertFalse(func::verifix_method($func, False, $bound)); - $func = [false, "::tmissing"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = [false, "->tmissing"]; self::assertFalse(func::verifix_method($func, False, $bound)); - $func = [false, "->tmissing"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = ["", "tsimple"]; self::assertTrue(func::verifix_method($func, true, $bound)); - $func = ["", "tsimple"]; self::assertTrue(func::verifix_method($func, false, $bound)); - - $func = ["", 'nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = ["", 'nur\sery\wip\php\impl\ntsimple']; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = ["", "tmissing"]; self::assertTrue(func::verifix_method($func, true, $bound)); - $func = ["", "tmissing"]; self::assertTrue(func::verifix_method($func, false, $bound)); - - $func = ["", "::tmethod"]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = ["", "::tmethod"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = ["", "->tmethod"]; self::assertTrue(func::verifix_method($func, true, $bound)); - $func = ["", "->tmethod"]; self::assertTrue(func::verifix_method($func, false, $bound)); - - $func = ["", "::tmissing"]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = ["", "::tmissing"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = ["", "->tmissing"]; self::assertTrue(func::verifix_method($func, true, $bound)); - $func = ["", "->tmissing"]; self::assertTrue(func::verifix_method($func, false, $bound)); - - $func = [MyClass::class, "tmethod"]; self::assertTrue(func::verifix_method($func, true, $bound)); - $func = [MyClass::class, "tmethod"]; self::assertTrue(func::verifix_method($func, false, $bound)); - - $func = [MyClass::class, "::tmethod"]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = [MyClass::class, "::tmethod"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = [MyClass::class, "tmethod"]; self::assertTrue(func::verifix_method($func, true, $bound)); - $func = [MyClass::class, "tmethod"]; self::assertTrue(func::verifix_method($func, false, $bound)); - - $func = [MyClass::class, "->tmethod"]; self::assertTrue(func::verifix_method($func, true, $bound)); - $func = [MyClass::class, "->tmethod"]; self::assertTrue(func::verifix_method($func, false, $bound)); - - $func = [MyClass::class, "tmissing"]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = [MyClass::class, "tmissing"]; self::assertTrue(func::verifix_method($func, false, $bound)); - - $func = [MyClass::class, "::tmissing"]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = [MyClass::class, "::tmissing"]; self::assertFalse(func::verifix_method($func, false, $bound)); - - $func = [MyClass::class, "->tmissing"]; self::assertFalse(func::verifix_method($func, true, $bound)); - $func = [MyClass::class, "->tmissing"]; self::assertTrue(func::verifix_method($func, false, $bound)); + $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 testMethodResults() {} } } diff --git a/wip/php/func.php b/wip/php/func.php index 004e305..ce97d18 100644 --- a/wip/php/func.php +++ b/wip/php/func.php @@ -2,7 +2,13 @@ namespace nur\sery\wip\php; use Closure; +use nur\config\Ref; use nur\sery\cv; +use nur\sery\StateException; +use nur\sery\ValueException; +use ReflectionClass; +use ReflectionFunction; +use ReflectionMethod; /** * Class func: outils pour appeler fonctions et méthodes dynamiquement @@ -53,42 +59,50 @@ class func { return true; } - private static function is_invalid(?string $m): bool { + /** + * vérifier que $func est une fonction simple avec les règles de + * {@link self::verifix_simple()} + */ + static function is_simple($func, bool $strict=true): bool { + return self::verifix_simple($func, $strict); + } + + private static function _is_invalid(?string $m): bool { return $m === null || $m === "" || $m === "::" || $m === "->"; } - private static function is_nfunction(?string $m): bool { + private static function _is_nfunction(?string $m): bool { return strpos($m, "\\") !== false; } - private static function parse_static(?string &$m): bool { + private static function _parse_static(?string &$m): bool { $pos = strpos($m, "::"); if ($pos === false) return false; $m = substr($m, $pos + 2); return true; } - private static function parse_method(?string &$m): bool { + private static function _parse_method(?string &$m): bool { $pos = strpos($m, "->"); if ($pos === false) return false; $m = substr($m, $pos + 2); return true; } - private static function parse_class_s(?string $cs, ?string &$c, ?string &$s): bool { - if (self::is_invalid($cs) || self::parse_method($cs)) return false; + private static function _parse_class_s(?string $cs, ?string &$c, ?string &$s): bool { + if (self::_is_invalid($cs) || self::_parse_method($cs)) return false; $pos = strpos($cs, "::"); if ($pos === false) return false; if ($pos === 0) return false; $tmpc = substr($cs, 0, $pos); $cs = substr($cs, $pos + 2); - if (self::is_nfunction($cs)) return false; + if (self::_is_nfunction($cs)) return false; [$c, $s] = [$tmpc, cv::vn($cs)]; return true; } - private static function parse_c_static(?string $cs, ?string &$c, ?string &$s, ?bool &$bound): bool { - if (self::is_invalid($cs) || self::parse_method($cs)) return false; + private static function _parse_c_static(?string $cs, ?string &$c, ?string &$s, ?bool &$bound): bool { + if (self::_is_invalid($cs) || self::_parse_method($cs)) return false; $pos = strpos($cs, "::"); if ($pos === false) return false; if ($pos == strlen($cs) - 2) return false; @@ -100,7 +114,7 @@ class func { $bound = false; } $cs = substr($cs, $pos + 2); - if (self::is_nfunction($cs)) return false; + if (self::_is_nfunction($cs)) return false; [$c, $s] = [$tmpc, cv::vn($cs)]; return true; } @@ -124,25 +138,25 @@ class func { */ static function verifix_static(&$func, bool $strict=true, ?bool &$bound=null): bool { if (is_string($func)) { - if (!self::parse_c_static($func, $c, $f, $bound)) return false; + if (!self::_parse_c_static($func, $c, $f, $bound)) return false; $func = [$c, $f]; } elseif (is_array($func)) { if (!array_key_exists(0, $func)) return false; $c = $func[0]; if ($c === false) return false; - if (self::parse_class_s($c, $c, $f)) { + if (self::_parse_class_s($c, $c, $f)) { $func[0] = $c; if ($f !== null) { # ["class::method"] --> ["class", "method"] array_splice($func, 1, 0, [$f]); } $bound = true; - } elseif (self::parse_c_static($c, $c, $f, $bound)) { + } elseif (self::_parse_c_static($c, $c, $f, $bound)) { # ["::method"] --> [null, "method"] array_splice($func, 0, 0, [null]); $func[1] = $f; } else { - if (self::is_invalid($c)) $c = null; + if (self::_is_invalid($c)) $c = null; $func[0] = $c; $bound = is_string($c); } @@ -150,18 +164,18 @@ class func { if (!array_key_exists(1, $func)) return false; $f = $func[1]; if (!is_string($f)) return false; - if (self::parse_c_static($f, $rc, $f, $rbound)) { + if (self::_parse_c_static($f, $rc, $f, $rbound)) { if ($rc !== null && $c === null) { $c = $rc; $bound = $rbound; } - } elseif (self::is_invalid($f)) { + } elseif (self::_is_invalid($f)) { return false; - } elseif (self::is_nfunction($f)) { + } elseif (self::_is_nfunction($f)) { return false; - } elseif (self::parse_method($f)) { + } elseif (self::_parse_method($f)) { return false; - } elseif (self::parse_static($f)) { + } elseif (self::_parse_static($f)) { } $func[1] = $f; } else { @@ -171,20 +185,28 @@ class func { return true; } - private static function parse_class_m(?string $cm, ?string &$c, ?string &$m): bool { - if (self::is_invalid($cm) || self::parse_static($cm)) return false; + /** + * vérifier que $func est une méthode statique avec les règles de + * {@link self::verifix_static()} + */ + static function is_static($func, bool $strict=true, ?bool &$bound=null): bool { + return self::verifix_static($func, $strict, $bound); + } + + private static function _parse_class_m(?string $cm, ?string &$c, ?string &$m): bool { + if (self::_is_invalid($cm) || self::_parse_static($cm)) return false; $pos = strpos($cm, "->"); if ($pos === false) return false; if ($pos === 0) return false; $tmpc = substr($cm, 0, $pos); $cm = substr($cm, $pos + 2); - if (self::is_nfunction($cm)) return false; + if (self::_is_nfunction($cm)) return false; [$c, $m] = [$tmpc, cv::vn($cm)]; return true; } - private static function parse_c_method(?string $cm, ?string &$c, ?string &$m, ?bool &$bound): bool { - if (self::is_invalid($cm) || self::parse_static($cm)) return false; + private static function _parse_c_method(?string $cm, ?string &$c, ?string &$m, ?bool &$bound): bool { + if (self::_is_invalid($cm) || self::_parse_static($cm)) return false; $pos = strpos($cm, "->"); if ($pos === false) return false; if ($pos == strlen($cm) - 2) return false; @@ -196,7 +218,7 @@ class func { $bound = false; } $cm = substr($cm, $pos + 2); - if (self::is_nfunction($cm)) return false; + if (self::_is_nfunction($cm)) return false; [$c, $m] = [$tmpc, cv::vn($cm)]; return true; } @@ -220,25 +242,25 @@ class func { */ static function verifix_method(&$func, bool $strict=true, ?bool &$bound=null): bool { if (is_string($func)) { - if (!self::parse_c_method($func, $c, $f, $bound)) return false; + if (!self::_parse_c_method($func, $c, $f, $bound)) return false; $func = [$c, $f]; } elseif (is_array($func)) { if (!array_key_exists(0, $func)) return false; $c = $func[0]; if ($c === false) return false; - if (self::parse_class_m($c, $c, $f)) { + if (self::_parse_class_m($c, $c, $f)) { $func[0] = $c; if ($f !== null) { # ["class->method"] --> ["class", "method"] array_splice($func, 1, 0, [$f]); } $bound = true; - } elseif (self::parse_c_method($c, $c, $f, $bound)) { + } elseif (self::_parse_c_method($c, $c, $f, $bound)) { # ["->method"] --> [null, "method"] array_splice($func, 0, 0, [null]); $func[1] = $f; } else { - if (self::is_invalid($c)) $c = null; + if (self::_is_invalid($c)) $c = null; $func[0] = $c; $bound = is_string($c); } @@ -246,18 +268,18 @@ class func { if (!array_key_exists(1, $func)) return false; $f = $func[1]; if (!is_string($f)) return false; - if (self::parse_c_method($f, $rc, $f, $rbound)) { + if (self::_parse_c_method($f, $rc, $f, $rbound)) { if ($rc !== null && $c === null) { $c = $rc; $bound = $rbound; } - } elseif (self::is_invalid($f)) { + } elseif (self::_is_invalid($f)) { return false; - } elseif (self::is_nfunction($f)) { + } elseif (self::_is_nfunction($f)) { return false; - } elseif (self::parse_static($f)) { + } elseif (self::_parse_static($f)) { return false; - } elseif (self::parse_method($f)) { + } elseif (self::_parse_method($f)) { } $func[1] = $f; } else { @@ -266,16 +288,200 @@ class func { if ($strict && $bound && !method_exists($c, $f)) return false; return true; } + + /** + * vérifier que $func est une méthode non statique avec les règles de + * {@link self::verifix_method()} + */ + static function is_method($func, bool $strict=true, ?bool &$bound=null): bool { + return self::verifix_method($func, $strict, $bound); + } - static function verifix_cons(&$func): bool { + static function verifix_cons(&$func, bool $strict=true): bool { if (is_string($func)) { - return true; } elseif (is_array($func)) { - return true; } else { return false; } + return false;#XXX + } + + static function with($func, bool $strict=true): self { + if ($func instanceof Closure) { + return new self($func); + } elseif (self::verifix_simple($func, $strict)) { + return new self($func); + } elseif (self::verifix_cons($func, $strict)) { + return new self($func); + } else { + if (self::verifix_static($func, $strict, $bound)) { + } elseif (self::verifix_method($func, $strict, $bound)) { + } else { + throw ValueException::invalid_type($func, "callable"); + } + if (!$bound) throw ValueException::invalid_value($func, null, "is not bound"); + return new self($func); + } + } + + static function call($func, ...$args) { + return self::with($func)->invoke($args); + } + + static function with_object($func, object $object, bool $rebind=false, bool $strict=true): self { + if ($func instanceof Closure) { + return new self($func); + } elseif (self::verifix_simple($func, $strict)) { + return new self($func); + } elseif (self::verifix_cons($func, $strict)) { + return new self($func); + } else { + if (self::verifix_method($func, $strict, $bound)) { + } elseif (self::verifix_static($func, $strict, $bound)) { + } else { + throw ValueException::invalid_type($func, "callable"); + } + if (!$bound || $rebind) $func[0] = $object; + return new self($func); + } + } + + static function with_class($func, $class, bool $rebind=false, bool $strict=true): self { + if ($func instanceof Closure) { + return new self($func); + } elseif (self::verifix_simple($func, $strict)) { + return new self($func); + } elseif (self::verifix_cons($func, $strict)) { + return new self($func); + } else { + if (self::verifix_method($func, $strict, $bound)) { + } elseif (self::verifix_static($func, $strict, $bound)) { + } else { + throw ValueException::invalid_type($func, "callable"); + } + if (!$bound || $rebind) { + if (is_object($class)) $class = get_class($class); + $func[0] = $class; + } + return new self($func); + } + } + + ############################################################################# + + const TYPE_CLOSURE = 0, TYPE_SIMPLE = 1, TYPE_STATIC = 2, TYPE_METHOD = 3, TYPE_CLASS = 4; + + function __construct($func) { + $object = null; + $prefixArgs = []; + if ($func instanceof Closure) { + $type = self::TYPE_CLOSURE; + $reflection = new ReflectionFunction($func); + $object = $func; + } elseif ($func instanceof ReflectionFunction) { + $type = self::TYPE_SIMPLE; + $reflection = $func; + } elseif ($func instanceof ReflectionMethod) { + $type = self::TYPE_STATIC; + $reflection = $func; + } elseif ($func instanceof ReflectionClass) { + $type = self::TYPE_CLASS; + $reflection = $func; + } elseif (is_array($func)) { + if (count($func) > 2) { + $prefixArgs = array_slice($func, 2); + $func = array_slice($func, 0, 2); + } + [$c, $f] = $func; + if ($c === false) { + # fonction simple + $type = self::TYPE_SIMPLE; + $reflection = new ReflectionFunction($f); + } elseif ($f === false) { + # classe + $type = self::TYPE_CLASS; + $reflection = new ReflectionClass($c); + } elseif ($c !== null) { + # methode + $reflection = new ReflectionMethod($func); + if (is_object($c)) { + $type = self::TYPE_METHOD; + $object = $c; + } else { + $type = self::TYPE_STATIC; + } + } else { + throw new StateException("invalid func"); + } + } else { + throw new StateException("invalid func"); + } + if ($reflection instanceof ReflectionClass) { + $constructor = $reflection->getConstructor(); + if ($constructor === null) { + $variadic = false; + $minArgs = $maxArgs = 0; + } else { + $variadic = $constructor->isVariadic(); + $minArgs = $constructor->getNumberOfRequiredParameters(); + $maxArgs = $constructor->getNumberOfParameters(); + } + } else { + $variadic = $reflection->isVariadic(); + $minArgs = $reflection->getNumberOfRequiredParameters(); + $maxArgs = $reflection->getNumberOfParameters(); + } + + $this->type = $type; + $this->reflection = $reflection; + $this->variadic = $variadic; + $this->minArgs = $minArgs; + $this->maxArgs = $maxArgs; + $this->object = $object; + $this->prefixArgs = $prefixArgs; + } + + protected int $type; + + /** @var ReflectionFunction|ReflectionMethod|ReflectionClass */ + protected $reflection; + + protected bool $variadic; + + protected int $minArgs; + + protected int $maxArgs; + + protected ?object $object; + + protected array $prefixArgs; + + function invoke(?array $args=null) { + $args = array_merge($this->prefixArgs, $args ?? []); + if (!$this->variadic) $args = array_slice($args, 0, $this->maxArgs); + $minArgs = $this->minArgs; + while (count($args) < $minArgs) $args[] = null; + + switch ($this->type) { + case self::TYPE_CLOSURE: + /** @var Closure $closure */ + $closure = $this->object; + return $closure(...$args); + case self::TYPE_SIMPLE: + case self::TYPE_STATIC: + /** @var ReflectionFunction $function */ + $function = $this->reflection; + return $function->invoke(...$args); + case self::TYPE_METHOD: + /** @var ReflectionMethod $method */ + $method = $this->reflection; + return $method->invoke($this->object, ...$args); + case self::TYPE_CLASS: + /** @var ReflectionClass $class */ + $class = $this->reflection; + return $class->newInstance(...$args); + } } }