350 lines
8.9 KiB
PHP
350 lines
8.9 KiB
PHP
<?php
|
|
/*
|
|
* This file is part of PHPUnit.
|
|
*
|
|
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
namespace PHPUnit\Runner;
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
use PHPUnit\Util\PHP\AbstractPhpProcess;
|
|
|
|
class PhptTestCaseTest extends TestCase
|
|
{
|
|
private const EXPECT_CONTENT = <<<EOF
|
|
--TEST--
|
|
EXPECT test
|
|
--FILE--
|
|
<?php echo "Hello PHPUnit!"; ?>
|
|
--EXPECT--
|
|
Hello PHPUnit!
|
|
EOF;
|
|
|
|
private const EXPECTF_CONTENT = <<<EOF
|
|
--TEST--
|
|
EXPECTF test
|
|
--FILE--
|
|
<?php echo "Hello PHPUnit!"; ?>
|
|
--EXPECTF--
|
|
Hello %s!
|
|
EOF;
|
|
|
|
private const EXPECTREGEX_CONTENT = <<<EOF
|
|
--TEST--
|
|
EXPECTREGEX test
|
|
--FILE--
|
|
<?php echo "Hello PHPUnit!"; ?>
|
|
--EXPECTREGEX--
|
|
Hello [HPU]{4}[nit]{3}!
|
|
EOF;
|
|
|
|
private const FILE_SECTION = <<<EOF
|
|
<?php echo "Hello PHPUnit!"; ?>
|
|
|
|
EOF;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
private $dirname;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
private $filename;
|
|
|
|
/**
|
|
* @var PhptTestCase
|
|
*/
|
|
private $testCase;
|
|
|
|
/**
|
|
* @var AbstractPhpProcess|\PHPUnit\Framework\MockObject\MockObject
|
|
*/
|
|
private $phpProcess;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
$this->dirname = \sys_get_temp_dir();
|
|
$this->filename = $this->dirname . '/phpunit.phpt';
|
|
\touch($this->filename);
|
|
|
|
$this->phpProcess = $this->getMockForAbstractClass(AbstractPhpProcess::class, [], '', false);
|
|
$this->testCase = new PhptTestCase($this->filename, $this->phpProcess);
|
|
}
|
|
|
|
protected function tearDown(): void
|
|
{
|
|
@\unlink($this->filename);
|
|
|
|
$this->phpProcess = null;
|
|
$this->testCase = null;
|
|
}
|
|
|
|
public function testAlwaysReportsNumberOfAssertionsIsOne(): void
|
|
{
|
|
$this->assertSame(1, $this->testCase->getNumAssertions());
|
|
}
|
|
|
|
public function testAlwaysReportsItDoesNotUseADataprovider(): void
|
|
{
|
|
$this->assertSame(false, $this->testCase->usesDataProvider());
|
|
}
|
|
|
|
public function testShouldRunFileSectionAsTest(): void
|
|
{
|
|
$this->setPhpContent($this->ensureCorrectEndOfLine(self::EXPECT_CONTENT));
|
|
|
|
$fileSection = '<?php echo "Hello PHPUnit!"; ?>' . \PHP_EOL;
|
|
|
|
$this->phpProcess
|
|
->expects($this->once())
|
|
->method('runJob')
|
|
->with($fileSection)
|
|
->will($this->returnValue(['stdout' => '', 'stderr' => '']));
|
|
|
|
$this->testCase->run();
|
|
}
|
|
|
|
public function testRenderFileSection(): void
|
|
{
|
|
$this->setPhpContent($this->ensureCorrectEndOfLine(
|
|
<<<EOF
|
|
--TEST--
|
|
Something to decribe it
|
|
--FILE--
|
|
<?php echo __DIR__ . __FILE__; ?>
|
|
--EXPECT--
|
|
Something
|
|
EOF
|
|
));
|
|
|
|
$renderedCode = "<?php echo '" . $this->dirname . "' . '" . $this->filename . "'; ?>" . \PHP_EOL;
|
|
|
|
$this->phpProcess
|
|
->expects($this->once())
|
|
->method('runJob')
|
|
->with($renderedCode)
|
|
->will($this->returnValue(['stdout' => '', 'stderr' => '']));
|
|
|
|
$this->testCase->run();
|
|
}
|
|
|
|
public function testRenderSkipifSection(): void
|
|
{
|
|
$phptContent = self::EXPECT_CONTENT . \PHP_EOL;
|
|
$phptContent .= '--SKIPIF--' . \PHP_EOL;
|
|
$phptContent .= "<?php echo 'skip: ' . __FILE__; ?>" . \PHP_EOL;
|
|
|
|
$this->setPhpContent($phptContent);
|
|
|
|
$renderedCode = "<?php echo 'skip: ' . '" . $this->filename . "'; ?>" . \PHP_EOL;
|
|
|
|
$this->phpProcess
|
|
->expects($this->at(0))
|
|
->method('runJob')
|
|
->with($renderedCode)
|
|
->will($this->returnValue(['stdout' => '', 'stderr' => '']));
|
|
|
|
$this->testCase->run();
|
|
}
|
|
|
|
public function testShouldRunSkipifSectionWhenExists(): void
|
|
{
|
|
$skipifSection = '<?php /** Nothing **/ ?>' . \PHP_EOL;
|
|
|
|
$phptContent = self::EXPECT_CONTENT . \PHP_EOL;
|
|
$phptContent .= '--SKIPIF--' . \PHP_EOL;
|
|
$phptContent .= $skipifSection;
|
|
|
|
$this->setPhpContent($phptContent);
|
|
|
|
$this->phpProcess
|
|
->expects($this->at(0))
|
|
->method('runJob')
|
|
->with($skipifSection)
|
|
->will($this->returnValue(['stdout' => '', 'stderr' => '']));
|
|
|
|
$this->testCase->run();
|
|
}
|
|
|
|
public function testShouldNotRunTestSectionIfSkipifSectionReturnsOutputWithSkipWord(): void
|
|
{
|
|
$skipifSection = '<?php echo "skip: Reason"; ?>' . \PHP_EOL;
|
|
|
|
$phptContent = self::EXPECT_CONTENT . \PHP_EOL;
|
|
$phptContent .= '--SKIPIF--' . \PHP_EOL;
|
|
$phptContent .= $skipifSection;
|
|
|
|
$this->setPhpContent($phptContent);
|
|
|
|
$this->phpProcess
|
|
->expects($this->once())
|
|
->method('runJob')
|
|
->with($skipifSection)
|
|
->will($this->returnValue(['stdout' => 'skip: Reason', 'stderr' => '']));
|
|
|
|
$this->testCase->run();
|
|
}
|
|
|
|
public function testShouldRunCleanSectionWhenDefined(): void
|
|
{
|
|
$cleanSection = '<?php unlink("/tmp/something"); ?>' . \PHP_EOL;
|
|
|
|
$phptContent = self::EXPECT_CONTENT . \PHP_EOL;
|
|
$phptContent .= '--CLEAN--' . \PHP_EOL;
|
|
$phptContent .= $cleanSection;
|
|
|
|
$this->setPhpContent($phptContent);
|
|
|
|
$this->phpProcess
|
|
->expects($this->at(1))
|
|
->method('runJob')
|
|
->with($cleanSection);
|
|
|
|
$this->testCase->run();
|
|
}
|
|
|
|
public function testShouldSkipTestWhenPhptFileIsEmpty(): void
|
|
{
|
|
$this->setPhpContent('');
|
|
|
|
$result = $this->testCase->run();
|
|
$this->assertCount(1, $result->skipped());
|
|
$this->assertSame('Invalid PHPT file', $result->skipped()[0]->thrownException()->getMessage());
|
|
}
|
|
|
|
public function testShouldSkipTestWhenFileSectionIsMissing(): void
|
|
{
|
|
$this->setPhpContent(
|
|
<<<EOF
|
|
--TEST--
|
|
Something to describe it
|
|
--EXPECT--
|
|
Something
|
|
EOF
|
|
);
|
|
|
|
$result = $this->testCase->run();
|
|
|
|
$this->assertCount(1, $result->skipped());
|
|
$this->assertSame('Invalid PHPT file', $result->skipped()[0]->thrownException()->getMessage());
|
|
}
|
|
|
|
public function testShouldSkipTestWhenThereIsNoExpecOrExpectifOrExpecregexSectionInPhptFile(): void
|
|
{
|
|
$this->setPhpContent(
|
|
<<<EOF
|
|
--TEST--
|
|
Something to describe it
|
|
--FILE--
|
|
<?php
|
|
echo "Hello world!\n";
|
|
?>
|
|
EOF
|
|
);
|
|
|
|
$result = $this->testCase->run();
|
|
|
|
$this->assertCount(1, $result->skipped());
|
|
$skipMessage = $result->skipped()[0]->thrownException()->getMessage();
|
|
$this->assertSame('Invalid PHPT file', $skipMessage);
|
|
}
|
|
|
|
public function testShouldSkipTestWhenSectionHeaderIsMalformed(): void
|
|
{
|
|
$this->setPhpContent(
|
|
<<<EOF
|
|
----
|
|
--TEST--
|
|
This is not going to work out
|
|
--EXPECT--
|
|
Tears and misery
|
|
EOF
|
|
);
|
|
|
|
$result = $this->testCase->run();
|
|
|
|
$this->assertCount(1, $result->skipped());
|
|
$skipMessage = $result->skipped()[0]->thrownException()->getMessage();
|
|
$this->assertSame('Invalid PHPT file: empty section header', $skipMessage);
|
|
}
|
|
|
|
public function testShouldValidateExpectSession(): void
|
|
{
|
|
$this->setPhpContent(self::EXPECT_CONTENT);
|
|
|
|
$this->phpProcess
|
|
->expects($this->once())
|
|
->method('runJob')
|
|
->with(self::FILE_SECTION)
|
|
->will($this->returnValue(['stdout' => 'Hello PHPUnit!', 'stderr' => '']));
|
|
|
|
$result = $this->testCase->run();
|
|
|
|
$this->assertTrue($result->wasSuccessful());
|
|
}
|
|
|
|
public function testShouldValidateExpectfSession(): void
|
|
{
|
|
$this->setPhpContent(self::EXPECTF_CONTENT);
|
|
|
|
$this->phpProcess
|
|
->expects($this->once())
|
|
->method('runJob')
|
|
->with(self::FILE_SECTION)
|
|
->will($this->returnValue(['stdout' => 'Hello PHPUnit!', 'stderr' => '']));
|
|
|
|
$result = $this->testCase->run();
|
|
|
|
$this->assertTrue($result->wasSuccessful());
|
|
}
|
|
|
|
public function testShouldValidateExpectregexSession(): void
|
|
{
|
|
$this->setPhpContent(self::EXPECTREGEX_CONTENT);
|
|
|
|
$this->phpProcess
|
|
->expects($this->once())
|
|
->method('runJob')
|
|
->with(self::FILE_SECTION)
|
|
->will($this->returnValue(['stdout' => 'Hello PHPUnit!', 'stderr' => '']));
|
|
|
|
$result = $this->testCase->run();
|
|
|
|
$this->assertTrue($result->wasSuccessful());
|
|
}
|
|
|
|
/**
|
|
* Defines the content of the current PHPT test.
|
|
*
|
|
* @param string $content
|
|
*/
|
|
private function setPhpContent($content): void
|
|
{
|
|
\file_put_contents($this->filename, $content);
|
|
}
|
|
|
|
/**
|
|
* Ensures the correct line ending is used for comparison
|
|
*
|
|
* @param string $content
|
|
*
|
|
* @return string
|
|
*/
|
|
private function ensureCorrectEndOfLine($content)
|
|
{
|
|
return \strtr(
|
|
$content,
|
|
[
|
|
"\r\n" => \PHP_EOL,
|
|
"\r" => \PHP_EOL,
|
|
"\n" => \PHP_EOL,
|
|
]
|
|
);
|
|
}
|
|
}
|