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