*/ 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($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 { $tagString = << This is with multiline description. TAG; $tag = m::mock(Tag::class); $tagFactory = m::mock(TagFactory::class); $tagFactory->shouldReceive('create')->with($tagString, 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); } /** * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory * @uses \phpDocumentor\Reflection\DocBlock\Description * * @covers ::__construct * @covers ::create */ public function testTagsAreFilteredForNullValues() : void { $tagString = << This is with multiline description. TAG; $tagFactory = m::mock(TagFactory::class); $tagFactory->shouldReceive('create')->with($tagString, m::any())->andReturn(null); $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory); $given = << This is with * multiline description. */ DOCBLOCK; $docblock = $fixture->create($given, new Context('')); $this->assertEquals([], $docblock->getTags()); } }