Merge pull request #992 from corpsee/feature-phpunit-fixes

Fixed TapParser parse fail
This commit is contained in:
Dan Cryer 2015-10-13 15:03:09 +01:00
commit d8cbe68705
2 changed files with 93 additions and 18 deletions

View file

@ -16,6 +16,7 @@ class TapParser
const TEST_LINE_PATTERN = '/^(ok|not ok)(?:\s+\d+)?(?:\s+\-)?\s*(.*?)(?:\s*#\s*(skip|todo)\s*(.*))?\s*$/i'; const TEST_LINE_PATTERN = '/^(ok|not ok)(?:\s+\d+)?(?:\s+\-)?\s*(.*?)(?:\s*#\s*(skip|todo)\s*(.*))?\s*$/i';
const TEST_YAML_START = '/^(\s*)---/'; const TEST_YAML_START = '/^(\s*)---/';
const TEST_DIAGNOSTIC = '/^#/'; const TEST_DIAGNOSTIC = '/^#/';
const TEST_COVERAGE = '/^Generating/';
/** /**
* @var string * @var string
@ -81,7 +82,7 @@ class TapParser
$line = $this->nextLine(); $line = $this->nextLine();
} }
if (count($this->results) !== $this->testCount) { if (false !== $this->testCount && count($this->results) !== $this->testCount) {
throw new Exception(Lang::get('tap_error')); throw new Exception(Lang::get('tap_error'));
} }
@ -123,19 +124,14 @@ class TapParser
return false; return false;
} }
/** Parse a single line. /**
*
* @param string $line * @param string $line
*
* @return boolean
*/ */
protected function parseLine($line) protected function testLine($line)
{ {
if (preg_match(self::TEST_COUNTS_PATTERN, $line, $matches)) { if (preg_match(self::TEST_LINE_PATTERN, $line, $matches)) {
$this->testCount = intval($matches[1]);
} elseif (preg_match(self::TEST_DIAGNOSTIC, $line)) {
return;
} elseif (preg_match(self::TEST_LINE_PATTERN, $line, $matches)) {
$this->results[] = $this->processTestLine( $this->results[] = $this->processTestLine(
$matches[1], $matches[1],
isset($matches[2]) ? $matches[2] : '', isset($matches[2]) ? $matches[2] : '',
@ -143,7 +139,20 @@ class TapParser
isset($matches[4]) ? $matches[4] : null isset($matches[4]) ? $matches[4] : null
); );
} elseif (preg_match(self::TEST_YAML_START, $line, $matches)) { return true;
}
return false;
}
/**
* @param string $line
*
* @return boolean
*/
protected function yamlLine($line)
{
if (preg_match(self::TEST_YAML_START, $line, $matches)) {
$diagnostic = $this->processYamlBlock($matches[1]); $diagnostic = $this->processYamlBlock($matches[1]);
$test = array_pop($this->results); $test = array_pop($this->results);
if (isset($test['message'], $diagnostic['message'])) { if (isset($test['message'], $diagnostic['message'])) {
@ -152,9 +161,39 @@ class TapParser
} }
$this->results[] = array_replace($test, $diagnostic); $this->results[] = array_replace($test, $diagnostic);
} else { return true;
throw new Exception(sprintf('Incorrect TAP data, line %d: %s', $this->lineNumber, $line));
} }
return false;
}
/** Parse a single line.
*
* @param string $line
*
* @throws Exception
*/
protected function parseLine($line)
{
if (preg_match(self::TEST_DIAGNOSTIC, $line) || preg_match(self::TEST_COVERAGE, $line) || !$line) {
return;
}
if (preg_match(self::TEST_COUNTS_PATTERN, $line, $matches)) {
$this->testCount = intval($matches[1]);
return;
}
if ($this->testLine($line)) {
return;
}
if ($this->yamlLine($line)) {
return;
}
throw new Exception(sprintf('Incorrect TAP data, line %d: %s', $this->lineNumber, $line));
} }
/** /**

View file

@ -23,6 +23,28 @@ ok 1 - SomeTest::testAnother
not ok not ok
1..2 1..2
Trailing garbage ! Trailing garbage !
TAP;
$parser = new TapParser($content);
$result = $parser->parse();
$this->assertEquals(array(
array('pass' => true, 'severity' => 'success', 'message' => 'SomeTest::testAnother'),
array('pass' => false, 'severity' => 'fail', 'message' => ''),
), $result);
$this->assertEquals(1, $parser->getTotalFailures());
}
public function testSimple2()
{
$content = <<<TAP
Leading garbage !
TAP version 13
ok 1 - SomeTest::testAnother
not ok
1..2
TAP; TAP;
$parser = new TapParser($content); $parser = new TapParser($content);
$result = $parser->parse(); $result = $parser->parse();
@ -48,6 +70,20 @@ TAP;
$parser->parse(); $parser->parse();
} }
public function testTapCoverage()
{
$content = <<<TAP
TAP version 13
Generating code coverage report in HTML format ... done
TAP;
$parser = new TapParser($content);
$result = $parser->parse();
$this->assertEquals(array(), $result);
}
/** /**
* @expectedException \Exception * @expectedException \Exception
* @expectedExceptionMessageRegExp /Duplicated TAP/ * @expectedExceptionMessageRegExp /Duplicated TAP/