*/
interface ITestRecorder {
- /** Called at beginning of the parser test run */
+ /**
+ * Called at beginning of the parser test run
+ */
public function start();
- /** Called after each test */
+ /**
+ * Called after each test
+ * @param string $test
+ * @param bool $result
+ */
public function record( $test, $result );
- /** Called before finishing the test run */
+ /**
+ * Called before finishing the test run
+ */
public function report();
- /** Called at the end of the parser test run */
+ /**
+ * Called at the end of the parser test run
+ */
public function end();
}
class TestRecorder implements ITestRecorder {
- var $parent;
- var $term;
+ public $parent;
+ public $term;
function __construct( $parent ) {
$this->parent = $parent;
/**
* This should be called before the table prefix is changed
+ * @param TestRecorder $parent
*/
function __construct( $parent ) {
parent::__construct( $parent );
* Returns a string giving information about when a test last had a status change.
* Could help to track down when regressions were introduced, as distinct from tests
* which have never passed (which are more change requests than regressions).
+ * @param string $testname
+ * @param string $after
+ * @return string
*/
private function getTestStatusInfo( $testname, $after ) {
// If we're looking at a test that has just been removed, then say when it first appeared.
}
class DbTestRecorder extends DbTestPreviewer {
- var $version;
+ public $version;
/**
* Set up result recording; insert a record for the run with the date
$input = $this->checkSection( array( 'wikitext', 'input' ), false );
$result = $this->checkSection( array( 'html/php', 'html/*', 'html', 'result' ), false );
// some tests have "with tidy" and "without tidy" variants
- $tidy = $this->checkSection( array( 'html/php+tidy', 'html+tidy'), false );
+ $tidy = $this->checkSection( array( 'html/php+tidy', 'html+tidy' ), false );
if ( $tidy != false ) {
if ( $this->nextSubTest == 0 ) {
if ( $result != false ) {
$hooksResult = $this->delayedParserTest->unleash( $this->parserTest );
if ( !$hooksResult ) {
# Some hook reported an issue. Abort.
- throw new MWException( "Problem running hook" );
+ throw new MWException( "Problem running requested parser hook from the test file" );
}
$this->test = array(
function readNextTest() {
# Run additional subtests of previous test
- while ( $this->nextSubTest > 0 )
- if ( $this->setupCurrentTest() )
+ while ( $this->nextSubTest > 0 ) {
+ if ( $this->setupCurrentTest() ) {
return true;
+ }
+ }
$this->clearSection();
# Reset hooks for the delayed test object
$line = trim( $line );
if ( $line ) {
- $delayedParserTest->requireTransparentHook( $line );
+ $this->delayedParserTest->requireTransparentHook( $line );
}
}
if ( $this->section == 'end' ) {
$this->checkSection( 'test' );
do {
- if ( $this->setupCurrentTest() )
+ if ( $this->setupCurrentTest() ) {
return true;
+ }
} while ( $this->nextSubTest > 0 );
# go on to next test (since this was disabled)
$this->clearSection();
* mentioned before closing this section
* @param bool $fatal True iff an exception should be thrown if
* the section is not found.
+ * @return bool|string
+ * @throws MWException
*/
private function checkSection( $tokens, $fatal = true ) {
if ( is_null( $this->section ) ) {
* Called whenever we actually want to run the hook.
* Should be the case if we found the parserTest is not disabled
* @param ParserTest|NewParserTest $parserTest
+ * @return bool
+ * @throws MWException
*/
public function unleash( &$parserTest ) {
- if ( !( $parserTest instanceof ParserTest || $parserTest instanceof NewParserTest ) ) {
+ if ( !( $parserTest instanceof ParserTest || $parserTest instanceof NewParserTest ) ) {
throw new MWException( __METHOD__ . " must be passed an instance of ParserTest or "
. "NewParserTest classes\n" );
}
global $wgTidyBin;
$this->internalTidy = extension_loaded( 'tidy' ) &&
- class_exists( 'tidy' );
+ class_exists( 'tidy' ) && !wfIsHHVM();
$this->externalTidy = is_executable( $wgTidyBin ) ||
Installer::locateExecutableInDefaultPaths( array( $wgTidyBin ) )