<?php
namespace WebPower\LuaSandbox\Tests;
use WebPower\LuaSandbox\LuaSandbox;
use WebPower\LuaSandbox\LuaGlobals;
class LuaSandboxTest extends \PHPUnit_Framework_TestCase
{
/**
* @var LuaSandbox
*/
public $obj;
protected function setUp()
{
$this->obj = new LuaSandbox();
}
/**
* @expectedException WebPower\LuaSandbox\LuaErrorException
*/
function testInvalidLuaThrowsException()
{
$lua = <<<CODE
callUnExistingFunction();
CODE;
$this->obj->run($lua);
}
function testValidLua()
{
$res = $this->obj->run(<<<CODE
return 10 * 2;
CODE
);
$this->assertEquals(20, $res);
}
/**
* @expectedException \InvalidArgumentException
*/
function testNonExistingFile()
{
$this->obj->runFile('NonExistingFile');
}
function testValidFile()
{
$res = $this->obj->runFile(__DIR__.'/dumpGlobals.lua');
$this->assertInternalType('array', $res);
}
function testUnset()
{
$unsetKeys = array(
'dofile',
'loadfile',
'module',
'require',
'coroutine',
'debug',
'file',
'io',
'os',
'package',
);
$this->obj->unsetVar($unsetKeys);
$globals = $this->obj->run(<<<CODE
local names = {}
for name, val in pairs(_G) do
table.insert(names, name)
end
table.sort(names)
return names
CODE
);
$luaGlobals = LuaGlobals::getGlobals();
$luaGlobals = array_flip($luaGlobals);
foreach ($luaGlobals as $key => $i) {
$luaGlobals[$key] = !in_array($key, $unsetKeys);
}
$luaGlobals = array_filter($luaGlobals);
$luaGlobals = array_keys($luaGlobals);
$this->assertEquals(
$luaGlobals,
array_values($globals)
);
}
/**
* @expectedException WebPower\LuaSandbox\LuaErrorException
*/
function testAssertThrowsException()
{
$this->setExpectedException('\WebPower\LuaSandbox\LuaErrorException');
$this->obj->run(<<<CODE
assert(false, 'Assertion failed')
CODE
);
}
/**
* @expectedException WebPower\LuaSandbox\LuaErrorException
*/
function testErrorThrowsException()
{
$this->obj->run(<<<CODE
error('Some error')
CODE
);
}
function testPhpCallbackFunction()
{
$args = false;
$this->obj->assignCallable('doSomething', function() use(&$args) {
$args = func_get_args();
});
$this->obj->run(<<<CODE
doSomething(1, 3, 3, 7, {1, 3, 3, 7})
CODE
);
$this->assertEquals(
array(
1, 3, 3, 7,
array(1=> 1, 3, 3, 7)
),
$args
);
}
/**
* @expectedException \InvalidArgumentException
*/
function testNonFunctionCallback()
{
$this->obj->assignCallable('abc', 123);
}
/**
* @expectedException WebPower\LuaSandbox\Exception
*/
function testInvalidCallbackName()
{
$this->obj->assignCallable('0abc', function() {});
}
function testVariables()
{
$this->obj->assignVar('valueFromPhp', 1337);
$val = $this->obj->run(<<<CODE
return valueFromPhp
CODE
);
$this->assertEquals(1337, $val);
}
/**
* @expectedException WebPower\LuaSandbox\InvalidVariableNameException
*/
function testInvalidVariableName()
{
$this->setExpectedException('WebPower\LuaSandbox\Exception');
$this->obj->assignVar('0abc', 1337);
}
/**
* @expectedException WebPower\LuaSandbox\Exception
*/
function testInvalidVariableValue()
{
$this->obj->assignVar('testFunc', function($a, $b) { return $a + $b; });
}
/**
* @expectedException WebPower\LuaSandbox\InvalidVariableNameException
*/
function testReservedKeywordVariable()
{
$this->obj->assignVar('break', 'test');
}
function testAssigningObject()
{
$obj = new \ArrayObject(array());
$this->obj->assignObject('myArray', $obj);
$this->obj->run('myArray.append(10)');
$this->assertEquals(1, count($obj));
$this->assertEquals(10, $obj[0]);
$obj->testProperty = 'hoi';
$res = $this->obj->run('return myArray.testProperty');
$this->assertEquals('hoi', $res);
$this->obj->run('myArray.testProperty = 123');
$this->assertEquals(123, $obj->testProperty);
}
function testCallingLuaFunction()
{
$this->obj->run('function testFunc(a, b) return a + b end');
$res = $this->obj->call('testFunc', array(1, 2));
$this->assertEquals(3, $res);
}
/**
* @expectedException \WebPower\LuaSandbox\Exception
*/
function testCallingNonexistingLuaFunction()
{
$this->obj->call('nonexistingFunction');
}
/**
* @expectedException \WebPower\LuaSandbox\InvalidVariableNameException
*/
function testCallingInvalidLuaFunction()
{
$this->obj->call('023_asb');
}
}
|