From f6172ba21386ea3428b45b3a40b38dbfb10745e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Cobucci?= Date: Fri, 24 Feb 2017 11:41:12 +0100 Subject: [PATCH 1/2] Simplify expression --- library/Mockery/Generator/Parameter.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/library/Mockery/Generator/Parameter.php b/library/Mockery/Generator/Parameter.php index 45d327676..11beacc5e 100644 --- a/library/Mockery/Generator/Parameter.php +++ b/library/Mockery/Generator/Parameter.php @@ -87,9 +87,6 @@ public function getName() */ public function isVariadic() { - if (version_compare(PHP_VERSION, '5.6.0') < 0) { - return false; - } - return $this->rfp->isVariadic(); + return version_compare(PHP_VERSION, '5.6.0') >= 0 && $this->rfp->isVariadic(); } } From 93ed423a8ea5f9bd94a247cec816fe9e19056359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Cobucci?= Date: Fri, 24 Feb 2017 11:41:23 +0100 Subject: [PATCH 2/2] Add support for nullable types on parameters --- library/Mockery/Generator/Parameter.php | 13 +- .../Fixtures/MethodWithNullableParameters.php | 49 +++++ ...ckingMethodsWithNullableParametersTest.php | 185 ++++++++++++++++++ 3 files changed, 245 insertions(+), 2 deletions(-) create mode 100644 tests/Mockery/Fixtures/MethodWithNullableParameters.php create mode 100644 tests/Mockery/MockingMethodsWithNullableParametersTest.php diff --git a/library/Mockery/Generator/Parameter.php b/library/Mockery/Generator/Parameter.php index 11beacc5e..4e08710b4 100644 --- a/library/Mockery/Generator/Parameter.php +++ b/library/Mockery/Generator/Parameter.php @@ -48,7 +48,7 @@ public function getTypeHintAsString() if ((version_compare(PHP_VERSION, '5.4.1') >= 0)) { try { if ($this->rfp->getClass()) { - return $this->rfp->getClass()->getName(); + return $this->getOptionalSign() . $this->rfp->getClass()->getName(); } } catch (\ReflectionException $re) { // noop @@ -56,7 +56,7 @@ public function getTypeHintAsString() } if (version_compare(PHP_VERSION, '7.0.0-dev') >= 0 && $this->rfp->hasType()) { - return (string) $this->rfp->getType(); + return $this->getOptionalSign() . $this->rfp->getType(); } if (preg_match('/^Parameter #[0-9]+ \[ \<(required|optional)\> (?\S+ )?.*\$' . $this->rfp->getName() . ' .*\]$/', $this->rfp->__toString(), $typehintMatch)) { @@ -68,6 +68,15 @@ public function getTypeHintAsString() return ''; } + private function getOptionalSign() + { + if (version_compare(PHP_VERSION, '7.1.0-dev', '>=') && $this->rfp->allowsNull() && !$this->rfp->isVariadic()) { + return '?'; + } + + return ''; + } + /** * Some internal classes have funny looking definitions... */ diff --git a/tests/Mockery/Fixtures/MethodWithNullableParameters.php b/tests/Mockery/Fixtures/MethodWithNullableParameters.php new file mode 100644 index 000000000..17700e7e6 --- /dev/null +++ b/tests/Mockery/Fixtures/MethodWithNullableParameters.php @@ -0,0 +1,49 @@ +container = new \Mockery\Container; + } + + protected function tearDown() + { + $this->container->mockery_close(); + } + + /** + * @test + */ + public function itShouldAllowNonNullableTypeToBeSet() + { + $mock = $this->container->mock('test\Mockery\Fixtures\MethodWithNullableParameters'); + + $mock->shouldReceive('nonNullablePrimitive')->with('a string'); + $mock->nonNullablePrimitive('a string'); + } + + /** + * @test + * @expectedException \TypeError + */ + public function itShouldNotAllowNonNullToBeNull() + { + $mock = $this->container->mock('test\Mockery\Fixtures\MethodWithNullableParameters'); + + $mock->nonNullablePrimitive(null); + } + + /** + * @test + */ + public function itShouldAllowPrimitiveNullableToBeNull() + { + $mock = $this->container->mock('test\Mockery\Fixtures\MethodWithNullableParameters'); + + $mock->shouldReceive('nullablePrimitive')->with(null); + $mock->nullablePrimitive(null); + } + + /** + * @test + */ + public function itShouldAllowPrimitiveNullabeToBeSet() + { + $mock = $this->container->mock('test\Mockery\Fixtures\MethodWithNullableParameters'); + + $mock->shouldReceive('nullablePrimitive')->with('a string'); + $mock->nullablePrimitive('a string'); + } + /** + * @test + */ + public function itShouldAllowSelfToBeSet() + { + $obj = new \test\Mockery\Fixtures\MethodWithNullableParameters; + $mock = $this->container->mock('test\Mockery\Fixtures\MethodWithNullableParameters'); + + $mock->shouldReceive('nonNullableSelf')->with($obj); + $mock->nonNullableSelf($obj); + } + + /** + * @test + * @expectedException \TypeError + */ + public function itShouldNotAllowSelfToBeNull() + { + $mock = $this->container->mock('test\Mockery\Fixtures\MethodWithNullableParameters'); + + $mock->nonNullableSelf(null); + } + + /** + * @test + */ + public function itShouldAllowNullalbeSelfToBeSet() + { + $obj = new \test\Mockery\Fixtures\MethodWithNullableParameters; + + $mock = $this->container->mock('test\Mockery\Fixtures\MethodWithNullableParameters'); + + $mock->shouldReceive('nullableSelf')->with($obj); + $mock->nullableSelf($obj); + } + + /** + * @test + */ + public function itShouldAllowNullableSelfToBeNull() + { + $mock = $this->container->mock('test\Mockery\Fixtures\MethodWithNullableParameters'); + + $mock->shouldReceive('nullableClass')->with(null); + $mock->nullableClass(null); + } + + /** + * @test + */ + public function itShouldAllowClassToBeSet() + { + $obj = new \test\Mockery\Fixtures\MethodWithNullableParameters; + $mock = $this->container->mock('test\Mockery\Fixtures\MethodWithNullableParameters'); + + $mock->shouldReceive('nonNullableClass')->with($obj); + $mock->nonNullableClass($obj); + } + + /** + * @test + * @expectedException \TypeError + */ + public function itShouldNotAllowClassToBeNull() + { + $mock = $this->container->mock('test\Mockery\Fixtures\MethodWithNullableParameters'); + + $mock->nonNullableClass(null); + } + + /** + * @test + */ + public function itShouldAllowNullalbeClassToBeSet() + { + $obj = new \test\Mockery\Fixtures\MethodWithNullableParameters; + + $mock = $this->container->mock('test\Mockery\Fixtures\MethodWithNullableParameters'); + + $mock->shouldReceive('nullableClass')->with($obj); + $mock->nullableClass($obj); + } + + /** + * @test + */ + public function itShouldAllowNullableClassToBeNull() + { + $mock = $this->container->mock('test\Mockery\Fixtures\MethodWithNullableParameters'); + + $mock->shouldReceive('nullableClass')->with(null); + $mock->nullableClass(null); + } +}