From 884f07baa6ea169b0e5959a2f208aa782bd1ee00 Mon Sep 17 00:00:00 2001 From: sunxyw <31698606+sunxyw@users.noreply.github.com> Date: Thu, 5 May 2022 22:32:33 +0800 Subject: [PATCH] add reflection util tests (#116) --- src/ZM/Utils/ReflectionUtil.php | 2 +- tests/ZM/Utils/ReflectionUtilTest.php | 104 ++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 tests/ZM/Utils/ReflectionUtilTest.php diff --git a/src/ZM/Utils/ReflectionUtil.php b/src/ZM/Utils/ReflectionUtil.php index d25387d6..34a288a7 100644 --- a/src/ZM/Utils/ReflectionUtil.php +++ b/src/ZM/Utils/ReflectionUtil.php @@ -69,7 +69,7 @@ class ReflectionUtil case is_object($var): return get_class($var); case is_resource($var): - return 'resource' . get_resource_type($var); + return 'resource(' . get_resource_type($var) . ')'; case is_null($var): return 'null'; case is_bool($var): diff --git a/tests/ZM/Utils/ReflectionUtilTest.php b/tests/ZM/Utils/ReflectionUtilTest.php new file mode 100644 index 00000000..c7651c86 --- /dev/null +++ b/tests/ZM/Utils/ReflectionUtilTest.php @@ -0,0 +1,104 @@ +assertFalse(ReflectionUtil::isNonStaticMethod([ReflectionUtilTestClass::class, 'staticMethod'])); + } + + public function testDetermineNonStaticMethod(): void + { + $this->assertTrue(ReflectionUtil::isNonStaticMethod([ReflectionUtilTestClass::class, 'method'])); + } + + public function testGetParameterClassName(): void + { + $class = new \ReflectionClass(ReflectionUtilTestClass::class); + $method = $class->getMethod('method'); + [$string_parameter, $object_parameter] = $method->getParameters(); + + $this->assertNull(ReflectionUtil::getParameterClassName($string_parameter)); + $this->assertSame(ReflectionUtilTestClass::class, ReflectionUtil::getParameterClassName($object_parameter)); + } + + /** + * @dataProvider provideTestVariableToString + * @param mixed $variable + */ + public function testVariableToString($variable, string $expected): void + { + $this->assertSame($expected, ReflectionUtil::variableToString($variable)); + } + + public function provideTestVariableToString(): array + { + return [ + 'callable' => [[new ReflectionUtilTestClass(), 'method'], ReflectionUtilTestClass::class . '@method'], + 'static callable' => [[ReflectionUtilTestClass::class, 'staticMethod'], ReflectionUtilTestClass::class . '::staticMethod'], + 'closure' => [Closure::fromCallable([$this, 'testVariableToString']), 'closure'], + 'string' => ['string', 'string'], + 'array' => [['123', '42', 'hello', 122], 'array["123","42","hello",122]'], + 'object' => [new \stdClass(), 'stdClass'], + 'resource' => [fopen('php://memory', 'rb'), 'resource(stream)'], + 'null' => [null, 'null'], + 'boolean 1' => [true, 'true'], + 'boolean 2' => [false, 'false'], + 'float' => [123.456, '123.456'], + 'integer' => [123, '123'], + ]; + } + + /** + * @dataProvider provideTestGetCallReflector + * @param mixed $callback + */ + public function testGetCallReflector($callback, ReflectionFunctionAbstract $expected): void + { + $this->assertEquals($expected, ReflectionUtil::getCallReflector($callback)); + } + + public function provideTestGetCallReflector(): array + { + $closure = function () { + }; + + return [ + 'callable' => [[new ReflectionUtilTestClass(), 'method'], new \ReflectionMethod(ReflectionUtilTestClass::class, 'method')], + 'static callable' => [[ReflectionUtilTestClass::class, 'staticMethod'], new \ReflectionMethod(ReflectionUtilTestClass::class, 'staticMethod')], + 'class::method' => [ReflectionUtilTestClass::class . '::staticMethod', new \ReflectionMethod(ReflectionUtilTestClass::class, 'staticMethod')], + 'invokable class' => [new InvokableClass(), new \ReflectionMethod(InvokableClass::class, '__invoke')], + 'closure' => [$closure, new \ReflectionFunction($closure)], + ]; + } +} + +class ReflectionUtilTestClass +{ + public function method(string $string, ReflectionUtilTestClass $class): void + { + } + + public static function staticMethod(string $string, ReflectionUtilTestClass $class): void + { + } +} + +class InvokableClass +{ + public function __invoke(): void + { + } +}