summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/LuaEnvironmentComparisonTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/LuaEnvironmentComparisonTest.php')
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/LuaEnvironmentComparisonTest.php114
1 files changed, 114 insertions, 0 deletions
diff --git a/www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/LuaEnvironmentComparisonTest.php b/www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/LuaEnvironmentComparisonTest.php
new file mode 100644
index 00000000..64172207
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/LuaEnvironmentComparisonTest.php
@@ -0,0 +1,114 @@
+<?php
+
+/**
+ * @group Lua
+ * @group LuaSandbox
+ * @group LuaStandalone
+ */
+// @codingStandardsIgnoreLine Squiz.Classes.ValidClassName.NotCamelCaps
+class Scribunto_LuaEnvironmentComparisonTest extends MediaWikiTestCase {
+ public $sandboxOpts = [
+ 'memoryLimit' => 50000000,
+ 'cpuLimit' => 30,
+ 'allowEnvFuncs' => true,
+ ];
+ public $standaloneOpts = [
+ 'errorFile' => null,
+ 'luaPath' => null,
+ 'memoryLimit' => 50000000,
+ 'cpuLimit' => 30,
+ 'allowEnvFuncs' => true,
+ ];
+
+ protected $engines = [];
+
+ private function makeEngine( $class, $opts ) {
+ $parser = new Parser;
+ $options = new ParserOptions;
+ $options->setTemplateCallback( [ $this, 'templateCallback' ] );
+ $parser->startExternalParse( Title::newMainPage(), $options, Parser::OT_HTML, true );
+ $engine = new $class ( [ 'parser' => $parser ] + $opts );
+ $parser->scribunto_engine = $engine;
+ $engine->setTitle( $parser->getTitle() );
+ $engine->getInterpreter();
+ return $engine;
+ }
+
+ protected function setUp() {
+ parent::setUp();
+
+ try {
+ $this->engines['LuaSandbox'] = $this->makeEngine(
+ 'Scribunto_LuaSandboxEngine', $this->sandboxOpts
+ );
+ } catch ( Scribunto_LuaInterpreterNotFoundError $e ) {
+ $this->markTestSkipped( "LuaSandbox interpreter not available" );
+ return;
+ }
+
+ try {
+ $this->engines['LuaStandalone'] = $this->makeEngine(
+ 'Scribunto_LuaStandaloneEngine', $this->standaloneOpts
+ );
+ } catch ( Scribunto_LuaInterpreterNotFoundError $e ) {
+ $this->markTestSkipped( "LuaStandalone interpreter not available" );
+ return;
+ }
+ }
+
+ protected function tearDown() {
+ foreach ( $this->engines as $engine ) {
+ $engine->destroy();
+ }
+ $this->engines = [];
+ parent::tearDown();
+ }
+
+ private function getGlobalEnvironment( $engine ) {
+ static $script = <<<LUA
+ xxxseen = {}
+ function xxxGetTable( t )
+ if xxxseen[t] then
+ return 'table'
+ end
+ local ret = {}
+ xxxseen[t] = ret
+ for k, v in pairs( t ) do
+ if k ~= '_G' and string.sub( k, 1, 3 ) ~= 'xxx' then
+ if type( v ) == 'table' then
+ ret[k] = xxxGetTable( v )
+ elseif type( v ) == 'string'
+ or type( v ) == 'number'
+ or type( v ) == 'boolean'
+ or type( v ) == 'nil'
+ then
+ ret[k] = v
+ else
+ ret[k] = type( v )
+ end
+ end
+ end
+ return ret
+ end
+ return xxxGetTable( _G )
+LUA;
+ $func = $engine->getInterpreter()->loadString( $script, 'script' );
+ return $engine->getInterpreter()->callFunction( $func );
+ }
+
+ public function testGlobalEnvironment() {
+ // Grab the first engine as the "standard"
+ $firstEngine = reset( $this->engines );
+ $firstName = key( $this->engines );
+ $firstEnv = $this->getGlobalEnvironment( $firstEngine );
+
+ // Test all others against it
+ foreach ( $this->engines as $secondName => $secondEngine ) {
+ if ( $secondName !== $firstName ) {
+ $secondEnv = $this->getGlobalEnvironment( $secondEngine );
+ $this->assertEquals( $firstEnv, $secondEnv,
+ "Environments for $firstName and $secondName are not equivalent" );
+ }
+ }
+ }
+}