diff --git a/tests/.pest/snapshots/Visual/Todo/todo.snap b/tests/.pest/snapshots/Visual/Todo/todo.snap index f7a85c93..e9939bf8 100644 --- a/tests/.pest/snapshots/Visual/Todo/todo.snap +++ b/tests/.pest/snapshots/Visual/Todo/todo.snap @@ -15,7 +15,7 @@ ↓ todo on describe → should not fail ↓ todo on describe → should run - TODO Tests\Features\Todo - 7 todos + TODO Tests\Features\Todo - 11 todos ↓ something todo later ↓ something todo later chained ↓ something todo later chained and with function body @@ -24,6 +24,10 @@ ↓ it may have an associated PR #1 ↓ it may have an associated note // a note + ↓ todo on describe → todo block → nested inside todo block → it should not execute + ↓ todo on describe → todo block → it should not execute + ↓ todo on beforeEach → todo block → nested inside todo block → it should not execute + ↓ todo on beforeEach → todo block → it should not execute PASS Tests\CustomTestCase\ChildTest ✓ override method @@ -34,6 +38,6 @@ PASS Tests\CustomTestCase\ParentTest ✓ override method - Tests: 17 todos, 3 passed (3 assertions) + Tests: 21 todos, 3 passed (7 assertions) Duration: x.xxs diff --git a/tests/.pest/snapshots/Visual/Todo/todo_in_parallel.snap b/tests/.pest/snapshots/Visual/Todo/todo_in_parallel.snap index f7a85c93..e9939bf8 100644 --- a/tests/.pest/snapshots/Visual/Todo/todo_in_parallel.snap +++ b/tests/.pest/snapshots/Visual/Todo/todo_in_parallel.snap @@ -15,7 +15,7 @@ ↓ todo on describe → should not fail ↓ todo on describe → should run - TODO Tests\Features\Todo - 7 todos + TODO Tests\Features\Todo - 11 todos ↓ something todo later ↓ something todo later chained ↓ something todo later chained and with function body @@ -24,6 +24,10 @@ ↓ it may have an associated PR #1 ↓ it may have an associated note // a note + ↓ todo on describe → todo block → nested inside todo block → it should not execute + ↓ todo on describe → todo block → it should not execute + ↓ todo on beforeEach → todo block → nested inside todo block → it should not execute + ↓ todo on beforeEach → todo block → it should not execute PASS Tests\CustomTestCase\ChildTest ✓ override method @@ -34,6 +38,6 @@ PASS Tests\CustomTestCase\ParentTest ✓ override method - Tests: 17 todos, 3 passed (3 assertions) + Tests: 21 todos, 3 passed (7 assertions) Duration: x.xxs diff --git a/tests/.pest/snapshots/Visual/Todo/todos.snap b/tests/.pest/snapshots/Visual/Todo/todos.snap index f7a85c93..e9939bf8 100644 --- a/tests/.pest/snapshots/Visual/Todo/todos.snap +++ b/tests/.pest/snapshots/Visual/Todo/todos.snap @@ -15,7 +15,7 @@ ↓ todo on describe → should not fail ↓ todo on describe → should run - TODO Tests\Features\Todo - 7 todos + TODO Tests\Features\Todo - 11 todos ↓ something todo later ↓ something todo later chained ↓ something todo later chained and with function body @@ -24,6 +24,10 @@ ↓ it may have an associated PR #1 ↓ it may have an associated note // a note + ↓ todo on describe → todo block → nested inside todo block → it should not execute + ↓ todo on describe → todo block → it should not execute + ↓ todo on beforeEach → todo block → nested inside todo block → it should not execute + ↓ todo on beforeEach → todo block → it should not execute PASS Tests\CustomTestCase\ChildTest ✓ override method @@ -34,6 +38,6 @@ PASS Tests\CustomTestCase\ParentTest ✓ override method - Tests: 17 todos, 3 passed (3 assertions) + Tests: 21 todos, 3 passed (7 assertions) Duration: x.xxs diff --git a/tests/.pest/snapshots/Visual/Todo/todos_in_parallel.snap b/tests/.pest/snapshots/Visual/Todo/todos_in_parallel.snap index f7a85c93..e9939bf8 100644 --- a/tests/.pest/snapshots/Visual/Todo/todos_in_parallel.snap +++ b/tests/.pest/snapshots/Visual/Todo/todos_in_parallel.snap @@ -15,7 +15,7 @@ ↓ todo on describe → should not fail ↓ todo on describe → should run - TODO Tests\Features\Todo - 7 todos + TODO Tests\Features\Todo - 11 todos ↓ something todo later ↓ something todo later chained ↓ something todo later chained and with function body @@ -24,6 +24,10 @@ ↓ it may have an associated PR #1 ↓ it may have an associated note // a note + ↓ todo on describe → todo block → nested inside todo block → it should not execute + ↓ todo on describe → todo block → it should not execute + ↓ todo on beforeEach → todo block → nested inside todo block → it should not execute + ↓ todo on beforeEach → todo block → it should not execute PASS Tests\CustomTestCase\ChildTest ✓ override method @@ -34,6 +38,6 @@ PASS Tests\CustomTestCase\ParentTest ✓ override method - Tests: 17 todos, 3 passed (3 assertions) + Tests: 21 todos, 3 passed (7 assertions) Duration: x.xxs diff --git a/tests/.snapshots/success.txt b/tests/.snapshots/success.txt index 50b7226b..fbb39a1b 100644 --- a/tests/.snapshots/success.txt +++ b/tests/.snapshots/success.txt @@ -43,6 +43,8 @@ ✓ it gets executed before each test ✓ 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 ✓ runs 1 @@ -181,6 +183,10 @@ ✓ 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 "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) PASS Tests\Features\Depends ✓ first @@ -191,6 +197,12 @@ ✓ depends run test only once ✓ it asserts true is true ✓ 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 PASS Tests\Features\DependsInheritance ✓ it is a test @@ -1071,9 +1083,22 @@ ✓ nested → it may have 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 static note within describe // This is before each runtime note + // This is before each describe runtime note // 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 // This is before each static note // This is before each runtime note @@ -1203,6 +1228,23 @@ ✓ 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') / ('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 ✓ uses dataset with (1) @@ -1259,6 +1301,12 @@ - it skips when skip after assertion - it can use something in the test case as a condition → This test was skipped - 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 WARN Tests\Features\SkipOnPhp ✓ it can run on php version @@ -1279,7 +1327,7 @@ ✓ nested → it may be associated with an ticket #1, #4, #5, #6, #3 // an note between an the ticket - PASS Tests\Features\Todo - 7 todos + PASS Tests\Features\Todo - 11 todos ↓ something todo later ↓ something todo later chained ↓ something todo later chained and with function body @@ -1289,6 +1337,12 @@ ↓ it may have an associated PR #1 ↓ it may have an associated note // a note + ↓ todo on describe → todo block → nested inside todo block → it should not execute + ↓ todo on describe → todo block → it should not execute + ✓ todo on describe → it should execute + ↓ todo on beforeEach → todo block → nested inside todo block → it should not execute + ↓ todo on beforeEach → todo block → it should not execute + ✓ todo on beforeEach → it should execute WARN Tests\Features\Warnings ! warning → Undefined property: P\Tests\Features\Warnings::$fooqwdfwqdfqw @@ -1588,4 +1642,4 @@ WARN Tests\Visual\Version - visual snapshot of help command output - Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 17 todos, 28 skipped, 1099 passed (2656 assertions) \ No newline at end of file + Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 21 todos, 32 skipped, 1133 passed (2702 assertions) \ No newline at end of file diff --git a/tests/Features/BeforeEach.php b/tests/Features/BeforeEach.php index 8ce78200..04f0dd13 100644 --- a/tests/Features/BeforeEach.php +++ b/tests/Features/BeforeEach.php @@ -41,3 +41,13 @@ describe('outer', function () { }); }); }); + +describe('with expectations', function () { + beforeEach()->expect(true)->toBeTrue(); + + describe('nested block', function () { + test('test', function () {}); + }); + + test('test', function () {}); +}); diff --git a/tests/Features/DatasetsTests.php b/tests/Features/DatasetsTests.php index bba77ac2..a2ff44ee 100644 --- a/tests/Features/DatasetsTests.php +++ b/tests/Features/DatasetsTests.php @@ -392,3 +392,25 @@ it('may be used with high order even when bound') ->with('greeting-bound') ->expect(fn (string $greeting) => $greeting) ->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]); +}); diff --git a/tests/Features/Depends.php b/tests/Features/Depends.php index 03ef85a8..0592b98b 100644 --- a/tests/Features/Depends.php +++ b/tests/Features/Depends.php @@ -36,3 +36,39 @@ test('depends run test only once', function () use (&$runCounter) { // Regression tests. See https://github.com/pestphp/pest/pull/216 it('asserts true is true')->assertTrue(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'); + }); +}); diff --git a/tests/Features/Note.php b/tests/Features/Note.php index 85868d48..571d7c85 100644 --- a/tests/Features/Note.php +++ b/tests/Features/Note.php @@ -21,11 +21,27 @@ it('may have static note and runtime note', function () { })->note('This is a static note'); 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 () { expect(true)->toBeTrue(true); $this->note('This is a runtime 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'); test('multiple notes', function () { diff --git a/tests/Features/Repeat.php b/tests/Features/Repeat.php index 811c1185..5a3370cd 100644 --- a/tests/Features/Repeat.php +++ b/tests/Features/Repeat.php @@ -43,3 +43,39 @@ test('multiple times with repeat iterator with multiple dataset', function (stri ->toBeNumeric() ->toBeGreaterThan(0); })->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); +}); diff --git a/tests/Features/Skip.php b/tests/Features/Skip.php index 5ac559f9..de12cf02 100644 --- a/tests/Features/Skip.php +++ b/tests/Features/Skip.php @@ -54,3 +54,73 @@ it('can user higher order callables and skip') return $this->shouldSkip; }) ->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); + }); +}); diff --git a/tests/Features/Todo.php b/tests/Features/Todo.php index 39f79e44..eaa6d025 100644 --- a/tests/Features/Todo.php +++ b/tests/Features/Todo.php @@ -27,3 +27,73 @@ it('may have an associated PR', function () { it('may have an associated note', function () { expect(true)->toBeTrue(); })->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__→_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 not execute', function () { + $this->ran = true; + $this->fail(); + }); + })->todo(); + + it('should execute', function () { + $this->ran = true; + expect($this->ran)->toBe(true); + }); +}); + +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__→_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(); + }); + }); + + it('should not execute', function () { + $this->ran = true; + $this->fail(); + }); + }); + + it('should execute', function () { + $this->ran = true; + expect($this->ran)->toBe(true); + }); +}); diff --git a/tests/Visual/Parallel.php b/tests/Visual/Parallel.php index b3de6f5d..eebfbec3 100644 --- a/tests/Visual/Parallel.php +++ b/tests/Visual/Parallel.php @@ -16,7 +16,7 @@ $run = function () { test('parallel', function () use ($run) { expect($run('--exclude-group=integration')) - ->toContain('Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 17 todos, 19 skipped, 1089 passed (2632 assertions)') + ->toContain('Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 21 todos, 23 skipped, 1123 passed (2678 assertions)') ->toContain('Parallel: 3 processes'); })->skipOnWindows();