1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
<?php
declare(strict_types=1);
namespace ProxyManagerTest\Inflector;
use PHPUnit\Framework\TestCase;
use ProxyManager\Inflector\ClassNameInflector;
use ProxyManager\Inflector\ClassNameInflectorInterface;
/**
* Tests for {@see \ProxyManager\Inflector\ClassNameInflector}
*
* @group Coverage
* @covers \ProxyManager\Inflector\ClassNameInflector
*/
final class ClassNameInflectorTest extends TestCase
{
/**
* @param class-string $realClassName
* @param class-string $proxyClassName
*
* @dataProvider getClassNames
*/
public function testInflector(string $realClassName, string $proxyClassName): void
{
$inflector = new ClassNameInflector('ProxyNS');
self::assertFalse($inflector->isProxyClassName($realClassName));
self::assertTrue($inflector->isProxyClassName($proxyClassName));
self::assertStringMatchesFormat($realClassName, $inflector->getUserClassName($realClassName));
self::assertStringMatchesFormat($proxyClassName, $inflector->getProxyClassName($proxyClassName));
self::assertStringMatchesFormat($proxyClassName, $inflector->getProxyClassName($realClassName));
self::assertStringMatchesFormat($realClassName, $inflector->getUserClassName($proxyClassName));
}
public function testGeneratesSameClassNameWithSameParameters(): void
{
/** @var class-string $fooBar */
$fooBar = 'Foo\\Bar';
$inflector = new ClassNameInflector('ProxyNS');
self::assertSame($inflector->getProxyClassName($fooBar), $inflector->getProxyClassName($fooBar));
self::assertSame(
$inflector->getProxyClassName($fooBar, ['baz' => 'tab']),
$inflector->getProxyClassName($fooBar, ['baz' => 'tab'])
);
self::assertSame(
$inflector->getProxyClassName($fooBar, ['tab' => 'baz']),
$inflector->getProxyClassName($fooBar, ['tab' => 'baz'])
);
}
public function testGeneratesDifferentClassNameWithDifferentParameters(): void
{
/** @var class-string $fooBar */
$fooBar = 'Foo\\Bar';
$inflector = new ClassNameInflector('ProxyNS');
self::assertNotSame(
$inflector->getProxyClassName($fooBar),
$inflector->getProxyClassName($fooBar, ['foo' => 'bar'])
);
self::assertNotSame(
$inflector->getProxyClassName($fooBar, ['baz' => 'tab']),
$inflector->getProxyClassName($fooBar, ['tab' => 'baz'])
);
self::assertNotSame(
$inflector->getProxyClassName($fooBar, ['foo' => 'bar', 'tab' => 'baz']),
$inflector->getProxyClassName($fooBar, ['foo' => 'bar'])
);
self::assertNotSame(
$inflector->getProxyClassName($fooBar, ['foo' => 'bar', 'tab' => 'baz']),
$inflector->getProxyClassName($fooBar, ['tab' => 'baz', 'foo' => 'bar'])
);
}
public function testGeneratesCorrectClassNameWhenGivenLeadingBackslash(): void
{
/** @var class-string $fooBar */
$fooBar = 'Foo\\Bar';
/** @var class-string $fooBarPrefixed */
$fooBarPrefixed = '\\Foo\\Bar';
$inflector = new ClassNameInflector('ProxyNS');
self::assertSame(
$inflector->getProxyClassName($fooBarPrefixed, ['tab' => 'baz']),
$inflector->getProxyClassName($fooBar, ['tab' => 'baz'])
);
}
/**
* @param class-string $className
* @param array<string, mixed> $parameters
*
* @dataProvider getClassAndParametersCombinations
*/
public function testClassNameIsValidClassIdentifier(string $className, array $parameters): void
{
$inflector = new ClassNameInflector('ProxyNS');
self::assertMatchesRegularExpression(
'/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]+)(\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]+)*/',
$inflector->getProxyClassName($className, $parameters),
'Class name string is a valid class identifier'
);
}
/**
* Data provider.
*
* @return string[][]
*/
public static function getClassNames(): array
{
return [
['Foo', 'ProxyNS\\' . ClassNameInflectorInterface::PROXY_MARKER . '\\Foo\\%s'],
['Foo\\Bar', 'ProxyNS\\' . ClassNameInflectorInterface::PROXY_MARKER . '\\Foo\\Bar\\%s'],
];
}
/**
* Data provider.
*
* @return mixed[][]
*/
public static function getClassAndParametersCombinations(): array
{
return [
['Foo', []],
['Foo\\Bar', []],
['Foo', [null]],
['Foo\\Bar', [null]],
['Foo', ['foo' => 'bar']],
['Foo\\Bar', ['foo' => 'bar']],
['Foo', ["\0" => "very \0 bad"]],
['Foo\\Bar', ["\0" => "very \0 bad"]],
];
}
}
|