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@0
|
9
|
Chris@17
|
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@13
|
25 new Stmt\Class_('SomeLogger', [
|
Chris@0
|
26 'extends' => new Name('BaseLogger'),
|
Chris@13
|
27 'implements' => [
|
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@13
|
32 ],
|
Chris@13
|
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@13
|
45 new Stmt\Class_('Test', [
|
Chris@0
|
46 'flags' => Stmt\Class_::MODIFIER_ABSTRACT
|
Chris@13
|
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@13
|
59 new Stmt\Class_('Test', [
|
Chris@0
|
60 'flags' => Stmt\Class_::MODIFIER_FINAL
|
Chris@13
|
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@13
|
70 [new Stmt\PropertyProperty('testProperty')]
|
Chris@0
|
71 );
|
Chris@13
|
72 $const = new Stmt\ClassConst([
|
Chris@0
|
73 new Node\Const_('TEST_CONST', new Node\Scalar\String_('ABC'))
|
Chris@13
|
74 ]);
|
Chris@13
|
75 $use = new Stmt\TraitUse([new Name('SomeTrait')]);
|
Chris@0
|
76
|
Chris@0
|
77 $node = $this->createClassBuilder('Test')
|
Chris@0
|
78 ->addStmt($method)
|
Chris@0
|
79 ->addStmt($property)
|
Chris@13
|
80 ->addStmts([$const, $use])
|
Chris@0
|
81 ->getNode()
|
Chris@0
|
82 ;
|
Chris@0
|
83
|
Chris@0
|
84 $this->assertEquals(
|
Chris@13
|
85 new Stmt\Class_('Test', [
|
Chris@13
|
86 'stmts' => [$use, $const, $property, $method]
|
Chris@13
|
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@13
|
103 new Stmt\Class_('Test', [], [
|
Chris@13
|
104 'comments' => [
|
Chris@0
|
105 new Comment\Doc($docComment)
|
Chris@13
|
106 ]
|
Chris@13
|
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@13
|
116 new Stmt\Class_('Test', [], [
|
Chris@13
|
117 'comments' => [
|
Chris@0
|
118 new Comment\Doc($docComment)
|
Chris@13
|
119 ]
|
Chris@13
|
120 ]),
|
Chris@0
|
121 $class
|
Chris@0
|
122 );
|
Chris@0
|
123 }
|
Chris@0
|
124
|
Chris@0
|
125 public function testInvalidStmtError() {
|
Chris@17
|
126 $this->expectException(\LogicException::class);
|
Chris@17
|
127 $this->expectExceptionMessage('Unexpected node of type "Stmt_Echo"');
|
Chris@0
|
128 $this->createClassBuilder('Test')
|
Chris@13
|
129 ->addStmt(new Stmt\Echo_([]))
|
Chris@0
|
130 ;
|
Chris@0
|
131 }
|
Chris@0
|
132
|
Chris@0
|
133 public function testInvalidDocComment() {
|
Chris@17
|
134 $this->expectException(\LogicException::class);
|
Chris@17
|
135 $this->expectExceptionMessage('Doc comment must be a string or an instance of PhpParser\Comment\Doc');
|
Chris@0
|
136 $this->createClassBuilder('Test')
|
Chris@0
|
137 ->setDocComment(new Comment('Test'));
|
Chris@0
|
138 }
|
Chris@0
|
139
|
Chris@0
|
140 public function testEmptyName() {
|
Chris@17
|
141 $this->expectException(\LogicException::class);
|
Chris@17
|
142 $this->expectExceptionMessage('Name cannot be empty');
|
Chris@0
|
143 $this->createClassBuilder('Test')
|
Chris@0
|
144 ->extend('');
|
Chris@0
|
145 }
|
Chris@0
|
146
|
Chris@0
|
147 public function testInvalidName() {
|
Chris@17
|
148 $this->expectException(\LogicException::class);
|
Chris@17
|
149 $this->expectExceptionMessage('Name must be a string or an instance of Node\Name');
|
Chris@0
|
150 $this->createClassBuilder('Test')
|
Chris@13
|
151 ->extend(['Foo']);
|
Chris@0
|
152 }
|
Chris@0
|
153 }
|