Move type extraction to base class and re-use in Throws

This commit is contained in:
Mike van Riel
2019-12-27 20:59:58 +01:00
parent 0a9b8ea383
commit 506fd89d43
4 changed files with 165 additions and 68 deletions
+93 -3
View File
@@ -134,10 +134,10 @@ class ThrowsTest extends TestCase
public function testFactoryMethod() : void
{
$descriptionFactory = m::mock(DescriptionFactory::class);
$resolver = new TypeResolver();
$context = new Context('');
$resolver = new TypeResolver();
$context = new Context('');
$type = new String_();
$type = new String_();
$description = new Description('My Description');
$descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
@@ -148,6 +148,96 @@ class ThrowsTest extends TestCase
$this->assertSame($description, $fixture->getDescription());
}
/**
* This test checks whether a braces in a Type are allowed.
*
* The advent of generics poses a few issues, one of them is that spaces can now be part of a type. In the past we
* could purely rely on spaces to split the individual parts of the body of a tag; but when there is a type in play
* we now need to check for braces.
*
* This test tests whether an error occurs demonstrating that the braces were taken into account; this test is still
* expected to produce an exception because the TypeResolver does not support generics.
*
* @covers ::create
* @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws::<public>
* @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
* @uses \phpDocumentor\Reflection\TypeResolver
* @uses \phpDocumentor\Reflection\DocBlock\Description
* @uses \phpDocumentor\Reflection\Types\String_
* @uses \phpDocumentor\Reflection\Types\Context
*/
public function testFactoryMethodWithGenericWithSpace()
{
$this->expectException(\InvalidArgumentException::class);
$this->expectExceptionMessage('"\array<string, string>" is not a valid Fqsen.');
$descriptionFactory = m::mock(DescriptionFactory::class);
$resolver = new TypeResolver();
$context = new Context('');
$description = new Description('My Description');
$descriptionFactory->shouldReceive('create')
->with('My Description', $context)
->andReturn($description);
Throws::create('array<string, string> My Description', $resolver, $descriptionFactory, $context);
}
/**
* @see self::testFactoryMethodWithGenericWithSpace()
*
* @covers ::create
* @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws::<public>
* @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
* @uses \phpDocumentor\Reflection\TypeResolver
* @uses \phpDocumentor\Reflection\DocBlock\Description
* @uses \phpDocumentor\Reflection\Types\String_
* @uses \phpDocumentor\Reflection\Types\Context
*/
public function testFactoryMethodWithGenericWithSpaceAndAddedEmojisToVerifyMultiByteBehaviour()
{
$this->expectException(\InvalidArgumentException::class);
$this->expectExceptionMessage('"\array😁<string,😁 😁string>" is not a valid Fqsen.');
$descriptionFactory = m::mock(DescriptionFactory::class);
$resolver = new TypeResolver();
$context = new Context('');
$description = new Description('My Description');
$descriptionFactory->shouldReceive('create')
->with('My Description', $context)
->andReturn($description);
Throws::create('array😁<string,😁 😁string> My Description', $resolver, $descriptionFactory, $context);
}
/**
* @covers ::create
* @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws::<public>
* @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
* @uses \phpDocumentor\Reflection\TypeResolver
* @uses \phpDocumentor\Reflection\DocBlock\Description
* @uses \phpDocumentor\Reflection\Types\String_
* @uses \phpDocumentor\Reflection\Types\Context
*/
public function testFactoryMethodWithEmojisToVerifyMultiByteBehaviour()
{
$descriptionFactory = m::mock(DescriptionFactory::class);
$resolver = new TypeResolver();
$context = new Context('');
$description = new Description('My Description');
$descriptionFactory->shouldReceive('create')
->with('My Description', $context)
->andReturn($description);
$fixture = Throws::create('\My😁Class My Description', $resolver, $descriptionFactory, $context);
$this->assertSame('\My😁Class My Description', (string) $fixture);
$this->assertEquals('\My😁Class', $fixture->getType());
$this->assertSame($description, $fixture->getDescription());
}
/**
* @covers ::create
*/