assertTrue($reflection->hasAnnotation('FirstAnnotation')); $this->assertTrue($reflection->hasAnnotation('SecondAnnotation')); $this->assertFalse($reflection->hasAnnotation('NonExistentAnnotation')); $this->assertIsA($reflection->getAnnotation('FirstAnnotation'), 'FirstAnnotation'); $this->assertIsA($reflection->getAnnotation('SecondAnnotation'), 'SecondAnnotation'); $annotations = $reflection->getAnnotations(); $this->assertEqual(count($annotations), 2); $this->assertIsA($annotations[0], 'FirstAnnotation'); $this->assertIsA($annotations[1], 'SecondAnnotation'); $this->assertFalse($reflection->getAnnotation('NonExistentAnnotation')); $this->assertIsA($reflection->getConstructor(), 'ReflectionAnnotatedMethod'); $this->assertIsA($reflection->getMethod('exampleMethod'), 'ReflectionAnnotatedMethod'); foreach($reflection->getMethods() as $method) { $this->assertIsA($method, 'ReflectionAnnotatedMethod'); } $this->assertIsA($reflection->getProperty('exampleProperty'), 'ReflectionAnnotatedProperty'); foreach($reflection->getProperties() as $property) { $this->assertIsA($property, 'ReflectionAnnotatedProperty'); } foreach($reflection->getInterfaces() as $interface) { $this->assertIsA($interface, 'ReflectionAnnotatedClass'); } $this->assertIsA($reflection->getParentClass(), 'ReflectionAnnotatedClass'); } public function testReflectionAnnotatedMethod() { $reflection = new ReflectionAnnotatedMethod('Example', 'exampleMethod'); $this->assertTrue($reflection->hasAnnotation('FirstAnnotation')); $this->assertFalse($reflection->hasAnnotation('NonExistentAnnotation')); $this->assertIsA($reflection->getAnnotation('FirstAnnotation'), 'FirstAnnotation'); $this->assertFalse($reflection->getAnnotation('NonExistentAnnotation')); $annotations = $reflection->getAnnotations(); $this->assertEqual(count($annotations), 1); $this->assertIsA($annotations[0], 'FirstAnnotation'); $this->assertIsA($reflection->getDeclaringClass(), 'ReflectionAnnotatedClass'); } public function testReflectionAnnotatedProperty() { $reflection = new ReflectionAnnotatedProperty('Example', 'exampleProperty'); $this->assertTrue($reflection->hasAnnotation('SecondAnnotation')); $this->assertFalse($reflection->hasAnnotation('FirstAnnotation')); $this->assertIsA($reflection->getAnnotation('SecondAnnotation'), 'SecondAnnotation'); $this->assertFalse($reflection->getAnnotation('NonExistentAnnotation')); $annotations = $reflection->getAnnotations(); $this->assertEqual(count($annotations), 1); $this->assertIsA($annotations[0], 'SecondAnnotation'); $this->assertIsA($reflection->getDeclaringClass(), 'ReflectionAnnotatedClass'); } public function testReflectionClassCanFilterMethodsByAccess() { $reflection = new ReflectionAnnotatedClass('Example'); $privateMethods = $reflection->getMethods(ReflectionMethod::IS_PRIVATE); $this->assertEqual(count($privateMethods), 1); $this->assertEqual($privateMethods[0]->getName(), 'justPrivate'); } public function testReflectionClassCanFilterPropertiesByAccess() { $reflection = new ReflectionAnnotatedClass('Example'); $privateProperties = $reflection->getProperties(ReflectionProperty::IS_PUBLIC); $this->assertEqual(count($privateProperties), 1); $this->assertEqual($privateProperties[0]->getName(), 'publicOne'); } public function testReflectionClassShouldReturnAllMethodsWithNoFilter() { $reflection = new ReflectionAnnotatedClass('Example'); $methods = $reflection->getMethods(); $this->assertEqual(count($methods), 3); } public function testReflectionClassShouldReturnAllPropertiesWithNoFilter() { $reflection = new ReflectionAnnotatedClass('Example'); $properties = $reflection->getProperties(); $this->assertEqual(count($properties), 2); } public function testMultipleAnnotationsOnClass() { $reflection = new ReflectionAnnotatedClass('MultiExample'); $annotations = $reflection->getAllAnnotations(); $this->assertEqual(count($annotations), 3); $this->assertEqual($annotations[0]->value, 1); $this->assertEqual($annotations[1]->value, 2); $this->assertEqual($annotations[2]->value, 3); $this->assertIsA($annotations[0], 'FirstAnnotation'); $this->assertIsA($annotations[1], 'FirstAnnotation'); $this->assertIsA($annotations[2], 'SecondAnnotation'); } public function testMultipleAnnotationsOnClassWithRestriction() { $reflection = new ReflectionAnnotatedClass('MultiExample'); $annotations = $reflection->getAllAnnotations('FirstAnnotation'); $this->assertEqual(count($annotations), 2); $this->assertEqual($annotations[0]->value, 1); $this->assertEqual($annotations[1]->value, 2); $this->assertIsA($annotations[0], 'FirstAnnotation'); $this->assertIsA($annotations[1], 'FirstAnnotation'); } public function testMultipleAnnotationsOnProperty() { $reflection = new ReflectionAnnotatedClass('MultiExample'); $reflection = $reflection->getProperty('property'); $annotations = $reflection->getAllAnnotations(); $this->assertEqual(count($annotations), 3); $this->assertEqual($annotations[0]->value, 1); $this->assertEqual($annotations[1]->value, 2); $this->assertEqual($annotations[2]->value, 3); $this->assertIsA($annotations[0], 'FirstAnnotation'); $this->assertIsA($annotations[1], 'FirstAnnotation'); $this->assertIsA($annotations[2], 'SecondAnnotation'); } public function testMultipleAnnotationsOnPropertyWithRestriction() { $reflection = new ReflectionAnnotatedClass('MultiExample'); $reflection = $reflection->getProperty('property'); $annotations = $reflection->getAllAnnotations('FirstAnnotation'); $this->assertEqual(count($annotations), 2); $this->assertEqual($annotations[0]->value, 1); $this->assertEqual($annotations[1]->value, 2); $this->assertIsA($annotations[0], 'FirstAnnotation'); $this->assertIsA($annotations[1], 'FirstAnnotation'); } public function testMultipleAnnotationsOnMethod() { $reflection = new ReflectionAnnotatedClass('MultiExample'); $reflection = $reflection->getMethod('aMethod'); $annotations = $reflection->getAllAnnotations(); $this->assertEqual(count($annotations), 3); $this->assertEqual($annotations[0]->value, 1); $this->assertEqual($annotations[1]->value, 2); $this->assertEqual($annotations[2]->value, 3); $this->assertIsA($annotations[0], 'FirstAnnotation'); $this->assertIsA($annotations[1], 'FirstAnnotation'); $this->assertIsA($annotations[2], 'SecondAnnotation'); } public function testMultipleAnnotationsOnMethodWithRestriction() { $reflection = new ReflectionAnnotatedClass('MultiExample'); $reflection = $reflection->getMethod('aMethod'); $annotations = $reflection->getAllAnnotations('FirstAnnotation'); $this->assertEqual(count($annotations), 2); $this->assertEqual($annotations[0]->value, 1); $this->assertEqual($annotations[1]->value, 2); $this->assertIsA($annotations[0], 'FirstAnnotation'); $this->assertIsA($annotations[1], 'FirstAnnotation'); } } Mock::generatePartial('AnnotationsBuilder', 'MockedAnnotationsBuilder', array('getDocComment')); class TestOfPerformanceFeatures extends UnitTestCase { public function setUp() { AnnotationsBuilder::clearCache(); } public function tearDown() { AnnotationsBuilder::clearCache(); } public function testBuilderShouldCacheResults() { $builder = new MockedAnnotationsBuilder; $reflection = new ReflectionClass('Example'); $builder->build($reflection); $builder->build($reflection); $builder->expectOnce('getDocComment'); } } class TestOfSupportingFeatures extends UnitTestCase { public function setUp() { Addendum::resetIgnoredAnnotations(); } public function tearDown() { Addendum::resetIgnoredAnnotations(); } public function testIgnoredAnnotationsAreNotUsed() { Addendum::ignore('FirstAnnotation', 'SecondAnnotation'); $reflection = new ReflectionAnnotatedClass('Example'); $this->assertFalse($reflection->hasAnnotation('FirstAnnotation')); $this->assertFalse($reflection->hasAnnotation('SecondAnnotation')); } } ?>