d33189212ebec4f678f3c5233a71cff65105fc6b
[yaffs-website] / vendor / nikic / php-parser / test / PhpParser / Builder / ParamTest.php
1 <?php declare(strict_types=1);
2
3 namespace PhpParser\Builder;
4
5 use PhpParser\Node;
6 use PhpParser\Node\Expr;
7 use PhpParser\Node\Scalar;
8 use PHPUnit\Framework\TestCase;
9
10 class ParamTest extends TestCase
11 {
12     public function createParamBuilder($name) {
13         return new Param($name);
14     }
15
16     /**
17      * @dataProvider provideTestDefaultValues
18      */
19     public function testDefaultValues($value, $expectedValueNode) {
20         $node = $this->createParamBuilder('test')
21             ->setDefault($value)
22             ->getNode()
23         ;
24
25         $this->assertEquals($expectedValueNode, $node->default);
26     }
27
28     public function provideTestDefaultValues() {
29         return [
30             [
31                 null,
32                 new Expr\ConstFetch(new Node\Name('null'))
33             ],
34             [
35                 true,
36                 new Expr\ConstFetch(new Node\Name('true'))
37             ],
38             [
39                 false,
40                 new Expr\ConstFetch(new Node\Name('false'))
41             ],
42             [
43                 31415,
44                 new Scalar\LNumber(31415)
45             ],
46             [
47                 3.1415,
48                 new Scalar\DNumber(3.1415)
49             ],
50             [
51                 'Hallo World',
52                 new Scalar\String_('Hallo World')
53             ],
54             [
55                 [1, 2, 3],
56                 new Expr\Array_([
57                     new Expr\ArrayItem(new Scalar\LNumber(1)),
58                     new Expr\ArrayItem(new Scalar\LNumber(2)),
59                     new Expr\ArrayItem(new Scalar\LNumber(3)),
60                 ])
61             ],
62             [
63                 ['foo' => 'bar', 'bar' => 'foo'],
64                 new Expr\Array_([
65                     new Expr\ArrayItem(
66                         new Scalar\String_('bar'),
67                         new Scalar\String_('foo')
68                     ),
69                     new Expr\ArrayItem(
70                         new Scalar\String_('foo'),
71                         new Scalar\String_('bar')
72                     ),
73                 ])
74             ],
75             [
76                 new Scalar\MagicConst\Dir,
77                 new Scalar\MagicConst\Dir
78             ]
79         ];
80     }
81
82     /**
83      * @dataProvider provideTestTypeHints
84      */
85     public function testTypeHints($typeHint, $expectedType) {
86         $node = $this->createParamBuilder('test')
87             ->setTypeHint($typeHint)
88             ->getNode()
89         ;
90         $type = $node->type;
91
92         /* Manually implement comparison to avoid __toString stupidity */
93         if ($expectedType instanceof Node\NullableType) {
94             $this->assertInstanceOf(get_class($expectedType), $type);
95             $expectedType = $expectedType->type;
96             $type = $type->type;
97         }
98
99         $this->assertInstanceOf(get_class($expectedType), $type);
100         $this->assertEquals($expectedType, $type);
101     }
102
103     public function provideTestTypeHints() {
104         return [
105             ['array', new Node\Identifier('array')],
106             ['callable', new Node\Identifier('callable')],
107             ['bool', new Node\Identifier('bool')],
108             ['int', new Node\Identifier('int')],
109             ['float', new Node\Identifier('float')],
110             ['string', new Node\Identifier('string')],
111             ['iterable', new Node\Identifier('iterable')],
112             ['object', new Node\Identifier('object')],
113             ['Array', new Node\Identifier('array')],
114             ['CALLABLE', new Node\Identifier('callable')],
115             ['Some\Class', new Node\Name('Some\Class')],
116             ['\Foo', new Node\Name\FullyQualified('Foo')],
117             ['self', new Node\Name('self')],
118             ['?array', new Node\NullableType(new Node\Identifier('array'))],
119             ['?Some\Class', new Node\NullableType(new Node\Name('Some\Class'))],
120             [new Node\Name('Some\Class'), new Node\Name('Some\Class')],
121             [
122                 new Node\NullableType(new Node\Identifier('int')),
123                 new Node\NullableType(new Node\Identifier('int'))
124             ],
125             [
126                 new Node\NullableType(new Node\Name('Some\Class')),
127                 new Node\NullableType(new Node\Name('Some\Class'))
128             ],
129         ];
130     }
131
132     /**
133      * @expectedException \LogicException
134      * @expectedExceptionMessage Parameter type cannot be void
135      */
136     public function testVoidTypeError() {
137         $this->createParamBuilder('test')->setTypeHint('void');
138     }
139
140     /**
141      * @expectedException \LogicException
142      * @expectedExceptionMessage Type must be a string, or an instance of Name, Identifier or NullableType
143      */
144     public function testInvalidTypeError() {
145         $this->createParamBuilder('test')->setTypeHint(new \stdClass);
146     }
147
148     public function testByRef() {
149         $node = $this->createParamBuilder('test')
150             ->makeByRef()
151             ->getNode()
152         ;
153
154         $this->assertEquals(
155             new Node\Param(new Expr\Variable('test'), null, null, true),
156             $node
157         );
158     }
159
160     public function testVariadic() {
161         $node = $this->createParamBuilder('test')
162             ->makeVariadic()
163             ->getNode()
164         ;
165
166         $this->assertEquals(
167             new Node\Param(new Expr\Variable('test'), null, null, false, true),
168             $node
169         );
170     }
171 }