Skip to content

Commit

Permalink
Merge pull request #73 from mr-feek/fix-that
Browse files Browse the repository at this point in the history
fix: Argument::that allows params
  • Loading branch information
weirdan committed May 24, 2020
2 parents 4290f2b + cd2ebfa commit 138998f
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 1 deletion.
2 changes: 1 addition & 1 deletion stubs/Prophecy.phpstub
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ namespace Prophecy {
use Prophecy\Argument\Token;
class Argument
{
/** @param callable():bool $callback */
/** @param callable(mixed...):bool $callback */
public static function that(callable $callback): Token\CallbackToken {}

/** @param mixed ...$tokens */
Expand Down
92 changes: 92 additions & 0 deletions tests/acceptance/Prophecy.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
Feature: Prophecy
In order to utilize Prophecy in my test cases
As a Psalm user
I need Psalm to typecheck my prophecies

Background:
Given I have the following config
"""
<?xml version="1.0"?>
<psalm totallyTyped="true" %s>
<projectFiles>
<directory name="."/>
<ignoreFiles> <directory name="../../vendor"/> </ignoreFiles>
</projectFiles>
<plugins>
<pluginClass class="Psalm\PhpUnitPlugin\Plugin"/>
</plugins>
</psalm>
"""
And I have the following code preamble
"""
<?php
namespace NS;
use PHPUnit\Framework\TestCase;
use Prophecy\Argument;
"""

Scenario: Argument::that() accepts callable with no parameters
Given I have the following code
"""
class MyTestCase extends TestCase
{
/** @return void */
public function testSomething() {
$argument = Argument::that(function () {
return true;
});
}
}
"""
When I run Psalm
Then I see no errors

Scenario: Argument::that() accepts callable with one parameter
Given I have the following code
"""
class MyTestCase extends TestCase
{
/** @return void */
public function testSomething() {
$argument = Argument::that(function (int $i) {
return $i > 0;
});
}
}
"""
When I run Psalm
Then I see no errors

Scenario: Argument::that() accepts callable with multiple parameters
Given I have the following code
"""
class MyTestCase extends TestCase
{
/** @return void */
public function testSomething() {
$argument = Argument::that(function (int $i, int $j, int $k) {
return ($i + $j + $k) > 0;
});
}
}
"""
When I run Psalm
Then I see no errors

Scenario: Argument::that() only accepts callable with boolean return type
Given I have the following code
"""
class MyTestCase extends TestCase
{
/** @return void */
public function testSomething() {
$argument = Argument::that(function (): string {
return 'hello';
});
}
}
"""
When I run Psalm
Then I see these errors
| InvalidScalarArgument | Argument 1 of Prophecy\Argument::that expects callable(mixed...):bool, Closure():string(hello) provided |

0 comments on commit 138998f

Please sign in to comment.