291 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			291 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * This file is part of phpDocumentor.
 | |
|  *
 | |
|  * For the full copyright and license information, please view the LICENSE
 | |
|  * file that was distributed with this source code.
 | |
|  *
 | |
|  * @copyright 2010-2015 Mike van Riel<mike@phpdoc.org>
 | |
|  * @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             ::<private>
 | |
|  * @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 = <<<DOCBLOCK
 | |
| /**
 | |
|  * This is a summary.
 | |
|  * This is a multiline Description
 | |
|  * that contains a code block.
 | |
|  *
 | |
|  *     See here: a CodeBlock
 | |
|  */
 | |
| DOCBLOCK;
 | |
| 
 | |
|         $description = <<<DESCRIPTION
 | |
| This is a multiline Description
 | |
| that contains a code block.
 | |
| 
 | |
|     See here: a CodeBlock
 | |
| DESCRIPTION;
 | |
| 
 | |
|         $docblock = $fixture->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 = <<<TAG
 | |
| @author Mike van Riel <me@mikevanriel.com> 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 = <<<DOCBLOCK
 | |
| /**
 | |
|  * This is a summary.
 | |
|  *
 | |
|  * @author Mike van Riel <me@mikevanriel.com> 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.',
 | |
|                 ''
 | |
|             ],
 | |
|             [
 | |
|                 <<<DOCBLOCK
 | |
| This is a DocBlock.
 | |
| This should be a Description.
 | |
| DOCBLOCK
 | |
|                 ,
 | |
|                 'This is a DocBlock.',
 | |
|                 'This should be a Description.'
 | |
|             ],
 | |
|             [
 | |
|                 <<<DOCBLOCK
 | |
| This is a
 | |
| multiline Summary.
 | |
| This should be a Description.
 | |
| DOCBLOCK
 | |
|                 ,
 | |
|                 "This is a\nmultiline Summary.",
 | |
|                 'This should be a Description.'
 | |
|             ],
 | |
|             [
 | |
|                 <<<DOCBLOCK
 | |
| This is a Summary without dot but with a whiteline
 | |
| 
 | |
| This should be a Description.
 | |
| DOCBLOCK
 | |
|                 ,
 | |
|                 'This is a Summary without dot but with a whiteline',
 | |
|                 'This should be a Description.'
 | |
|             ],
 | |
|             [
 | |
|                 <<<DOCBLOCK
 | |
| This is a Summary with dot and with a whiteline.
 | |
| 
 | |
| This should be a Description.
 | |
| DOCBLOCK
 | |
|                 ,
 | |
|                 'This is a Summary with dot and with a whiteline.',
 | |
|                 'This should be a Description.'
 | |
|             ],
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @covers ::__construct
 | |
|      * @covers ::create
 | |
|      *
 | |
|      * @uses   phpDocumentor\Reflection\DocBlock\DescriptionFactory
 | |
|      * @uses   phpDocumentor\Reflection\DocBlock\Description
 | |
|      * @uses   phpDocumentor\Reflection\Types\Context
 | |
|      * @uses   phpDocumentor\Reflection\DocBlock\Tags\Param
 | |
|      */
 | |
|     public function testTagsWithContextNamespace()
 | |
|     {
 | |
|         $tagFactoryMock = m::mock(TagFactory::class);
 | |
|         $fixture = new DocBlockFactory(m::mock(DescriptionFactory::class), $tagFactoryMock);
 | |
|         $context = new Context('MyNamespace');
 | |
| 
 | |
|         $tagFactoryMock->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 = <<<TAG
 | |
| @author Mike van Riel <me@mikevanriel.com> 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 = <<<DOCBLOCK
 | |
| /**
 | |
|  * This is a summary.
 | |
|  *
 | |
|  * @author Mike van Riel <me@mikevanriel.com> This is with
 | |
|  *   multiline description.
 | |
|  */
 | |
| DOCBLOCK;
 | |
| 
 | |
|         $docblock = $fixture->create($given, new Context(''));
 | |
| 
 | |
|         $this->assertEquals([], $docblock->getTags());
 | |
|     }
 | |
| }
 | 
