Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace PhpParser\Builder;
|
Chris@0
|
4
|
Chris@0
|
5 use PhpParser\Comment;
|
Chris@0
|
6 use PhpParser\Node;
|
Chris@0
|
7 use PhpParser\Node\Name;
|
Chris@0
|
8 use PhpParser\Node\Stmt;
|
Chris@0
|
9
|
Chris@0
|
10 class ClassTest extends \PHPUnit_Framework_TestCase
|
Chris@0
|
11 {
|
Chris@0
|
12 protected function createClassBuilder($class) {
|
Chris@0
|
13 return new Class_($class);
|
Chris@0
|
14 }
|
Chris@0
|
15
|
Chris@0
|
16 public function testExtendsImplements() {
|
Chris@0
|
17 $node = $this->createClassBuilder('SomeLogger')
|
Chris@0
|
18 ->extend('BaseLogger')
|
Chris@0
|
19 ->implement('Namespaced\Logger', new Name('SomeInterface'))
|
Chris@0
|
20 ->implement('\Fully\Qualified', 'namespace\NamespaceRelative')
|
Chris@0
|
21 ->getNode()
|
Chris@0
|
22 ;
|
Chris@0
|
23
|
Chris@0
|
24 $this->assertEquals(
|
Chris@0
|
25 new Stmt\Class_('SomeLogger', array(
|
Chris@0
|
26 'extends' => new Name('BaseLogger'),
|
Chris@0
|
27 'implements' => array(
|
Chris@0
|
28 new Name('Namespaced\Logger'),
|
Chris@0
|
29 new Name('SomeInterface'),
|
Chris@0
|
30 new Name\FullyQualified('Fully\Qualified'),
|
Chris@0
|
31 new Name\Relative('NamespaceRelative'),
|
Chris@0
|
32 ),
|
Chris@0
|
33 )),
|
Chris@0
|
34 $node
|
Chris@0
|
35 );
|
Chris@0
|
36 }
|
Chris@0
|
37
|
Chris@0
|
38 public function testAbstract() {
|
Chris@0
|
39 $node = $this->createClassBuilder('Test')
|
Chris@0
|
40 ->makeAbstract()
|
Chris@0
|
41 ->getNode()
|
Chris@0
|
42 ;
|
Chris@0
|
43
|
Chris@0
|
44 $this->assertEquals(
|
Chris@0
|
45 new Stmt\Class_('Test', array(
|
Chris@0
|
46 'flags' => Stmt\Class_::MODIFIER_ABSTRACT
|
Chris@0
|
47 )),
|
Chris@0
|
48 $node
|
Chris@0
|
49 );
|
Chris@0
|
50 }
|
Chris@0
|
51
|
Chris@0
|
52 public function testFinal() {
|
Chris@0
|
53 $node = $this->createClassBuilder('Test')
|
Chris@0
|
54 ->makeFinal()
|
Chris@0
|
55 ->getNode()
|
Chris@0
|
56 ;
|
Chris@0
|
57
|
Chris@0
|
58 $this->assertEquals(
|
Chris@0
|
59 new Stmt\Class_('Test', array(
|
Chris@0
|
60 'flags' => Stmt\Class_::MODIFIER_FINAL
|
Chris@0
|
61 )),
|
Chris@0
|
62 $node
|
Chris@0
|
63 );
|
Chris@0
|
64 }
|
Chris@0
|
65
|
Chris@0
|
66 public function testStatementOrder() {
|
Chris@0
|
67 $method = new Stmt\ClassMethod('testMethod');
|
Chris@0
|
68 $property = new Stmt\Property(
|
Chris@0
|
69 Stmt\Class_::MODIFIER_PUBLIC,
|
Chris@0
|
70 array(new Stmt\PropertyProperty('testProperty'))
|
Chris@0
|
71 );
|
Chris@0
|
72 $const = new Stmt\ClassConst(array(
|
Chris@0
|
73 new Node\Const_('TEST_CONST', new Node\Scalar\String_('ABC'))
|
Chris@0
|
74 ));
|
Chris@0
|
75 $use = new Stmt\TraitUse(array(new Name('SomeTrait')));
|
Chris@0
|
76
|
Chris@0
|
77 $node = $this->createClassBuilder('Test')
|
Chris@0
|
78 ->addStmt($method)
|
Chris@0
|
79 ->addStmt($property)
|
Chris@0
|
80 ->addStmts(array($const, $use))
|
Chris@0
|
81 ->getNode()
|
Chris@0
|
82 ;
|
Chris@0
|
83
|
Chris@0
|
84 $this->assertEquals(
|
Chris@0
|
85 new Stmt\Class_('Test', array(
|
Chris@0
|
86 'stmts' => array($use, $const, $property, $method)
|
Chris@0
|
87 )),
|
Chris@0
|
88 $node
|
Chris@0
|
89 );
|
Chris@0
|
90 }
|
Chris@0
|
91
|
Chris@0
|
92 public function testDocComment() {
|
Chris@0
|
93 $docComment = <<<'DOC'
|
Chris@0
|
94 /**
|
Chris@0
|
95 * Test
|
Chris@0
|
96 */
|
Chris@0
|
97 DOC;
|
Chris@0
|
98 $class = $this->createClassBuilder('Test')
|
Chris@0
|
99 ->setDocComment($docComment)
|
Chris@0
|
100 ->getNode();
|
Chris@0
|
101
|
Chris@0
|
102 $this->assertEquals(
|
Chris@0
|
103 new Stmt\Class_('Test', array(), array(
|
Chris@0
|
104 'comments' => array(
|
Chris@0
|
105 new Comment\Doc($docComment)
|
Chris@0
|
106 )
|
Chris@0
|
107 )),
|
Chris@0
|
108 $class
|
Chris@0
|
109 );
|
Chris@0
|
110
|
Chris@0
|
111 $class = $this->createClassBuilder('Test')
|
Chris@0
|
112 ->setDocComment(new Comment\Doc($docComment))
|
Chris@0
|
113 ->getNode();
|
Chris@0
|
114
|
Chris@0
|
115 $this->assertEquals(
|
Chris@0
|
116 new Stmt\Class_('Test', array(), array(
|
Chris@0
|
117 'comments' => array(
|
Chris@0
|
118 new Comment\Doc($docComment)
|
Chris@0
|
119 )
|
Chris@0
|
120 )),
|
Chris@0
|
121 $class
|
Chris@0
|
122 );
|
Chris@0
|
123 }
|
Chris@0
|
124
|
Chris@0
|
125 /**
|
Chris@0
|
126 * @expectedException \LogicException
|
Chris@0
|
127 * @expectedExceptionMessage Unexpected node of type "Stmt_Echo"
|
Chris@0
|
128 */
|
Chris@0
|
129 public function testInvalidStmtError() {
|
Chris@0
|
130 $this->createClassBuilder('Test')
|
Chris@0
|
131 ->addStmt(new Stmt\Echo_(array()))
|
Chris@0
|
132 ;
|
Chris@0
|
133 }
|
Chris@0
|
134
|
Chris@0
|
135 /**
|
Chris@0
|
136 * @expectedException \LogicException
|
Chris@0
|
137 * @expectedExceptionMessage Doc comment must be a string or an instance of PhpParser\Comment\Doc
|
Chris@0
|
138 */
|
Chris@0
|
139 public function testInvalidDocComment() {
|
Chris@0
|
140 $this->createClassBuilder('Test')
|
Chris@0
|
141 ->setDocComment(new Comment('Test'));
|
Chris@0
|
142 }
|
Chris@0
|
143
|
Chris@0
|
144 /**
|
Chris@0
|
145 * @expectedException \LogicException
|
Chris@0
|
146 * @expectedExceptionMessage Name cannot be empty
|
Chris@0
|
147 */
|
Chris@0
|
148 public function testEmptyName() {
|
Chris@0
|
149 $this->createClassBuilder('Test')
|
Chris@0
|
150 ->extend('');
|
Chris@0
|
151 }
|
Chris@0
|
152
|
Chris@0
|
153 /**
|
Chris@0
|
154 * @expectedException \LogicException
|
Chris@0
|
155 * @expectedExceptionMessage Name must be a string or an instance of PhpParser\Node\Name
|
Chris@0
|
156 */
|
Chris@0
|
157 public function testInvalidName() {
|
Chris@0
|
158 $this->createClassBuilder('Test')
|
Chris@0
|
159 ->extend(array('Foo'));
|
Chris@0
|
160 }
|
Chris@0
|
161 }
|