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