__DIR__ . '/SandboxTests.lua', ); } public function testArgumentParsingTime() { $engine = $this->getEngine(); if ( !is_callable( array( $engine->getInterpreter()->sandbox, 'pauseUsageTimer' ) ) ) { $this->markTestSkipped( "LuaSandbox::pauseUsageTimer is not available" ); } $parser = $engine->getParser(); $pp = $parser->getPreprocessor(); $frame = $pp->newFrame(); $parser->setHook( 'scribuntodelay', function () { $t = microtime( 1 ) + 0.5; while ( microtime( 1 ) < $t ) { # Waste CPU cycles } return "ok"; } ); $this->extraModules['Module:TestArgumentParsingTime'] = ' return { f = function ( frame ) return frame.args[1] end, f2 = function ( frame ) return frame:preprocess( "{{#invoke:TestArgumentParsingTime|f|}}" ) end, f3 = function ( frame ) return frame:preprocess( "{{#invoke:TestArgumentParsingTime|f|}}" ) end, } '; $u0 = $engine->getInterpreter()->getCPUUsage(); $frame->expand( $pp->preprocessToObj( '{{#invoke:TestArgumentParsingTime|f|}}' ) ); $this->assertLessThan( 0.25, $engine->getInterpreter()->getCPUUsage() - $u0, 'Argument access time was not counted' ); $u0 = $engine->getInterpreter()->getCPUUsage(); $frame->expand( $pp->preprocessToObj( '{{#invoke:TestArgumentParsingTime|f2|}}' ) ); $this->assertLessThan( 0.25, $engine->getInterpreter()->getCPUUsage() - $u0, 'Unused arguments not counted in preprocess' ); $u0 = $engine->getInterpreter()->getCPUUsage(); $frame->expand( $pp->preprocessToObj( '{{#invoke:TestArgumentParsingTime|f3}}' ) ); $this->assertGreaterThan( 0.25, $engine->getInterpreter()->getCPUUsage() - $u0, 'Recursive argument access time was counted' ); } }