Merge pull request #323 from pestphp/non-callable-sequence

Sequenced expectations can now be passed as non-callable values
This commit is contained in:
Nuno Maduro
2021-06-18 21:53:04 +01:00
committed by GitHub
3 changed files with 30 additions and 4 deletions

View File

@ -120,7 +120,7 @@ final class Expectation
if (is_callable($callback)) {
foreach ($this->value as $item) {
$callback(expect($item));
$callback(new Expectation($item));
}
}
@ -128,9 +128,12 @@ final class Expectation
}
/**
* @template TValue
* Allows you to specify a sequential set of expectations for each item in a iterable "value".
*
* @param callable(Expectation, Expectation): void|TValue ...$callbacks
*/
public function sequence(callable ...$callbacks): Expectation
public function sequence(...$callbacks): Expectation
{
if (!is_iterable($this->value)) {
throw new BadMethodCallException('Expectation value is not iterable.');
@ -148,7 +151,12 @@ final class Expectation
}
foreach ($values as $key => $item) {
call_user_func($callbacks[$key], expect($item), expect($keys[$key]));
if (is_callable($callbacks[$key])) {
call_user_func($callbacks[$key], new Expectation($item), new Expectation($keys[$key]));
continue;
}
(new Expectation($item))->toEqual($callbacks[$key]);
}
return $this;

View File

@ -156,6 +156,8 @@
✓ loops back to the start if it runs out of sequence items
✓ it works if the number of items in the iterable is smaller than the number of expectations
✓ it works with associative arrays
✓ it can be passed non-callable values
✓ it can be passed a mixture of value types
PASS Tests\Features\Expect\toBe
✓ strict comparisons
@ -573,5 +575,5 @@
✓ it is a test
✓ it uses correct parent class
Tests: 4 incompleted, 7 skipped, 357 passed
Tests: 4 incompleted, 7 skipped, 359 passed

View File

@ -44,3 +44,19 @@ test('it works with associative arrays', function () {
function ($expectation, $key) { $expectation->toEqual('boom'); $key->toEqual('baz'); },
);
});
test('it can be passed non-callable values', function () {
expect(['foo', 'bar', 'baz'])->sequence('foo', 'bar', 'baz');
expect(static::getCount())->toBe(3);
});
test('it can be passed a mixture of value types', function () {
expect(['foo', 'bar', 'baz'])->sequence(
'foo',
function ($expectation) { $expectation->toEqual('bar')->toBeString(); },
'baz'
);
expect(static::getCount())->toBe(4);
});