Skip to content

Commit

Permalink
Merge 93ed423 into 1e5e2ff
Browse files Browse the repository at this point in the history
  • Loading branch information
lcobucci committed Feb 24, 2017
2 parents 1e5e2ff + 93ed423 commit 4556a6d
Show file tree
Hide file tree
Showing 3 changed files with 246 additions and 6 deletions.
18 changes: 12 additions & 6 deletions library/Mockery/Generator/Parameter.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,15 @@ 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
}
}

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)\> (?<typehint>\S+ )?.*\$' . $this->rfp->getName() . ' .*\]$/', $this->rfp->__toString(), $typehintMatch)) {
Expand All @@ -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...
*/
Expand All @@ -87,9 +96,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();
}
}
49 changes: 49 additions & 0 deletions tests/Mockery/Fixtures/MethodWithNullableParameters.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php
/**
* Mockery
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://github.com/padraic/mockery/master/LICENSE
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to padraic@php.net so we can send you a copy immediately.
*
* @category Mockery
* @package Mockery
* @subpackage UnitTests
* @copyright Copyright (c) 2010 Pádraic Brady (http://blog.astrumfutura.com)
* @license http://github.com/padraic/mockery/blob/master/LICENSE New BSD License
*/

namespace test\Mockery\Fixtures;

class MethodWithNullableParameters
{
public function nonNullablePrimitive(string $a)
{
}

public function nullablePrimitive(?string $a)
{
}

public function nonNullableSelf(self $a)
{
}

public function nullableSelf(?self $a)
{
}

public function nonNullableClass(MethodWithNullableParameters $a)
{
}

public function nullableClass(?MethodWithNullableParameters $a)
{
}
}
185 changes: 185 additions & 0 deletions tests/Mockery/MockingMethodsWithNullableParametersTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
<?php
/**
* Mockery
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://github.com/padraic/mockery/master/LICENSE
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to padraic@php.net so we can send you a copy immediately.
*
* @category Mockery
* @package Mockery
* @subpackage UnitTests
* @copyright Copyright (c) 2010 Pádraic Brady (http://blog.astrumfutura.com)
* @license http://github.com/padraic/mockery/blob/master/LICENSE New BSD License
*/

namespace test\Mockery;

use Mockery\Adapter\Phpunit\MockeryTestCase;
use test\Mockery\Fixtures\MethodWithNullableReturnType;

/**
* @requires PHP 7.1.0RC3
*/
class MockingMethodsWithNullableParametersTest extends MockeryTestCase
{
/**
* @var \Mockery\Container
*/
private $container;

protected function setUp()
{
require_once __DIR__."/Fixtures/MethodWithNullableParameters.php";

$this->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);
}
}

0 comments on commit 4556a6d

Please sign in to comment.