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],
|
||
|
];
|
||
|
}
|
||
|
}
|