rector/rules/PhpSpecToPHPUnit/Naming/PhpSpecRenaming.php

146 lines
4.2 KiB
PHP
Raw Normal View History

2019-10-13 07:59:52 +02:00
<?php
declare(strict_types=1);
2019-03-15 11:53:06 +01:00
namespace Rector\PhpSpecToPHPUnit\Naming;
use Nette\Utils\Strings;
use PhpParser\Node;
2019-03-15 11:53:06 +01:00
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Namespace_;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
2020-05-03 21:30:01 +02:00
use Rector\Core\Util\StaticRectorStrings;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
2019-03-15 11:53:06 +01:00
use Symplify\PackageBuilder\Strings\StringFormatConverter;
final class PhpSpecRenaming
{
2020-05-06 23:39:33 +02:00
/**
* @var string
*/
private const SPEC = 'Spec';
2019-03-15 11:53:06 +01:00
/**
* @var StringFormatConverter
*/
private $stringFormatConverter;
/**
* @var NodeNameResolver
*/
private $nodeNameResolver;
/**
* @var BetterNodeFinder
*/
private $betterNodeFinder;
public function __construct(
NodeNameResolver $nodeNameResolver,
StringFormatConverter $stringFormatConverter,
BetterNodeFinder $betterNodeFinder
) {
2019-03-15 11:53:06 +01:00
$this->stringFormatConverter = $stringFormatConverter;
$this->nodeNameResolver = $nodeNameResolver;
$this->betterNodeFinder = $betterNodeFinder;
2019-03-15 11:53:06 +01:00
}
public function renameMethod(ClassMethod $classMethod): void
2019-03-15 11:53:06 +01:00
{
if ($classMethod->isPrivate()) {
return;
}
$classMethodName = $this->nodeNameResolver->getName($classMethod);
$classMethodName = $this->removeNamePrefixes($classMethodName);
2019-03-15 11:53:06 +01:00
// from PhpSpec to PHPUnit method naming convention
$classMethodName = $this->stringFormatConverter->underscoreAndHyphenToCamelCase($classMethodName);
2019-03-15 11:53:06 +01:00
// add "test", so PHPUnit runs the method
if (! Strings::startsWith($classMethodName, 'test')) {
$classMethodName = 'test' . ucfirst($classMethodName);
2019-03-15 11:53:06 +01:00
}
$classMethod->name = new Identifier($classMethodName);
2019-03-15 11:53:06 +01:00
}
public function renameExtends(Class_ $class): void
{
$class->extends = new FullyQualified('PHPUnit\Framework\TestCase');
}
public function renameNamespace(Class_ $class): void
{
$namespace = $this->betterNodeFinder->findParentType($class, Namespace_::class);
if (! $namespace instanceof Namespace_) {
2019-03-15 11:53:06 +01:00
return;
}
$namespaceName = $this->nodeNameResolver->getName($namespace);
if ($namespaceName === null) {
return;
}
$newNamespaceName = StaticRectorStrings::removePrefixes($namespaceName, ['spec\\']);
2019-03-15 11:53:06 +01:00
$namespace->name = new Name('Tests\\' . $newNamespaceName);
}
public function renameClass(Class_ $class): void
{
$classShortName = $this->nodeNameResolver->getShortName($class);
2019-03-15 11:53:06 +01:00
// anonymous class?
if ($classShortName === '') {
2019-09-21 13:03:30 +02:00
throw new ShouldNotHappenException();
2019-03-15 11:53:06 +01:00
}
// 2. change class name
$newClassName = StaticRectorStrings::removeSuffixes($classShortName, [self::SPEC]);
2019-03-15 11:53:06 +01:00
$newTestClassName = $newClassName . 'Test';
$class->name = new Identifier($newTestClassName);
}
public function resolveObjectPropertyName(Class_ $class): string
{
// anonymous class?
if ($class->name === null) {
2019-09-21 13:03:30 +02:00
throw new ShouldNotHappenException();
2019-03-15 11:53:06 +01:00
}
$shortClassName = $this->nodeNameResolver->getShortName($class);
$bareClassName = StaticRectorStrings::removeSuffixes($shortClassName, [self::SPEC, 'Test']);
2019-03-15 11:53:06 +01:00
return lcfirst($bareClassName);
}
public function resolveTestedClass(Node $node): string
{
/** @var string $className */
$className = $node->getAttribute(AttributeKey::CLASS_NAME);
2020-05-03 21:30:01 +02:00
$newClassName = StaticRectorStrings::removePrefixes($className, ['spec\\']);
2020-05-06 23:39:33 +02:00
return StaticRectorStrings::removeSuffixes($newClassName, [self::SPEC]);
}
private function removeNamePrefixes(string $name): string
{
$originalName = $name;
2020-05-03 21:30:01 +02:00
$name = StaticRectorStrings::removePrefixes(
$name,
['it_should_have_', 'it_should_be', 'it_should_', 'it_is_', 'it_', 'is_']
);
return $name ?: $originalName;
}
2019-03-15 11:53:06 +01:00
}