mirror of
https://github.com/retailcrm/NelmioApiDocBundle.git
synced 2025-02-09 02:59:27 +03:00
Improved directive parsing, and separate test class for parsing directives.
This commit is contained in:
parent
928a23e2c8
commit
4b7dbcd478
@ -374,12 +374,21 @@ class ApiDocExtractor
|
|||||||
}
|
}
|
||||||
|
|
||||||
$collectionData = array();
|
$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['class'] = $collectionData[1][0];
|
||||||
$input['collection'] = true;
|
$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
|
// normalize groups
|
||||||
|
@ -256,43 +256,4 @@ class ApiDocExtractorTest extends WebTestCase
|
|||||||
);
|
);
|
||||||
$this->assertCount(1, $parsers);
|
$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);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
109
Tests/Extractor/CollectionDirectiveTest.php
Normal file
109
Tests/Extractor/CollectionDirectiveTest.php
Normal 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 '),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user