<?php /** * phpDocumentor DocBlock Test * * PHP Version 5.3 * * @author Mike van Riel <mike.vanriel@naenius.com> * @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 */ namespace phpDocumentor\Reflection; use phpDocumentor\Reflection\DocBlock\Context; use phpDocumentor\Reflection\DocBlock\Location; use phpDocumentor\Reflection\DocBlock\Tag\ReturnTag; /** * Test class for phpDocumentor\Reflection\DocBlock * * @author Mike van Riel <mike.vanriel@naenius.com> * @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 */ class DocBlockTest extends \PHPUnit_Framework_TestCase { /** * @covers \phpDocumentor\Reflection\DocBlock * * @return void */ public function testConstruct() { $fixture = <<<DOCBLOCK /** * This is a short description * * This is a long description * * @see \MyClass * @return void */ DOCBLOCK; $object = new DocBlock( $fixture, new Context('\MyNamespace', array('PHPDoc' => '\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')); $this->assertSame('MyNamespace', $object->getContext()->getNamespace()); $this->assertSame( array('PHPDoc' => '\phpDocumentor'), $object->getContext()->getNamespaceAliases() ); $this->assertSame(2, $object->getLocation()->getLineNumber()); } /** * @covers \phpDocumentor\Reflection\DocBlock::splitDocBlock * * @return void */ public function testConstructWithTagsOnly() { $fixture = <<<DOCBLOCK /** * @see \MyClass * @return void */ DOCBLOCK; $object = new DocBlock($fixture); $this->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')); } /** * @covers \phpDocumentor\Reflection\DocBlock::isTemplateStart */ public function testIfStartOfTemplateIsDiscovered() { $fixture = <<<DOCBLOCK /**#@+ * @see \MyClass * @return void */ DOCBLOCK; $object = new DocBlock($fixture); $this->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 = <<<DOCBLOCK /**#@-*/ DOCBLOCK; $object = new DocBlock($fixture); $this->assertEquals('', $object->getShortDescription()); $this->assertEquals('', $object->getLongDescription()->getContents()); $this->assertTrue($object->isTemplateEnd()); } /** * @covers \phpDocumentor\Reflection\DocBlock::cleanInput * * @return void */ public function testConstructOneLiner() { $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()); } /** * @covers \phpDocumentor\Reflection\DocBlock::__construct * * @return void */ public function testConstructFromReflector() { $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')); } /** * @expectedException \InvalidArgumentException * * @return void */ public function testExceptionOnInvalidObject() { new DocBlock($this); } public function testDotSeperation() { $fixture = <<<DOCBLOCK /** * This is a short description. * This is a long description. * This is a continuation of the long description. */ DOCBLOCK; $object = new DocBlock($fixture); $this->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() ); } /** * @covers \phpDocumentor\Reflection\DocBlock::parseTags * @expectedException \LogicException * * @return void */ public function testInvalidTagBlock() { if (0 == ini_get('allow_url_include')) { $this->markTestSkipped('"data" URIs for includes are required.'); } include 'data:text/plain;base64,'. base64_encode( <<<DOCBLOCK_EXTENSION <?php class MyReflectionDocBlock extends \phpDocumentor\Reflection\DocBlock { protected function splitDocBlock(\$comment) { return array('', '', 'Invalid tag block'); } } DOCBLOCK_EXTENSION ); new \MyReflectionDocBlock(''); } public function testTagCaseSensitivity() { $fixture = <<<DOCBLOCK /** * This is a short description. * * This is a long description. * * @method null something() * @Method({"GET", "POST"}) */ DOCBLOCK; $object = new DocBlock($fixture); $this->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] ); } /** * @depends testConstructFromReflector * @covers \phpDocumentor\Reflection\DocBlock::getTagsByName * * @return void */ public function testGetTagsByNameZeroAndOneMatch() { $object = new DocBlock(new \ReflectionClass($this)); $this->assertEmpty($object->getTagsByName('category')); $this->assertCount(1, $object->getTagsByName('author')); } /** * @depends testConstructWithTagsOnly * @covers \phpDocumentor\Reflection\DocBlock::parseTags * * @return void */ public function testParseMultilineTag() { $fixture = <<<DOCBLOCK /** * @return void Content on * multiple lines. */ DOCBLOCK; $object = new DocBlock($fixture); $this->assertCount(1, $object->getTags()); } /** * @depends testConstructWithTagsOnly * @covers \phpDocumentor\Reflection\DocBlock::parseTags * * @return void */ public function testParseMultilineTagWithLineBreaks() { $fixture = <<<DOCBLOCK /** * @return void Content on * multiple lines. * * One more, after the break. */ DOCBLOCK; $object = new DocBlock($fixture); $this->assertCount(1, $tags = $object->getTags()); /** @var ReturnTag $tag */ $tag = reset($tags); $this->assertEquals("Content on\n multiple lines.\n\n One more, after the break.", $tag->getDescription()); } /** * @depends testConstructWithTagsOnly * @covers \phpDocumentor\Reflection\DocBlock::getTagsByName * * @return void */ public function testGetTagsByNameMultipleMatch() { $fixture = <<<DOCBLOCK /** * @param string * @param int * @return void */ DOCBLOCK; $object = new DocBlock($fixture); $this->assertEmpty($object->getTagsByName('category')); $this->assertCount(1, $object->getTagsByName('return')); $this->assertCount(2, $object->getTagsByName('param')); } }