* @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\DocBlock; use Mockery as m; use phpDocumentor\Reflection\DocBlock\Tags\Link; use phpDocumentor\Reflection\Types\Context; /** * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\DescriptionFactory * @covers :: */ class DescriptionFactoryTest extends \PHPUnit_Framework_TestCase { /** * @covers ::__construct * @covers ::create * @uses phpDocumentor\Reflection\DocBlock\Description * @dataProvider provideSimpleExampleDescriptions */ public function testDescriptionCanParseASimpleString($contents) { $tagFactory = m::mock(TagFactory::class); $tagFactory->shouldReceive('create')->never(); $factory = new DescriptionFactory($tagFactory); $description = $factory->create($contents, new Context('')); $this->assertSame($contents, $description->render()); } /** * @covers ::__construct * @covers ::create * @uses phpDocumentor\Reflection\DocBlock\Description * @dataProvider provideEscapeSequences */ public function testEscapeSequences($contents, $expected) { $tagFactory = m::mock(TagFactory::class); $tagFactory->shouldReceive('create')->never(); $factory = new DescriptionFactory($tagFactory); $description = $factory->create($contents, new Context('')); $this->assertSame($expected, $description->render()); } /** * @covers ::__construct * @covers ::create * @uses phpDocumentor\Reflection\DocBlock\Description * @uses phpDocumentor\Reflection\DocBlock\Tags\Link * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter * @uses phpDocumentor\Reflection\Types\Context */ public function testDescriptionCanParseAStringWithInlineTag() { $contents = 'This is text for a {@link http://phpdoc.org/ description} that uses an inline tag.'; $context = new Context(''); $tagFactory = m::mock(TagFactory::class); $tagFactory->shouldReceive('create') ->once() ->with('@link http://phpdoc.org/ description', $context) ->andReturn(new Link('http://phpdoc.org/', new Description('description'))) ; $factory = new DescriptionFactory($tagFactory); $description = $factory->create($contents, $context); $this->assertSame($contents, $description->render()); } /** * @covers ::__construct * @covers ::create * @uses phpDocumentor\Reflection\DocBlock\Description * @uses phpDocumentor\Reflection\DocBlock\Tags\Link * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter * @uses phpDocumentor\Reflection\Types\Context */ public function testDescriptionCanParseAStringStartingWithInlineTag() { $contents = '{@link http://phpdoc.org/ This} is text for a description that starts with an inline tag.'; $context = new Context(''); $tagFactory = m::mock(TagFactory::class); $tagFactory->shouldReceive('create') ->once() ->with('@link http://phpdoc.org/ This', $context) ->andReturn(new Link('http://phpdoc.org/', new Description('This'))) ; $factory = new DescriptionFactory($tagFactory); $description = $factory->create($contents, $context); $this->assertSame($contents, $description->render()); } /** * @covers ::__construct * @covers ::create * @uses phpDocumentor\Reflection\DocBlock\Description */ public function testIfSuperfluousStartingSpacesAreRemoved() { $factory = new DescriptionFactory(m::mock(TagFactory::class)); $descriptionText = <<create($descriptionText, new Context('')); $this->assertSame($expectedDescription, $description->render()); } /** * Provides a series of example strings that the parser should correctly interpret and return. * * @return string[][] */ public function provideSimpleExampleDescriptions() { return [ ['This is text for a description.'], ['This is text for a description containing { that is literal.'], ['This is text for a description containing } that is literal.'], ['This is text for a description with {just a text} that is not a tag.'], ]; } public function provideEscapeSequences() { return [ ['This is text for a description with a {@}.', 'This is text for a description with a @.'], ['This is text for a description with a {}.', 'This is text for a description with a }.'], ]; } }