4 * This file is part of Psy Shell.
6 * (c) 2012-2018 Justin Hileman
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
16 class ContextTest extends \PHPUnit\Framework\TestCase
18 public function testGet()
20 $this->assertTrue(true);
23 public function testGetAll()
25 $this->assertTrue(true);
28 public function testGetSpecialVariables()
30 $context = new Context();
32 $this->assertNull($context->get('_'));
33 $this->assertNull($context->getReturnValue());
35 $this->assertEquals(['_' => null], $context->getAll());
37 $e = new \Exception('eeeeeee');
38 $obj = new \StdClass();
39 $context->setLastException($e);
40 $context->setLastStdout('out');
41 $context->setBoundObject($obj);
43 $context->setCommandScopeVariables([
44 '__function' => 'function',
45 '__method' => 'method',
47 '__namespace' => 'namespace',
58 '__function' => 'function',
59 '__method' => 'method',
61 '__namespace' => 'namespace',
67 $this->assertEquals($expected, $context->getAll());
70 public function testSetAll()
72 $context = new Context();
74 $baz = new \StdClass();
84 '__psysh__' => 'fail',
86 '__function' => 'fail',
89 '__namespace' => 'fail',
95 $context->setAll($vars);
97 $this->assertEquals('Foo', $context->get('foo'));
98 $this->assertEquals(123, $context->get('bar'));
99 $this->assertSame($baz, $context->get('baz'));
101 $this->assertEquals(['foo' => 'Foo', 'bar' => 123, 'baz' => $baz, '_' => null], $context->getAll());
105 * @dataProvider specialNames
106 * @expectedException \InvalidArgumentException
107 * @expectedExceptionMessageRegEx /Unknown variable: \$\w+/
109 public function testSetAllDoesNotSetSpecial($name)
111 $context = new Context();
112 $context->setAll([$name => 'fail']);
113 $context->get($name);
116 public function specialNames()
133 public function testReturnValue()
135 $context = new Context();
136 $this->assertNull($context->getReturnValue());
138 $val = 'some string';
139 $context->setReturnValue($val);
140 $this->assertEquals($val, $context->getReturnValue());
141 $this->assertEquals($val, $context->get('_'));
143 $obj = new \StdClass();
144 $context->setReturnValue($obj);
145 $this->assertSame($obj, $context->getReturnValue());
146 $this->assertSame($obj, $context->get('_'));
148 $context->setReturnValue(null);
149 $this->assertNull($context->getReturnValue());
152 public function testLastException()
154 $context = new Context();
155 $e = new \Exception('wat');
156 $context->setLastException($e);
157 $this->assertSame($e, $context->getLastException());
158 $this->assertSame($e, $context->get('_e'));
162 * @expectedException \InvalidArgumentException
163 * @expectedExceptionMessage No most-recent exception
165 public function testLastExceptionThrowsSometimes()
167 $context = new Context();
168 $context->getLastException();
171 public function testLastStdout()
173 $context = new Context();
174 $context->setLastStdout('ouuuuut');
175 $this->assertEquals('ouuuuut', $context->getLastStdout());
176 $this->assertEquals('ouuuuut', $context->get('__out'));
180 * @expectedException \InvalidArgumentException
181 * @expectedExceptionMessage No most-recent output
183 public function testLastStdoutThrowsSometimes()
185 $context = new Context();
186 $context->getLastStdout();
189 public function testBoundObject()
191 $context = new Context();
192 $this->assertNull($context->getBoundObject());
194 $obj = new \StdClass();
195 $context->setBoundObject($obj);
196 $this->assertSame($obj, $context->getBoundObject());
197 $this->assertSame($obj, $context->get('this'));
199 $context->setBoundObject(null);
200 $this->assertNull($context->getBoundObject());
204 * @expectedException \InvalidArgumentException
205 * @expectedExceptionMessage Unknown variable: $this
207 public function testBoundObjectThrowsSometimes()
209 $context = new Context();
210 $context->get('this');
213 public function testBoundClass()
215 $context = new Context();
216 $this->assertNull($context->getBoundClass());
218 $context->setBoundClass('');
219 $this->assertNull($context->getBoundClass());
221 $context->setBoundClass('Psy\Shell');
222 $this->assertEquals('Psy\Shell', $context->getBoundClass());
224 $context->setBoundObject(new \StdClass());
225 $this->assertNotNull($context->getBoundObject());
226 $this->assertNull($context->getBoundClass());
228 $context->setBoundClass('Psy\Shell');
229 $this->assertEquals('Psy\Shell', $context->getBoundClass());
230 $this->assertNull($context->getBoundObject());
232 $context->setBoundClass(null);
233 $this->assertNull($context->getBoundClass());
234 $this->assertNull($context->getBoundObject());
237 public function testCommandScopeVariables()
239 $__function = 'donkey';
242 $__namespace = 'funky';
247 $vars = compact('__function', '__method', '__class', '__namespace', '__file', '__line', '__dir');
249 $context = new Context();
250 $context->setCommandScopeVariables($vars);
252 $this->assertEquals($vars, $context->getCommandScopeVariables());
254 $this->assertEquals($__function, $context->get('__function'));
255 $this->assertEquals($__method, $context->get('__method'));
256 $this->assertEquals($__class, $context->get('__class'));
257 $this->assertEquals($__namespace, $context->get('__namespace'));
258 $this->assertEquals($__file, $context->get('__file'));
259 $this->assertEquals($__line, $context->get('__line'));
260 $this->assertEquals($__dir, $context->get('__dir'));
262 $someVars = compact('__function', '__namespace', '__file', '__line', '__dir');
263 $context->setCommandScopeVariables($someVars);
266 public function testGetUnusedCommandScopeVariableNames()
268 $context = new Context();
271 ['__function', '__method', '__class', '__namespace', '__file', '__line', '__dir'],
272 $context->getUnusedCommandScopeVariableNames()
275 $context->setCommandScopeVariables([
276 '__function' => 'foo',
277 '__namespace' => 'bar',
284 ['__method', '__class'],
285 array_values($context->getUnusedCommandScopeVariableNames())
290 * @dataProvider specialAndNotSpecialVariableNames
292 public function testIsSpecialVariableName($name, $isSpecial)
294 $context = new Context();
297 $this->assertTrue($context->isSpecialVariableName($name));
299 $this->assertFalse($context->isSpecialVariableName($name));
303 public function specialAndNotSpecialVariableNames()
316 ['__function', true],
319 ['__namespace', true],