Skip to content

Commit

Permalink
- 100% test coverage
Browse files Browse the repository at this point in the history
  • Loading branch information
TorbenKoehn committed May 10, 2018
1 parent 1710dcd commit eb872fb
Show file tree
Hide file tree
Showing 29 changed files with 680 additions and 66 deletions.
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
},
"autoload": {
"psr-4": {
"Tale\\": "src"
"Tale\\": "src",
"Tale\\Test\\": "tests"
}
}
}
15 changes: 12 additions & 3 deletions src/Inflector.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,12 @@ public static function create(StrategyFactoryInterface $strategyFactory = null):
return new self($strategyFactory);
}

public static function inflectString(string $string, array $strategies, StrategyFactoryInterface $strategyFactory = null): string
{
public static function inflectString(
string $string,
array $strategies,
StrategyFactoryInterface $strategyFactory = null
): string {

return self::create($strategyFactory)->inflect($string, $strategies);
}

Expand Down Expand Up @@ -169,11 +173,16 @@ public static function underscorize(string $string): string
*
* @return string The camelCased string
*/
public static function variablize(string $string): string
public static function variableize(string $string): string
{
return self::inflectString($string, [StrategyFactory::STRATEGY_VARIABLEIZE]);
}

public static function constantize(string $string): string
{
return self::inflectString($string, [StrategyFactory::STRATEGY_CONSTANTIZE]);
}

/**
* Returns a lower_cased_dash_separated string.
*
Expand Down
4 changes: 0 additions & 4 deletions src/Inflector/Strategy/AbstractCountableStrategy.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,6 @@ abstract class AbstractCountableStrategy implements StrategyInterface

protected function isUncountable(string $string): bool
{
if (is_numeric($string)) {
return true;
}

$string = strtolower($string);
foreach (static::UNCOUNTABLES as $uncountable) {
if (substr($string, -1 * \strlen($uncountable)) === $uncountable) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace Tale\Inflector\Strategy;

class DashRejoinStrategy extends RejoinStrategy
class DashStrategy extends RejoinStrategy
{
protected const DELIMITER = '-';
}
2 changes: 1 addition & 1 deletion src/Inflector/Strategy/KebabCaseStrategy.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace Tale\Inflector\Strategy;

class KebabCaseStrategy extends DashRejoinStrategy
class KebabCaseStrategy extends DashStrategy
{
public function inflect(string $string): string
{
Expand Down
2 changes: 1 addition & 1 deletion src/Inflector/Strategy/MacroCaseStrategy.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace Tale\Inflector\Strategy;

class MacroCaseStrategy extends UnderscoreRejoinStrategy
class MacroCaseStrategy extends UnderscoreStrategy
{
public function inflect(string $string): string
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

use Tale\Inflector\StrategyInterface;

class NumberOrdinalStrategy implements StrategyInterface
class OrdinalStrategy implements StrategyInterface
{
public function inflect(string $string): string
{
Expand Down
37 changes: 25 additions & 12 deletions src/Inflector/Strategy/PluralStrategy.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,28 +22,41 @@ class PluralStrategy extends AbstractCountableStrategy
'/(alias|status)/i' => '$1es',
'/(octop|vir)us$/i' => '$1i',
'/(ax|test)is$/i' => '$1es',
'/s$/i' => 's',
'/$/' => 's'
'/s$/i' => 's'
];

public function inflect(string $string): string
private function getIrregularPlural(string $string): ?string
{
if ($this->isUncountable($string)) {
return $string;
}

foreach (static::IRREGULARS as $singular => $plural) {
if (preg_match('/(' . $singular . ')$/i', $string, $matches)) {
return preg_replace('/(' . $singular . ')$/i', $matches[0][0] . substr($plural, 1), $string);
if (!preg_match('/(' . $singular . ')$/i', $string, $matches)) {
continue;
}
return preg_replace('/(' . $singular . ')$/i', $matches[0][0] . substr($plural, 1), $string);
}
return null;
}

private function getPlural(string $string): ?string
{
foreach (static::PATTERNS as $rule => $replacement) {
if (preg_match($rule, $string)) {
return preg_replace($rule, $replacement, $string);
if (!preg_match($rule, $string)) {
continue;
}
return preg_replace($rule, $replacement, $string);
}
return preg_replace('/$/', 's', $string);
}

public function inflect(string $string): string
{
if ($this->isUncountable($string)) {
return $string;
}

if (($irregularPlural = $this->getIrregularPlural($string)) !== null) {
return $irregularPlural;
}

return $string;
return $this->getPlural($string);
}
}
6 changes: 2 additions & 4 deletions src/Inflector/Strategy/RejoinStrategy.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class RejoinStrategy implements StrategyInterface

public function inflect(string $string): string
{
$quotedDelimiter = static::DELIMITER === '' ? '' : preg_quote(static::DELIMITER, '/');
$quotedDelimiter = preg_quote(static::DELIMITER, '/');

$inflectedString = $string;
if (\function_exists('transliterator_transliterate')) {
Expand All @@ -34,8 +34,6 @@ public function inflect(string $string): string
);

//finally remove repeating chars, so "something & something" wont end in "something---something"
return static::DELIMITER === ''
? $inflectedString
: trim(preg_replace('/'.$quotedDelimiter.'+/', static::DELIMITER, $inflectedString), static::DELIMITER);
return trim(preg_replace('/'.$quotedDelimiter.'+/', static::DELIMITER, $inflectedString), static::DELIMITER);
}
}
34 changes: 24 additions & 10 deletions src/Inflector/Strategy/SingularStrategy.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,27 +29,41 @@ class SingularStrategy extends AbstractCountableStrategy
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i' => '\1\2sis',
'/([ti])a$/i' => '\1um',
'/(n)ews$/i' => '\1ews',
'/s$/i' => '',
];

public function inflect(string $string): string
private function getIrregularSingular(string $string): ?string
{
if ($this->isUncountable($string)) {
return $string;
}

foreach (static::IRREGULARS as $singular => $plural) {
if (preg_match('/(' . $plural . ')$/i', $string, $matches)) {
return preg_replace('/(' . $plural . ')$/i', $matches[0][0] . substr($singular, 1), $string);
if (!preg_match('/(' . $plural . ')$/i', $string, $matches)) {
continue;
}
return preg_replace('/(' . $plural . ')$/i', $matches[0][0] . substr($singular, 1), $string);
}
return null;
}

private function getSingular(string $string): ?string
{
foreach (static::PATTERNS as $rule => $replacement) {
if (preg_match($rule, $string)) {
return preg_replace($rule, $replacement, $string);
if (!preg_match($rule, $string)) {
continue;
}
return preg_replace($rule, $replacement, $string);
}
return preg_replace('/s$/i', '', $string);
}

public function inflect(string $string): string
{
if ($this->isUncountable($string)) {
return $string;
}

if (($irregularSingular = $this->getIrregularSingular($string)) !== null) {
return $irregularSingular;
}

return $string;
return $this->getSingular($string);
}
}
2 changes: 1 addition & 1 deletion src/Inflector/Strategy/SnakeCaseStrategy.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace Tale\Inflector\Strategy;

class SnakeCaseStrategy extends UnderscoreRejoinStrategy
class SnakeCaseStrategy extends UnderscoreStrategy
{
public function inflect(string $string): string
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace Tale\Inflector\Strategy;

class UnderscoreRejoinStrategy extends RejoinStrategy
class UnderscoreStrategy extends RejoinStrategy
{
protected const DELIMITER = '_';
}
21 changes: 11 additions & 10 deletions src/Inflector/StrategyFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@
namespace Tale\Inflector;

use Tale\Inflector\Strategy\CamelCaseStrategy;
use Tale\Inflector\Strategy\DashRejoinStrategy;
use Tale\Inflector\Strategy\DashStrategy;
use Tale\Inflector\Strategy\KebabCaseStrategy;
use Tale\Inflector\Strategy\LowerCamelCaseStrategy;
use Tale\Inflector\Strategy\MacroCaseStrategy;
use Tale\Inflector\Strategy\NumberOrdinalStrategy;
use Tale\Inflector\Strategy\OrdinalStrategy;
use Tale\Inflector\Strategy\PluralStrategy;
use Tale\Inflector\Strategy\SingularStrategy;
use Tale\Inflector\Strategy\SnakeCaseStrategy;
use Tale\Inflector\Strategy\UnderscoreRejoinStrategy;
use Tale\Inflector\Strategy\UnderscoreStrategy;
use Tale\Inflector\Strategy\UppercaseWordsStrategy;

class StrategyFactory implements StrategyFactoryInterface
Expand All @@ -21,7 +21,7 @@ class StrategyFactory implements StrategyFactoryInterface
public const STRATEGY_DASHERIZE = 'dasherize';
public const STRATEGY_CANONICALIZE = 'canonicalize';
public const STRATEGY_VARIABLEIZE = 'variableize';
public const STRATEGY_CONSTANIZE = 'constantize';
public const STRATEGY_CONSTANTIZE = 'constantize';
public const STRATEGY_TABLEIZE = 'tableize';
public const STRATEGY_UNDERSCORIZE = 'underscorize';
public const STRATEGY_HUMANIZE = 'humanize';
Expand All @@ -31,16 +31,16 @@ class StrategyFactory implements StrategyFactoryInterface

private $namedStrategies = [
self::STRATEGY_CAMELIZE => CamelCaseStrategy::class,
self::STRATEGY_DASHERIZE => DashRejoinStrategy::class,
self::STRATEGY_DASHERIZE => DashStrategy::class,
self::STRATEGY_CANONICALIZE => KebabCaseStrategy::class,
self::STRATEGY_VARIABLEIZE => LowerCamelCaseStrategy::class,
self::STRATEGY_CONSTANIZE => MacroCaseStrategy::class,
self::STRATEGY_CONSTANTIZE => MacroCaseStrategy::class,
self::STRATEGY_TABLEIZE => SnakeCaseStrategy::class,
self::STRATEGY_UNDERSCORIZE => UnderscoreRejoinStrategy::class,
self::STRATEGY_UNDERSCORIZE => UnderscoreStrategy::class,
self::STRATEGY_HUMANIZE => UppercaseWordsStrategy::class,
self::STRATEGY_PLURALIZE => PluralStrategy::class,
self::STRATEGY_SINGULARIZE => SingularStrategy::class,
self::STRATEGY_ORDINALIZE => NumberOrdinalStrategy::class
self::STRATEGY_ORDINALIZE => OrdinalStrategy::class
];

private $instances = [];
Expand All @@ -60,7 +60,7 @@ public function addNamedStrategy(string $name, string $className): StrategyFacto
return $this;
}

public function addNamedStrategies(iterable $strategies): self
public function addNamedStrategies(iterable $strategies): StrategyFactoryInterface
{
foreach ($strategies as $name => $className) {
$this->addNamedStrategy($name, $className);
Expand Down Expand Up @@ -91,7 +91,8 @@ protected function validateClassName(string $className): void
{
if (!is_subclass_of($className, StrategyInterface::class, true)) {
throw new \InvalidArgumentException(sprintf(
'Class name passed to %s is not a valid %s class name',
'Class name %s passed to %s is not a valid %s class name',
$className,
static::class,
StrategyInterface::class
));
Expand Down
1 change: 1 addition & 0 deletions src/Inflector/StrategyFactoryInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ interface StrategyFactoryInterface
{
public function getNamedStrategies(): array;
public function addNamedStrategy(string $name, string $className): self;
public function addNamedStrategies(iterable $strategies): self;
public function resolve(string $className): string;
public function get(string $className): StrategyInterface;
}
26 changes: 26 additions & 0 deletions tests/Inflector/Strategy/CamelCaseStrategyTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php
declare(strict_types=1);

namespace Tale\Test\Inflector\Strategy;

use PHPUnit\Framework\TestCase;
use Tale\Inflector\Strategy\CamelCaseStrategy;

/**
* @coversDefaultClass \Tale\Inflector\Strategy\CamelCaseStrategy
*/
class CamelCaseStrategyTest extends TestCase
{
/**
* @covers \Tale\Inflector\Strategy\RejoinStrategy::inflect
* @covers ::inflect
*/
public function testInflections()
{
$instance = new CamelCaseStrategy();
$this->assertEquals('SomeRandomString', $instance->inflect('--some Random&string!'));
$this->assertEquals('IRandomString', $instance->inflect('IRandomSTRING'));
$this->assertEquals('SomeStringOfStrings', $instance->inflect('SomeSTRINGOfStrings'));
$this->assertEquals('StringString', $instance->inflect('String! & ! String'));
}
}
25 changes: 25 additions & 0 deletions tests/Inflector/Strategy/DashStrategyTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php
declare(strict_types=1);

namespace Tale\Test\Inflector\Strategy;

use PHPUnit\Framework\TestCase;
use Tale\Inflector\Strategy\DashStrategy;

/**
* @coversDefaultClass \Tale\Inflector\Strategy\DashStrategyTest
*/
class DashStrategyTest extends TestCase
{
/**
* @covers \Tale\Inflector\Strategy\RejoinStrategy::inflect
*/
public function testInflections()
{
$instance = new DashStrategy();
$this->assertEquals('some-Random-string', $instance->inflect('--some Random&string!'));
$this->assertEquals('I-Random-STRING', $instance->inflect('IRandomSTRING'));
$this->assertEquals('Some-STRING-Of-Strings', $instance->inflect('SomeSTRINGOfStrings'));
$this->assertEquals('String-String', $instance->inflect('String! & ! String'));
}
}
26 changes: 26 additions & 0 deletions tests/Inflector/Strategy/KebabCaseStrategyTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php
declare(strict_types=1);

namespace Tale\Test\Inflector\Strategy;

use PHPUnit\Framework\TestCase;
use Tale\Inflector\Strategy\KebabCaseStrategy;

/**
* @coversDefaultClass \Tale\Inflector\Strategy\KebabCaseStrategy
*/
class KebabCaseStrategyTest extends TestCase
{
/**
* @covers \Tale\Inflector\Strategy\RejoinStrategy::inflect
* @covers ::inflect
*/
public function testInflections()
{
$instance = new KebabCaseStrategy();
$this->assertEquals('some-random-string', $instance->inflect('--some Random&string!'));
$this->assertEquals('i-random-string', $instance->inflect('IRandomSTRING'));
$this->assertEquals('some-string-of-strings', $instance->inflect('SomeSTRINGOfStrings'));
$this->assertEquals('string-string', $instance->inflect('String! & ! String'));
}
}
Loading

0 comments on commit eb872fb

Please sign in to comment.