Completed
Push — master ( c5cc72...7c6f56 )
by Jean-Christophe
02:02
created

BadlyAnnotatedClass   A

Complexity

Total Complexity 2

Size/Duplication

Total Lines 10
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 0

Importance

Changes 0
Metric Value
wmc 2
lcom 0
cbo 0
dl 0
loc 10
rs 10
c 0
b 0
f 0
1
<?php
2
	require_once('simpletest/autorun.php');
3
	require_once(dirname(__FILE__).'/../../annotations.php');
4
5
	/** @Target("class") */
6
	class ClassRestrictedAnnotation extends Annotation {}
7
8
	/** @Target("method") */
9
	class MethodRestrictedAnnotation extends Annotation {}
10
	
11
	/** @Target("property") */
12
	class PropertyRestrictedAnnotation extends Annotation {}
13
14
	/** @Target("nested") */
15
	class NestedRestrictedAnnotation extends Annotation {}
16
17
	/** @Target({"class", "property"}) */
18
	class ClassOrPropertyRestrictedAnnotation extends Annotation {}
19
	
20
21
	class BadlyAnnotatedClass {
22
		/** @ClassRestrictedAnnotation */
23
		private $property;
24
		
25
		/** @ClassRestrictedAnnotation */
26
		public function method() {}
27
		
28
		/** @ClassOrPropertyRestrictedAnnotation */
29
		public function method2() {}
30
	}
31
32
	/** @ClassRestrictedAnnotation(value = @MethodRestrictedAnnotation(true)) */
33
	class ClassWithBadlyNestedAnnotations {}
34
	
35
	/** @ClassRestrictedAnnotation */
36
	class SuccesfullyAnnotatedClass {
37
		/** @PropertyRestrictedAnnotation */
38
		private $property;
39
		
40
		/** @ClassOrPropertyRestrictedAnnotation */
41
		private $property2;
42
43
		/** @MethodRestrictedAnnotation */
44
		public function method() {}
45
46
		/** @MethodRestrictedAnnotation(value = @NestedRestrictedAnnotation) */
47
		public function method2() {}
48
	}
49
50
	class TestOfConstrainedAnnotation extends UnitTestCase {
51
		public function testClassAnnotationThrowsErrorWhenOnMethod() {
52
			$this->expectError("Annotation 'ClassRestrictedAnnotation' not allowed on BadlyAnnotatedClass::method");
53
			$reflection = new ReflectionAnnotatedClass('BadlyAnnotatedClass');
54
			$method = $reflection->getMethod('method');
55
		}
56
		
57
		public function testClassAnnotationThrowsErrorWhenOnProperty() {
58
			$this->expectError("Annotation 'ClassRestrictedAnnotation' not allowed on BadlyAnnotatedClass::\$property");
59
			$reflection = new ReflectionAnnotatedClass('BadlyAnnotatedClass');
60
			$method = $reflection->getProperty('property');
61
		}
62
		
63
		public function testSingleTargetAnnotationThrowsNoErrorWhenOnRightPlace() {
64
			$reflection = new ReflectionAnnotatedClass('SuccesfullyAnnotatedClass');
65
			$method = $reflection->getMethod('method');
66
			$property = $reflection->getProperty('property');
67
		}
68
		
69
		public function testMultiTargetAnnotationThrowsErrorWhenOnWrongPlace() {
70
			$this->expectError("Annotation 'ClassOrPropertyRestrictedAnnotation' not allowed on BadlyAnnotatedClass::method2");
71
			$reflection = new ReflectionAnnotatedClass('BadlyAnnotatedClass');
72
			$method = $reflection->getMethod('method2');
73
		}
74
		
75
		public function testMultiTargetAnnotationThrowsNoErrorWhenOnRightPlace() {
76
			$reflection = new ReflectionAnnotatedClass('SuccesfullyAnnotatedClass');
77
			$method = $reflection->getProperty('property2');
78
		}
79
80
		public function testBadlyNestedAnnotationThrowsError() {
81
			$this->expectError("Annotation 'MethodRestrictedAnnotation' nesting not allowed");
82
			$this->expectError("Annotation 'MethodRestrictedAnnotation' nesting not allowed"); // because of parsing
83
			$reflection = new ReflectionAnnotatedClass('ClassWithBadlyNestedAnnotations');
84
		}
85
86
		public function testSuccesfullyNestedAnnotationThrowsNoError() {
87
			$reflection = new ReflectionAnnotatedClass('SuccesfullyAnnotatedClass');
88
			$reflection->getMethod('method2')->getAnnotation('MethodRestrictedAnnotation');
89
			
90
		}
91
	}
92
?>
93