File: ClassNameInflectorTest.php

package info (click to toggle)
php-proxy-manager 2.11.1%2B1.0.18-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,624 kB
  • sloc: php: 14,438; makefile: 25
file content (140 lines) | stat: -rw-r--r-- 4,892 bytes parent folder | download | duplicates (3)
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"]],
        ];
    }
}