Write test for Link tag

This commit is contained in:
Mike van Riel
2015-06-15 06:47:27 +02:00
committed by Mike van Riel
parent 7ade5b89fc
commit 4b4fc8fdf6
2 changed files with 178 additions and 3 deletions
+21 -3
View File
@@ -15,17 +15,28 @@ namespace phpDocumentor\Reflection\DocBlock\Tags;
use phpDocumentor\Reflection\DocBlock\Description; use phpDocumentor\Reflection\DocBlock\Description;
use phpDocumentor\Reflection\DocBlock\DescriptionFactory; use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
use phpDocumentor\Reflection\Types\Context; use phpDocumentor\Reflection\Types\Context;
use Webmozart\Assert\Assert;
/** /**
* Reflection class for a @link tag in a Docblock. * Reflection class for a @link tag in a Docblock.
*/ */
final class Link extends BaseTag final class Link extends BaseTag
{ {
protected $name = 'link';
/** @var string */ /** @var string */
private $link = ''; private $link = '';
public function __construct($link, Description $description) /**
* Initializes a link to a URL.
*
* @param string $link
* @param Description $description
*/
public function __construct($link, Description $description = null)
{ {
Assert::string($link);
$this->link = $link; $this->link = $link;
$this->description = $description; $this->description = $description;
} }
@@ -35,10 +46,12 @@ final class Link extends BaseTag
*/ */
public static function create($body, DescriptionFactory $descriptionFactory = null, Context $context = null) public static function create($body, DescriptionFactory $descriptionFactory = null, Context $context = null)
{ {
Assert::string($body);
$parts = preg_split('/\s+/Su', $body, 2); $parts = preg_split('/\s+/Su', $body, 2);
$link = $parts[0]; $link = $parts[0];
$description = $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context); $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null;
return new static($link, $description); return new static($link, $description);
} }
@@ -53,8 +66,13 @@ final class Link extends BaseTag
return $this->link; return $this->link;
} }
/**
* Returns a string representation for this tag.
*
* @return string
*/
public function __toString() public function __toString()
{ {
return $this->link . ' ' . $this->description; return $this->link . ($this->description ? ' ' . $this->description->render() : '');
} }
} }
+157
View File
@@ -0,0 +1,157 @@
<?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<[email protected]>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://phpdoc.org
*/
namespace phpDocumentor\Reflection\DocBlock\Tags;
use Mockery as m;
use phpDocumentor\Reflection\DocBlock\Description;
use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
use phpDocumentor\Reflection\Types\Context;
/**
* @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Link
* @covers ::<private>
*/
class LinkTest extends \PHPUnit_Framework_TestCase
{
/**
* @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::__construct
* @uses \phpDocumentor\Reflection\DocBlock\Description
* @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
*/
public function testIfCorrectTagNameIsReturned()
{
$fixture = new Link('http://this.is.my/link', new Description('Description'));
$this->assertSame('link', $fixture->getName());
}
/**
* @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::__construct
* @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::__toString
* @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
* @uses \phpDocumentor\Reflection\DocBlock\Description
* @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
*/
public function testIfTagCanBeRenderedUsingDefaultFormatter()
{
$fixture = new Link('http://this.is.my/link', new Description('Description'));
$this->assertSame('http://this.is.my/link Description', $fixture->render());
}
/**
* @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::__construct
* @uses \phpDocumentor\Reflection\DocBlock\Description
* @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
*/
public function testIfTagCanBeRenderedUsingSpecificFormatter()
{
$fixture = new Link('http://this.is.my/link', new Description('Description'));
$formatter = m::mock(Formatter::class);
$formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
$this->assertSame('Rendered output', $fixture->render($formatter));
}
/**
* @covers ::__construct
* @covers ::getLink
*/
public function testHasLinkUrl()
{
$expected = 'http://this.is.my/link';
$fixture = new Link($expected);
$this->assertSame($expected, $fixture->getLink());
}
/**
* @covers ::__construct
* @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
* @uses \phpDocumentor\Reflection\DocBlock\Description
*/
public function testHasDescription()
{
$expected = new Description('Description');
$fixture = new Link('http://this.is.my/link', $expected);
$this->assertSame($expected, $fixture->getDescription());
}
/**
* @covers ::__construct
* @covers ::__toString
* @uses \phpDocumentor\Reflection\DocBlock\Description
*/
public function testStringRepresentationIsReturned()
{
$fixture = new Link('http://this.is.my/link', new Description('Description'));
$this->assertSame('http://this.is.my/link Description', (string)$fixture);
}
/**
* @covers ::create
* @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::<public>
* @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
* @uses \phpDocumentor\Reflection\DocBlock\Description
* @uses \phpDocumentor\Reflection\Types\Context
*/
public function testFactoryMethod()
{
$descriptionFactory = m::mock(DescriptionFactory::class);
$context = new Context('');
$links = 'http://this.is.my/link';
$description = new Description('My Description');
$descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
$fixture = Link::create('http://this.is.my/link My Description', $descriptionFactory, $context);
$this->assertSame('http://this.is.my/link My Description', (string)$fixture);
$this->assertSame($links, $fixture->getLink());
$this->assertSame($description, $fixture->getDescription());
}
/**
* @covers ::create
* @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::<public>
* @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
* @uses \phpDocumentor\Reflection\DocBlock\Description
* @uses \phpDocumentor\Reflection\Types\Context
*/
public function testFactoryMethodCreatesEmptyLinkTag()
{
$descriptionFactory = m::mock(DescriptionFactory::class);
$descriptionFactory->shouldReceive('create')->never();
$fixture = Link::create('', $descriptionFactory, new Context(''));
$this->assertSame('', (string)$fixture);
$this->assertSame('', $fixture->getLink());
$this->assertSame(null, $fixture->getDescription());
}
/**
* @covers ::create
* @expectedException \InvalidArgumentException
*/
public function testFactoryMethodFailsIfVersionIsNotString()
{
$this->assertNull(Link::create([]));
}
}