Skip to content

Commit

Permalink
Add helper to get last element of array
Browse files Browse the repository at this point in the history
  • Loading branch information
jshayes committed Oct 13, 2024
1 parent 7c639cd commit cd2eb35
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 6 deletions.
3 changes: 2 additions & 1 deletion src/PendingCalls/AfterEachCall.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use Closure;
use Pest\PendingCalls\Concerns\Describable;
use Pest\Support\Arr;
use Pest\Support\Backtrace;
use Pest\Support\ChainableClosure;
use Pest\Support\HigherOrderMessageCollection;
Expand Down Expand Up @@ -54,7 +55,7 @@ public function __destruct()
$proxies = $this->proxies;

$afterEachTestCase = ChainableClosure::boundWhen(
fn (): bool => $describing === [] || in_array(end($describing), $this->__describing, true),
fn (): bool => $describing === [] || in_array(Arr::last($describing), $this->__describing, true),
ChainableClosure::bound(fn () => $proxies->chain($this), $this->closure)->bindTo($this, self::class), // @phpstan-ignore-line
)->bindTo($this, self::class);

Expand Down
7 changes: 4 additions & 3 deletions src/PendingCalls/BeforeEachCall.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use Closure;
use Pest\Exceptions\AfterBeforeTestFunction;
use Pest\PendingCalls\Concerns\Describable;
use Pest\Support\Arr;
use Pest\Support\Backtrace;
use Pest\Support\ChainableClosure;
use Pest\Support\HigherOrderMessageCollection;
Expand Down Expand Up @@ -64,11 +65,11 @@ public function __destruct()
$beforeEachTestCall = function (TestCall $testCall) use ($describing): void {

if ($this->describing !== []) {
if (end($describing) !== end($this->describing)) {
if (Arr::last($describing) !== Arr::last($this->describing)) {
return;
}

if (! in_array(end($describing), $testCall->describing, true)) {
if (! in_array(Arr::last($describing), $testCall->describing, true)) {
return;
}
}
Expand All @@ -77,7 +78,7 @@ public function __destruct()
};

$beforeEachTestCase = ChainableClosure::boundWhen(
fn (): bool => $describing === [] || in_array(end($describing), $this->__describing, true),
fn (): bool => $describing === [] || in_array(Arr::last($describing), $this->__describing, true),
ChainableClosure::bound(fn () => $testCaseProxies->chain($this), $this->closure)->bindTo($this, self::class), // @phpstan-ignore-line
)->bindTo($this, self::class);

Expand Down
10 changes: 10 additions & 0 deletions src/Support/Arr.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,4 +81,14 @@ public static function dot(array $array, string $prepend = ''): array

return $results;
}

/**
* Returns the value of the last element or false for empty array
*
* @param array<array-key, mixed> $array
*/
public static function last(array $array): mixed
{
return end($array);
}
}
9 changes: 8 additions & 1 deletion tests/.snapshots/success.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1491,6 +1491,13 @@
✓ preset invalid name
✓ preset → myFramework

PASS Tests\Unit\Support\Arr
✓ last → it should return false for an empty arary
✓ last → it should return the last element for an array with a single element
✓ last → it should return the last element for an array without changing the internal pointer
✓ last → it should return the last element for an associative array without changing the internal pointer
✓ last → it should return the last element for an mixed key array without changing the internal pointer

PASS Tests\Unit\Support\Backtrace
✓ it gets file name from called file

Expand Down Expand Up @@ -1642,4 +1649,4 @@
WARN Tests\Visual\Version
- visual snapshot of help command output

Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 21 todos, 32 skipped, 1133 passed (2702 assertions)
Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 21 todos, 32 skipped, 1138 passed (2719 assertions)
49 changes: 49 additions & 0 deletions tests/Unit/Support/Arr.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

use Pest\Support\Arr;

describe('last', function () {
it('should return false for an empty arary', function () {
expect(Arr::last([]))->toBeFalse();
});

it('should return the last element for an array with a single element', function () {
expect(Arr::last([1]))->toBe(1);
});

it('should return the last element for an array without changing the internal pointer', function () {
$array = [1, 2, 3];

expect(Arr::last($array))->toBe(3);
expect(current($array))->toBe(1);

next($array);
expect(current($array))->toBe(2);
expect(Arr::last($array))->toBe(3);
expect(current($array))->toBe(2);
});

it('should return the last element for an associative array without changing the internal pointer', function () {
$array = ['first' => 1, 'second' => 2, 'third' => 3];

expect(Arr::last($array))->toBe(3);
expect(current($array))->toBe(1);

next($array);
expect(current($array))->toBe(2);
expect(Arr::last($array))->toBe(3);
expect(current($array))->toBe(2);
});

it('should return the last element for an mixed key array without changing the internal pointer', function () {
$array = ['first' => 1, 2, 'third' => 3];

expect(Arr::last($array))->toBe(3);
expect(current($array))->toBe(1);

next($array);
expect(current($array))->toBe(2);
expect(Arr::last($array))->toBe(3);
expect(current($array))->toBe(2);
});
});
2 changes: 1 addition & 1 deletion tests/Visual/Parallel.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

test('parallel', function () use ($run) {
expect($run('--exclude-group=integration'))
->toContain('Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 21 todos, 23 skipped, 1123 passed (2678 assertions)')
->toContain('Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 21 todos, 23 skipped, 1128 passed (2695 assertions)')
->toContain('Parallel: 3 processes');
})->skipOnWindows();

Expand Down

0 comments on commit cd2eb35

Please sign in to comment.