assertTrue(true); } public function testGetAll() { $this->assertTrue(true); } public function testGetSpecialVariables() { $context = new Context(); $this->assertNull($context->get('_')); $this->assertNull($context->getReturnValue()); $this->assertEquals(['_' => null], $context->getAll()); $e = new \Exception('eeeeeee'); $obj = new \StdClass(); $context->setLastException($e); $context->setLastStdout('out'); $context->setBoundObject($obj); $context->setCommandScopeVariables([ '__function' => 'function', '__method' => 'method', '__class' => 'class', '__namespace' => 'namespace', '__file' => 'file', '__line' => 'line', '__dir' => 'dir', ]); $expected = [ '_' => null, '_e' => $e, '__out' => 'out', 'this' => $obj, '__function' => 'function', '__method' => 'method', '__class' => 'class', '__namespace' => 'namespace', '__file' => 'file', '__line' => 'line', '__dir' => 'dir', ]; $this->assertEquals($expected, $context->getAll()); } public function testSetAll() { $context = new Context(); $baz = new \StdClass(); $vars = [ 'foo' => 'Foo', 'bar' => 123, 'baz' => $baz, '_' => 'fail', '_e' => 'fail', '__out' => 'fail', 'this' => 'fail', '__psysh__' => 'fail', '__function' => 'fail', '__method' => 'fail', '__class' => 'fail', '__namespace' => 'fail', '__file' => 'fail', '__line' => 'fail', '__dir' => 'fail', ]; $context->setAll($vars); $this->assertEquals('Foo', $context->get('foo')); $this->assertEquals(123, $context->get('bar')); $this->assertSame($baz, $context->get('baz')); $this->assertEquals(['foo' => 'Foo', 'bar' => 123, 'baz' => $baz, '_' => null], $context->getAll()); } /** * @dataProvider specialNames * @expectedException \InvalidArgumentException * @expectedExceptionMessageRegEx /Unknown variable: \$\w+/ */ public function testSetAllDoesNotSetSpecial($name) { $context = new Context(); $context->setAll([$name => 'fail']); $context->get($name); } public function specialNames() { return [ ['_e'], ['__out'], ['this'], ['__psysh__'], ['__function'], ['__method'], ['__class'], ['__namespace'], ['__file'], ['__line'], ['__dir'], ]; } public function testReturnValue() { $context = new Context(); $this->assertNull($context->getReturnValue()); $val = 'some string'; $context->setReturnValue($val); $this->assertEquals($val, $context->getReturnValue()); $this->assertEquals($val, $context->get('_')); $obj = new \StdClass(); $context->setReturnValue($obj); $this->assertSame($obj, $context->getReturnValue()); $this->assertSame($obj, $context->get('_')); $context->setReturnValue(null); $this->assertNull($context->getReturnValue()); } public function testLastException() { $context = new Context(); $e = new \Exception('wat'); $context->setLastException($e); $this->assertSame($e, $context->getLastException()); $this->assertSame($e, $context->get('_e')); } /** * @expectedException \InvalidArgumentException * @expectedExceptionMessage No most-recent exception */ public function testLastExceptionThrowsSometimes() { $context = new Context(); $context->getLastException(); } public function testLastStdout() { $context = new Context(); $context->setLastStdout('ouuuuut'); $this->assertEquals('ouuuuut', $context->getLastStdout()); $this->assertEquals('ouuuuut', $context->get('__out')); } /** * @expectedException \InvalidArgumentException * @expectedExceptionMessage No most-recent output */ public function testLastStdoutThrowsSometimes() { $context = new Context(); $context->getLastStdout(); } public function testBoundObject() { $context = new Context(); $this->assertNull($context->getBoundObject()); $obj = new \StdClass(); $context->setBoundObject($obj); $this->assertSame($obj, $context->getBoundObject()); $this->assertSame($obj, $context->get('this')); $context->setBoundObject(null); $this->assertNull($context->getBoundObject()); } /** * @expectedException \InvalidArgumentException * @expectedExceptionMessage Unknown variable: $this */ public function testBoundObjectThrowsSometimes() { $context = new Context(); $context->get('this'); } public function testBoundClass() { $context = new Context(); $this->assertNull($context->getBoundClass()); $context->setBoundClass(''); $this->assertNull($context->getBoundClass()); $context->setBoundClass('Psy\Shell'); $this->assertEquals('Psy\Shell', $context->getBoundClass()); $context->setBoundObject(new \StdClass()); $this->assertNotNull($context->getBoundObject()); $this->assertNull($context->getBoundClass()); $context->setBoundClass('Psy\Shell'); $this->assertEquals('Psy\Shell', $context->getBoundClass()); $this->assertNull($context->getBoundObject()); $context->setBoundClass(null); $this->assertNull($context->getBoundClass()); $this->assertNull($context->getBoundObject()); } public function testCommandScopeVariables() { $__function = 'donkey'; $__method = 'diddy'; $__class = 'cranky'; $__namespace = 'funky'; $__file = 'candy'; $__line = 'dixie'; $__dir = 'wrinkly'; $vars = \compact('__function', '__method', '__class', '__namespace', '__file', '__line', '__dir'); $context = new Context(); $context->setCommandScopeVariables($vars); $this->assertEquals($vars, $context->getCommandScopeVariables()); $this->assertEquals($__function, $context->get('__function')); $this->assertEquals($__method, $context->get('__method')); $this->assertEquals($__class, $context->get('__class')); $this->assertEquals($__namespace, $context->get('__namespace')); $this->assertEquals($__file, $context->get('__file')); $this->assertEquals($__line, $context->get('__line')); $this->assertEquals($__dir, $context->get('__dir')); $someVars = \compact('__function', '__namespace', '__file', '__line', '__dir'); $context->setCommandScopeVariables($someVars); } public function testGetUnusedCommandScopeVariableNames() { $context = new Context(); $this->assertEquals( ['__function', '__method', '__class', '__namespace', '__file', '__line', '__dir'], $context->getUnusedCommandScopeVariableNames() ); $context->setCommandScopeVariables([ '__function' => 'foo', '__namespace' => 'bar', '__file' => 'baz', '__line' => 123, '__dir' => 'qux', ]); $this->assertEquals( ['__method', '__class'], \array_values($context->getUnusedCommandScopeVariableNames()) ); } /** * @dataProvider specialAndNotSpecialVariableNames */ public function testIsSpecialVariableName($name, $isSpecial) { $context = new Context(); if ($isSpecial) { $this->assertTrue($context->isSpecialVariableName($name)); } else { $this->assertFalse($context->isSpecialVariableName($name)); } } public function specialAndNotSpecialVariableNames() { return [ ['foo', false], ['psysh', false], ['__psysh', false], ['_', true], ['_e', true], ['__out', true], ['this', true], ['__psysh__', true], ['__function', true], ['__method', true], ['__class', true], ['__namespace', true], ['__file', true], ['__line', true], ['__dir', true], ]; } }