1<?php declare(strict_types=1); 2 3namespace PhpParser\Builder; 4 5use PhpParser\Comment; 6use PhpParser\Modifiers; 7use PhpParser\Node\Arg; 8use PhpParser\Node\Attribute; 9use PhpParser\Node\AttributeGroup; 10use PhpParser\Node\Expr; 11use PhpParser\Node\Identifier; 12use PhpParser\Node\Name; 13use PhpParser\Node\Scalar; 14use PhpParser\Node\Scalar\Int_; 15use PhpParser\Node\Stmt; 16 17class PropertyTest extends \PHPUnit\Framework\TestCase { 18 public function createPropertyBuilder($name) { 19 return new Property($name); 20 } 21 22 public function testModifiers(): void { 23 $node = $this->createPropertyBuilder('test') 24 ->makePrivate() 25 ->makeStatic() 26 ->getNode() 27 ; 28 29 $this->assertEquals( 30 new Stmt\Property( 31 Modifiers::PRIVATE | Modifiers::STATIC, 32 [ 33 new \PhpParser\Node\PropertyItem('test') 34 ] 35 ), 36 $node 37 ); 38 39 $node = $this->createPropertyBuilder('test') 40 ->makeProtected() 41 ->getNode() 42 ; 43 44 $this->assertEquals( 45 new Stmt\Property( 46 Modifiers::PROTECTED, 47 [ 48 new \PhpParser\Node\PropertyItem('test') 49 ] 50 ), 51 $node 52 ); 53 54 $node = $this->createPropertyBuilder('test') 55 ->makePublic() 56 ->getNode() 57 ; 58 59 $this->assertEquals( 60 new Stmt\Property( 61 Modifiers::PUBLIC, 62 [ 63 new \PhpParser\Node\PropertyItem('test') 64 ] 65 ), 66 $node 67 ); 68 69 $node = $this->createPropertyBuilder('test') 70 ->makeReadonly() 71 ->getNode() 72 ; 73 74 $this->assertEquals( 75 new Stmt\Property( 76 Modifiers::READONLY, 77 [ 78 new \PhpParser\Node\PropertyItem('test') 79 ] 80 ), 81 $node 82 ); 83 } 84 85 public function testDocComment(): void { 86 $node = $this->createPropertyBuilder('test') 87 ->setDocComment('/** Test */') 88 ->getNode(); 89 90 $this->assertEquals(new Stmt\Property( 91 Modifiers::PUBLIC, 92 [ 93 new \PhpParser\Node\PropertyItem('test') 94 ], 95 [ 96 'comments' => [new Comment\Doc('/** Test */')] 97 ] 98 ), $node); 99 } 100 101 /** 102 * @dataProvider provideTestDefaultValues 103 */ 104 public function testDefaultValues($value, $expectedValueNode): void { 105 $node = $this->createPropertyBuilder('test') 106 ->setDefault($value) 107 ->getNode() 108 ; 109 110 $this->assertEquals($expectedValueNode, $node->props[0]->default); 111 } 112 113 public function testAddAttribute(): void { 114 $attribute = new Attribute( 115 new Name('Attr'), 116 [new Arg(new Int_(1), false, false, [], new Identifier('name'))] 117 ); 118 $attributeGroup = new AttributeGroup([$attribute]); 119 120 $node = $this->createPropertyBuilder('test') 121 ->addAttribute($attributeGroup) 122 ->getNode() 123 ; 124 125 $this->assertEquals( 126 new Stmt\Property( 127 Modifiers::PUBLIC, 128 [ 129 new \PhpParser\Node\PropertyItem('test') 130 ], 131 [], 132 null, 133 [$attributeGroup] 134 ), 135 $node 136 ); 137 } 138 139 public static function provideTestDefaultValues() { 140 return [ 141 [ 142 null, 143 new Expr\ConstFetch(new Name('null')) 144 ], 145 [ 146 true, 147 new Expr\ConstFetch(new Name('true')) 148 ], 149 [ 150 false, 151 new Expr\ConstFetch(new Name('false')) 152 ], 153 [ 154 31415, 155 new Scalar\Int_(31415) 156 ], 157 [ 158 3.1415, 159 new Scalar\Float_(3.1415) 160 ], 161 [ 162 'Hallo World', 163 new Scalar\String_('Hallo World') 164 ], 165 [ 166 [1, 2, 3], 167 new Expr\Array_([ 168 new \PhpParser\Node\ArrayItem(new Scalar\Int_(1)), 169 new \PhpParser\Node\ArrayItem(new Scalar\Int_(2)), 170 new \PhpParser\Node\ArrayItem(new Scalar\Int_(3)), 171 ]) 172 ], 173 [ 174 ['foo' => 'bar', 'bar' => 'foo'], 175 new Expr\Array_([ 176 new \PhpParser\Node\ArrayItem( 177 new Scalar\String_('bar'), 178 new Scalar\String_('foo') 179 ), 180 new \PhpParser\Node\ArrayItem( 181 new Scalar\String_('foo'), 182 new Scalar\String_('bar') 183 ), 184 ]) 185 ], 186 [ 187 new Scalar\MagicConst\Dir(), 188 new Scalar\MagicConst\Dir() 189 ] 190 ]; 191 } 192} 193