<?php
/*
* This file is part of Chevere.
*
* (c) Rodolfo Berrios <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Chevere\Tests;
use Chevere\Parameter\Interfaces\MixedParameterInterface;
use Chevere\Parameter\Interfaces\NullParameterInterface;
use Chevere\Parameter\Interfaces\ObjectParameterInterface;
use Chevere\Parameter\Interfaces\StringParameterInterface;
use Chevere\Parameter\Interfaces\UnionParameterInterface;
use Chevere\Parameter\ReflectionParameterTyped;
use Chevere\Tests\src\Depends;
use LogicException;
use PHPUnit\Framework\TestCase;
use ReflectionMethod;
use ReflectionParameter;
use stdClass;
use TypeError;
final class ReflectionParameterTypedTest extends TestCase
{
public function testUseNoneGoesMixed(): void
{
$parameter = $this->getReflection('useNone');
$reflection = new ReflectionParameterTyped($parameter);
$reflected = $reflection->parameter();
$this->assertInstanceOf(MixedParameterInterface::class, $reflected);
$this->assertSame('default', $reflected->default());
}
// public function testUseNull(): void
// {
// $parameter = $this->getReflection('useNull');
// $reflection = new ReflectionParameterTyped($parameter);
// $reflected = $reflection->parameter();
// $this->assertInstanceOf(NullParameterInterface::class, $reflected);
// $this->assertSame(null, $reflected->default());
// }
public function testParameterObject(): void
{
$parameter = $this->getReflection('useObject');
$reflection = new ReflectionParameterTyped($parameter);
/** @var ObjectParameterInterface $reflected */
$reflected = $reflection->parameter();
$this->assertInstanceOf(ObjectParameterInterface::class, $reflected);
$this->assertSame(null, $reflected->default());
$this->assertSame(stdClass::class, $reflected->className());
}
public function testParameterDefault(): void
{
$parameter = $this->getReflection('useString');
$reflection = new ReflectionParameterTyped($parameter);
/** @var StringParameterInterface $reflected */
$reflected = $reflection->parameter();
$this->assertInstanceOf(StringParameterInterface::class, $reflected);
$this->assertSame('/^[a-z]+$/', $reflected->regex()->__toString());
$this->assertSame('default', $reflected->default());
$this->assertSame('A string', $reflected->description());
}
public function testUnion(): void
{
$parameter = $this->getReflection('useUnion');
$reflection = new ReflectionParameterTyped($parameter);
$reflected = $reflection->parameter();
$this->assertInstanceOf(UnionParameterInterface::class, $reflected);
}
public function testUnionAttributeError(): void
{
$parameter = $this->getReflection('useWrongUnionAttr');
$this->expectException(TypeError::class);
$this->expectExceptionMessage(
<<<PLAIN
Parameter \$union of type string|int is not compatible with Chevere\Parameter\UnionParameter attribute
PLAIN
);
new ReflectionParameterTyped($parameter);
}
public function testIntersection(): void
{
$parameter = $this->getReflection('useIntersection');
$this->expectException(LogicException::class);
$this->expectExceptionMessage('$intersection of type intersection is not supported');
new ReflectionParameterTyped($parameter);
}
public function testMixed(): void
{
$parameter = $this->getReflection('useMixed');
$reflection = new ReflectionParameterTyped($parameter);
$reflected = $reflection->parameter();
$this->assertInstanceOf(MixedParameterInterface::class, $reflected);
}
public function testInvalidAttribute(): void
{
$parameter = $this->getReflection('useInvalidAttribute');
$this->expectException(TypeError::class);
$this->expectExceptionMessage('Parameter $int of type int is not compatible with Chevere\Parameter\StringParameter attribute');
new ReflectionParameterTyped($parameter);
}
private function getReflection(string $method, int $pos = 0): ReflectionParameter
{
$reflection = new ReflectionMethod(Depends::class, $method);
return $reflection->getParameters()[$pos];
}
}
|