From 5749b814fb55ee908cf2201e0fc4e9aa574bd1a5 Mon Sep 17 00:00:00 2001 From: Mike van Riel Date: Sat, 13 Jun 2015 18:01:00 +0200 Subject: [PATCH] Add test for DocBlock class --- src/DocBlock.php | 105 ++++----- src/DocBlockFactory.php | 6 +- src/DocBlockFactoryInterface.php | 6 +- tests/unit/DocBlockTest.php | 368 +++++++++---------------------- 4 files changed, 160 insertions(+), 325 deletions(-) diff --git a/src/DocBlock.php b/src/DocBlock.php index 2b1dd49..f59cd76 100644 --- a/src/DocBlock.php +++ b/src/DocBlock.php @@ -13,8 +13,7 @@ namespace phpDocumentor\Reflection; use phpDocumentor\Reflection\DocBlock\Tag; -use phpDocumentor\Reflection\DocBlock\Context; -use phpDocumentor\Reflection\DocBlock\Location; +use phpDocumentor\Reflection\Types\Context; final class DocBlock { @@ -40,12 +39,6 @@ final class DocBlock private $isTemplateEnd = false; /** - * Parses the given docblock and populates the member fields. - * - * The constructor may also receive namespace information such as the - * current namespace and aliases. This information is used by some tags - * (e.g. return, param, etc.) to turn a relative Type into a FQCN. - * * @param string $summary * @param DocBlock\Description $description * @param DocBlock\Tag[] $tags @@ -77,6 +70,42 @@ final class DocBlock $this->isTemplateStart = $isTemplateStart; } + /** + * @return string + */ + public function getSummary() + { + return $this->summary; + } + + /** + * @return DocBlock\Description + */ + public function getDescription() + { + return $this->description; + } + + /** + * Returns the current context. + * + * @return Context + */ + public function getContext() + { + return $this->context; + } + + /** + * Returns the current location. + * + * @return Location + */ + public function getLocation() + { + return $this->location; + } + /** * Returns whether this DocBlock is the start of a Template section. * @@ -115,54 +144,6 @@ final class DocBlock return $this->isTemplateEnd; } - /** - * Returns the current context. - * - * @return Context - */ - public function getContext() - { - return $this->context; - } - - /** - * Returns the current location. - * - * @return Location - */ - public function getLocation() - { - return $this->location; - } - - /** - * @return string - */ - public function getSummary() - { - return $this->summary; - } - - /** - * @return DocBlock\Description - */ - public function getDescription() - { - return $this->description; - } - - /** - * Adds a tag to this DocBlock. - * - * @param Tag $tag The tag to add. - * - * @return void - */ - public function addTag(Tag $tag) - { - $this->tags[] = $tag; - } - /** * Returns the tags for this DocBlock. * @@ -215,4 +196,16 @@ final class DocBlock return false; } + + /** + * Adds a tag to this DocBlock. + * + * @param Tag $tag The tag to add. + * + * @return void + */ + private function addTag(Tag $tag) + { + $this->tags[] = $tag; + } } diff --git a/src/DocBlockFactory.php b/src/DocBlockFactory.php index 11b331a..e5d5cb7 100644 --- a/src/DocBlockFactory.php +++ b/src/DocBlockFactory.php @@ -63,12 +63,12 @@ final class DocBlockFactory implements DocBlockFactoryInterface /** * @param $docblock - * @param DocBlock\Context $context - * @param DocBlock\Location $location + * @param Types\Context $context + * @param Location $location * * @return DocBlock */ - public function create($docblock, DocBlock\Context $context = null, DocBlock\Location $location = null) + public function create($docblock, Types\Context $context = null, Location $location = null) { if (is_object($docblock)) { if (!method_exists($docblock, 'getDocComment')) { diff --git a/src/DocBlockFactoryInterface.php b/src/DocBlockFactoryInterface.php index 47c2b83..b353342 100644 --- a/src/DocBlockFactoryInterface.php +++ b/src/DocBlockFactoryInterface.php @@ -14,10 +14,10 @@ interface DocBlockFactoryInterface /** * @param string $docblock - * @param DocBlock\Context $context - * @param DocBlock\Location $location + * @param Types\Context $context + * @param Location $location * * @return DocBlock */ - public function create($docblock, DocBlock\Context $context = null, DocBlock\Location $location = null); + public function create($docblock, Types\Context $context = null, Location $location = null); } diff --git a/tests/unit/DocBlockTest.php b/tests/unit/DocBlockTest.php index 92a8d8e..ffd7ea5 100644 --- a/tests/unit/DocBlockTest.php +++ b/tests/unit/DocBlockTest.php @@ -1,337 +1,179 @@ - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @copyright 2010-2015 Mike van Riel * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection; -use phpDocumentor\Reflection\DocBlock\Context; -use phpDocumentor\Reflection\DocBlock\Location; -use phpDocumentor\Reflection\DocBlock\Tag\Return_; +use Mockery as m; +use phpDocumentor\Reflection\Types\Context; /** - * Test class for phpDocumentor\Reflection\DocBlock - * - * @author Mike van Riel - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org + * @coversDefaultClass phpDocumentor\Reflection\DocBlock + * @covers :: */ class DocBlockTest extends \PHPUnit_Framework_TestCase { /** - * @covers \phpDocumentor\Reflection\DocBlock + * @covers ::__construct + * @covers ::getSummary * - * @return void + * @uses \phpDocumentor\Reflection\DocBlock\Description */ - public function testConstruct() + public function testDocBlockCanHaveASummary() { - $fixture = << '\phpDocumentor')), - new Location(2) - ); - $this->assertEquals( - 'This is a short description', - $object->getShortDescription() - ); - $this->assertEquals( - 'This is a long description', - $object->getLongDescription()->getContents() - ); - $this->assertCount(2, $object->getTags()); - $this->assertTrue($object->hasTag('see')); - $this->assertTrue($object->hasTag('return')); - $this->assertFalse($object->hasTag('category')); + $summary = 'This is a summary'; - $this->assertSame('MyNamespace', $object->getContext()->getNamespace()); - $this->assertSame( - array('PHPDoc' => '\phpDocumentor'), - $object->getContext()->getNamespaceAliases() - ); - $this->assertSame(2, $object->getLocation()->getLineNumber()); + $fixture = new DocBlock($summary); + + $this->assertSame($summary, $fixture->getSummary()); } /** - * @covers \phpDocumentor\Reflection\DocBlock::splitDocBlock + * @covers ::__construct + * @covers ::getDescription * - * @return void + * @uses \phpDocumentor\Reflection\DocBlock\Description */ - public function testConstructWithTagsOnly() + public function testDocBlockCanHaveADescription() { - $fixture = <<assertEquals('', $object->getShortDescription()); - $this->assertEquals('', $object->getLongDescription()->getContents()); - $this->assertCount(2, $object->getTags()); - $this->assertTrue($object->hasTag('see')); - $this->assertTrue($object->hasTag('return')); - $this->assertFalse($object->hasTag('category')); + $description = new DocBlock\Description(''); + + $fixture = new DocBlock('', $description); + + $this->assertSame($description, $fixture->getDescription()); } /** - * @covers \phpDocumentor\Reflection\DocBlock::isTemplateStart - */ - public function testIfStartOfTemplateIsDiscovered() - { - $fixture = <<assertEquals('', $object->getShortDescription()); - $this->assertEquals('', $object->getLongDescription()->getContents()); - $this->assertCount(2, $object->getTags()); - $this->assertTrue($object->hasTag('see')); - $this->assertTrue($object->hasTag('return')); - $this->assertFalse($object->hasTag('category')); - $this->assertTrue($object->isTemplateStart()); - } - - /** - * @covers \phpDocumentor\Reflection\DocBlock::isTemplateEnd - */ - public function testIfEndOfTemplateIsDiscovered() - { - $fixture = <<assertEquals('', $object->getShortDescription()); - $this->assertEquals('', $object->getLongDescription()->getContents()); - $this->assertTrue($object->isTemplateEnd()); - } - - /** - * @covers \phpDocumentor\Reflection\DocBlock::cleanInput + * @covers ::__construct + * @covers ::getTags * - * @return void + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\DocBlock\Tag */ - public function testConstructOneLiner() + public function testDocBlockCanHaveTags() { - $fixture = '/** Short description and nothing more. */'; - $object = new DocBlock($fixture); - $this->assertEquals( - 'Short description and nothing more.', - $object->getShortDescription() - ); - $this->assertEquals('', $object->getLongDescription()->getContents()); - $this->assertCount(0, $object->getTags()); + $tags = [ + m::mock(DocBlock\Tag::class) + ]; + + $fixture = new DocBlock('', null, $tags); + + $this->assertSame($tags, $fixture->getTags()); } /** - * @covers \phpDocumentor\Reflection\DocBlock::__construct + * @covers ::__construct + * @covers ::getTagsByName * - * @return void + * @uses \phpDocumentor\Reflection\DocBlock::getTags + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\DocBlock\Tag */ - public function testConstructFromReflector() + public function testFindTagsInDocBlockByName() { - $object = new DocBlock(new \ReflectionClass($this)); - $this->assertEquals( - 'Test class for phpDocumentor\Reflection\DocBlock', - $object->getShortDescription() - ); - $this->assertEquals('', $object->getLongDescription()->getContents()); - $this->assertCount(4, $object->getTags()); - $this->assertTrue($object->hasTag('author')); - $this->assertTrue($object->hasTag('copyright')); - $this->assertTrue($object->hasTag('license')); - $this->assertTrue($object->hasTag('link')); - $this->assertFalse($object->hasTag('category')); + $tag1 = m::mock(DocBlock\Tag::class); + $tag2 = m::mock(DocBlock\Tag::class); + $tag3 = m::mock(DocBlock\Tag::class); + $tags = [$tag1, $tag2, $tag3]; + + $tag1->shouldReceive('getName')->andReturn('abc'); + $tag2->shouldReceive('getName')->andReturn('abcd'); + $tag3->shouldReceive('getName')->never(); + + $fixture = new DocBlock('', null, $tags); + + $this->assertSame([$tag2], $fixture->getTagsByName('abcd')); + $this->assertSame([], $fixture->getTagsByName('Ebcd')); } /** - * @expectedException \InvalidArgumentException + * @covers ::__construct + * @covers ::hasTag * - * @return void + * @uses \phpDocumentor\Reflection\DocBlock::getTags + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\DocBlock\Tag */ - public function testExceptionOnInvalidObject() + public function testCheckIfThereAreTagsWithAGivenName() { - new DocBlock($this); - } + $tag1 = m::mock(DocBlock\Tag::class); + $tag2 = m::mock(DocBlock\Tag::class); + $tag3 = m::mock(DocBlock\Tag::class); + $tags = [$tag1, $tag2, $tag3]; - public function testDotSeperation() - { - $fixture = <<assertEquals( - 'This is a short description.', - $object->getShortDescription() - ); - $this->assertEquals( - "This is a long description.\nThis is a continuation of the long " - ."description.", - $object->getLongDescription()->getContents() - ); + $tag1->shouldReceive('getName')->andReturn('abc'); + $tag2->shouldReceive('getName')->andReturn('abcd'); + $tag3->shouldReceive('getName')->never(); + + $fixture = new DocBlock('', null, $tags); + + $this->assertTrue($fixture->hasTag('abcd')); + $this->assertFalse($fixture->hasTag('Ebcd')); } /** - * @covers \phpDocumentor\Reflection\DocBlock::parseTags - * @expectedException \LogicException + * @covers ::__construct + * @covers ::getContext * - * @return void + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\Context */ - public function testInvalidTagBlock() + public function testDocBlockKnowsInWhichNamespaceItIsAndWhichAliasesThereAre() { - if (0 == ini_get('allow_url_include')) { - $this->markTestSkipped('"data" URIs for includes are required.'); - } + $context = new Context(''); - include 'data:text/plain;base64,'. base64_encode( - <<assertEquals( - 'This is a short description.', - $object->getShortDescription() - ); - $this->assertEquals( - 'This is a long description.', - $object->getLongDescription()->getContents() - ); - $tags = $object->getTags(); - $this->assertCount(2, $tags); - $this->assertTrue($object->hasTag('method')); - $this->assertTrue($object->hasTag('Method')); - $this->assertInstanceOf( - __NAMESPACE__ . '\DocBlock\Tag\MethodTag', - $tags[0] - ); - $this->assertInstanceOf( - __NAMESPACE__ . '\DocBlock\Tag', - $tags[1] - ); - $this->assertNotInstanceOf( - __NAMESPACE__ . '\DocBlock\Tag\MethodTag', - $tags[1] - ); + $this->assertSame($context, $fixture->getContext()); } /** - * @depends testConstructFromReflector - * @covers \phpDocumentor\Reflection\DocBlock::getTagsByName + * @covers ::__construct + * @covers ::getLocation * - * @return void + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Location */ - public function testGetTagsByNameZeroAndOneMatch() + public function testDocBlockKnowsAtWhichLineItIs() { - $object = new DocBlock(new \ReflectionClass($this)); - $this->assertEmpty($object->getTagsByName('category')); - $this->assertCount(1, $object->getTagsByName('author')); - } + $location = new Location(10); - /** - * @depends testConstructWithTagsOnly - * @covers \phpDocumentor\Reflection\DocBlock::parseTags - * - * @return void - */ - public function testParseMultilineTag() - { - $fixture = <<assertCount(1, $object->getTags()); + $fixture = new DocBlock('', null, [], null, $location); + + $this->assertSame($location, $fixture->getLocation()); } /** - * @depends testConstructWithTagsOnly - * @covers \phpDocumentor\Reflection\DocBlock::parseTags + * @covers ::__construct + * @covers ::isTemplateStart * - * @return void + * @uses \phpDocumentor\Reflection\DocBlock\Description */ - public function testParseMultilineTagWithLineBreaks() + public function testDocBlockKnowsIfItIsTheStartOfADocBlockTemplate() { - $fixture = <<assertCount(1, $tags = $object->getTags()); - /** @var Return_ $tag */ - $tag = reset($tags); - $this->assertEquals("Content on\n multiple lines.\n\n One more, after the break.", $tag->getDescription()); + $fixture = new DocBlock('', null, [], null, null, true); + + $this->assertTrue($fixture->isTemplateStart()); } /** - * @depends testConstructWithTagsOnly - * @covers \phpDocumentor\Reflection\DocBlock::getTagsByName + * @covers ::__construct + * @covers ::isTemplateEnd * - * @return void + * @uses \phpDocumentor\Reflection\DocBlock\Description */ - public function testGetTagsByNameMultipleMatch() + public function testDocBlockKnowsIfItIsTheEndOfADocBlockTemplate() { - $fixture = <<assertEmpty($object->getTagsByName('category')); - $this->assertCount(1, $object->getTagsByName('return')); - $this->assertCount(2, $object->getTagsByName('param')); + $fixture = new DocBlock('', null, [], null, null, false, true); + + $this->assertTrue($fixture->isTemplateEnd()); } }