diff --git a/Extractor/ApiDocExtractor.php b/Extractor/ApiDocExtractor.php index 19f3104..725ddfc 100644 --- a/Extractor/ApiDocExtractor.php +++ b/Extractor/ApiDocExtractor.php @@ -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 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 or array as collectionName', + $input['class'] + ) + ); } // normalize groups diff --git a/Tests/Extractor/ApiDocExtractorTest.php b/Tests/Extractor/ApiDocExtractorTest.php index a208b6e..a0dbd29 100644 --- a/Tests/Extractor/ApiDocExtractorTest.php +++ b/Tests/Extractor/ApiDocExtractorTest.php @@ -256,43 +256,4 @@ class ApiDocExtractorTest extends WebTestCase ); $this->assertCount(1, $parsers); } - - public function testCollectionOutputNormalization() - { - $extractor = new TestExtractor(); - $normalized = $extractor->getNormalization('array'); - - $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 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('arrayassertArrayNotHasKey('collection', $normalized); - $this->assertArrayNotHasKey('collectionName', $normalized); - - } } diff --git a/Tests/Extractor/CollectionDirectiveTest.php b/Tests/Extractor/CollectionDirectiveTest.php new file mode 100644 index 0000000..c432726 --- /dev/null +++ b/Tests/Extractor/CollectionDirectiveTest.php @@ -0,0 +1,109 @@ +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', + 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', + 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 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 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'), + array('array<2Vendor\\>'), + array('array<_Vendor\\>'), + array('array'), + array('array'), + array('array as'), + array('array as '), + ); + } +}