[tests] decouple FixtureSplitter

This commit is contained in:
Tomas Votruba 2019-04-26 14:03:31 +02:00
parent 9decd6136b
commit d2e4adb7e5
9 changed files with 91 additions and 59 deletions

View File

@ -2,8 +2,6 @@
namespace Rector\DeadCode\Rector\Assign;
use PhpParser\Node\Stmt\Catch_;
use PhpParser\Node\Stmt\Case_;
use PhpParser\Node;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\FuncCall;
@ -11,6 +9,8 @@ use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\StaticCall;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\Case_;
use PhpParser\Node\Stmt\Catch_;
use PhpParser\Node\Stmt\Do_;
use PhpParser\Node\Stmt\Else_;
use PhpParser\Node\Stmt\ElseIf_;

View File

@ -2,9 +2,9 @@
namespace Rector\DeadCode\Rector\ClassMethod;
use PhpParser\Node\Stmt\Trait_;
use PhpParser\Node;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Trait_;
use Rector\NodeContainer\ParsedNodesByType;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\Rector\AbstractRector;

View File

@ -2,11 +2,11 @@
namespace Rector\DeadCode\Rector\Property;
use PhpParser\Node\Stmt\Trait_;
use PhpParser\Node;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Stmt\Property;
use PhpParser\Node\Stmt\Trait_;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\PhpParser\Node\Manipulator\PropertyManipulator;
use Rector\Rector\AbstractRector;

View File

@ -17,11 +17,6 @@ use Symplify\PackageBuilder\Tests\AbstractKernelTestCase;
abstract class AbstractRectorTestCase extends AbstractKernelTestCase
{
/**
* @var string
*/
private const SPLIT_LINE = '#-----\n#';
/**
* @var FileProcessor
*/
@ -37,8 +32,15 @@ abstract class AbstractRectorTestCase extends AbstractKernelTestCase
*/
private $autoloadTestFixture = true;
/**
* @var FixtureSplitter
*/
private $fixtureSplitter;
protected function setUp(): void
{
$this->fixtureSplitter = new FixtureSplitter($this->getTempPath());
$configFile = $this->provideConfig();
if (! file_exists($configFile)) {
@ -113,7 +115,10 @@ abstract class AbstractRectorTestCase extends AbstractKernelTestCase
// 1. original to changed content
foreach ($files as $file) {
$smartFileInfo = new SmartFileInfo($file);
[$originalFile, $changedFile] = $this->splitContentToOriginalFileAndExpectedFile($smartFileInfo);
[$originalFile, $changedFile] = $this->fixtureSplitter->splitContentToOriginalFileAndExpectedFile(
$smartFileInfo,
$this->autoloadTestFixture
);
$this->doTestFileMatchesExpectedContent($originalFile, $changedFile, $smartFileInfo->getRealPath());
}
@ -125,34 +130,6 @@ abstract class AbstractRectorTestCase extends AbstractKernelTestCase
return sys_get_temp_dir() . '/rector_temp_tests';
}
/**
* @return string[]
*/
private function splitContentToOriginalFileAndExpectedFile(SmartFileInfo $smartFileInfo): array
{
if (Strings::match($smartFileInfo->getContents(), self::SPLIT_LINE)) {
// original → expected
[$originalContent, $expectedContent] = Strings::split($smartFileInfo->getContents(), self::SPLIT_LINE);
} else {
// no changes
$originalContent = $smartFileInfo->getContents();
$expectedContent = $originalContent;
}
$originalFile = $this->createTemporaryPathWithPrefix($smartFileInfo, 'original');
$expectedFile = $this->createTemporaryPathWithPrefix($smartFileInfo, 'expected');
FileSystem::write($originalFile, $originalContent);
FileSystem::write($expectedFile, $expectedContent);
// file needs to be autoload PHPStan analyze
if ($this->autoloadTestFixture) {
require_once $originalFile;
}
return [$originalFile, $expectedFile];
}
private function doTestFileMatchesExpectedContent(
string $originalFile,
string $expectedFile,
@ -170,13 +147,6 @@ abstract class AbstractRectorTestCase extends AbstractKernelTestCase
$this->assertStringEqualsFile($expectedFile, $changedContent, 'Caused by ' . $fixtureFile);
}
private function createTemporaryPathWithPrefix(SmartFileInfo $smartFileInfo, string $prefix): string
{
$hash = Strings::substring(md5($smartFileInfo->getRealPath()), 0, 5);
return sprintf($this->getTempPath() . '/%s_%s_%s', $prefix, $hash, $smartFileInfo->getBasename('.inc'));
}
private function createFixtureHash(): string
{
return Strings::substring(

View File

@ -0,0 +1,62 @@
<?php declare(strict_types=1);
namespace Rector\Testing\PHPUnit;
use Nette\Utils\FileSystem;
use Nette\Utils\Strings;
use Symplify\PackageBuilder\FileSystem\SmartFileInfo;
final class FixtureSplitter
{
/**
* @var string
*/
private const SPLIT_LINE = '#-----\n#';
/**
* @var string
*/
private $tempPath;
public function __construct(string $tempPath)
{
$this->tempPath = $tempPath;
}
/**
* @return string[]
*/
public function splitContentToOriginalFileAndExpectedFile(
SmartFileInfo $smartFileInfo,
bool $autoloadTestFixture
): array {
if (Strings::match($smartFileInfo->getContents(), self::SPLIT_LINE)) {
// original → expected
[$originalContent, $expectedContent] = Strings::split($smartFileInfo->getContents(), self::SPLIT_LINE);
} else {
// no changes
$originalContent = $smartFileInfo->getContents();
$expectedContent = $originalContent;
}
$originalFile = $this->createTemporaryPathWithPrefix($smartFileInfo, 'original');
$expectedFile = $this->createTemporaryPathWithPrefix($smartFileInfo, 'expected');
FileSystem::write($originalFile, $originalContent);
FileSystem::write($expectedFile, $expectedContent);
// file needs to be autoload so PHPStan can analyze
if ($autoloadTestFixture) {
require_once $originalFile;
}
return [$originalFile, $expectedFile];
}
private function createTemporaryPathWithPrefix(SmartFileInfo $smartFileInfo, string $prefix): string
{
$hash = Strings::substring(md5($smartFileInfo->getRealPath()), 0, 5);
return sprintf($this->tempPath . '/%s_%s_%s', $prefix, $hash, $smartFileInfo->getBasename('.inc'));
}
}

View File

@ -2,9 +2,9 @@
namespace Rector\Tests\Rector\Argument\ArgumentAdderRector\Fixture;
use Rector\Tests\Rector\Argument\ArgumentAdderRector\Source\ContainerBuilder;
use Rector\Tests\Rector\Argument\ArgumentAdderRector\Source\SomeContainerBuilder;
class AlreadyAdded extends ContainerBuilder
class AlreadyAdded extends SomeContainerBuilder
{
public function addCompilerPass($pass, $type, int $priority = 10)
{

View File

@ -2,13 +2,13 @@
namespace Rector\Tests\Rector\Argument\ArgumentAdderRector\Fixture;
use Rector\Tests\Rector\Argument\ArgumentAdderRector\Source\ContainerBuilder;
use Rector\Tests\Rector\Argument\ArgumentAdderRector\Source\SomeContainerBuilder;
class SomeClass
{
public function create()
{
$containerBuilder = new ContainerBuilder();
$containerBuilder = new SomeContainerBuilder();
$containerBuilder->compile();
}
}
@ -19,13 +19,13 @@ class SomeClass
namespace Rector\Tests\Rector\Argument\ArgumentAdderRector\Fixture;
use Rector\Tests\Rector\Argument\ArgumentAdderRector\Source\ContainerBuilder;
use Rector\Tests\Rector\Argument\ArgumentAdderRector\Source\SomeContainerBuilder;
class SomeClass
{
public function create()
{
$containerBuilder = new ContainerBuilder();
$containerBuilder = new SomeContainerBuilder();
$containerBuilder->compile(false);
}
}

View File

@ -2,13 +2,13 @@
namespace Rector\Tests\Rector\Argument\ArgumentAdderRector\Fixture;
use Rector\Tests\Rector\Argument\ArgumentAdderRector\Source\ContainerBuilder;
use Rector\Tests\Rector\Argument\ArgumentAdderRector\Source\SomeContainerBuilder;
class SomeClass2
{
public function create()
{
$containerBuilder = new ContainerBuilder();
$containerBuilder = new SomeContainerBuilder();
$containerBuilder->addCompilerPass('pass', 'type');
}
}
@ -19,13 +19,13 @@ class SomeClass2
namespace Rector\Tests\Rector\Argument\ArgumentAdderRector\Fixture;
use Rector\Tests\Rector\Argument\ArgumentAdderRector\Source\ContainerBuilder;
use Rector\Tests\Rector\Argument\ArgumentAdderRector\Source\SomeContainerBuilder;
class SomeClass2
{
public function create()
{
$containerBuilder = new ContainerBuilder();
$containerBuilder = new SomeContainerBuilder();
$containerBuilder->addCompilerPass('pass', 'type', 0);
}
}

View File

@ -2,9 +2,9 @@
namespace Rector\Tests\Rector\Argument\ArgumentAdderRector\Fixture;
use Rector\Tests\Rector\Argument\ArgumentAdderRector\Source\ContainerBuilder;
use Rector\Tests\Rector\Argument\ArgumentAdderRector\Source\SomeContainerBuilder;
class CustomContainerBuilder extends ContainerBuilder
class CustomContainerBuilder extends SomeContainerBuilder
{
public function addCompilerPass($pass, $type)
{
@ -17,9 +17,9 @@ class CustomContainerBuilder extends ContainerBuilder
namespace Rector\Tests\Rector\Argument\ArgumentAdderRector\Fixture;
use Rector\Tests\Rector\Argument\ArgumentAdderRector\Source\ContainerBuilder;
use Rector\Tests\Rector\Argument\ArgumentAdderRector\Source\SomeContainerBuilder;
class CustomContainerBuilder extends ContainerBuilder
class CustomContainerBuilder extends SomeContainerBuilder
{
public function addCompilerPass($pass, $type, int $priority = 0)
{