Improved directive parsing, and separate test class for parsing directives.

This commit is contained in:
Bez Hermoso 2014-08-08 08:51:21 -07:00
parent 928a23e2c8
commit 4b7dbcd478
3 changed files with 121 additions and 42 deletions

View File

@ -374,12 +374,21 @@ class ApiDocExtractor
}
$collectionData = array();
preg_match_all("/array<(.*)>(\\s+as\\s+(.*))?/", $input['class'], $collectionData);
if (count($collectionData[0]) > 0) {
/*
* Match array<Fully\Qualified\ClassName> as alias; "as alias" optional.
*/
if (preg_match_all("/^array<([A-Za-z]+[A-Za-z0-9_]*(?:\\\\[A-Za-z]+[A-Za-z0-9_]*)*)>(?:\\s+as\\s+(.+))?$/", $input['class'], $collectionData)) {
$input['class'] = $collectionData[1][0];
$input['collection'] = true;
$input['collectionName'] = $collectionData[3][0];
$input['collectionName'] = $collectionData[2][0];
} elseif (preg_match('/^array</', $input['class'])) { //See if a collection directive was attempted. Must be malformed.
throw new \InvalidArgumentException(
sprintf(
'Malformed collection directive: %s. Proper format is: array<Fully\\Qualified\\ClassName> or array<Fully\\Qualified\\ClassName> as collectionName',
$input['class']
)
);
}
// normalize groups

View File

@ -256,43 +256,4 @@ class ApiDocExtractorTest extends WebTestCase
);
$this->assertCount(1, $parsers);
}
public function testCollectionOutputNormalization()
{
$extractor = new TestExtractor();
$normalized = $extractor->getNormalization('array<Vendor\\Namespace\\Test>');
$this->assertArrayHasKey('class', $normalized);
$this->assertArrayHasKey('collection', $normalized);
$this->assertArrayHasKey('collectionName', $normalized);
$this->assertEquals('Vendor\\Namespace\\Test', $normalized['class']);
$this->assertEquals('', $normalized['collectionName']);
$this->assertTrue($normalized['collection']);
}
public function testNamedCollectionOutputNormalization()
{
$extractor = new TestExtractor();
$normalized = $extractor->getNormalization('array<Vendor\\Namespace\\Test> as tests');
$this->assertArrayHasKey('class', $normalized);
$this->assertArrayHasKey('collection', $normalized);
$this->assertArrayHasKey('collectionName', $normalized);
$this->assertEquals('Vendor\\Namespace\\Test', $normalized['class']);
$this->assertEquals('tests', $normalized['collectionName']);
$this->assertTrue($normalized['collection']);
}
public function testFailedCollectionOutputNormalization()
{
$extractor = new TestExtractor();
$normalized = $extractor->getNormalization('array<Vendor\\Test');
$this->assertArrayNotHasKey('collection', $normalized);
$this->assertArrayNotHasKey('collectionName', $normalized);
}
}

View File

@ -0,0 +1,109 @@
<?php
namespace Nelmio\ApiDocBundle\Tests\Extractor;
class CollectionDirectiveTest extends \PHPUnit_Framework_TestCase
{
/**
* @var TestExtractor
*/
private $testExtractor;
public function setUp()
{
$this->testExtractor = new TestExtractor();
}
private function normalize($input)
{
return $this->testExtractor->getNormalization($input);
}
/**
* @dataProvider dataNormalizationTests
*/
public function testNormalizations($input, callable $callable)
{
call_user_func($callable, $this->normalize($input), $this);
}
public function dataNormalizationTests()
{
return array(
'test_simple_notation' => array(
'array<User>',
function ($actual, \PHPUnit_Framework_TestCase $case) {
$case->assertArrayHasKey('collection', $actual);
$case->assertArrayHasKey('collectionName', $actual);
$case->assertArrayHasKey('class', $actual);
$case->assertTrue($actual['collection']);
$case->assertEquals('', $actual['collectionName']);
$case->assertEquals('User', $actual['class']);
}
),
'test_simple_notation_with_namespaces' => array(
'array<Vendor0_2\\Namespace1\\Namespace_2\\User>',
function ($actual, \PHPUnit_Framework_TestCase $case) {
$case->assertArrayHasKey('collection', $actual);
$case->assertArrayHasKey('collectionName', $actual);
$case->assertArrayHasKey('class', $actual);
$case->assertTrue($actual['collection']);
$case->assertEquals('', $actual['collectionName']);
$case->assertEquals('Vendor0_2\\Namespace1\\Namespace_2\\User', $actual['class']);
}
),
'test_simple_named_collections' => array(
'array<Group> as groups',
function ($actual, \PHPUnit_Framework_TestCase $case) {
$case->assertArrayHasKey('collection', $actual);
$case->assertArrayHasKey('collectionName', $actual);
$case->assertArrayHasKey('class', $actual);
$case->assertTrue($actual['collection']);
$case->assertEquals('groups', $actual['collectionName']);
$case->assertEquals('Group', $actual['class']);
}
),
'test_namespaced_named_collections' => array(
'array<Vendor\\Namespace0\\Namespace_2F3\\Group> as groups',
function ($actual, \PHPUnit_Framework_TestCase $case) {
$case->assertArrayHasKey('collection', $actual);
$case->assertArrayHasKey('collectionName', $actual);
$case->assertArrayHasKey('class', $actual);
$case->assertTrue($actual['collection']);
$case->assertEquals('groups', $actual['collectionName']);
$case->assertEquals('Vendor\\Namespace0\\Namespace_2F3\\Group', $actual['class']);
}
),
);
}
/**
* @expectedException \InvalidArgumentException
* @dataProvider dataInvalidDirectives
* @param $input
*/
public function testInvalidDirectives($input)
{
$this->normalize($input);
}
public function dataInvalidDirectives()
{
return array(
array('array<>'),
array('array<Vendor\\>'),
array('array<2Vendor\\>'),
array('array<_Vendor\\>'),
array('array<Vendor\\_Class>'),
array('array<Vendor\\2Class>'),
array('array<User> as'),
array('array<User> as '),
);
}
}