Ocramius /
ProxyManager
This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | |||
| 3 | declare(strict_types=1); |
||
| 4 | |||
| 5 | namespace ProxyManagerTest\Functional; |
||
| 6 | |||
| 7 | use Closure; |
||
| 8 | use Generator; |
||
| 9 | use PHPUnit\Framework\ExpectationFailedException; |
||
| 10 | use PHPUnit\Framework\MockObject\MockObject as Mock; |
||
| 11 | use PHPUnit\Framework\TestCase; |
||
| 12 | use ProxyManager\Factory\LazyLoadingValueHolderFactory; |
||
| 13 | use ProxyManager\Proxy\LazyLoadingInterface; |
||
| 14 | use ProxyManager\Proxy\VirtualProxyInterface; |
||
| 15 | use ProxyManagerTestAsset\BaseClass; |
||
| 16 | use ProxyManagerTestAsset\BaseInterface; |
||
| 17 | use ProxyManagerTestAsset\CallableInterface; |
||
| 18 | use ProxyManagerTestAsset\ClassWithCounterConstructor; |
||
| 19 | use ProxyManagerTestAsset\ClassWithDynamicArgumentsMethod; |
||
| 20 | use ProxyManagerTestAsset\ClassWithMagicMethods; |
||
| 21 | use ProxyManagerTestAsset\ClassWithMethodWithByRefVariadicFunction; |
||
| 22 | use ProxyManagerTestAsset\ClassWithMethodWithVariadicFunction; |
||
| 23 | use ProxyManagerTestAsset\ClassWithParentHint; |
||
| 24 | use ProxyManagerTestAsset\ClassWithPublicArrayProperty; |
||
| 25 | use ProxyManagerTestAsset\ClassWithPublicProperties; |
||
| 26 | use ProxyManagerTestAsset\ClassWithSelfHint; |
||
| 27 | use ProxyManagerTestAsset\EmptyClass; |
||
| 28 | use ProxyManagerTestAsset\OtherObjectAccessClass; |
||
| 29 | use ProxyManagerTestAsset\VoidCounter; |
||
| 30 | use ReflectionClass; |
||
| 31 | use ReflectionProperty; |
||
| 32 | use stdClass; |
||
| 33 | use function array_values; |
||
| 34 | use function get_class; |
||
| 35 | use function random_int; |
||
| 36 | use function serialize; |
||
| 37 | use function ucfirst; |
||
| 38 | use function uniqid; |
||
| 39 | use function unserialize; |
||
| 40 | |||
| 41 | /** |
||
| 42 | * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolderGenerator} produced objects |
||
| 43 | * |
||
| 44 | * @group Functional |
||
| 45 | * @coversNothing |
||
| 46 | */ |
||
| 47 | final class LazyLoadingValueHolderFunctionalTest extends TestCase |
||
| 48 | { |
||
| 49 | /** |
||
| 50 | * @param mixed[] $params |
||
| 51 | * @param mixed $expectedValue |
||
| 52 | * |
||
| 53 | * @dataProvider getProxyMethods |
||
| 54 | * |
||
| 55 | * @psalm-template OriginalClass |
||
| 56 | * @psalm-param class-string<OriginalClass> $className |
||
| 57 | * @psalm-param OriginalClass $instance |
||
| 58 | */ |
||
| 59 | public function testMethodCalls(string $className, object $instance, string $method, array $params, $expectedValue) : void |
||
| 60 | { |
||
| 61 | $proxy = (new LazyLoadingValueHolderFactory())->createProxy( |
||
| 62 | $className, |
||
| 63 | $this->createInitializer($className, $instance) |
||
| 64 | ); |
||
| 65 | |||
| 66 | self::assertFalse($proxy->isProxyInitialized()); |
||
|
0 ignored issues
–
show
|
|||
| 67 | |||
| 68 | /** @var callable $callProxyMethod */ |
||
| 69 | $callProxyMethod = [$proxy, $method]; |
||
| 70 | $parameterValues = array_values($params); |
||
| 71 | |||
| 72 | self::assertSame($expectedValue, $callProxyMethod(...$parameterValues)); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 73 | self::assertTrue($proxy->isProxyInitialized()); |
||
|
0 ignored issues
–
show
The method
assertTrue() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 74 | self::assertSame($instance, $proxy->getWrappedValueHolderValue()); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 75 | } |
||
| 76 | |||
| 77 | /** |
||
| 78 | * @param mixed[] $params |
||
| 79 | * @param mixed $expectedValue |
||
| 80 | * |
||
| 81 | * @dataProvider getProxyMethods |
||
| 82 | * |
||
| 83 | * @psalm-template OriginalClass |
||
| 84 | * @psalm-param class-string<OriginalClass> $className |
||
| 85 | * @psalm-param OriginalClass $instance |
||
| 86 | */ |
||
| 87 | public function testMethodCallsAfterUnSerialization( |
||
| 88 | string $className, |
||
| 89 | object $instance, |
||
| 90 | string $method, |
||
| 91 | array $params, |
||
| 92 | $expectedValue |
||
| 93 | ) : void { |
||
| 94 | /** @var VirtualProxyInterface $proxy */ |
||
| 95 | $proxy = unserialize(serialize((new LazyLoadingValueHolderFactory())->createProxy( |
||
| 96 | $className, |
||
| 97 | $this->createInitializer($className, $instance) |
||
| 98 | ))); |
||
| 99 | |||
| 100 | self::assertTrue($proxy->isProxyInitialized()); |
||
|
0 ignored issues
–
show
The method
assertTrue() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 101 | |||
| 102 | $callProxyMethod = [$proxy, $method]; |
||
| 103 | $parameterValues = array_values($params); |
||
| 104 | |||
| 105 | self::assertIsCallable($callProxyMethod); |
||
|
0 ignored issues
–
show
The method
assertIsCallable() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 106 | |||
| 107 | self::assertSame($expectedValue, $callProxyMethod(...$parameterValues)); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 108 | self::assertEquals($instance, $proxy->getWrappedValueHolderValue()); |
||
|
0 ignored issues
–
show
The method
assertEquals() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 109 | } |
||
| 110 | |||
| 111 | /** |
||
| 112 | * @param mixed[] $params |
||
| 113 | * @param mixed $expectedValue |
||
| 114 | * |
||
| 115 | * @dataProvider getProxyMethods |
||
| 116 | * |
||
| 117 | * @psalm-template OriginalClass |
||
| 118 | * @psalm-param class-string<OriginalClass> $className |
||
| 119 | * @psalm-param OriginalClass $instance |
||
| 120 | */ |
||
| 121 | public function testMethodCallsAfterCloning( |
||
| 122 | string $className, |
||
| 123 | object $instance, |
||
| 124 | string $method, |
||
| 125 | array $params, |
||
| 126 | $expectedValue |
||
| 127 | ) : void { |
||
| 128 | $proxy = (new LazyLoadingValueHolderFactory())->createProxy( |
||
| 129 | $className, |
||
| 130 | $this->createInitializer($className, $instance) |
||
| 131 | ); |
||
| 132 | $cloned = clone $proxy; |
||
| 133 | |||
| 134 | self::assertTrue($cloned->isProxyInitialized()); |
||
|
0 ignored issues
–
show
The method
assertTrue() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 135 | self::assertNotSame($proxy->getWrappedValueHolderValue(), $cloned->getWrappedValueHolderValue()); |
||
|
0 ignored issues
–
show
The method
assertNotSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 136 | |||
| 137 | $callProxyMethod = [$cloned, $method]; |
||
| 138 | $parameterValues = array_values($params); |
||
| 139 | |||
| 140 | self::assertIsCallable($callProxyMethod); |
||
|
0 ignored issues
–
show
The method
assertIsCallable() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 141 | |||
| 142 | self::assertSame($expectedValue, $callProxyMethod(...$parameterValues)); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 143 | self::assertEquals($instance, $cloned->getWrappedValueHolderValue()); |
||
|
0 ignored issues
–
show
The method
assertEquals() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 144 | } |
||
| 145 | |||
| 146 | /** |
||
| 147 | * @param mixed $propertyValue |
||
| 148 | * |
||
| 149 | * @dataProvider getPropertyAccessProxies |
||
| 150 | */ |
||
| 151 | public function testPropertyReadAccess( |
||
| 152 | object $instance, |
||
| 153 | VirtualProxyInterface $proxy, |
||
| 154 | string $publicProperty, |
||
| 155 | $propertyValue |
||
| 156 | ) : void { |
||
| 157 | self::assertSame($propertyValue, $proxy->$publicProperty); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 158 | self::assertTrue($proxy->isProxyInitialized()); |
||
|
0 ignored issues
–
show
The method
assertTrue() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 159 | self::assertEquals($instance, $proxy->getWrappedValueHolderValue()); |
||
|
0 ignored issues
–
show
The method
assertEquals() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 160 | } |
||
| 161 | |||
| 162 | /** |
||
| 163 | * @dataProvider getPropertyAccessProxies |
||
| 164 | */ |
||
| 165 | public function testPropertyWriteAccess(object $instance, VirtualProxyInterface $proxy, string $publicProperty) : void |
||
|
0 ignored issues
–
show
|
|||
| 166 | { |
||
| 167 | $newValue = uniqid('', true); |
||
| 168 | $proxy->$publicProperty = $newValue; |
||
| 169 | |||
| 170 | self::assertTrue($proxy->isProxyInitialized()); |
||
|
0 ignored issues
–
show
The method
assertTrue() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 171 | self::assertSame($newValue, $proxy->$publicProperty); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 172 | |||
| 173 | $wrappedValue = $proxy->getWrappedValueHolderValue(); |
||
| 174 | |||
| 175 | self::assertNotNull($wrappedValue); |
||
|
0 ignored issues
–
show
The method
assertNotNull() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 176 | |||
| 177 | self::assertSame($newValue, $wrappedValue->$publicProperty); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 178 | } |
||
| 179 | |||
| 180 | /** |
||
| 181 | * @dataProvider getPropertyAccessProxies |
||
| 182 | */ |
||
| 183 | public function testPropertyExistence(object $instance, VirtualProxyInterface $proxy, string $publicProperty) : void |
||
| 184 | { |
||
| 185 | self::assertSame(isset($instance->$publicProperty), isset($proxy->$publicProperty)); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 186 | self::assertTrue($proxy->isProxyInitialized()); |
||
|
0 ignored issues
–
show
The method
assertTrue() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 187 | self::assertEquals($instance, $proxy->getWrappedValueHolderValue()); |
||
|
0 ignored issues
–
show
The method
assertEquals() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 188 | } |
||
| 189 | |||
| 190 | /** |
||
| 191 | * @dataProvider getPropertyAccessProxies |
||
| 192 | */ |
||
| 193 | public function testPropertyAbsence(object $instance, VirtualProxyInterface $proxy, string $publicProperty) : void |
||
| 194 | { |
||
| 195 | $instance = $proxy->getWrappedValueHolderValue() ?: $instance; |
||
| 196 | $instance->$publicProperty = null; |
||
| 197 | self::assertFalse(isset($proxy->$publicProperty)); |
||
|
0 ignored issues
–
show
The method
assertFalse() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 198 | self::assertTrue($proxy->isProxyInitialized()); |
||
|
0 ignored issues
–
show
The method
assertTrue() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 199 | } |
||
| 200 | |||
| 201 | /** |
||
| 202 | * @dataProvider getPropertyAccessProxies |
||
| 203 | */ |
||
| 204 | public function testPropertyUnset(object $instance, VirtualProxyInterface $proxy, string $publicProperty) : void |
||
| 205 | { |
||
| 206 | $instance = $proxy->getWrappedValueHolderValue() ?: $instance; |
||
| 207 | unset($proxy->$publicProperty); |
||
| 208 | |||
| 209 | self::assertTrue($proxy->isProxyInitialized()); |
||
|
0 ignored issues
–
show
The method
assertTrue() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 210 | |||
| 211 | self::assertFalse(isset($instance->$publicProperty)); |
||
|
0 ignored issues
–
show
The method
assertFalse() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 212 | self::assertFalse(isset($proxy->$publicProperty)); |
||
|
0 ignored issues
–
show
The method
assertFalse() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 213 | } |
||
| 214 | |||
| 215 | /** |
||
| 216 | * Verifies that accessing a public property containing an array behaves like in a normal context |
||
| 217 | */ |
||
| 218 | public function testCanWriteToArrayKeysInPublicProperty() : void |
||
| 219 | { |
||
| 220 | $proxy = (new LazyLoadingValueHolderFactory())->createProxy( |
||
| 221 | ClassWithPublicArrayProperty::class, |
||
| 222 | $this->createInitializer(ClassWithPublicArrayProperty::class, new ClassWithPublicArrayProperty()) |
||
|
0 ignored issues
–
show
new \ProxyManagerTestAss...thPublicArrayProperty() is of type object<ProxyManagerTestA...ithPublicArrayProperty>, but the function expects a object<ProxyManagerTest\Functional\object>.
It seems like the type of the argument is not accepted by the function/method which you are calling. In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug. We suggest to add an explicit type cast like in the following example: function acceptsInteger($int) { }
$x = '123'; // string "123"
// Instead of
acceptsInteger($x);
// we recommend to use
acceptsInteger((integer) $x);
Loading history...
|
|||
| 223 | ); |
||
| 224 | |||
| 225 | $proxy->arrayProperty['foo'] = 'bar'; |
||
| 226 | |||
| 227 | self::assertByRefVariableValueSame('bar', $proxy->arrayProperty['foo']); |
||
| 228 | |||
| 229 | $proxy->arrayProperty = ['tab' => 'taz']; |
||
| 230 | |||
| 231 | self::assertSame(['tab' => 'taz'], $proxy->arrayProperty); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 232 | } |
||
| 233 | |||
| 234 | /** |
||
| 235 | * Verifies that public properties retrieved via `__get` don't get modified in the object itself |
||
| 236 | */ |
||
| 237 | public function testWillNotModifyRetrievedPublicProperties() : void |
||
| 238 | { |
||
| 239 | $proxy = (new LazyLoadingValueHolderFactory())->createProxy( |
||
| 240 | ClassWithPublicProperties::class, |
||
| 241 | $this->createInitializer(ClassWithPublicProperties::class, new ClassWithPublicProperties()) |
||
|
0 ignored issues
–
show
new \ProxyManagerTestAss...sWithPublicProperties() is of type object<ProxyManagerTestA...ssWithPublicProperties>, but the function expects a object<ProxyManagerTest\Functional\object>.
It seems like the type of the argument is not accepted by the function/method which you are calling. In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug. We suggest to add an explicit type cast like in the following example: function acceptsInteger($int) { }
$x = '123'; // string "123"
// Instead of
acceptsInteger($x);
// we recommend to use
acceptsInteger((integer) $x);
Loading history...
|
|||
| 242 | ); |
||
| 243 | $variable = $proxy->property0; |
||
| 244 | |||
| 245 | self::assertByRefVariableValueSame('property0', $variable); |
||
| 246 | |||
| 247 | $variable = 'foo'; |
||
| 248 | |||
| 249 | self::assertSame('property0', $proxy->property0); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 250 | self::assertByRefVariableValueSame('foo', $variable); |
||
| 251 | } |
||
| 252 | |||
| 253 | /** |
||
| 254 | * Verifies that public properties references retrieved via `__get` modify in the object state |
||
| 255 | */ |
||
| 256 | public function testWillModifyByRefRetrievedPublicProperties() : void |
||
| 257 | { |
||
| 258 | $proxy = (new LazyLoadingValueHolderFactory())->createProxy( |
||
| 259 | ClassWithPublicProperties::class, |
||
| 260 | $this->createInitializer(ClassWithPublicProperties::class, new ClassWithPublicProperties()) |
||
|
0 ignored issues
–
show
new \ProxyManagerTestAss...sWithPublicProperties() is of type object<ProxyManagerTestA...ssWithPublicProperties>, but the function expects a object<ProxyManagerTest\Functional\object>.
It seems like the type of the argument is not accepted by the function/method which you are calling. In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug. We suggest to add an explicit type cast like in the following example: function acceptsInteger($int) { }
$x = '123'; // string "123"
// Instead of
acceptsInteger($x);
// we recommend to use
acceptsInteger((integer) $x);
Loading history...
|
|||
| 261 | ); |
||
| 262 | $variable = & $proxy->property0; |
||
| 263 | |||
| 264 | self::assertByRefVariableValueSame('property0', $variable); |
||
| 265 | |||
| 266 | $variable = 'foo'; |
||
| 267 | |||
| 268 | self::assertSame('foo', $proxy->property0); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 269 | self::assertByRefVariableValueSame('foo', $variable); |
||
| 270 | } |
||
| 271 | |||
| 272 | /** |
||
| 273 | * @group 16 |
||
| 274 | * |
||
| 275 | * Verifies that initialization of a value holder proxy may happen multiple times |
||
| 276 | */ |
||
| 277 | public function testWillAllowMultipleProxyInitialization() : void |
||
| 278 | { |
||
| 279 | $counter = 0; |
||
| 280 | |||
| 281 | $proxy = (new LazyLoadingValueHolderFactory())->createProxy( |
||
| 282 | BaseClass::class, |
||
| 283 | static function (?object & $wrappedInstance) use (& $counter) : bool { |
||
| 284 | $wrappedInstance = new BaseClass(); |
||
| 285 | |||
| 286 | /** @var int $counter */ |
||
| 287 | $wrappedInstance->publicProperty = (string) ($counter += 1); |
||
| 288 | |||
| 289 | return true; |
||
| 290 | } |
||
| 291 | ); |
||
| 292 | |||
| 293 | self::assertSame('1', $proxy->publicProperty); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 294 | self::assertSame('2', $proxy->publicProperty); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 295 | self::assertSame('3', $proxy->publicProperty); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 296 | } |
||
| 297 | |||
| 298 | /** |
||
| 299 | * @group 115 |
||
| 300 | * @group 175 |
||
| 301 | */ |
||
| 302 | public function testWillBehaveLikeObjectWithNormalConstructor() : void |
||
| 303 | { |
||
| 304 | $instance = new ClassWithCounterConstructor(10); |
||
| 305 | |||
| 306 | self::assertSame(10, $instance->amount, 'Verifying that test asset works as expected'); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 307 | self::assertSame(10, $instance->getAmount(), 'Verifying that test asset works as expected'); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 308 | $instance->__construct(3); |
||
| 309 | self::assertSame(13, $instance->amount, 'Verifying that test asset works as expected'); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 310 | self::assertSame(13, $instance->getAmount(), 'Verifying that test asset works as expected'); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 311 | |||
| 312 | $proxyName = get_class( |
||
| 313 | (new LazyLoadingValueHolderFactory()) |
||
| 314 | ->createProxy( |
||
| 315 | ClassWithCounterConstructor::class, |
||
| 316 | static function () : bool { |
||
| 317 | return true; |
||
| 318 | } |
||
| 319 | ) |
||
| 320 | ); |
||
| 321 | |||
| 322 | $proxy = new $proxyName(15); |
||
| 323 | |||
| 324 | self::assertSame(15, $proxy->amount, 'Verifying that the proxy constructor works as expected'); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 325 | self::assertSame(15, $proxy->getAmount(), 'Verifying that the proxy constructor works as expected'); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 326 | $proxy->__construct(5); |
||
| 327 | self::assertSame(20, $proxy->amount, 'Verifying that the proxy constructor works as expected'); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 328 | self::assertSame(20, $proxy->getAmount(), 'Verifying that the proxy constructor works as expected'); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 329 | } |
||
| 330 | |||
| 331 | /** |
||
| 332 | * @group 265 |
||
| 333 | */ |
||
| 334 | public function testWillForwardVariadicByRefArguments() : void |
||
| 335 | { |
||
| 336 | $object = (new LazyLoadingValueHolderFactory())->createProxy( |
||
| 337 | ClassWithMethodWithByRefVariadicFunction::class, |
||
| 338 | static function (?object & $wrappedInstance) : bool { |
||
| 339 | $wrappedInstance = new ClassWithMethodWithByRefVariadicFunction(); |
||
| 340 | |||
| 341 | return true; |
||
| 342 | } |
||
| 343 | ); |
||
| 344 | |||
| 345 | $parameters = ['a', 'b', 'c']; |
||
| 346 | |||
| 347 | // first, testing normal variadic behavior (verifying we didn't screw up in the test asset) |
||
| 348 | self::assertSame(['a', 'changed', 'c'], (new ClassWithMethodWithByRefVariadicFunction())->tuz(...$parameters)); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 349 | self::assertSame(['a', 'changed', 'c'], $object->tuz(...$parameters)); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 350 | self::assertSame(['a', 'changed', 'c'], $parameters, 'by-ref variadic parameter was changed'); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 351 | } |
||
| 352 | |||
| 353 | /** |
||
| 354 | * This test documents a known limitation: `func_get_args()` (and similars) don't work in proxied APIs. |
||
| 355 | * If you manage to make this test pass, then please do send a patch |
||
| 356 | * |
||
| 357 | * @group 265 |
||
| 358 | */ |
||
| 359 | public function testWillNotForwardDynamicArguments() : void |
||
| 360 | { |
||
| 361 | $object = (new LazyLoadingValueHolderFactory())->createProxy( |
||
| 362 | ClassWithDynamicArgumentsMethod::class, |
||
| 363 | static function (?object & $wrappedInstance) : bool { |
||
| 364 | $wrappedInstance = new ClassWithDynamicArgumentsMethod(); |
||
| 365 | |||
| 366 | return true; |
||
| 367 | } |
||
| 368 | ); |
||
| 369 | |||
| 370 | self::assertSame(['a', 'b'], (new ClassWithDynamicArgumentsMethod())->dynamicArgumentsMethod('a', 'b')); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 371 | |||
| 372 | $this->expectException(ExpectationFailedException::class); |
||
|
0 ignored issues
–
show
The method
expectException() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 373 | |||
| 374 | self::assertSame(['a', 'b'], $object->dynamicArgumentsMethod('a', 'b')); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 375 | } |
||
| 376 | |||
| 377 | /** |
||
| 378 | * @return Closure( |
||
|
0 ignored issues
–
show
The doc-type
Closure( could not be parsed: Expected "|" or "end of type", but got "(" at position 7. (view supported doc-types)
This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types. Loading history...
|
|||
| 379 | * object|null, |
||
| 380 | * VirtualProxyInterface, |
||
| 381 | * string, |
||
| 382 | * array, |
||
| 383 | * ?Closure |
||
| 384 | * ) : bool |
||
| 385 | * |
||
| 386 | * @psalm-param (CallableInterface&Mock)|null $initializerMatcher |
||
| 387 | */ |
||
| 388 | private function createInitializer(string $className, object $realInstance, ?Mock $initializerMatcher = null) : Closure |
||
| 389 | { |
||
| 390 | if (! $initializerMatcher) { |
||
| 391 | $initializerMatcher = $this->createMock(CallableInterface::class); |
||
|
0 ignored issues
–
show
Are you sure the assignment to
$initializerMatcher is correct as $this->createMock(\Proxy...llableInterface::class) (which targets PHPUnit\Framework\TestCase::createMock()) seems to always return null.
This check looks for function or method calls that always return null and whose return value is assigned to a variable. class A
{
function getObject()
{
return null;
}
}
$a = new A();
$object = $a->getObject();
The method The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes. Loading history...
|
|||
| 392 | |||
| 393 | $initializerMatcher |
||
|
0 ignored issues
–
show
|
|||
| 394 | ->expects(self::once()) |
||
|
0 ignored issues
–
show
The method
once() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 395 | ->method('__invoke') |
||
| 396 | ->with( |
||
| 397 | self::logicalAnd( |
||
|
0 ignored issues
–
show
The method
logicalAnd() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 398 | self::isInstanceOf(VirtualProxyInterface::class), |
||
|
0 ignored issues
–
show
The method
isInstanceOf() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 399 | self::isInstanceOf($className) |
||
|
0 ignored issues
–
show
The method
isInstanceOf() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 400 | ), |
||
| 401 | $realInstance |
||
| 402 | ); |
||
| 403 | } |
||
| 404 | |||
| 405 | return static function ( |
||
| 406 | ?object & $wrappedObject, |
||
| 407 | VirtualProxyInterface $proxy, |
||
| 408 | string $method, |
||
| 409 | array $params, |
||
| 410 | ?Closure & $initializer |
||
| 411 | ) use ( |
||
| 412 | $initializerMatcher, |
||
| 413 | $realInstance |
||
| 414 | ) : bool { |
||
| 415 | $initializer = null; |
||
| 416 | |||
| 417 | $wrappedObject = $realInstance; |
||
| 418 | |||
| 419 | $initializerMatcher->__invoke($proxy, $wrappedObject, $method, $params); |
||
| 420 | |||
| 421 | return true; |
||
| 422 | }; |
||
| 423 | } |
||
| 424 | |||
| 425 | /** |
||
| 426 | * Generates a list of object, invoked method, parameters, expected result |
||
| 427 | * |
||
| 428 | * @return string[][]|object[][]|bool[][]|mixed[][][] |
||
| 429 | */ |
||
| 430 | public function getProxyMethods() : array |
||
| 431 | { |
||
| 432 | $selfHintParam = new ClassWithSelfHint(); |
||
| 433 | $empty = new EmptyClass(); |
||
| 434 | |||
| 435 | return [ |
||
| 436 | [ |
||
| 437 | BaseClass::class, |
||
| 438 | new BaseClass(), |
||
| 439 | 'publicMethod', |
||
| 440 | [], |
||
| 441 | 'publicMethodDefault', |
||
| 442 | ], |
||
| 443 | [ |
||
| 444 | BaseClass::class, |
||
| 445 | new BaseClass(), |
||
| 446 | 'publicTypeHintedMethod', |
||
| 447 | [new stdClass()], |
||
| 448 | 'publicTypeHintedMethodDefault', |
||
| 449 | ], |
||
| 450 | [ |
||
| 451 | BaseClass::class, |
||
| 452 | new BaseClass(), |
||
| 453 | 'publicByReferenceMethod', |
||
| 454 | [], |
||
| 455 | 'publicByReferenceMethodDefault', |
||
| 456 | ], |
||
| 457 | [ |
||
| 458 | BaseInterface::class, |
||
| 459 | new BaseClass(), |
||
| 460 | 'publicMethod', |
||
| 461 | [], |
||
| 462 | 'publicMethodDefault', |
||
| 463 | ], |
||
| 464 | [ |
||
| 465 | ClassWithSelfHint::class, |
||
| 466 | new ClassWithSelfHint(), |
||
| 467 | 'selfHintMethod', |
||
| 468 | ['parameter' => $selfHintParam], |
||
| 469 | $selfHintParam, |
||
| 470 | ], |
||
| 471 | [ |
||
| 472 | ClassWithParentHint::class, |
||
| 473 | new ClassWithParentHint(), |
||
| 474 | 'parentHintMethod', |
||
| 475 | ['parameter' => $empty], |
||
| 476 | $empty, |
||
| 477 | ], |
||
| 478 | [ |
||
| 479 | ClassWithMethodWithVariadicFunction::class, |
||
| 480 | new ClassWithMethodWithVariadicFunction(), |
||
| 481 | 'buz', |
||
| 482 | ['Ocramius', 'Malukenho'], |
||
| 483 | ['Ocramius', 'Malukenho'], |
||
| 484 | ], |
||
| 485 | [ |
||
| 486 | ClassWithMethodWithByRefVariadicFunction::class, |
||
| 487 | new ClassWithMethodWithByRefVariadicFunction(), |
||
| 488 | 'tuz', |
||
| 489 | ['Ocramius', 'Malukenho'], |
||
| 490 | ['Ocramius', 'changed'], |
||
| 491 | ], |
||
| 492 | [ |
||
| 493 | ClassWithMagicMethods::class, |
||
| 494 | new ClassWithMagicMethods(), |
||
| 495 | '__get', |
||
| 496 | ['parameterName'], |
||
| 497 | 'parameterName', |
||
| 498 | ], |
||
| 499 | [ |
||
| 500 | ClassWithMagicMethods::class, |
||
| 501 | new ClassWithMagicMethods(), |
||
| 502 | '__set', |
||
| 503 | ['foo', 'bar'], |
||
| 504 | ['foo' => 'bar'], |
||
| 505 | ], |
||
| 506 | [ |
||
| 507 | ClassWithMagicMethods::class, |
||
| 508 | new ClassWithMagicMethods(), |
||
| 509 | '__isset', |
||
| 510 | ['example'], |
||
| 511 | true, |
||
| 512 | ], |
||
| 513 | [ |
||
| 514 | ClassWithMagicMethods::class, |
||
| 515 | new ClassWithMagicMethods(), |
||
| 516 | '__isset', |
||
| 517 | [''], |
||
| 518 | false, |
||
| 519 | ], |
||
| 520 | [ |
||
| 521 | ClassWithMagicMethods::class, |
||
| 522 | new ClassWithMagicMethods(), |
||
| 523 | '__unset', |
||
| 524 | ['example'], |
||
| 525 | true, |
||
| 526 | ], |
||
| 527 | ]; |
||
| 528 | } |
||
| 529 | |||
| 530 | /** |
||
| 531 | * Generates proxies and instances with a public property to feed to the property accessor methods |
||
| 532 | * |
||
| 533 | * @return array<int, array<int, object|VirtualProxyInterface|string>> |
||
|
0 ignored issues
–
show
The doc-type
array<int, could not be parsed: Expected ">" at position 5, but found "end of type". (view supported doc-types)
This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types. Loading history...
|
|||
| 534 | */ |
||
| 535 | public function getPropertyAccessProxies() : array |
||
| 536 | { |
||
| 537 | $instance1 = new BaseClass(); |
||
| 538 | $instance2 = new BaseClass(); |
||
| 539 | $factory = new LazyLoadingValueHolderFactory(); |
||
| 540 | /** @var VirtualProxyInterface $serialized */ |
||
| 541 | $serialized = unserialize(serialize($factory->createProxy( |
||
| 542 | BaseClass::class, |
||
| 543 | $this->createInitializer(BaseClass::class, $instance2) |
||
|
0 ignored issues
–
show
$instance2 is of type object<ProxyManagerTestAsset\BaseClass>, but the function expects a object<ProxyManagerTest\Functional\object>.
It seems like the type of the argument is not accepted by the function/method which you are calling. In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug. We suggest to add an explicit type cast like in the following example: function acceptsInteger($int) { }
$x = '123'; // string "123"
// Instead of
acceptsInteger($x);
// we recommend to use
acceptsInteger((integer) $x);
Loading history...
|
|||
| 544 | ))); |
||
| 545 | |||
| 546 | return [ |
||
| 547 | [ |
||
| 548 | $instance1, |
||
| 549 | $factory->createProxy( |
||
| 550 | BaseClass::class, |
||
| 551 | $this->createInitializer(BaseClass::class, $instance1) |
||
|
0 ignored issues
–
show
$instance1 is of type object<ProxyManagerTestAsset\BaseClass>, but the function expects a object<ProxyManagerTest\Functional\object>.
It seems like the type of the argument is not accepted by the function/method which you are calling. In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug. We suggest to add an explicit type cast like in the following example: function acceptsInteger($int) { }
$x = '123'; // string "123"
// Instead of
acceptsInteger($x);
// we recommend to use
acceptsInteger((integer) $x);
Loading history...
|
|||
| 552 | ), |
||
| 553 | 'publicProperty', |
||
| 554 | 'publicPropertyDefault', |
||
| 555 | ], |
||
| 556 | [ |
||
| 557 | $instance2, |
||
| 558 | $serialized, |
||
| 559 | 'publicProperty', |
||
| 560 | 'publicPropertyDefault', |
||
| 561 | ], |
||
| 562 | ]; |
||
| 563 | } |
||
| 564 | |||
| 565 | /** |
||
| 566 | * @group 276 |
||
| 567 | * @dataProvider getMethodsThatAccessPropertiesOnOtherObjectsInTheSameScope |
||
| 568 | */ |
||
| 569 | public function testWillLazyLoadMembersOfOtherProxiesWithTheSamePrivateScope( |
||
| 570 | object $callerObject, |
||
| 571 | object $realInstance, |
||
| 572 | string $method, |
||
| 573 | string $expectedValue |
||
| 574 | ) : void { |
||
| 575 | $className = get_class($realInstance); |
||
| 576 | $proxy = (new LazyLoadingValueHolderFactory())->createProxy( |
||
| 577 | $className, |
||
| 578 | $this->createInitializer($className, $realInstance) |
||
| 579 | ); |
||
| 580 | |||
| 581 | $accessor = [$callerObject, $method]; |
||
| 582 | |||
| 583 | self::assertIsCallable($accessor); |
||
|
0 ignored issues
–
show
The method
assertIsCallable() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 584 | self::assertFalse($proxy->isProxyInitialized()); |
||
|
0 ignored issues
–
show
The method
assertFalse() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 585 | self::assertSame($expectedValue, $accessor($proxy)); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 586 | self::assertTrue($proxy->isProxyInitialized()); |
||
|
0 ignored issues
–
show
The method
assertTrue() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 587 | } |
||
| 588 | |||
| 589 | /** |
||
| 590 | * @group 276 |
||
| 591 | * @dataProvider getMethodsThatAccessPropertiesOnOtherObjectsInTheSameScope |
||
| 592 | */ |
||
| 593 | public function testWillFetchMembersOfOtherDeSerializedProxiesWithTheSamePrivateScope( |
||
| 594 | object $callerObject, |
||
| 595 | object $realInstance, |
||
| 596 | string $method, |
||
| 597 | string $expectedValue |
||
| 598 | ) : void { |
||
| 599 | $className = get_class($realInstance); |
||
| 600 | /** @var LazyLoadingInterface $proxy */ |
||
| 601 | $proxy = unserialize(serialize((new LazyLoadingValueHolderFactory())->createProxy( |
||
| 602 | $className, |
||
| 603 | $this->createInitializer($className, $realInstance) |
||
| 604 | ))); |
||
| 605 | |||
| 606 | /** @var callable $accessor */ |
||
| 607 | $accessor = [$callerObject, $method]; |
||
| 608 | |||
| 609 | self::assertTrue($proxy->isProxyInitialized()); |
||
|
0 ignored issues
–
show
The method
assertTrue() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 610 | self::assertSame($expectedValue, $accessor($proxy)); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 611 | } |
||
| 612 | |||
| 613 | /** |
||
| 614 | * @group 276 |
||
| 615 | * @dataProvider getMethodsThatAccessPropertiesOnOtherObjectsInTheSameScope |
||
| 616 | */ |
||
| 617 | public function testWillFetchMembersOfOtherClonedProxiesWithTheSamePrivateScope( |
||
| 618 | object $callerObject, |
||
| 619 | object $realInstance, |
||
| 620 | string $method, |
||
| 621 | string $expectedValue |
||
| 622 | ) : void { |
||
| 623 | $className = get_class($realInstance); |
||
| 624 | $proxy = clone (new LazyLoadingValueHolderFactory())->createProxy( |
||
| 625 | $className, |
||
| 626 | $this->createInitializer($className, $realInstance) |
||
| 627 | ); |
||
| 628 | |||
| 629 | /** @var callable $accessor */ |
||
| 630 | $accessor = [$callerObject, $method]; |
||
| 631 | |||
| 632 | self::assertTrue($proxy->isProxyInitialized()); |
||
|
0 ignored issues
–
show
The method
assertTrue() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 633 | self::assertSame($expectedValue, $accessor($proxy)); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 634 | } |
||
| 635 | |||
| 636 | /** |
||
| 637 | * @group 327 |
||
| 638 | */ |
||
| 639 | public function testWillExecuteLogicInAVoidMethod() : void |
||
| 640 | { |
||
| 641 | $proxy = (new LazyLoadingValueHolderFactory())->createProxy( |
||
| 642 | VoidCounter::class, |
||
| 643 | $this->createInitializer(VoidCounter::class, new VoidCounter()) |
||
|
0 ignored issues
–
show
new \ProxyManagerTestAsset\VoidCounter() is of type object<ProxyManagerTestAsset\VoidCounter>, but the function expects a object<ProxyManagerTest\Functional\object>.
It seems like the type of the argument is not accepted by the function/method which you are calling. In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug. We suggest to add an explicit type cast like in the following example: function acceptsInteger($int) { }
$x = '123'; // string "123"
// Instead of
acceptsInteger($x);
// we recommend to use
acceptsInteger((integer) $x);
Loading history...
|
|||
| 644 | ); |
||
| 645 | |||
| 646 | $increment = random_int(100, 1000); |
||
| 647 | |||
| 648 | $proxy->increment($increment); |
||
| 649 | |||
| 650 | self::assertSame($increment, $proxy->counter); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 651 | } |
||
| 652 | |||
| 653 | public function getMethodsThatAccessPropertiesOnOtherObjectsInTheSameScope() : Generator |
||
| 654 | { |
||
| 655 | foreach ((new ReflectionClass(OtherObjectAccessClass::class))->getProperties() as $property) { |
||
| 656 | $propertyName = $property->getName(); |
||
| 657 | $expectedValue = uniqid('', true); |
||
| 658 | |||
| 659 | // callee is an actual object |
||
| 660 | yield OtherObjectAccessClass::class . '#$' . $propertyName => [ |
||
| 661 | new OtherObjectAccessClass(), |
||
| 662 | $this->buildInstanceWithValues(new OtherObjectAccessClass(), [$propertyName => $expectedValue]), |
||
|
0 ignored issues
–
show
new \ProxyManagerTestAss...therObjectAccessClass() is of type object<ProxyManagerTestA...OtherObjectAccessClass>, but the function expects a object<ProxyManagerTest\Functional\object>.
It seems like the type of the argument is not accepted by the function/method which you are calling. In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug. We suggest to add an explicit type cast like in the following example: function acceptsInteger($int) { }
$x = '123'; // string "123"
// Instead of
acceptsInteger($x);
// we recommend to use
acceptsInteger((integer) $x);
Loading history...
|
|||
| 663 | 'get' . ucfirst($propertyName), |
||
| 664 | $expectedValue, |
||
| 665 | ]; |
||
| 666 | |||
| 667 | $expectedValue = uniqid('', true); |
||
| 668 | |||
| 669 | // callee is a proxy (not to be lazy-loaded!) |
||
| 670 | yield '(proxy) ' . OtherObjectAccessClass::class . '#$' . $propertyName => [ |
||
| 671 | (new LazyLoadingValueHolderFactory())->createProxy( |
||
| 672 | OtherObjectAccessClass::class, |
||
| 673 | $this->createInitializer( |
||
| 674 | OtherObjectAccessClass::class, |
||
| 675 | new OtherObjectAccessClass() |
||
|
0 ignored issues
–
show
new \ProxyManagerTestAss...therObjectAccessClass() is of type object<ProxyManagerTestA...OtherObjectAccessClass>, but the function expects a object<ProxyManagerTest\Functional\object>.
It seems like the type of the argument is not accepted by the function/method which you are calling. In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug. We suggest to add an explicit type cast like in the following example: function acceptsInteger($int) { }
$x = '123'; // string "123"
// Instead of
acceptsInteger($x);
// we recommend to use
acceptsInteger((integer) $x);
Loading history...
|
|||
| 676 | ) |
||
| 677 | ), |
||
| 678 | $this->buildInstanceWithValues(new OtherObjectAccessClass(), [$propertyName => $expectedValue]), |
||
|
0 ignored issues
–
show
new \ProxyManagerTestAss...therObjectAccessClass() is of type object<ProxyManagerTestA...OtherObjectAccessClass>, but the function expects a object<ProxyManagerTest\Functional\object>.
It seems like the type of the argument is not accepted by the function/method which you are calling. In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug. We suggest to add an explicit type cast like in the following example: function acceptsInteger($int) { }
$x = '123'; // string "123"
// Instead of
acceptsInteger($x);
// we recommend to use
acceptsInteger((integer) $x);
Loading history...
|
|||
| 679 | 'get' . ucfirst($propertyName), |
||
| 680 | $expectedValue, |
||
| 681 | ]; |
||
| 682 | } |
||
| 683 | } |
||
| 684 | |||
| 685 | /** @param array<string, string> $values */ |
||
| 686 | private function buildInstanceWithValues(object $instance, array $values) : object |
||
| 687 | { |
||
| 688 | foreach ($values as $property => $value) { |
||
| 689 | $property = new ReflectionProperty($instance, $property); |
||
| 690 | |||
| 691 | $property->setAccessible(true); |
||
| 692 | |||
| 693 | $property->setValue($instance, $value); |
||
| 694 | } |
||
| 695 | |||
| 696 | return $instance; |
||
| 697 | } |
||
| 698 | |||
| 699 | /** |
||
| 700 | * @param mixed $expected |
||
| 701 | * @param mixed $actual |
||
| 702 | */ |
||
| 703 | private static function assertByRefVariableValueSame($expected, & $actual) : void |
||
| 704 | { |
||
| 705 | self::assertSame($expected, $actual); |
||
|
0 ignored issues
–
show
The method
assertSame() does not seem to exist on object<ProxyManagerTest\...ueHolderFunctionalTest>.
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||
| 706 | } |
||
| 707 | } |
||
| 708 |
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.
This is most likely a typographical error or the method has been renamed.