Chris@17
|
1 <?php declare(strict_types=1);
|
Chris@17
|
2
|
Chris@17
|
3 namespace PhpParser\Builder;
|
Chris@17
|
4
|
Chris@17
|
5 use PhpParser\Node\Name;
|
Chris@17
|
6 use PhpParser\Node\Stmt;
|
Chris@17
|
7 use PhpParser\Node\Stmt\Class_;
|
Chris@17
|
8
|
Chris@17
|
9 class TraitUseAdaptationTest extends \PHPUnit\Framework\TestCase
|
Chris@17
|
10 {
|
Chris@17
|
11 protected function createTraitUseAdaptationBuilder($trait, $method) {
|
Chris@17
|
12 return new TraitUseAdaptation($trait, $method);
|
Chris@17
|
13 }
|
Chris@17
|
14
|
Chris@17
|
15 public function testAsMake() {
|
Chris@17
|
16 $builder = $this->createTraitUseAdaptationBuilder(null, 'foo');
|
Chris@17
|
17
|
Chris@17
|
18 $this->assertEquals(
|
Chris@17
|
19 new Stmt\TraitUseAdaptation\Alias(null, 'foo', null, 'bar'),
|
Chris@17
|
20 (clone $builder)->as('bar')->getNode()
|
Chris@17
|
21 );
|
Chris@17
|
22
|
Chris@17
|
23 $this->assertEquals(
|
Chris@17
|
24 new Stmt\TraitUseAdaptation\Alias(null, 'foo', Class_::MODIFIER_PUBLIC, null),
|
Chris@17
|
25 (clone $builder)->makePublic()->getNode()
|
Chris@17
|
26 );
|
Chris@17
|
27
|
Chris@17
|
28 $this->assertEquals(
|
Chris@17
|
29 new Stmt\TraitUseAdaptation\Alias(null, 'foo', Class_::MODIFIER_PROTECTED, null),
|
Chris@17
|
30 (clone $builder)->makeProtected()->getNode()
|
Chris@17
|
31 );
|
Chris@17
|
32
|
Chris@17
|
33 $this->assertEquals(
|
Chris@17
|
34 new Stmt\TraitUseAdaptation\Alias(null, 'foo', Class_::MODIFIER_PRIVATE, null),
|
Chris@17
|
35 (clone $builder)->makePrivate()->getNode()
|
Chris@17
|
36 );
|
Chris@17
|
37 }
|
Chris@17
|
38
|
Chris@17
|
39 public function testInsteadof() {
|
Chris@17
|
40 $node = $this->createTraitUseAdaptationBuilder('SomeTrait', 'foo')
|
Chris@17
|
41 ->insteadof('AnotherTrait')
|
Chris@17
|
42 ->getNode()
|
Chris@17
|
43 ;
|
Chris@17
|
44
|
Chris@17
|
45 $this->assertEquals(
|
Chris@17
|
46 new Stmt\TraitUseAdaptation\Precedence(
|
Chris@17
|
47 new Name('SomeTrait'),
|
Chris@17
|
48 'foo',
|
Chris@17
|
49 [new Name('AnotherTrait')]
|
Chris@17
|
50 ),
|
Chris@17
|
51 $node
|
Chris@17
|
52 );
|
Chris@17
|
53 }
|
Chris@17
|
54
|
Chris@17
|
55 public function testAsOnNotAlias() {
|
Chris@17
|
56 $this->expectException(\LogicException::class);
|
Chris@17
|
57 $this->expectExceptionMessage('Cannot set alias for not alias adaptation buider');
|
Chris@17
|
58 $this->createTraitUseAdaptationBuilder('Test', 'foo')
|
Chris@17
|
59 ->insteadof('AnotherTrait')
|
Chris@17
|
60 ->as('bar')
|
Chris@17
|
61 ;
|
Chris@17
|
62 }
|
Chris@17
|
63
|
Chris@17
|
64 public function testInsteadofOnNotPrecedence() {
|
Chris@17
|
65 $this->expectException(\LogicException::class);
|
Chris@17
|
66 $this->expectExceptionMessage('Cannot add overwritten traits for not precedence adaptation buider');
|
Chris@17
|
67 $this->createTraitUseAdaptationBuilder('Test', 'foo')
|
Chris@17
|
68 ->as('bar')
|
Chris@17
|
69 ->insteadof('AnotherTrait')
|
Chris@17
|
70 ;
|
Chris@17
|
71 }
|
Chris@17
|
72
|
Chris@17
|
73 public function testInsteadofWithoutTrait() {
|
Chris@17
|
74 $this->expectException(\LogicException::class);
|
Chris@17
|
75 $this->expectExceptionMessage('Precedence adaptation must have trait');
|
Chris@17
|
76 $this->createTraitUseAdaptationBuilder(null, 'foo')
|
Chris@17
|
77 ->insteadof('AnotherTrait')
|
Chris@17
|
78 ;
|
Chris@17
|
79 }
|
Chris@17
|
80
|
Chris@17
|
81 public function testMakeOnNotAlias() {
|
Chris@17
|
82 $this->expectException(\LogicException::class);
|
Chris@17
|
83 $this->expectExceptionMessage('Cannot set access modifier for not alias adaptation buider');
|
Chris@17
|
84 $this->createTraitUseAdaptationBuilder('Test', 'foo')
|
Chris@17
|
85 ->insteadof('AnotherTrait')
|
Chris@17
|
86 ->makePublic()
|
Chris@17
|
87 ;
|
Chris@17
|
88 }
|
Chris@17
|
89
|
Chris@17
|
90 public function testMultipleMake() {
|
Chris@17
|
91 $this->expectException(\LogicException::class);
|
Chris@17
|
92 $this->expectExceptionMessage('Multiple access type modifiers are not allowed');
|
Chris@17
|
93 $this->createTraitUseAdaptationBuilder(null, 'foo')
|
Chris@17
|
94 ->makePrivate()
|
Chris@17
|
95 ->makePublic()
|
Chris@17
|
96 ;
|
Chris@17
|
97 }
|
Chris@17
|
98
|
Chris@17
|
99 public function testUndefinedType() {
|
Chris@17
|
100 $this->expectException(\LogicException::class);
|
Chris@17
|
101 $this->expectExceptionMessage('Type of adaptation is not defined');
|
Chris@17
|
102 $this->createTraitUseAdaptationBuilder(null, 'foo')
|
Chris@17
|
103 ->getNode()
|
Chris@17
|
104 ;
|
Chris@17
|
105 }
|
Chris@17
|
106 }
|