Merge pull request #992 from corpsee/feature-phpunit-fixes
Fixed TapParser parse fail
This commit is contained in:
commit
d8cbe68705
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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/
|
||||||
|
|
Loading…
Reference in a new issue