Chris@16
|
1 <?php
|
Chris@16
|
2
|
Chris@16
|
3 /*
|
Chris@16
|
4 * This file is part of Psy Shell.
|
Chris@16
|
5 *
|
Chris@16
|
6 * (c) 2012-2018 Justin Hileman
|
Chris@16
|
7 *
|
Chris@16
|
8 * For the full copyright and license information, please view the LICENSE
|
Chris@16
|
9 * file that was distributed with this source code.
|
Chris@16
|
10 */
|
Chris@16
|
11
|
Chris@16
|
12 namespace Psy\Test;
|
Chris@16
|
13
|
Chris@16
|
14 use Psy\Context;
|
Chris@16
|
15
|
Chris@16
|
16 class ContextTest extends \PHPUnit\Framework\TestCase
|
Chris@16
|
17 {
|
Chris@16
|
18 public function testGet()
|
Chris@16
|
19 {
|
Chris@16
|
20 $this->assertTrue(true);
|
Chris@16
|
21 }
|
Chris@16
|
22
|
Chris@16
|
23 public function testGetAll()
|
Chris@16
|
24 {
|
Chris@16
|
25 $this->assertTrue(true);
|
Chris@16
|
26 }
|
Chris@16
|
27
|
Chris@16
|
28 public function testGetSpecialVariables()
|
Chris@16
|
29 {
|
Chris@16
|
30 $context = new Context();
|
Chris@16
|
31
|
Chris@16
|
32 $this->assertNull($context->get('_'));
|
Chris@16
|
33 $this->assertNull($context->getReturnValue());
|
Chris@16
|
34
|
Chris@16
|
35 $this->assertEquals(['_' => null], $context->getAll());
|
Chris@16
|
36
|
Chris@16
|
37 $e = new \Exception('eeeeeee');
|
Chris@16
|
38 $obj = new \StdClass();
|
Chris@16
|
39 $context->setLastException($e);
|
Chris@16
|
40 $context->setLastStdout('out');
|
Chris@16
|
41 $context->setBoundObject($obj);
|
Chris@16
|
42
|
Chris@16
|
43 $context->setCommandScopeVariables([
|
Chris@16
|
44 '__function' => 'function',
|
Chris@16
|
45 '__method' => 'method',
|
Chris@16
|
46 '__class' => 'class',
|
Chris@16
|
47 '__namespace' => 'namespace',
|
Chris@16
|
48 '__file' => 'file',
|
Chris@16
|
49 '__line' => 'line',
|
Chris@16
|
50 '__dir' => 'dir',
|
Chris@16
|
51 ]);
|
Chris@16
|
52
|
Chris@16
|
53 $expected = [
|
Chris@16
|
54 '_' => null,
|
Chris@16
|
55 '_e' => $e,
|
Chris@16
|
56 '__out' => 'out',
|
Chris@16
|
57 'this' => $obj,
|
Chris@16
|
58 '__function' => 'function',
|
Chris@16
|
59 '__method' => 'method',
|
Chris@16
|
60 '__class' => 'class',
|
Chris@16
|
61 '__namespace' => 'namespace',
|
Chris@16
|
62 '__file' => 'file',
|
Chris@16
|
63 '__line' => 'line',
|
Chris@16
|
64 '__dir' => 'dir',
|
Chris@16
|
65 ];
|
Chris@16
|
66
|
Chris@16
|
67 $this->assertEquals($expected, $context->getAll());
|
Chris@16
|
68 }
|
Chris@16
|
69
|
Chris@16
|
70 public function testSetAll()
|
Chris@16
|
71 {
|
Chris@16
|
72 $context = new Context();
|
Chris@16
|
73
|
Chris@16
|
74 $baz = new \StdClass();
|
Chris@16
|
75 $vars = [
|
Chris@16
|
76 'foo' => 'Foo',
|
Chris@16
|
77 'bar' => 123,
|
Chris@16
|
78 'baz' => $baz,
|
Chris@16
|
79
|
Chris@16
|
80 '_' => 'fail',
|
Chris@16
|
81 '_e' => 'fail',
|
Chris@16
|
82 '__out' => 'fail',
|
Chris@16
|
83 'this' => 'fail',
|
Chris@16
|
84 '__psysh__' => 'fail',
|
Chris@16
|
85
|
Chris@16
|
86 '__function' => 'fail',
|
Chris@16
|
87 '__method' => 'fail',
|
Chris@16
|
88 '__class' => 'fail',
|
Chris@16
|
89 '__namespace' => 'fail',
|
Chris@16
|
90 '__file' => 'fail',
|
Chris@16
|
91 '__line' => 'fail',
|
Chris@16
|
92 '__dir' => 'fail',
|
Chris@16
|
93 ];
|
Chris@16
|
94
|
Chris@16
|
95 $context->setAll($vars);
|
Chris@16
|
96
|
Chris@16
|
97 $this->assertEquals('Foo', $context->get('foo'));
|
Chris@16
|
98 $this->assertEquals(123, $context->get('bar'));
|
Chris@16
|
99 $this->assertSame($baz, $context->get('baz'));
|
Chris@16
|
100
|
Chris@16
|
101 $this->assertEquals(['foo' => 'Foo', 'bar' => 123, 'baz' => $baz, '_' => null], $context->getAll());
|
Chris@16
|
102 }
|
Chris@16
|
103
|
Chris@16
|
104 /**
|
Chris@16
|
105 * @dataProvider specialNames
|
Chris@16
|
106 * @expectedException \InvalidArgumentException
|
Chris@16
|
107 * @expectedExceptionMessageRegEx /Unknown variable: \$\w+/
|
Chris@16
|
108 */
|
Chris@16
|
109 public function testSetAllDoesNotSetSpecial($name)
|
Chris@16
|
110 {
|
Chris@16
|
111 $context = new Context();
|
Chris@16
|
112 $context->setAll([$name => 'fail']);
|
Chris@16
|
113 $context->get($name);
|
Chris@16
|
114 }
|
Chris@16
|
115
|
Chris@16
|
116 public function specialNames()
|
Chris@16
|
117 {
|
Chris@16
|
118 return [
|
Chris@16
|
119 ['_e'],
|
Chris@16
|
120 ['__out'],
|
Chris@16
|
121 ['this'],
|
Chris@16
|
122 ['__psysh__'],
|
Chris@16
|
123 ['__function'],
|
Chris@16
|
124 ['__method'],
|
Chris@16
|
125 ['__class'],
|
Chris@16
|
126 ['__namespace'],
|
Chris@16
|
127 ['__file'],
|
Chris@16
|
128 ['__line'],
|
Chris@16
|
129 ['__dir'],
|
Chris@16
|
130 ];
|
Chris@16
|
131 }
|
Chris@16
|
132
|
Chris@16
|
133 public function testReturnValue()
|
Chris@16
|
134 {
|
Chris@16
|
135 $context = new Context();
|
Chris@16
|
136 $this->assertNull($context->getReturnValue());
|
Chris@16
|
137
|
Chris@16
|
138 $val = 'some string';
|
Chris@16
|
139 $context->setReturnValue($val);
|
Chris@16
|
140 $this->assertEquals($val, $context->getReturnValue());
|
Chris@16
|
141 $this->assertEquals($val, $context->get('_'));
|
Chris@16
|
142
|
Chris@16
|
143 $obj = new \StdClass();
|
Chris@16
|
144 $context->setReturnValue($obj);
|
Chris@16
|
145 $this->assertSame($obj, $context->getReturnValue());
|
Chris@16
|
146 $this->assertSame($obj, $context->get('_'));
|
Chris@16
|
147
|
Chris@16
|
148 $context->setReturnValue(null);
|
Chris@16
|
149 $this->assertNull($context->getReturnValue());
|
Chris@16
|
150 }
|
Chris@16
|
151
|
Chris@16
|
152 public function testLastException()
|
Chris@16
|
153 {
|
Chris@16
|
154 $context = new Context();
|
Chris@16
|
155 $e = new \Exception('wat');
|
Chris@16
|
156 $context->setLastException($e);
|
Chris@16
|
157 $this->assertSame($e, $context->getLastException());
|
Chris@16
|
158 $this->assertSame($e, $context->get('_e'));
|
Chris@16
|
159 }
|
Chris@16
|
160
|
Chris@16
|
161 /**
|
Chris@16
|
162 * @expectedException \InvalidArgumentException
|
Chris@16
|
163 * @expectedExceptionMessage No most-recent exception
|
Chris@16
|
164 */
|
Chris@16
|
165 public function testLastExceptionThrowsSometimes()
|
Chris@16
|
166 {
|
Chris@16
|
167 $context = new Context();
|
Chris@16
|
168 $context->getLastException();
|
Chris@16
|
169 }
|
Chris@16
|
170
|
Chris@16
|
171 public function testLastStdout()
|
Chris@16
|
172 {
|
Chris@16
|
173 $context = new Context();
|
Chris@16
|
174 $context->setLastStdout('ouuuuut');
|
Chris@16
|
175 $this->assertEquals('ouuuuut', $context->getLastStdout());
|
Chris@16
|
176 $this->assertEquals('ouuuuut', $context->get('__out'));
|
Chris@16
|
177 }
|
Chris@16
|
178
|
Chris@16
|
179 /**
|
Chris@16
|
180 * @expectedException \InvalidArgumentException
|
Chris@16
|
181 * @expectedExceptionMessage No most-recent output
|
Chris@16
|
182 */
|
Chris@16
|
183 public function testLastStdoutThrowsSometimes()
|
Chris@16
|
184 {
|
Chris@16
|
185 $context = new Context();
|
Chris@16
|
186 $context->getLastStdout();
|
Chris@16
|
187 }
|
Chris@16
|
188
|
Chris@16
|
189 public function testBoundObject()
|
Chris@16
|
190 {
|
Chris@16
|
191 $context = new Context();
|
Chris@16
|
192 $this->assertNull($context->getBoundObject());
|
Chris@16
|
193
|
Chris@16
|
194 $obj = new \StdClass();
|
Chris@16
|
195 $context->setBoundObject($obj);
|
Chris@16
|
196 $this->assertSame($obj, $context->getBoundObject());
|
Chris@16
|
197 $this->assertSame($obj, $context->get('this'));
|
Chris@16
|
198
|
Chris@16
|
199 $context->setBoundObject(null);
|
Chris@16
|
200 $this->assertNull($context->getBoundObject());
|
Chris@16
|
201 }
|
Chris@16
|
202
|
Chris@16
|
203 /**
|
Chris@16
|
204 * @expectedException \InvalidArgumentException
|
Chris@16
|
205 * @expectedExceptionMessage Unknown variable: $this
|
Chris@16
|
206 */
|
Chris@16
|
207 public function testBoundObjectThrowsSometimes()
|
Chris@16
|
208 {
|
Chris@16
|
209 $context = new Context();
|
Chris@16
|
210 $context->get('this');
|
Chris@16
|
211 }
|
Chris@16
|
212
|
Chris@16
|
213 public function testBoundClass()
|
Chris@16
|
214 {
|
Chris@16
|
215 $context = new Context();
|
Chris@16
|
216 $this->assertNull($context->getBoundClass());
|
Chris@16
|
217
|
Chris@16
|
218 $context->setBoundClass('');
|
Chris@16
|
219 $this->assertNull($context->getBoundClass());
|
Chris@16
|
220
|
Chris@16
|
221 $context->setBoundClass('Psy\Shell');
|
Chris@16
|
222 $this->assertEquals('Psy\Shell', $context->getBoundClass());
|
Chris@16
|
223
|
Chris@16
|
224 $context->setBoundObject(new \StdClass());
|
Chris@16
|
225 $this->assertNotNull($context->getBoundObject());
|
Chris@16
|
226 $this->assertNull($context->getBoundClass());
|
Chris@16
|
227
|
Chris@16
|
228 $context->setBoundClass('Psy\Shell');
|
Chris@16
|
229 $this->assertEquals('Psy\Shell', $context->getBoundClass());
|
Chris@16
|
230 $this->assertNull($context->getBoundObject());
|
Chris@16
|
231
|
Chris@16
|
232 $context->setBoundClass(null);
|
Chris@16
|
233 $this->assertNull($context->getBoundClass());
|
Chris@16
|
234 $this->assertNull($context->getBoundObject());
|
Chris@16
|
235 }
|
Chris@16
|
236
|
Chris@16
|
237 public function testCommandScopeVariables()
|
Chris@16
|
238 {
|
Chris@16
|
239 $__function = 'donkey';
|
Chris@16
|
240 $__method = 'diddy';
|
Chris@16
|
241 $__class = 'cranky';
|
Chris@16
|
242 $__namespace = 'funky';
|
Chris@16
|
243 $__file = 'candy';
|
Chris@16
|
244 $__line = 'dixie';
|
Chris@16
|
245 $__dir = 'wrinkly';
|
Chris@16
|
246
|
Chris@17
|
247 $vars = \compact('__function', '__method', '__class', '__namespace', '__file', '__line', '__dir');
|
Chris@16
|
248
|
Chris@16
|
249 $context = new Context();
|
Chris@16
|
250 $context->setCommandScopeVariables($vars);
|
Chris@16
|
251
|
Chris@16
|
252 $this->assertEquals($vars, $context->getCommandScopeVariables());
|
Chris@16
|
253
|
Chris@16
|
254 $this->assertEquals($__function, $context->get('__function'));
|
Chris@16
|
255 $this->assertEquals($__method, $context->get('__method'));
|
Chris@16
|
256 $this->assertEquals($__class, $context->get('__class'));
|
Chris@16
|
257 $this->assertEquals($__namespace, $context->get('__namespace'));
|
Chris@16
|
258 $this->assertEquals($__file, $context->get('__file'));
|
Chris@16
|
259 $this->assertEquals($__line, $context->get('__line'));
|
Chris@16
|
260 $this->assertEquals($__dir, $context->get('__dir'));
|
Chris@16
|
261
|
Chris@17
|
262 $someVars = \compact('__function', '__namespace', '__file', '__line', '__dir');
|
Chris@16
|
263 $context->setCommandScopeVariables($someVars);
|
Chris@16
|
264 }
|
Chris@16
|
265
|
Chris@16
|
266 public function testGetUnusedCommandScopeVariableNames()
|
Chris@16
|
267 {
|
Chris@16
|
268 $context = new Context();
|
Chris@16
|
269
|
Chris@16
|
270 $this->assertEquals(
|
Chris@16
|
271 ['__function', '__method', '__class', '__namespace', '__file', '__line', '__dir'],
|
Chris@16
|
272 $context->getUnusedCommandScopeVariableNames()
|
Chris@16
|
273 );
|
Chris@16
|
274
|
Chris@16
|
275 $context->setCommandScopeVariables([
|
Chris@16
|
276 '__function' => 'foo',
|
Chris@16
|
277 '__namespace' => 'bar',
|
Chris@16
|
278 '__file' => 'baz',
|
Chris@16
|
279 '__line' => 123,
|
Chris@16
|
280 '__dir' => 'qux',
|
Chris@16
|
281 ]);
|
Chris@16
|
282
|
Chris@16
|
283 $this->assertEquals(
|
Chris@16
|
284 ['__method', '__class'],
|
Chris@17
|
285 \array_values($context->getUnusedCommandScopeVariableNames())
|
Chris@16
|
286 );
|
Chris@16
|
287 }
|
Chris@16
|
288
|
Chris@16
|
289 /**
|
Chris@16
|
290 * @dataProvider specialAndNotSpecialVariableNames
|
Chris@16
|
291 */
|
Chris@16
|
292 public function testIsSpecialVariableName($name, $isSpecial)
|
Chris@16
|
293 {
|
Chris@16
|
294 $context = new Context();
|
Chris@16
|
295
|
Chris@16
|
296 if ($isSpecial) {
|
Chris@16
|
297 $this->assertTrue($context->isSpecialVariableName($name));
|
Chris@16
|
298 } else {
|
Chris@16
|
299 $this->assertFalse($context->isSpecialVariableName($name));
|
Chris@16
|
300 }
|
Chris@16
|
301 }
|
Chris@16
|
302
|
Chris@16
|
303 public function specialAndNotSpecialVariableNames()
|
Chris@16
|
304 {
|
Chris@16
|
305 return [
|
Chris@16
|
306 ['foo', false],
|
Chris@16
|
307 ['psysh', false],
|
Chris@16
|
308 ['__psysh', false],
|
Chris@16
|
309
|
Chris@16
|
310 ['_', true],
|
Chris@16
|
311 ['_e', true],
|
Chris@16
|
312 ['__out', true],
|
Chris@16
|
313 ['this', true],
|
Chris@16
|
314 ['__psysh__', true],
|
Chris@16
|
315
|
Chris@16
|
316 ['__function', true],
|
Chris@16
|
317 ['__method', true],
|
Chris@16
|
318 ['__class', true],
|
Chris@16
|
319 ['__namespace', true],
|
Chris@16
|
320 ['__file', true],
|
Chris@16
|
321 ['__line', true],
|
Chris@16
|
322 ['__dir', true],
|
Chris@16
|
323 ];
|
Chris@16
|
324 }
|
Chris@16
|
325 }
|