326 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			326 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?php | ||
|  | 
 | ||
|  | /* | ||
|  |  * This file is part of Psy Shell. | ||
|  |  * | ||
|  |  * (c) 2012-2018 Justin Hileman | ||
|  |  * | ||
|  |  * For the full copyright and license information, please view the LICENSE | ||
|  |  * file that was distributed with this source code. | ||
|  |  */ | ||
|  | 
 | ||
|  | namespace Psy\Test; | ||
|  | 
 | ||
|  | use Psy\Context; | ||
|  | 
 | ||
|  | class ContextTest extends \PHPUnit\Framework\TestCase | ||
|  | { | ||
|  |     public function testGet() | ||
|  |     { | ||
|  |         $this->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], | ||
|  |         ]; | ||
|  |     } | ||
|  | } |