* @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection; use Mockery as m; use phpDocumentor\Reflection\DocBlock\Description; use phpDocumentor\Reflection\DocBlock\DescriptionFactory; use phpDocumentor\Reflection\DocBlock\Tag; use phpDocumentor\Reflection\DocBlock\TagFactory; use phpDocumentor\Reflection\DocBlock\Tags\Param; use phpDocumentor\Reflection\Types\Context; /** * @coversDefaultClass phpDocumentor\Reflection\DocBlockFactory * @covers :: * @uses \Webmozart\Assert\Assert * @uses phpDocumentor\Reflection\DocBlock */ class DocBlockFactoryTest extends \PHPUnit_Framework_TestCase { /** * @covers ::__construct * @covers ::createInstance * @uses \phpDocumentor\Reflection\DocBlock\StandardTagFactory * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory */ public function testCreateFactoryUsingFactoryMethod() { $fixture = DocBlockFactory::createInstance(); $this->assertInstanceOf(DocBlockFactory::class, $fixture); } /** * @covers ::__construct * @covers ::create * @uses phpDocumentor\Reflection\DocBlock\Description */ public function testCreateDocBlockFromReflection() { $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()); } /** * @covers ::__construct * @covers ::create * @uses phpDocumentor\Reflection\DocBlock\Description */ public function testCreateDocBlockFromStringWithDocComment() { $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()); } /** * @covers ::create * @covers ::__construct * @uses phpDocumentor\Reflection\DocBlock\Description */ public function testCreateDocBlockFromStringWithoutDocComment() { $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()); } /** * @covers ::__construct * @covers ::create * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory * @uses phpDocumentor\Reflection\DocBlock\Description * @dataProvider provideSummaryAndDescriptions */ public function testSummaryAndDescriptionAreSeparated($given, $summary, $description) { $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()); } /** * @covers ::__construct * @covers ::create * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory * @uses phpDocumentor\Reflection\DocBlock\Description */ public function testDescriptionsRetainFormatting() { $tagFactory = m::mock(TagFactory::class); $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory); $given = <<create($given); $this->assertEquals(new Description($description), $docblock->getDescription()); } /** * @covers ::__construct * @covers ::create * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory * @uses phpDocumentor\Reflection\DocBlock\Description */ public function testTagsAreInterpretedUsingFactory() { $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()); } public function provideSummaryAndDescriptions() { 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); } /** * @covers ::__construct * @covers ::create * * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory * @uses phpDocumentor\Reflection\DocBlock\Description */ public function testTagsAreFilteredForNullValues() { $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()); } }