<?php
namespace Doctrine\Tests\Common\Annotations;
use Doctrine\Common\Annotations\DoctrineReader;
use Doctrine\Common\Reflection\StaticReflectionParser;
use Doctrine\Common\Reflection\Psr0FindFile;
use Doctrine\Common\Annotations\Annotation\IgnoreAnnotation;
use Doctrine\Common\Annotations\Annotation\IgnorePhpDoc;
use ReflectionClass, Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Tests\Common\Annotations\DummyAnnotation;
use Doctrine\Tests\Common\Annotations\Name;
use Doctrine\Tests\Common\Annotations\DummyId;
use Doctrine\Tests\Common\Annotations\DummyJoinTable;
use Doctrine\Tests\Common\Annotations\DummyJoinColumn;
use Doctrine\Tests\Common\Annotations\DummyColumn;
use Doctrine\Tests\Common\Annotations\DummyGeneratedValue;
require_once __DIR__ . '/TopLevelAnnotation.php';
abstract class AbstractReaderTest extends \PHPUnit_Framework_TestCase {
public function getReflectionClass() {
$className = 'Doctrine\\Tests\\Common\\Annotations\\DummyClass';
$testsRoot = substr(__DIR__, 0, -strlen(__NAMESPACE__) - 1);
$paths = array(
'Doctrine\\Tests' => array(
$testsRoot,
),
);
$staticReflectionParser = new StaticReflectionParser($className, new Psr0FindFile($paths));
return array(
'native' => array(
new ReflectionClass($className),
),
'static' => array(
$staticReflectionParser
->getReflectionClass(),
),
);
}
public function testAnnotations($class) {
$reader = $this
->getReader();
$this
->assertEquals(1, count($reader
->getClassAnnotations($class)));
$this
->assertInstanceOf($annotName = 'Doctrine\\Tests\\Common\\Annotations\\DummyAnnotation', $annot = $reader
->getClassAnnotation($class, $annotName));
$this
->assertEquals("hello", $annot->dummyValue);
$field1Prop = $class
->getProperty('field1');
$propAnnots = $reader
->getPropertyAnnotations($field1Prop);
$this
->assertEquals(1, count($propAnnots));
$this
->assertInstanceOf($annotName, $annot = $reader
->getPropertyAnnotation($field1Prop, $annotName));
$this
->assertEquals("fieldHello", $annot->dummyValue);
$getField1Method = $class
->getMethod('getField1');
$methodAnnots = $reader
->getMethodAnnotations($getField1Method);
$this
->assertEquals(1, count($methodAnnots));
$this
->assertInstanceOf($annotName, $annot = $reader
->getMethodAnnotation($getField1Method, $annotName));
$this
->assertEquals(array(
1,
2,
"three",
), $annot->value);
$field2Prop = $class
->getProperty('field2');
$propAnnots = $reader
->getPropertyAnnotations($field2Prop);
$this
->assertEquals(1, count($propAnnots));
$this
->assertInstanceOf($annotName = 'Doctrine\\Tests\\Common\\Annotations\\DummyJoinTable', $joinTableAnnot = $reader
->getPropertyAnnotation($field2Prop, $annotName));
$this
->assertEquals(1, count($joinTableAnnot->joinColumns));
$this
->assertEquals(1, count($joinTableAnnot->inverseJoinColumns));
$this
->assertTrue($joinTableAnnot->joinColumns[0] instanceof DummyJoinColumn);
$this
->assertTrue($joinTableAnnot->inverseJoinColumns[0] instanceof DummyJoinColumn);
$this
->assertEquals('col1', $joinTableAnnot->joinColumns[0]->name);
$this
->assertEquals('col2', $joinTableAnnot->joinColumns[0]->referencedColumnName);
$this
->assertEquals('col3', $joinTableAnnot->inverseJoinColumns[0]->name);
$this
->assertEquals('col4', $joinTableAnnot->inverseJoinColumns[0]->referencedColumnName);
$dummyAnnot = $reader
->getMethodAnnotation($class
->getMethod('getField1'), 'Doctrine\\Tests\\Common\\Annotations\\DummyAnnotation');
$this
->assertEquals('', $dummyAnnot->dummyValue);
$this
->assertEquals(array(
1,
2,
'three',
), $dummyAnnot->value);
$dummyAnnot = $reader
->getPropertyAnnotation($class
->getProperty('field1'), 'Doctrine\\Tests\\Common\\Annotations\\DummyAnnotation');
$this
->assertEquals('fieldHello', $dummyAnnot->dummyValue);
$classAnnot = $reader
->getClassAnnotation($class, 'Doctrine\\Tests\\Common\\Annotations\\DummyAnnotation');
$this
->assertEquals('hello', $classAnnot->dummyValue);
}
public function testAnnotationsWithValidTargets() {
$reader = $this
->getReader();
$class = new ReflectionClass('Doctrine\\Tests\\Common\\Annotations\\Fixtures\\ClassWithValidAnnotationTarget');
$this
->assertEquals(1, count($reader
->getClassAnnotations($class)));
$this
->assertEquals(1, count($reader
->getPropertyAnnotations($class
->getProperty('foo'))));
$this
->assertEquals(1, count($reader
->getMethodAnnotations($class
->getMethod('someFunction'))));
$this
->assertEquals(1, count($reader
->getPropertyAnnotations($class
->getProperty('nested'))));
}
public function testAnnotationsWithVarType() {
$reader = $this
->getReader();
$class = new ReflectionClass('Doctrine\\Tests\\Common\\Annotations\\Fixtures\\ClassWithAnnotationWithVarType');
$this
->assertEquals(1, count($fooAnnot = $reader
->getPropertyAnnotations($class
->getProperty('foo'))));
$this
->assertEquals(1, count($barAnnot = $reader
->getMethodAnnotations($class
->getMethod('bar'))));
$this
->assertInternalType('string', $fooAnnot[0]->string);
$this
->assertInstanceOf('Doctrine\\Tests\\Common\\Annotations\\Fixtures\\AnnotationTargetAll', $barAnnot[0]->annotation);
}
public function testClassWithInvalidAnnotationTargetAtClassDocBlock() {
$reader = $this
->getReader();
$reader
->getClassAnnotations(new \ReflectionClass('Doctrine\\Tests\\Common\\Annotations\\Fixtures\\ClassWithInvalidAnnotationTargetAtClass'));
}
public function testClassWithInvalidAnnotationTargetAtPropertyDocBlock() {
$reader = $this
->getReader();
$reader
->getPropertyAnnotations(new \ReflectionProperty('Doctrine\\Tests\\Common\\Annotations\\Fixtures\\ClassWithInvalidAnnotationTargetAtProperty', 'foo'));
}
public function testClassWithInvalidNestedAnnotationTargetAtPropertyDocBlock() {
$reader = $this
->getReader();
$reader
->getPropertyAnnotations(new \ReflectionProperty('Doctrine\\Tests\\Common\\Annotations\\Fixtures\\ClassWithInvalidAnnotationTargetAtProperty', 'bar'));
}
public function testClassWithInvalidAnnotationTargetAtMethodDocBlock() {
$reader = $this
->getReader();
$reader
->getMethodAnnotations(new \ReflectionMethod('Doctrine\\Tests\\Common\\Annotations\\Fixtures\\ClassWithInvalidAnnotationTargetAtMethod', 'functionName'));
}
public function testClassWithAnnotationWithTargetSyntaxErrorAtClassDocBlock() {
$reader = $this
->getReader();
$reader
->getClassAnnotations(new \ReflectionClass('Doctrine\\Tests\\Common\\Annotations\\Fixtures\\ClassWithAnnotationWithTargetSyntaxError'));
}
public function testClassWithAnnotationWithTargetSyntaxErrorAtPropertyDocBlock() {
$reader = $this
->getReader();
$reader
->getPropertyAnnotations(new \ReflectionProperty('Doctrine\\Tests\\Common\\Annotations\\Fixtures\\ClassWithAnnotationWithTargetSyntaxError', 'foo'));
}
public function testClassWithAnnotationWithTargetSyntaxErrorAtMethodDocBlock() {
$reader = $this
->getReader();
$reader
->getMethodAnnotations(new \ReflectionMethod('Doctrine\\Tests\\Common\\Annotations\\Fixtures\\ClassWithAnnotationWithTargetSyntaxError', 'bar'));
}
public function testClassWithPropertyInvalidVarTypeError() {
$reader = $this
->getReader();
$class = new ReflectionClass('Doctrine\\Tests\\Common\\Annotations\\Fixtures\\ClassWithAnnotationWithVarType');
$reader
->getPropertyAnnotations($class
->getProperty('invalidProperty'));
}
public function testClassWithMethodInvalidVarTypeError() {
$reader = $this
->getReader();
$class = new ReflectionClass('Doctrine\\Tests\\Common\\Annotations\\Fixtures\\ClassWithAnnotationWithVarType');
$reader
->getMethodAnnotations($class
->getMethod('invalidMethod'));
}
public function testClassSyntaxErrorContext() {
$reader = $this
->getReader();
$reader
->getClassAnnotations(new \ReflectionClass('Doctrine\\Tests\\Common\\Annotations\\DummyClassSyntaxError'));
}
public function testMethodSyntaxErrorContext() {
$reader = $this
->getReader();
$reader
->getMethodAnnotations(new \ReflectionMethod('Doctrine\\Tests\\Common\\Annotations\\DummyClassMethodSyntaxError', 'foo'));
}
public function testPropertySyntaxErrorContext() {
$reader = $this
->getReader();
$reader
->getPropertyAnnotations(new \ReflectionProperty('Doctrine\\Tests\\Common\\Annotations\\DummyClassPropertySyntaxError', 'foo'));
}
public function testMultipleAnnotationsOnSameLine() {
$reader = $this
->getReader();
$annots = $reader
->getPropertyAnnotations(new \ReflectionProperty('Doctrine\\Tests\\Common\\Annotations\\DummyClass2', 'id'));
$this
->assertEquals(3, count($annots));
}
public function testNonAnnotationProblem() {
$reader = $this
->getReader();
$this
->assertNotNull($annot = $reader
->getPropertyAnnotation(new \ReflectionProperty('Doctrine\\Tests\\Common\\Annotations\\DummyClassNonAnnotationProblem', 'foo'), $name = 'Doctrine\\Tests\\Common\\Annotations\\DummyAnnotation'));
$this
->assertInstanceOf($name, $annot);
}
public function testImportWithConcreteAnnotation() {
$reader = $this
->getReader();
$property = new \ReflectionProperty('Doctrine\\Tests\\Common\\Annotations\\TestImportWithConcreteAnnotation', 'field');
$annotations = $reader
->getPropertyAnnotations($property);
$this
->assertEquals(1, count($annotations));
$this
->assertNotNull($reader
->getPropertyAnnotation($property, 'Doctrine\\Tests\\Common\\Annotations\\DummyAnnotation'));
}
public function testImportWithInheritance() {
$reader = $this
->getReader();
$class = new TestParentClass();
$ref = new \ReflectionClass($class);
$childAnnotations = $reader
->getPropertyAnnotations($ref
->getProperty('child'));
$this
->assertEquals(1, count($childAnnotations));
$this
->assertInstanceOf('Doctrine\\Tests\\Common\\Annotations\\Foo\\Name', reset($childAnnotations));
$parentAnnotations = $reader
->getPropertyAnnotations($ref
->getProperty('parent'));
$this
->assertEquals(1, count($parentAnnotations));
$this
->assertInstanceOf('Doctrine\\Tests\\Common\\Annotations\\Bar\\Name', reset($parentAnnotations));
}
public function testImportDetectsNotImportedAnnotation() {
$reader = $this
->getReader();
$reader
->getPropertyAnnotations(new \ReflectionProperty('Doctrine\\Tests\\Common\\Annotations\\TestAnnotationNotImportedClass', 'field'));
}
public function testImportDetectsNonExistentAnnotation() {
$reader = $this
->getReader();
$reader
->getPropertyAnnotations(new \ReflectionProperty('Doctrine\\Tests\\Common\\Annotations\\TestNonExistentAnnotationClass', 'field'));
}
public function testTopLevelAnnotation() {
$reader = $this
->getReader();
$annotations = $reader
->getPropertyAnnotations(new \ReflectionProperty('Doctrine\\Tests\\Common\\Annotations\\TestTopLevelAnnotationClass', 'field'));
$this
->assertEquals(1, count($annotations));
$this
->assertInstanceOf('\\TopLevelAnnotation', reset($annotations));
}
public function testIgnoresAnnotationsNotPrefixedWithWhitespace() {
$reader = $this
->getReader();
$annotation = $reader
->getClassAnnotation(new \ReflectionClass(new TestIgnoresNonAnnotationsClass()), 'Doctrine\\Tests\\Common\\Annotations\\Name');
$this
->assertInstanceOf('Doctrine\\Tests\\Common\\Annotations\\Name', $annotation);
}
public function testErrorWhenInvalidAnnotationIsUsed() {
$reader = $this
->getReader();
$ref = new \ReflectionClass('Doctrine\\Tests\\Common\\Annotations\\Fixtures\\InvalidAnnotationUsageClass');
$reader
->getClassAnnotations($ref);
}
public function testInvalidAnnotationUsageButIgnoredClass() {
$reader = $this
->getReader();
$ref = new \ReflectionClass('Doctrine\\Tests\\Common\\Annotations\\Fixtures\\InvalidAnnotationUsageButIgnoredClass');
$annots = $reader
->getClassAnnotations($ref);
$this
->assertEquals(2, count($annots));
}
public function testInvalidAnnotationButIgnored() {
$reader = $this
->getReader();
$class = new \ReflectionClass('Doctrine\\Tests\\Common\\Annotations\\Fixtures\\ClassDDC1660');
$this
->assertTrue(class_exists('Doctrine\\Tests\\Common\\Annotations\\Fixtures\\Annotation\\Version'));
$this
->assertCount(0, $reader
->getClassAnnotations($class));
$this
->assertCount(0, $reader
->getMethodAnnotations($class
->getMethod('bar')));
$this
->assertCount(0, $reader
->getPropertyAnnotations($class
->getProperty('foo')));
}
protected abstract function getReader();
}
class TestParseAnnotationClass {
private $field;
}
class TestIgnoresNonAnnotationsClass {
}
class TestTopLevelAnnotationClass {
private $field;
}
class TestNonExistentAnnotationClass {
private $field;
}
class TestAnnotationNotImportedClass {
private $field;
}
class TestChildClass {
protected $child;
}
class TestParentClass extends TestChildClass {
private $parent;
}
class TestImportWithConcreteAnnotation {
private $field;
}
class DummyClass2 {
private $id;
}
class DummyId extends \Doctrine\Common\Annotations\Annotation {
}
class DummyColumn extends \Doctrine\Common\Annotations\Annotation {
public $type;
}
class DummyGeneratedValue extends \Doctrine\Common\Annotations\Annotation {
}
class DummyAnnotation extends \Doctrine\Common\Annotations\Annotation {
public $dummyValue;
}
class DummyJoinColumn extends \Doctrine\Common\Annotations\Annotation {
public $name;
public $referencedColumnName;
}
class DummyJoinTable extends \Doctrine\Common\Annotations\Annotation {
public $name;
public $joinColumns;
public $inverseJoinColumns;
}
class DummyClassSyntaxError {
}
class DummyClassMethodSyntaxError {
public function foo() {
}
}
class DummyClassPropertySyntaxError {
public $foo;
}
class DummyClassNonAnnotationProblem {
public $foo;
}
class DummyClassWithEmail {
}
namespace Doctrine\Tests\Common\Annotations\Foo;
class Name extends \Doctrine\Common\Annotations\Annotation {
public $name;
}
namespace Doctrine\Tests\Common\Annotations\Bar;
class Name extends \Doctrine\Common\Annotations\Annotation {
public $name;
}