*/ class DocBlockFactoryTest extends TestCase { /** * Call Mockery::close after each test. */ public function tearDown(): void { m::close(); } /** * @uses \phpDocumentor\Reflection\DocBlock\StandardTagFactory * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory * * @covers ::__construct * @covers ::createInstance */ public function testCreateFactoryUsingFactoryMethod(): void { $fixture = DocBlockFactory::createInstance(); $this->assertInstanceOf(DocBlockFactory::class, $fixture); } /** * @uses \phpDocumentor\Reflection\DocBlock\Description * * @covers ::__construct * @covers ::create */ public function testCreateDocBlockFromReflection(): void { $fixture = new DocBlockFactory(m::mock(DescriptionFactory::class), m::mock(TagFactory::class)); $docBlock = '/** This is a DocBlock */'; $classReflector = m::mock(ReflectionClass::class); $classReflector->shouldReceive('getDocComment')->andReturn($docBlock); $docblock = $fixture->create($classReflector); $this->assertInstanceOf(DocBlock::class, $docblock); $this->assertSame('This is a DocBlock', $docblock->getSummary()); $this->assertEquals(new Description(''), $docblock->getDescription()); $this->assertSame([], $docblock->getTags()); $this->assertEquals(new Context(''), $docblock->getContext()); $this->assertNull($docblock->getLocation()); } /** * @uses \phpDocumentor\Reflection\DocBlock\Description * * @covers ::__construct * @covers ::create */ public function testCreateDocBlockFromStringWithDocComment(): void { $fixture = new DocBlockFactory(m::mock(DescriptionFactory::class), m::mock(TagFactory::class)); $docblock = $fixture->create('/** This is a DocBlock */'); $this->assertInstanceOf(DocBlock::class, $docblock); $this->assertSame('This is a DocBlock', $docblock->getSummary()); $this->assertEquals(new Description(''), $docblock->getDescription()); $this->assertSame([], $docblock->getTags()); $this->assertEquals(new Context(''), $docblock->getContext()); $this->assertNull($docblock->getLocation()); } /** * @uses \phpDocumentor\Reflection\DocBlock\Description * * @covers ::create * @covers ::__construct */ public function testCreateDocBlockFromStringWithoutDocComment(): void { $fixture = new DocBlockFactory(m::mock(DescriptionFactory::class), m::mock(TagFactory::class)); $docblock = $fixture->create('This is a DocBlock'); $this->assertInstanceOf(DocBlock::class, $docblock); $this->assertSame('This is a DocBlock', $docblock->getSummary()); $this->assertEquals(new Description(''), $docblock->getDescription()); $this->assertSame([], $docblock->getTags()); $this->assertEquals(new Context(''), $docblock->getContext()); $this->assertNull($docblock->getLocation()); } /** * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory * @uses \phpDocumentor\Reflection\DocBlock\Description * * @covers ::__construct * @covers ::create * * @dataProvider provideSummaryAndDescriptions */ public function testSummaryAndDescriptionAreSeparated(string $given, string $summary, string $description): void { $tagFactory = m::mock(TagFactory::class); $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory); $docblock = $fixture->create($given); $this->assertSame($summary, $docblock->getSummary()); $this->assertEquals(new Description(str_replace(PHP_EOL, "\n", $description)), $docblock->getDescription()); } /** * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory * @uses \phpDocumentor\Reflection\DocBlock\Description * * @covers ::__construct * @covers ::create */ public function testDescriptionsRetainFormatting(): void { $tagFactory = m::mock(TagFactory::class); $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory); $given = <<create($given); $this->assertEquals(new Description($description), $docblock->getDescription()); } /** * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory * @uses \phpDocumentor\Reflection\DocBlock\Description * * @covers ::__construct * @covers ::create */ public function testTagsAreInterpretedUsingFactory(): void { $tag = m::mock(Tag::class); $tagFactory = m::mock(TagFactory::class); $tagFactory->shouldReceive('create')->with(m::any(), m::type(Context::class))->andReturn($tag); $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory); $given = << This is with * multiline description. */ DOCBLOCK; $docblock = $fixture->create($given, new Context('')); $this->assertEquals([$tag], $docblock->getTags()); } /** * @return string[] */ public function provideSummaryAndDescriptions(): array { return [ ['This is a DocBlock', 'This is a DocBlock', ''], [ 'This is a DocBlock. This should still be summary.', 'This is a DocBlock. This should still be summary.', '', ], [ <<shouldReceive('create')->with(m::any(), $context)->andReturn(new Param('param')); $docblock = $fixture->create('/** @param MyType $param */', $context); $this->assertInstanceOf(DocBlock::class, $docblock); } }