mirror of
https://github.com/retailcrm/NelmioApiDocBundle.git
synced 2025-02-08 18:49:26 +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();
|
||||
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
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
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