mirror of
https://github.com/pestphp/pest.git
synced 2026-03-06 07:47:22 +01:00
Merge pull request #1295 from jshayes/nested-describe
Support for nested describe blocks
This commit is contained in:
@ -61,8 +61,10 @@ trait Testable
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The test's describing, if any.
|
* The test's describing, if any.
|
||||||
|
*
|
||||||
|
* @var array<int, string>
|
||||||
*/
|
*/
|
||||||
public ?string $__describing = null;
|
public array $__describing = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether the test has ran or not.
|
* Whether the test has ran or not.
|
||||||
|
|||||||
@ -31,8 +31,10 @@ final class TestCaseMethodFactory
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The test's describing, if any.
|
* The test's describing, if any.
|
||||||
|
*
|
||||||
|
* @var array<int, string>
|
||||||
*/
|
*/
|
||||||
public ?string $describing = null;
|
public array $describing = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The test's description, if any.
|
* The test's description, if any.
|
||||||
@ -201,7 +203,7 @@ final class TestCaseMethodFactory
|
|||||||
];
|
];
|
||||||
|
|
||||||
foreach ($this->depends as $depend) {
|
foreach ($this->depends as $depend) {
|
||||||
$depend = Str::evaluable($this->describing !== null ? Str::describe($this->describing, $depend) : $depend);
|
$depend = Str::evaluable($this->describing === [] ? $depend : Str::describe($this->describing, $depend));
|
||||||
|
|
||||||
$this->attributes[] = new Attribute(
|
$this->attributes[] = new Attribute(
|
||||||
\PHPUnit\Framework\Attributes\Depends::class,
|
\PHPUnit\Framework\Attributes\Depends::class,
|
||||||
|
|||||||
@ -43,7 +43,7 @@ if (! function_exists('beforeAll')) {
|
|||||||
*/
|
*/
|
||||||
function beforeAll(Closure $closure): void
|
function beforeAll(Closure $closure): void
|
||||||
{
|
{
|
||||||
if (! is_null(DescribeCall::describing())) {
|
if (DescribeCall::describing() !== []) {
|
||||||
$filename = Backtrace::file();
|
$filename = Backtrace::file();
|
||||||
|
|
||||||
throw new BeforeAllWithinDescribe($filename);
|
throw new BeforeAllWithinDescribe($filename);
|
||||||
@ -205,7 +205,7 @@ if (! function_exists('afterAll')) {
|
|||||||
*/
|
*/
|
||||||
function afterAll(Closure $closure): void
|
function afterAll(Closure $closure): void
|
||||||
{
|
{
|
||||||
if (! is_null(DescribeCall::describing())) {
|
if (DescribeCall::describing() !== []) {
|
||||||
$filename = Backtrace::file();
|
$filename = Backtrace::file();
|
||||||
|
|
||||||
throw new AfterAllWithinDescribe($filename);
|
throw new AfterAllWithinDescribe($filename);
|
||||||
|
|||||||
@ -6,6 +6,7 @@ namespace Pest\PendingCalls;
|
|||||||
|
|
||||||
use Closure;
|
use Closure;
|
||||||
use Pest\PendingCalls\Concerns\Describable;
|
use Pest\PendingCalls\Concerns\Describable;
|
||||||
|
use Pest\Support\Arr;
|
||||||
use Pest\Support\Backtrace;
|
use Pest\Support\Backtrace;
|
||||||
use Pest\Support\ChainableClosure;
|
use Pest\Support\ChainableClosure;
|
||||||
use Pest\Support\HigherOrderMessageCollection;
|
use Pest\Support\HigherOrderMessageCollection;
|
||||||
@ -54,7 +55,7 @@ final class AfterEachCall
|
|||||||
$proxies = $this->proxies;
|
$proxies = $this->proxies;
|
||||||
|
|
||||||
$afterEachTestCase = ChainableClosure::boundWhen(
|
$afterEachTestCase = ChainableClosure::boundWhen(
|
||||||
fn (): bool => is_null($describing) || $this->__describing === $describing,
|
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
|
ChainableClosure::bound(fn () => $proxies->chain($this), $this->closure)->bindTo($this, self::class), // @phpstan-ignore-line
|
||||||
)->bindTo($this, self::class);
|
)->bindTo($this, self::class);
|
||||||
|
|
||||||
|
|||||||
@ -7,6 +7,7 @@ namespace Pest\PendingCalls;
|
|||||||
use Closure;
|
use Closure;
|
||||||
use Pest\Exceptions\AfterBeforeTestFunction;
|
use Pest\Exceptions\AfterBeforeTestFunction;
|
||||||
use Pest\PendingCalls\Concerns\Describable;
|
use Pest\PendingCalls\Concerns\Describable;
|
||||||
|
use Pest\Support\Arr;
|
||||||
use Pest\Support\Backtrace;
|
use Pest\Support\Backtrace;
|
||||||
use Pest\Support\ChainableClosure;
|
use Pest\Support\ChainableClosure;
|
||||||
use Pest\Support\HigherOrderMessageCollection;
|
use Pest\Support\HigherOrderMessageCollection;
|
||||||
@ -63,12 +64,12 @@ final class BeforeEachCall
|
|||||||
|
|
||||||
$beforeEachTestCall = function (TestCall $testCall) use ($describing): void {
|
$beforeEachTestCall = function (TestCall $testCall) use ($describing): void {
|
||||||
|
|
||||||
if ($this->describing !== null) {
|
if ($this->describing !== []) {
|
||||||
if ($describing !== $this->describing) {
|
if (Arr::last($describing) !== Arr::last($this->describing)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($describing !== $testCall->describing) {
|
if (! in_array(Arr::last($describing), $testCall->describing, true)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -77,7 +78,7 @@ final class BeforeEachCall
|
|||||||
};
|
};
|
||||||
|
|
||||||
$beforeEachTestCase = ChainableClosure::boundWhen(
|
$beforeEachTestCase = ChainableClosure::boundWhen(
|
||||||
fn (): bool => is_null($describing) || $this->__describing === $describing,
|
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
|
ChainableClosure::bound(fn () => $testCaseProxies->chain($this), $this->closure)->bindTo($this, self::class), // @phpstan-ignore-line
|
||||||
)->bindTo($this, self::class);
|
)->bindTo($this, self::class);
|
||||||
|
|
||||||
@ -96,7 +97,7 @@ final class BeforeEachCall
|
|||||||
*/
|
*/
|
||||||
public function after(Closure $closure): self
|
public function after(Closure $closure): self
|
||||||
{
|
{
|
||||||
if ($this->describing === null) {
|
if ($this->describing === []) {
|
||||||
throw new AfterBeforeTestFunction($this->filename);
|
throw new AfterBeforeTestFunction($this->filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -11,11 +11,15 @@ trait Describable
|
|||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Note: this is property is not used; however, it gets added automatically by rector php.
|
* Note: this is property is not used; however, it gets added automatically by rector php.
|
||||||
|
*
|
||||||
|
* @var array<int, string>
|
||||||
*/
|
*/
|
||||||
public string $__describing;
|
public array $__describing;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The describing of the test case.
|
* The describing of the test case.
|
||||||
|
*
|
||||||
|
* @var array<int, string>
|
||||||
*/
|
*/
|
||||||
public ?string $describing = null;
|
public array $describing = [];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,8 +15,10 @@ final class DescribeCall
|
|||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* The current describe call.
|
* The current describe call.
|
||||||
|
*
|
||||||
|
* @var array<int, string>
|
||||||
*/
|
*/
|
||||||
private static ?string $describing = null;
|
private static array $describing = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The describe "before each" call.
|
* The describe "before each" call.
|
||||||
@ -37,8 +39,10 @@ final class DescribeCall
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* What is the current describing.
|
* What is the current describing.
|
||||||
|
*
|
||||||
|
* @return array<int, string>
|
||||||
*/
|
*/
|
||||||
public static function describing(): ?string
|
public static function describing(): array
|
||||||
{
|
{
|
||||||
return self::$describing;
|
return self::$describing;
|
||||||
}
|
}
|
||||||
@ -50,12 +54,12 @@ final class DescribeCall
|
|||||||
{
|
{
|
||||||
unset($this->currentBeforeEachCall);
|
unset($this->currentBeforeEachCall);
|
||||||
|
|
||||||
self::$describing = $this->description;
|
self::$describing[] = $this->description;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
($this->tests)();
|
($this->tests)();
|
||||||
} finally {
|
} finally {
|
||||||
self::$describing = null;
|
array_pop(self::$describing);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,7 +75,7 @@ final class DescribeCall
|
|||||||
if (! $this->currentBeforeEachCall instanceof \Pest\PendingCalls\BeforeEachCall) {
|
if (! $this->currentBeforeEachCall instanceof \Pest\PendingCalls\BeforeEachCall) {
|
||||||
$this->currentBeforeEachCall = new BeforeEachCall(TestSuite::getInstance(), $filename);
|
$this->currentBeforeEachCall = new BeforeEachCall(TestSuite::getInstance(), $filename);
|
||||||
|
|
||||||
$this->currentBeforeEachCall->describing = $this->description;
|
$this->currentBeforeEachCall->describing[] = $this->description;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->currentBeforeEachCall->{$name}(...$arguments); // @phpstan-ignore-line
|
$this->currentBeforeEachCall->{$name}(...$arguments); // @phpstan-ignore-line
|
||||||
|
|||||||
@ -76,7 +76,7 @@ final class TestCall // @phpstan-ignore-line
|
|||||||
throw new TestDescriptionMissing($this->filename);
|
throw new TestDescriptionMissing($this->filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
$description = is_null($this->describing)
|
$description = $this->describing === []
|
||||||
? $this->description
|
? $this->description
|
||||||
: Str::describe($this->describing, $this->description);
|
: Str::describe($this->describing, $this->description);
|
||||||
|
|
||||||
@ -683,7 +683,7 @@ final class TestCall // @phpstan-ignore-line
|
|||||||
throw new TestDescriptionMissing($this->filename);
|
throw new TestDescriptionMissing($this->filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! is_null($this->describing)) {
|
if ($this->describing !== []) {
|
||||||
$this->testCaseMethod->describing = $this->describing;
|
$this->testCaseMethod->describing = $this->describing;
|
||||||
$this->testCaseMethod->description = Str::describe($this->describing, $this->description);
|
$this->testCaseMethod->description = Str::describe($this->describing, $this->description);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -81,4 +81,14 @@ final class Arr
|
|||||||
|
|
||||||
return $results;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -103,10 +103,14 @@ final class Str
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a describe block as `$describeDescription` → `$testDescription` format.
|
* Creates a describe block as `$describeDescription` → `$testDescription` format.
|
||||||
|
*
|
||||||
|
* @param array<int, string> $describeDescriptions
|
||||||
*/
|
*/
|
||||||
public static function describe(string $describeDescription, string $testDescription): string
|
public static function describe(array $describeDescriptions, string $testDescription): string
|
||||||
{
|
{
|
||||||
return sprintf('`%s` → %s', $describeDescription, $testDescription);
|
$descriptionComponents = [...$describeDescriptions, $testDescription];
|
||||||
|
|
||||||
|
return sprintf(str_repeat('`%s` → ', count($describeDescriptions)).'%s', ...$descriptionComponents);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -15,7 +15,7 @@
|
|||||||
↓ todo on describe → should not fail
|
↓ todo on describe → should not fail
|
||||||
↓ todo on describe → should run
|
↓ todo on describe → should run
|
||||||
|
|
||||||
TODO Tests\Features\Todo - 7 todos
|
TODO Tests\Features\Todo - 28 todos
|
||||||
↓ something todo later
|
↓ something todo later
|
||||||
↓ something todo later chained
|
↓ something todo later chained
|
||||||
↓ something todo later chained and with function body
|
↓ something todo later chained and with function body
|
||||||
@ -24,6 +24,52 @@
|
|||||||
↓ it may have an associated PR #1
|
↓ it may have an associated PR #1
|
||||||
↓ it may have an associated note
|
↓ it may have an associated note
|
||||||
// a note
|
// a note
|
||||||
|
↓ todo on describe → todo block → nested inside todo block → it should not execute
|
||||||
|
↓ todo on describe → todo block → nested inside todo block → it should set the note
|
||||||
|
// hi
|
||||||
|
↓ todo on describe → todo block → describe with note → it should apply the note to a test without a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → it should apply the note to a test with a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → it should apply the note as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on describe → todo block → describe with note → nested describe with note → it should apply all parent notes to a test without a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → nested describe with note → it should apply all parent notes to a test with a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → nested describe with note → it should apply all parent notes as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on describe → todo block → it should not execute
|
||||||
|
↓ todo on test after describe block
|
||||||
|
↓ todo with note on test after describe block
|
||||||
|
// test note
|
||||||
|
↓ todo on beforeEach → todo block → nested inside todo block → it should not execute
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → it should apply the note to a test without a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → it should apply the note to a test with a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → it should apply the note as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → nested describe with note → it should apply all parent notes to a test without a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → nested describe with note → it should apply all parent notes to a test with a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → nested describe with note → it should apply all parent notes as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on beforeEach → todo block → it should not execute
|
||||||
|
↓ todo on test after describe block with beforeEach
|
||||||
|
↓ todo with note on test after describe block with beforeEach
|
||||||
|
// test note
|
||||||
|
|
||||||
PASS Tests\CustomTestCase\ChildTest
|
PASS Tests\CustomTestCase\ChildTest
|
||||||
✓ override method
|
✓ override method
|
||||||
@ -34,6 +80,6 @@
|
|||||||
PASS Tests\CustomTestCase\ParentTest
|
PASS Tests\CustomTestCase\ParentTest
|
||||||
✓ override method
|
✓ override method
|
||||||
|
|
||||||
Tests: 17 todos, 3 passed (3 assertions)
|
Tests: 38 todos, 3 passed (20 assertions)
|
||||||
Duration: x.xxs
|
Duration: x.xxs
|
||||||
|
|
||||||
|
|||||||
@ -15,7 +15,7 @@
|
|||||||
↓ todo on describe → should not fail
|
↓ todo on describe → should not fail
|
||||||
↓ todo on describe → should run
|
↓ todo on describe → should run
|
||||||
|
|
||||||
TODO Tests\Features\Todo - 7 todos
|
TODO Tests\Features\Todo - 28 todos
|
||||||
↓ something todo later
|
↓ something todo later
|
||||||
↓ something todo later chained
|
↓ something todo later chained
|
||||||
↓ something todo later chained and with function body
|
↓ something todo later chained and with function body
|
||||||
@ -24,6 +24,52 @@
|
|||||||
↓ it may have an associated PR #1
|
↓ it may have an associated PR #1
|
||||||
↓ it may have an associated note
|
↓ it may have an associated note
|
||||||
// a note
|
// a note
|
||||||
|
↓ todo on describe → todo block → nested inside todo block → it should not execute
|
||||||
|
↓ todo on describe → todo block → nested inside todo block → it should set the note
|
||||||
|
// hi
|
||||||
|
↓ todo on describe → todo block → describe with note → it should apply the note to a test without a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → it should apply the note to a test with a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → it should apply the note as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on describe → todo block → describe with note → nested describe with note → it should apply all parent notes to a test without a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → nested describe with note → it should apply all parent notes to a test with a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → nested describe with note → it should apply all parent notes as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on describe → todo block → it should not execute
|
||||||
|
↓ todo on test after describe block
|
||||||
|
↓ todo with note on test after describe block
|
||||||
|
// test note
|
||||||
|
↓ todo on beforeEach → todo block → nested inside todo block → it should not execute
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → it should apply the note to a test without a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → it should apply the note to a test with a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → it should apply the note as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → nested describe with note → it should apply all parent notes to a test without a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → nested describe with note → it should apply all parent notes to a test with a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → nested describe with note → it should apply all parent notes as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on beforeEach → todo block → it should not execute
|
||||||
|
↓ todo on test after describe block with beforeEach
|
||||||
|
↓ todo with note on test after describe block with beforeEach
|
||||||
|
// test note
|
||||||
|
|
||||||
PASS Tests\CustomTestCase\ChildTest
|
PASS Tests\CustomTestCase\ChildTest
|
||||||
✓ override method
|
✓ override method
|
||||||
@ -34,6 +80,6 @@
|
|||||||
PASS Tests\CustomTestCase\ParentTest
|
PASS Tests\CustomTestCase\ParentTest
|
||||||
✓ override method
|
✓ override method
|
||||||
|
|
||||||
Tests: 17 todos, 3 passed (3 assertions)
|
Tests: 38 todos, 3 passed (20 assertions)
|
||||||
Duration: x.xxs
|
Duration: x.xxs
|
||||||
|
|
||||||
|
|||||||
@ -15,7 +15,7 @@
|
|||||||
↓ todo on describe → should not fail
|
↓ todo on describe → should not fail
|
||||||
↓ todo on describe → should run
|
↓ todo on describe → should run
|
||||||
|
|
||||||
TODO Tests\Features\Todo - 7 todos
|
TODO Tests\Features\Todo - 28 todos
|
||||||
↓ something todo later
|
↓ something todo later
|
||||||
↓ something todo later chained
|
↓ something todo later chained
|
||||||
↓ something todo later chained and with function body
|
↓ something todo later chained and with function body
|
||||||
@ -24,6 +24,52 @@
|
|||||||
↓ it may have an associated PR #1
|
↓ it may have an associated PR #1
|
||||||
↓ it may have an associated note
|
↓ it may have an associated note
|
||||||
// a note
|
// a note
|
||||||
|
↓ todo on describe → todo block → nested inside todo block → it should not execute
|
||||||
|
↓ todo on describe → todo block → nested inside todo block → it should set the note
|
||||||
|
// hi
|
||||||
|
↓ todo on describe → todo block → describe with note → it should apply the note to a test without a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → it should apply the note to a test with a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → it should apply the note as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on describe → todo block → describe with note → nested describe with note → it should apply all parent notes to a test without a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → nested describe with note → it should apply all parent notes to a test with a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → nested describe with note → it should apply all parent notes as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on describe → todo block → it should not execute
|
||||||
|
↓ todo on test after describe block
|
||||||
|
↓ todo with note on test after describe block
|
||||||
|
// test note
|
||||||
|
↓ todo on beforeEach → todo block → nested inside todo block → it should not execute
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → it should apply the note to a test without a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → it should apply the note to a test with a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → it should apply the note as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → nested describe with note → it should apply all parent notes to a test without a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → nested describe with note → it should apply all parent notes to a test with a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → nested describe with note → it should apply all parent notes as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on beforeEach → todo block → it should not execute
|
||||||
|
↓ todo on test after describe block with beforeEach
|
||||||
|
↓ todo with note on test after describe block with beforeEach
|
||||||
|
// test note
|
||||||
|
|
||||||
PASS Tests\CustomTestCase\ChildTest
|
PASS Tests\CustomTestCase\ChildTest
|
||||||
✓ override method
|
✓ override method
|
||||||
@ -34,6 +80,6 @@
|
|||||||
PASS Tests\CustomTestCase\ParentTest
|
PASS Tests\CustomTestCase\ParentTest
|
||||||
✓ override method
|
✓ override method
|
||||||
|
|
||||||
Tests: 17 todos, 3 passed (3 assertions)
|
Tests: 38 todos, 3 passed (20 assertions)
|
||||||
Duration: x.xxs
|
Duration: x.xxs
|
||||||
|
|
||||||
|
|||||||
@ -15,7 +15,7 @@
|
|||||||
↓ todo on describe → should not fail
|
↓ todo on describe → should not fail
|
||||||
↓ todo on describe → should run
|
↓ todo on describe → should run
|
||||||
|
|
||||||
TODO Tests\Features\Todo - 7 todos
|
TODO Tests\Features\Todo - 28 todos
|
||||||
↓ something todo later
|
↓ something todo later
|
||||||
↓ something todo later chained
|
↓ something todo later chained
|
||||||
↓ something todo later chained and with function body
|
↓ something todo later chained and with function body
|
||||||
@ -24,6 +24,52 @@
|
|||||||
↓ it may have an associated PR #1
|
↓ it may have an associated PR #1
|
||||||
↓ it may have an associated note
|
↓ it may have an associated note
|
||||||
// a note
|
// a note
|
||||||
|
↓ todo on describe → todo block → nested inside todo block → it should not execute
|
||||||
|
↓ todo on describe → todo block → nested inside todo block → it should set the note
|
||||||
|
// hi
|
||||||
|
↓ todo on describe → todo block → describe with note → it should apply the note to a test without a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → it should apply the note to a test with a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → it should apply the note as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on describe → todo block → describe with note → nested describe with note → it should apply all parent notes to a test without a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → nested describe with note → it should apply all parent notes to a test with a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → nested describe with note → it should apply all parent notes as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on describe → todo block → it should not execute
|
||||||
|
↓ todo on test after describe block
|
||||||
|
↓ todo with note on test after describe block
|
||||||
|
// test note
|
||||||
|
↓ todo on beforeEach → todo block → nested inside todo block → it should not execute
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → it should apply the note to a test without a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → it should apply the note to a test with a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → it should apply the note as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → nested describe with note → it should apply all parent notes to a test without a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → nested describe with note → it should apply all parent notes to a test with a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → nested describe with note → it should apply all parent notes as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on beforeEach → todo block → it should not execute
|
||||||
|
↓ todo on test after describe block with beforeEach
|
||||||
|
↓ todo with note on test after describe block with beforeEach
|
||||||
|
// test note
|
||||||
|
|
||||||
PASS Tests\CustomTestCase\ChildTest
|
PASS Tests\CustomTestCase\ChildTest
|
||||||
✓ override method
|
✓ override method
|
||||||
@ -34,6 +80,6 @@
|
|||||||
PASS Tests\CustomTestCase\ParentTest
|
PASS Tests\CustomTestCase\ParentTest
|
||||||
✓ override method
|
✓ override method
|
||||||
|
|
||||||
Tests: 17 todos, 3 passed (3 assertions)
|
Tests: 38 todos, 3 passed (20 assertions)
|
||||||
Duration: x.xxs
|
Duration: x.xxs
|
||||||
|
|
||||||
|
|||||||
@ -27,6 +27,8 @@
|
|||||||
PASS Tests\Features\AfterEach
|
PASS Tests\Features\AfterEach
|
||||||
✓ it does not get executed before the test
|
✓ it does not get executed before the test
|
||||||
✓ it gets executed after the test
|
✓ it gets executed after the test
|
||||||
|
✓ outer → inner → it does not get executed before the test
|
||||||
|
✓ outer → inner → it should call all parent afterEach functions
|
||||||
|
|
||||||
PASS Tests\Features\Assignee
|
PASS Tests\Features\Assignee
|
||||||
✓ it may be associated with an assignee [@nunomaduro, @taylorotwell]
|
✓ it may be associated with an assignee [@nunomaduro, @taylorotwell]
|
||||||
@ -40,6 +42,9 @@
|
|||||||
PASS Tests\Features\BeforeEach
|
PASS Tests\Features\BeforeEach
|
||||||
✓ it gets executed before each test
|
✓ it gets executed before each test
|
||||||
✓ it gets executed before each test once again
|
✓ it gets executed before each test once again
|
||||||
|
✓ outer → inner → it should call all parent beforeEach functions
|
||||||
|
✓ with expectations → nested block → test
|
||||||
|
✓ with expectations → test
|
||||||
|
|
||||||
PASS Tests\Features\BeforeEachProxiesToTestCallWithExpectations
|
PASS Tests\Features\BeforeEachProxiesToTestCallWithExpectations
|
||||||
✓ runs 1
|
✓ runs 1
|
||||||
@ -178,6 +183,14 @@
|
|||||||
✓ it may be used with high order with dataset "informal"
|
✓ it may be used with high order with dataset "informal"
|
||||||
✓ it may be used with high order even when bound with dataset "formal"
|
✓ it may be used with high order even when bound with dataset "formal"
|
||||||
✓ it may be used with high order even when bound with dataset "informal"
|
✓ it may be used with high order even when bound with dataset "informal"
|
||||||
|
✓ with on nested describe → nested → before inner describe block with (1)
|
||||||
|
✓ with on nested describe → nested → describe → it should include the with value from all parent describe blocks with (1) / (2)
|
||||||
|
✓ with on nested describe → nested → describe → should include the with value from all parent describe blocks and the test with (1) / (2) / (3)
|
||||||
|
✓ with on nested describe → nested → after inner describe block with (1)
|
||||||
|
✓ after describe block with (5)
|
||||||
|
✓ it may be used with high order after describe block with dataset "formal"
|
||||||
|
✓ it may be used with high order after describe block with dataset "informal"
|
||||||
|
✓ after describe block with named dataset with ('after')
|
||||||
|
|
||||||
PASS Tests\Features\Depends
|
PASS Tests\Features\Depends
|
||||||
✓ first
|
✓ first
|
||||||
@ -188,6 +201,13 @@
|
|||||||
✓ depends run test only once
|
✓ depends run test only once
|
||||||
✓ it asserts true is true
|
✓ it asserts true is true
|
||||||
✓ depends works with the correct test name
|
✓ depends works with the correct test name
|
||||||
|
✓ describe block → first in describe
|
||||||
|
✓ describe block → second in describe
|
||||||
|
✓ describe block → third in describe
|
||||||
|
✓ describe block → nested describe → first in nested describe
|
||||||
|
✓ describe block → nested describe → second in nested describe
|
||||||
|
✓ describe block → nested describe → third in nested describe
|
||||||
|
✓ depends on test after describe block
|
||||||
|
|
||||||
PASS Tests\Features\DependsInheritance
|
PASS Tests\Features\DependsInheritance
|
||||||
✓ it is a test
|
✓ it is a test
|
||||||
@ -215,6 +235,7 @@
|
|||||||
✓ depends on describe → bar
|
✓ depends on describe → bar
|
||||||
✓ depends on describe using with → foo with (3)
|
✓ depends on describe using with → foo with (3)
|
||||||
✓ depends on describe using with → bar with (3)
|
✓ depends on describe using with → bar with (3)
|
||||||
|
✓ with test after describe → it should run the before each
|
||||||
|
|
||||||
PASS Tests\Features\DescriptionLess
|
PASS Tests\Features\DescriptionLess
|
||||||
✓ get 'foo'
|
✓ get 'foo'
|
||||||
@ -1067,9 +1088,22 @@
|
|||||||
✓ nested → it may have static note and runtime note
|
✓ nested → it may have static note and runtime note
|
||||||
// This is before each static note
|
// This is before each static note
|
||||||
// This is describe static note
|
// This is describe static note
|
||||||
|
// This is before each describe static note
|
||||||
// This is a static note within describe
|
// This is a static note within describe
|
||||||
// This is before each runtime note
|
// This is before each runtime note
|
||||||
|
// This is before each describe runtime note
|
||||||
// This is a runtime note within describe
|
// This is a runtime note within describe
|
||||||
|
✓ nested → describe nested within describe → it may have a static note and runtime note
|
||||||
|
// This is before each static note
|
||||||
|
// This is describe static note
|
||||||
|
// This is before each describe static note
|
||||||
|
// This is a nested describe static note
|
||||||
|
// This is before each nested describe static note
|
||||||
|
// This is a static note within a nested describe
|
||||||
|
// This is before each runtime note
|
||||||
|
// This is before each describe runtime note
|
||||||
|
// This is before each nested describe runtime note
|
||||||
|
// This is a runtime note within a nested describe
|
||||||
✓ multiple notes
|
✓ multiple notes
|
||||||
// This is before each static note
|
// This is before each static note
|
||||||
// This is before each runtime note
|
// This is before each runtime note
|
||||||
@ -1199,6 +1233,23 @@
|
|||||||
✓ multiple times with repeat iterator with multiple dataset ('c') / ('d') @ repetition 2 of 2
|
✓ multiple times with repeat iterator with multiple dataset ('c') / ('d') @ repetition 2 of 2
|
||||||
✓ multiple times with repeat iterator with multiple dataset ('c') / ('e') @ repetition 2 of 2
|
✓ multiple times with repeat iterator with multiple dataset ('c') / ('e') @ repetition 2 of 2
|
||||||
✓ multiple times with repeat iterator with multiple dataset ('c') / ('f') @ repetition 2 of 2
|
✓ multiple times with repeat iterator with multiple dataset ('c') / ('f') @ repetition 2 of 2
|
||||||
|
✓ describe blocks → multiple times @ repetition 1 of 3
|
||||||
|
✓ describe blocks → multiple times @ repetition 2 of 3
|
||||||
|
✓ describe blocks → multiple times @ repetition 3 of 3
|
||||||
|
✓ describe blocks → describe with repeat → test with no repeat should repeat the number of times specified in the parent describe block @ repetition 1 of 3
|
||||||
|
✓ describe blocks → describe with repeat → test with no repeat should repeat the number of times specified in the parent describe block @ repetition 2 of 3
|
||||||
|
✓ describe blocks → describe with repeat → test with no repeat should repeat the number of times specified in the parent describe block @ repetition 3 of 3
|
||||||
|
✓ describe blocks → describe with repeat → test with repeat should repeat the number of times specified in the test @ repetition 1 of 2
|
||||||
|
✓ describe blocks → describe with repeat → test with repeat should repeat the number of times specified in the test @ repetition 2 of 2
|
||||||
|
✓ describe blocks → describe with repeat → nested describe without repeat → test with no repeat should repeat the number of times specified in the parent's parent describe block @ repetition 1 of 3
|
||||||
|
✓ describe blocks → describe with repeat → nested describe without repeat → test with no repeat should repeat the number of times specified in the parent's parent describe block @ repetition 2 of 3
|
||||||
|
✓ describe blocks → describe with repeat → nested describe without repeat → test with no repeat should repeat the number of times specified in the parent's parent describe block @ repetition 3 of 3
|
||||||
|
✓ describe blocks → describe with repeat → nested describe without repeat → test with repeat should repeat the number of times specified in the test @ repetition 1 of 2
|
||||||
|
✓ describe blocks → describe with repeat → nested describe without repeat → test with repeat should repeat the number of times specified in the test @ repetition 2 of 2
|
||||||
|
✓ describe blocks → describe with repeat → nested describe with repeat → test with no repeat should repeat the number of times specified in the parent describe block @ repetition 1 of 2
|
||||||
|
✓ describe blocks → describe with repeat → nested describe with repeat → test with no repeat should repeat the number of times specified in the parent describe block @ repetition 2 of 2
|
||||||
|
✓ describe blocks → describe with repeat → nested describe with repeat → test with repeat should repeat the number of times specified in the test @ repetition 1 of 2
|
||||||
|
✓ describe blocks → describe with repeat → nested describe with repeat → test with repeat should repeat the number of times specified in the test @ repetition 2 of 2
|
||||||
|
|
||||||
PASS Tests\Features\ScopedDatasets\Directory\NestedDirectory1\TestFileInNestedDirectoryWithDatasetsFile
|
PASS Tests\Features\ScopedDatasets\Directory\NestedDirectory1\TestFileInNestedDirectoryWithDatasetsFile
|
||||||
✓ uses dataset with (1)
|
✓ uses dataset with (1)
|
||||||
@ -1255,6 +1306,14 @@
|
|||||||
- it skips when skip after assertion
|
- it skips when skip after assertion
|
||||||
- it can use something in the test case as a condition → This test was skipped
|
- it can use something in the test case as a condition → This test was skipped
|
||||||
- it can user higher order callables and skip
|
- it can user higher order callables and skip
|
||||||
|
- skip on describe → skipped tests → nested inside skipped block → it should not execute
|
||||||
|
- skip on describe → skipped tests → it should not execute
|
||||||
|
✓ skip on describe → it should execute
|
||||||
|
- skip on beforeEach → skipped tests → nested inside skipped block → it should not execute
|
||||||
|
- skip on beforeEach → skipped tests → it should not execute
|
||||||
|
✓ skip on beforeEach → it should execute
|
||||||
|
✓ it does not skip after the describe block
|
||||||
|
- it can skip after the describe block
|
||||||
|
|
||||||
WARN Tests\Features\SkipOnPhp
|
WARN Tests\Features\SkipOnPhp
|
||||||
✓ it can run on php version
|
✓ it can run on php version
|
||||||
@ -1275,7 +1334,7 @@
|
|||||||
✓ nested → it may be associated with an ticket #1, #4, #5, #6, #3
|
✓ nested → it may be associated with an ticket #1, #4, #5, #6, #3
|
||||||
// an note between an the ticket
|
// an note between an the ticket
|
||||||
|
|
||||||
PASS Tests\Features\Todo - 7 todos
|
PASS Tests\Features\Todo - 28 todos
|
||||||
↓ something todo later
|
↓ something todo later
|
||||||
↓ something todo later chained
|
↓ something todo later chained
|
||||||
↓ something todo later chained and with function body
|
↓ something todo later chained and with function body
|
||||||
@ -1285,6 +1344,54 @@
|
|||||||
↓ it may have an associated PR #1
|
↓ it may have an associated PR #1
|
||||||
↓ it may have an associated note
|
↓ it may have an associated note
|
||||||
// a note
|
// a note
|
||||||
|
↓ todo on describe → todo block → nested inside todo block → it should not execute
|
||||||
|
↓ todo on describe → todo block → nested inside todo block → it should set the note
|
||||||
|
// hi
|
||||||
|
↓ todo on describe → todo block → describe with note → it should apply the note to a test without a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → it should apply the note to a test with a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → it should apply the note as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on describe → todo block → describe with note → nested describe with note → it should apply all parent notes to a test without a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → nested describe with note → it should apply all parent notes to a test with a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on describe → todo block → describe with note → nested describe with note → it should apply all parent notes as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on describe → todo block → it should not execute
|
||||||
|
✓ todo on describe → it should execute
|
||||||
|
↓ todo on test after describe block
|
||||||
|
↓ todo with note on test after describe block
|
||||||
|
// test note
|
||||||
|
↓ todo on beforeEach → todo block → nested inside todo block → it should not execute
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → it should apply the note to a test without a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → it should apply the note to a test with a todo
|
||||||
|
// describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → it should apply the note as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → nested describe with note → it should apply all parent notes to a test without a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → nested describe with note → it should apply all parent notes to a test with a todo
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
↓ todo on beforeEach → todo block → describe with note → nested describe with note → it should apply all parent notes as well as the note from the test
|
||||||
|
// describe note
|
||||||
|
// nested describe note
|
||||||
|
// test note
|
||||||
|
↓ todo on beforeEach → todo block → it should not execute
|
||||||
|
✓ todo on beforeEach → it should execute
|
||||||
|
↓ todo on test after describe block with beforeEach
|
||||||
|
↓ todo with note on test after describe block with beforeEach
|
||||||
|
// test note
|
||||||
|
|
||||||
WARN Tests\Features\Warnings
|
WARN Tests\Features\Warnings
|
||||||
! warning → Undefined property: P\Tests\Features\Warnings::$fooqwdfwqdfqw
|
! warning → Undefined property: P\Tests\Features\Warnings::$fooqwdfwqdfqw
|
||||||
@ -1433,6 +1540,13 @@
|
|||||||
✓ preset invalid name
|
✓ preset invalid name
|
||||||
✓ preset → myFramework
|
✓ 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
|
PASS Tests\Unit\Support\Backtrace
|
||||||
✓ it gets file name from called file
|
✓ it gets file name from called file
|
||||||
|
|
||||||
@ -1584,4 +1698,4 @@
|
|||||||
WARN Tests\Visual\Version
|
WARN Tests\Visual\Version
|
||||||
- visual snapshot of help command output
|
- visual snapshot of help command output
|
||||||
|
|
||||||
Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 17 todos, 28 skipped, 1095 passed (2648 assertions)
|
Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 38 todos, 33 skipped, 1144 passed (2736 assertions)
|
||||||
@ -26,3 +26,25 @@ it('gets executed after the test', function () {
|
|||||||
afterEach(function () {
|
afterEach(function () {
|
||||||
$this->state->bar = 2;
|
$this->state->bar = 2;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('outer', function () {
|
||||||
|
afterEach(function () {
|
||||||
|
$this->state->bar++;
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('inner', function () {
|
||||||
|
afterEach(function () {
|
||||||
|
$this->state->bar++;
|
||||||
|
});
|
||||||
|
|
||||||
|
it('does not get executed before the test', function () {
|
||||||
|
expect($this->state)->toHaveProperty('bar');
|
||||||
|
expect($this->state->bar)->toBe(2);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call all parent afterEach functions', function () {
|
||||||
|
expect($this->state)->toHaveProperty('bar');
|
||||||
|
expect($this->state->bar)->toBe(4);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@ -25,3 +25,29 @@ it('gets executed before each test once again', function () {
|
|||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
$this->bar++;
|
$this->bar++;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('outer', function () {
|
||||||
|
beforeEach(function () {
|
||||||
|
$this->bar++;
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('inner', function () {
|
||||||
|
beforeEach(function () {
|
||||||
|
$this->bar++;
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call all parent beforeEach functions', function () {
|
||||||
|
expect($this->bar)->toBe(3);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('with expectations', function () {
|
||||||
|
beforeEach()->expect(true)->toBeTrue();
|
||||||
|
|
||||||
|
describe('nested block', function () {
|
||||||
|
test('test', function () {});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('test', function () {});
|
||||||
|
});
|
||||||
|
|||||||
@ -392,3 +392,40 @@ it('may be used with high order even when bound')
|
|||||||
->with('greeting-bound')
|
->with('greeting-bound')
|
||||||
->expect(fn (string $greeting) => $greeting)
|
->expect(fn (string $greeting) => $greeting)
|
||||||
->throws(InvalidArgumentException::class);
|
->throws(InvalidArgumentException::class);
|
||||||
|
|
||||||
|
describe('with on nested describe', function () {
|
||||||
|
describe('nested', function () {
|
||||||
|
test('before inner describe block', function (...$args) {
|
||||||
|
expect($args)->toBe([1]);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('describe', function () {
|
||||||
|
it('should include the with value from all parent describe blocks', function (...$args) {
|
||||||
|
expect($args)->toBe([1, 2]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should include the with value from all parent describe blocks and the test', function (...$args) {
|
||||||
|
expect($args)->toBe([1, 2, 3]);
|
||||||
|
})->with([3]);
|
||||||
|
})->with([2]);
|
||||||
|
|
||||||
|
test('after inner describe block', function (...$args) {
|
||||||
|
expect($args)->toBe([1]);
|
||||||
|
});
|
||||||
|
})->with([1]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('after describe block', function (...$args) {
|
||||||
|
expect($args)->toBe([5]);
|
||||||
|
})->with([5]);
|
||||||
|
|
||||||
|
it('may be used with high order after describe block')
|
||||||
|
->with('greeting-string')
|
||||||
|
->expect(fn (string $greeting) => $greeting)
|
||||||
|
->throwsNoExceptions();
|
||||||
|
|
||||||
|
dataset('after-describe', ['after']);
|
||||||
|
|
||||||
|
test('after describe block with named dataset', function (...$args) {
|
||||||
|
expect($args)->toBe(['after']);
|
||||||
|
})->with('after-describe');
|
||||||
|
|||||||
@ -36,3 +36,43 @@ test('depends run test only once', function () use (&$runCounter) {
|
|||||||
// Regression tests. See https://github.com/pestphp/pest/pull/216
|
// Regression tests. See https://github.com/pestphp/pest/pull/216
|
||||||
it('asserts true is true')->assertTrue(true);
|
it('asserts true is true')->assertTrue(true);
|
||||||
test('depends works with the correct test name')->assertTrue(true)->depends('it asserts true is true');
|
test('depends works with the correct test name')->assertTrue(true)->depends('it asserts true is true');
|
||||||
|
|
||||||
|
describe('describe block', function () {
|
||||||
|
$runCounter = 0;
|
||||||
|
|
||||||
|
test('first in describe', function () use (&$runCounter) {
|
||||||
|
$runCounter++;
|
||||||
|
expect(true)->toBeTrue();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('second in describe', function () use (&$runCounter) {
|
||||||
|
expect($runCounter)->toBe(1);
|
||||||
|
$runCounter++;
|
||||||
|
})->depends('first in describe');
|
||||||
|
|
||||||
|
test('third in describe', function () use (&$runCounter) {
|
||||||
|
expect($runCounter)->toBe(2);
|
||||||
|
})->depends('second in describe');
|
||||||
|
|
||||||
|
describe('nested describe', function () {
|
||||||
|
$runCounter = 0;
|
||||||
|
|
||||||
|
test('first in nested describe', function () use (&$runCounter) {
|
||||||
|
$runCounter++;
|
||||||
|
expect(true)->toBeTrue();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('second in nested describe', function () use (&$runCounter) {
|
||||||
|
expect($runCounter)->toBe(1);
|
||||||
|
$runCounter++;
|
||||||
|
})->depends('first in nested describe');
|
||||||
|
|
||||||
|
test('third in nested describe', function () use (&$runCounter) {
|
||||||
|
expect($runCounter)->toBe(2);
|
||||||
|
})->depends('second in nested describe');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('depends on test after describe block', function () use (&$runCounter) {
|
||||||
|
expect($runCounter)->toBe(2);
|
||||||
|
})->depends('first', 'second');
|
||||||
|
|||||||
@ -96,3 +96,15 @@ describe('depends on describe using with', function () {
|
|||||||
expect($foo + $foo)->toBe(6);
|
expect($foo + $foo)->toBe(6);
|
||||||
})->depends('foo');
|
})->depends('foo');
|
||||||
})->with([3]);
|
})->with([3]);
|
||||||
|
|
||||||
|
describe('with test after describe', function () {
|
||||||
|
beforeEach(function () {
|
||||||
|
$this->count++;
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('foo', function () {});
|
||||||
|
|
||||||
|
it('should run the before each', function () {
|
||||||
|
expect($this->count)->toBe(2);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@ -21,11 +21,27 @@ it('may have static note and runtime note', function () {
|
|||||||
})->note('This is a static note');
|
})->note('This is a static note');
|
||||||
|
|
||||||
describe('nested', function () {
|
describe('nested', function () {
|
||||||
|
beforeEach(function () {
|
||||||
|
$this->note('This is before each describe runtime note');
|
||||||
|
})->note('This is before each describe static note');
|
||||||
|
|
||||||
it('may have static note and runtime note', function () {
|
it('may have static note and runtime note', function () {
|
||||||
expect(true)->toBeTrue(true);
|
expect(true)->toBeTrue(true);
|
||||||
|
|
||||||
$this->note('This is a runtime note within describe');
|
$this->note('This is a runtime note within describe');
|
||||||
})->note('This is a static note within describe');
|
})->note('This is a static note within describe');
|
||||||
|
|
||||||
|
describe('describe nested within describe', function () {
|
||||||
|
beforeEach(function () {
|
||||||
|
$this->note('This is before each nested describe runtime note');
|
||||||
|
})->note('This is before each nested describe static note');
|
||||||
|
|
||||||
|
it('may have a static note and runtime note', function () {
|
||||||
|
expect(true)->toBeTrue(true);
|
||||||
|
|
||||||
|
$this->note('This is a runtime note within a nested describe');
|
||||||
|
})->note('This is a static note within a nested describe');
|
||||||
|
})->note('This is a nested describe static note');
|
||||||
})->note('This is describe static note');
|
})->note('This is describe static note');
|
||||||
|
|
||||||
test('multiple notes', function () {
|
test('multiple notes', function () {
|
||||||
|
|||||||
@ -43,3 +43,39 @@ test('multiple times with repeat iterator with multiple dataset', function (stri
|
|||||||
->toBeNumeric()
|
->toBeNumeric()
|
||||||
->toBeGreaterThan(0);
|
->toBeGreaterThan(0);
|
||||||
})->repeat(times: 2)->with(['a', 'b', 'c'], ['d', 'e', 'f']);
|
})->repeat(times: 2)->with(['a', 'b', 'c'], ['d', 'e', 'f']);
|
||||||
|
|
||||||
|
describe('describe blocks', function () {
|
||||||
|
test('multiple times', function () {
|
||||||
|
expect(true)->toBeTrue();
|
||||||
|
})->repeat(times: 3);
|
||||||
|
|
||||||
|
describe('describe with repeat', function () {
|
||||||
|
test('test with no repeat should repeat the number of times specified in the parent describe block', function () {
|
||||||
|
expect(true)->toBeTrue();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('test with repeat should repeat the number of times specified in the test', function () {
|
||||||
|
expect(true)->toBeTrue();
|
||||||
|
})->repeat(times: 2);
|
||||||
|
|
||||||
|
describe('nested describe without repeat', function () {
|
||||||
|
test("test with no repeat should repeat the number of times specified in the parent's parent describe block", function () {
|
||||||
|
expect(true)->toBeTrue();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('test with repeat should repeat the number of times specified in the test', function () {
|
||||||
|
expect(true)->toBeTrue();
|
||||||
|
})->repeat(times: 2);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('nested describe with repeat', function () {
|
||||||
|
test('test with no repeat should repeat the number of times specified in the parent describe block', function () {
|
||||||
|
expect(true)->toBeTrue();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('test with repeat should repeat the number of times specified in the test', function () {
|
||||||
|
expect(true)->toBeTrue();
|
||||||
|
})->repeat(times: 2);
|
||||||
|
})->repeat(times: 2);
|
||||||
|
})->repeat(times: 3);
|
||||||
|
});
|
||||||
|
|||||||
@ -54,3 +54,81 @@ it('can user higher order callables and skip')
|
|||||||
return $this->shouldSkip;
|
return $this->shouldSkip;
|
||||||
})
|
})
|
||||||
->toBeFalse();
|
->toBeFalse();
|
||||||
|
|
||||||
|
describe('skip on describe', function () {
|
||||||
|
beforeEach(function () {
|
||||||
|
$this->ran = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(function () {
|
||||||
|
match ($this->name()) {
|
||||||
|
'__pest_evaluable__skip_on_describe__→__skipped_tests__→__nested_inside_skipped_block__→_it_should_not_execute' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__skip_on_describe__→__skipped_tests__→_it_should_not_execute' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__skip_on_describe__→_it_should_execute' => expect($this->ran)->toBe(true),
|
||||||
|
default => $this->fail('Unexpected test name: '.$this->name()),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('skipped tests', function () {
|
||||||
|
describe('nested inside skipped block', function () {
|
||||||
|
it('should not execute', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not execute', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
});
|
||||||
|
})->skip();
|
||||||
|
|
||||||
|
it('should execute', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
expect($this->ran)->toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('skip on beforeEach', function () {
|
||||||
|
beforeEach(function () {
|
||||||
|
$this->ran = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(function () {
|
||||||
|
match ($this->name()) {
|
||||||
|
'__pest_evaluable__skip_on_beforeEach__→__skipped_tests__→__nested_inside_skipped_block__→_it_should_not_execute' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__skip_on_beforeEach__→__skipped_tests__→_it_should_not_execute' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__skip_on_beforeEach__→_it_should_execute' => expect($this->ran)->toBe(true),
|
||||||
|
default => $this->fail('Unexpected test name: '.$this->name()),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('skipped tests', function () {
|
||||||
|
beforeEach()->skip();
|
||||||
|
|
||||||
|
describe('nested inside skipped block', function () {
|
||||||
|
it('should not execute', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not execute', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should execute', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
expect($this->ran)->toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('does not skip after the describe block', function () {
|
||||||
|
expect(true)->toBeTrue();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('can skip after the describe block', function () {
|
||||||
|
expect(true)->toBeTrue();
|
||||||
|
})->skip();
|
||||||
|
|||||||
@ -27,3 +27,175 @@ it('may have an associated PR', function () {
|
|||||||
it('may have an associated note', function () {
|
it('may have an associated note', function () {
|
||||||
expect(true)->toBeTrue();
|
expect(true)->toBeTrue();
|
||||||
})->todo(note: 'a note');
|
})->todo(note: 'a note');
|
||||||
|
|
||||||
|
describe('todo on describe', function () {
|
||||||
|
beforeEach(function () {
|
||||||
|
$this->ran = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(function () {
|
||||||
|
match ($this->name()) {
|
||||||
|
'__pest_evaluable__todo_on_describe__→__todo_block__→__nested_inside_todo_block__→_it_should_not_execute' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__todo_on_describe__→__todo_block__→__nested_inside_todo_block__→_it_should_set_the_note' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__todo_on_describe__→__todo_block__→__describe_with_note__→_it_should_apply_the_note_to_a_test_without_a_todo' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__todo_on_describe__→__todo_block__→__describe_with_note__→_it_should_apply_the_note_to_a_test_with_a_todo' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__todo_on_describe__→__todo_block__→__describe_with_note__→_it_should_apply_the_note_as_well_as_the_note_from_the_test' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__todo_on_describe__→__todo_block__→__describe_with_note__→__nested_describe_with_note__→_it_should_apply_all_parent_notes_to_a_test_without_a_todo' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__todo_on_describe__→__todo_block__→__describe_with_note__→__nested_describe_with_note__→_it_should_apply_all_parent_notes_to_a_test_with_a_todo' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__todo_on_describe__→__todo_block__→__describe_with_note__→__nested_describe_with_note__→_it_should_apply_all_parent_notes_as_well_as_the_note_from_the_test' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__todo_on_describe__→__todo_block__→_it_should_not_execute' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__todo_on_describe__→_it_should_execute' => expect($this->ran)->toBe(true),
|
||||||
|
default => $this->fail('Unexpected test name: '.$this->name()),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('todo block', function () {
|
||||||
|
describe('nested inside todo block', function () {
|
||||||
|
it('should not execute', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set the note', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
})->todo(note: 'hi');
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('describe with note', function () {
|
||||||
|
it('should apply the note to a test without a todo', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should apply the note to a test with a todo', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
})->todo();
|
||||||
|
|
||||||
|
it('should apply the note as well as the note from the test', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
})->todo(note: 'test note');
|
||||||
|
|
||||||
|
describe('nested describe with note', function () {
|
||||||
|
it('should apply all parent notes to a test without a todo', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should apply all parent notes to a test with a todo', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
})->todo();
|
||||||
|
|
||||||
|
it('should apply all parent notes as well as the note from the test', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
})->todo(note: 'test note');
|
||||||
|
})->todo(note: 'nested describe note');
|
||||||
|
})->todo(note: 'describe note');
|
||||||
|
|
||||||
|
it('should not execute', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
});
|
||||||
|
})->todo();
|
||||||
|
|
||||||
|
it('should execute', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
expect($this->ran)->toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('todo on test after describe block', function () {
|
||||||
|
$this->fail();
|
||||||
|
})->todo();
|
||||||
|
|
||||||
|
test('todo with note on test after describe block', function () {
|
||||||
|
$this->fail();
|
||||||
|
})->todo(note: 'test note');
|
||||||
|
|
||||||
|
describe('todo on beforeEach', function () {
|
||||||
|
beforeEach(function () {
|
||||||
|
$this->ran = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(function () {
|
||||||
|
match ($this->name()) {
|
||||||
|
'__pest_evaluable__todo_on_beforeEach__→__todo_block__→__nested_inside_todo_block__→_it_should_not_execute' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__todo_on_beforeEach__→__todo_block__→_it_should_not_execute' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__todo_on_beforeEach__→__todo_block__→__describe_with_note__→_it_should_apply_the_note_to_a_test_without_a_todo' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__todo_on_beforeEach__→__todo_block__→__describe_with_note__→_it_should_apply_the_note_to_a_test_with_a_todo' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__todo_on_beforeEach__→__todo_block__→__describe_with_note__→_it_should_apply_the_note_as_well_as_the_note_from_the_test' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__todo_on_beforeEach__→__todo_block__→__describe_with_note__→__nested_describe_with_note__→_it_should_apply_all_parent_notes_to_a_test_without_a_todo' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__todo_on_beforeEach__→__todo_block__→__describe_with_note__→__nested_describe_with_note__→_it_should_apply_all_parent_notes_to_a_test_with_a_todo' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__todo_on_beforeEach__→__todo_block__→__describe_with_note__→__nested_describe_with_note__→_it_should_apply_all_parent_notes_as_well_as_the_note_from_the_test' => expect($this->ran)->toBe(false),
|
||||||
|
'__pest_evaluable__todo_on_beforeEach__→_it_should_execute' => expect($this->ran)->toBe(true),
|
||||||
|
default => $this->fail('Unexpected test name: '.$this->name()),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('todo block', function () {
|
||||||
|
beforeEach()->todo();
|
||||||
|
|
||||||
|
describe('nested inside todo block', function () {
|
||||||
|
it('should not execute', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('describe with note', function () {
|
||||||
|
it('should apply the note to a test without a todo', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should apply the note to a test with a todo', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
})->todo();
|
||||||
|
|
||||||
|
it('should apply the note as well as the note from the test', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
})->todo(note: 'test note');
|
||||||
|
|
||||||
|
describe('nested describe with note', function () {
|
||||||
|
it('should apply all parent notes to a test without a todo', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should apply all parent notes to a test with a todo', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
})->todo();
|
||||||
|
|
||||||
|
it('should apply all parent notes as well as the note from the test', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
})->todo(note: 'test note');
|
||||||
|
})->todo(note: 'nested describe note');
|
||||||
|
})->todo(note: 'describe note');
|
||||||
|
|
||||||
|
it('should not execute', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
$this->fail();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should execute', function () {
|
||||||
|
$this->ran = true;
|
||||||
|
expect($this->ran)->toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('todo on test after describe block with beforeEach', function () {
|
||||||
|
$this->fail();
|
||||||
|
})->todo();
|
||||||
|
|
||||||
|
test('todo with note on test after describe block with beforeEach', function () {
|
||||||
|
$this->fail();
|
||||||
|
})->todo(note: 'test note');
|
||||||
|
|||||||
49
tests/Unit/Support/Arr.php
Normal file
49
tests/Unit/Support/Arr.php
Normal file
@ -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);
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -16,7 +16,7 @@ $run = function () {
|
|||||||
|
|
||||||
test('parallel', function () use ($run) {
|
test('parallel', function () use ($run) {
|
||||||
expect($run('--exclude-group=integration'))
|
expect($run('--exclude-group=integration'))
|
||||||
->toContain('Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 17 todos, 19 skipped, 1085 passed (2624 assertions)')
|
->toContain('Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 38 todos, 24 skipped, 1134 passed (2712 assertions)')
|
||||||
->toContain('Parallel: 3 processes');
|
->toContain('Parallel: 3 processes');
|
||||||
})->skipOnWindows();
|
})->skipOnWindows();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user