mirror of
https://github.com/pestphp/pest.git
synced 2026-03-06 15:57:21 +01:00
Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1e0bb88b73 | |||
| 83b76d7c2e | |||
| 5a870b3940 | |||
| 1115c64186 | |||
| e38a271ca2 | |||
| 43703ab40a | |||
| 86452765a4 | |||
| b8a1b7e5cc | |||
| 5fe79d9c18 | |||
| 2744da4292 | |||
| 87f4e5e7b3 | |||
| bb3decf3cc | |||
| 4e2987d438 | |||
| a25158bce8 | |||
| 49e77b1d4c | |||
| 989e43d1a0 | |||
| 7cd42aafd8 | |||
| 48a1de273f | |||
| 970e16e949 | |||
| 432ff221c6 |
23
bin/pest
23
bin/pest
@ -1,5 +1,7 @@
|
|||||||
#!/usr/bin/env php
|
#!/usr/bin/env php
|
||||||
<?php declare(strict_types=1);
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
use Pest\Kernel;
|
use Pest\Kernel;
|
||||||
use Pest\Panic;
|
use Pest\Panic;
|
||||||
@ -37,7 +39,7 @@ use Symfony\Component\Console\Output\ConsoleOutput;
|
|||||||
|
|
||||||
if (str_contains($value, '--test-directory=')) {
|
if (str_contains($value, '--test-directory=')) {
|
||||||
unset($arguments[$key]);
|
unset($arguments[$key]);
|
||||||
} else if ($value === '--test-directory') {
|
} elseif ($value === '--test-directory') {
|
||||||
unset($arguments[$key]);
|
unset($arguments[$key]);
|
||||||
|
|
||||||
if (isset($arguments[$key + 1])) {
|
if (isset($arguments[$key + 1])) {
|
||||||
@ -62,7 +64,7 @@ use Symfony\Component\Console\Output\ConsoleOutput;
|
|||||||
|
|
||||||
if (str_contains($value, '--assignee=')) {
|
if (str_contains($value, '--assignee=')) {
|
||||||
unset($arguments[$key]);
|
unset($arguments[$key]);
|
||||||
} else if ($value === '--assignee') {
|
} elseif ($value === '--assignee') {
|
||||||
unset($arguments[$key]);
|
unset($arguments[$key]);
|
||||||
|
|
||||||
if (isset($arguments[$key + 1])) {
|
if (isset($arguments[$key + 1])) {
|
||||||
@ -72,7 +74,7 @@ use Symfony\Component\Console\Output\ConsoleOutput;
|
|||||||
|
|
||||||
if (str_contains($value, '--issue=')) {
|
if (str_contains($value, '--issue=')) {
|
||||||
unset($arguments[$key]);
|
unset($arguments[$key]);
|
||||||
} else if ($value === '--issue') {
|
} elseif ($value === '--issue') {
|
||||||
unset($arguments[$key]);
|
unset($arguments[$key]);
|
||||||
|
|
||||||
if (isset($arguments[$key + 1])) {
|
if (isset($arguments[$key + 1])) {
|
||||||
@ -82,7 +84,7 @@ use Symfony\Component\Console\Output\ConsoleOutput;
|
|||||||
|
|
||||||
if (str_contains($value, '--ticket=')) {
|
if (str_contains($value, '--ticket=')) {
|
||||||
unset($arguments[$key]);
|
unset($arguments[$key]);
|
||||||
} else if ($value === '--ticket') {
|
} elseif ($value === '--ticket') {
|
||||||
unset($arguments[$key]);
|
unset($arguments[$key]);
|
||||||
|
|
||||||
if (isset($arguments[$key + 1])) {
|
if (isset($arguments[$key + 1])) {
|
||||||
@ -92,7 +94,7 @@ use Symfony\Component\Console\Output\ConsoleOutput;
|
|||||||
|
|
||||||
if (str_contains($value, '--pr=')) {
|
if (str_contains($value, '--pr=')) {
|
||||||
unset($arguments[$key]);
|
unset($arguments[$key]);
|
||||||
} else if ($value === '--pr') {
|
} elseif ($value === '--pr') {
|
||||||
unset($arguments[$key]);
|
unset($arguments[$key]);
|
||||||
|
|
||||||
if (isset($arguments[$key + 1])) {
|
if (isset($arguments[$key + 1])) {
|
||||||
@ -102,7 +104,7 @@ use Symfony\Component\Console\Output\ConsoleOutput;
|
|||||||
|
|
||||||
if (str_contains($value, '--pull-request=')) {
|
if (str_contains($value, '--pull-request=')) {
|
||||||
unset($arguments[$key]);
|
unset($arguments[$key]);
|
||||||
} else if ($value === '--pull-request') {
|
} elseif ($value === '--pull-request') {
|
||||||
unset($arguments[$key]);
|
unset($arguments[$key]);
|
||||||
|
|
||||||
if (isset($arguments[$key + 1])) {
|
if (isset($arguments[$key + 1])) {
|
||||||
@ -117,7 +119,6 @@ use Symfony\Component\Console\Output\ConsoleOutput;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Used when Pest is required using composer.
|
// Used when Pest is required using composer.
|
||||||
$vendorPath = dirname(__DIR__, 4).'/vendor/autoload.php';
|
$vendorPath = dirname(__DIR__, 4).'/vendor/autoload.php';
|
||||||
|
|
||||||
@ -134,7 +135,7 @@ use Symfony\Component\Console\Output\ConsoleOutput;
|
|||||||
|
|
||||||
// Get $rootPath based on $autoloadPath
|
// Get $rootPath based on $autoloadPath
|
||||||
$rootPath = dirname($autoloadPath, 2);
|
$rootPath = dirname($autoloadPath, 2);
|
||||||
$input = new ArgvInput();
|
$input = new ArgvInput;
|
||||||
|
|
||||||
$testSuite = TestSuite::getInstance(
|
$testSuite = TestSuite::getInstance(
|
||||||
$rootPath,
|
$rootPath,
|
||||||
@ -146,11 +147,11 @@ use Symfony\Component\Console\Output\ConsoleOutput;
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($todo) {
|
if ($todo) {
|
||||||
$testSuite->tests->addTestCaseMethodFilter(new TodoTestCaseFilter());
|
$testSuite->tests->addTestCaseMethodFilter(new TodoTestCaseFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($notes) {
|
if ($notes) {
|
||||||
$testSuite->tests->addTestCaseMethodFilter(new NotesTestCaseFilter());
|
$testSuite->tests->addTestCaseMethodFilter(new NotesTestCaseFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($assignee = $input->getParameterOption('--assignee')) {
|
if ($assignee = $input->getParameterOption('--assignee')) {
|
||||||
|
|||||||
@ -53,7 +53,7 @@
|
|||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"pestphp/pest-dev-tools": "^3.0.0",
|
"pestphp/pest-dev-tools": "^3.0.0",
|
||||||
"pestphp/pest-plugin-type-coverage": "^3.0.0",
|
"pestphp/pest-plugin-type-coverage": "^3.0.1",
|
||||||
"symfony/process": "^7.1.5"
|
"symfony/process": "^7.1.5"
|
||||||
},
|
},
|
||||||
"minimum-stability": "dev",
|
"minimum-stability": "dev",
|
||||||
|
|||||||
@ -27,17 +27,20 @@ final class Laravel extends AbstractPreset
|
|||||||
->ignoring('App\Enums');
|
->ignoring('App\Enums');
|
||||||
|
|
||||||
$this->expectations[] = expect('App\Enums')
|
$this->expectations[] = expect('App\Enums')
|
||||||
->toBeEnums();
|
->toBeEnums()
|
||||||
|
->ignoring('App\Enums\Concerns');
|
||||||
|
|
||||||
$this->expectations[] = expect('App\Features')
|
$this->expectations[] = expect('App\Features')
|
||||||
->toBeClasses();
|
->toBeClasses()
|
||||||
|
->ignoring('App\Features\Concerns');
|
||||||
|
|
||||||
$this->expectations[] = expect('App\Features')
|
$this->expectations[] = expect('App\Features')
|
||||||
->toHaveMethod('resolve');
|
->toHaveMethod('resolve');
|
||||||
|
|
||||||
$this->expectations[] = expect('App\Exceptions')
|
$this->expectations[] = expect('App\Exceptions')
|
||||||
->classes()
|
->classes()
|
||||||
->toImplement('Throwable');
|
->toImplement('Throwable')
|
||||||
|
->ignoring('App\Exceptions\Handler');
|
||||||
|
|
||||||
$this->expectations[] = expect('App')
|
$this->expectations[] = expect('App')
|
||||||
->not->toImplement(Throwable::class)
|
->not->toImplement(Throwable::class)
|
||||||
@ -149,7 +152,7 @@ final class Laravel extends AbstractPreset
|
|||||||
->toOnlyBeUsedIn('App\Http');
|
->toOnlyBeUsedIn('App\Http');
|
||||||
|
|
||||||
$this->expectations[] = expect('App\Http\Controllers')
|
$this->expectations[] = expect('App\Http\Controllers')
|
||||||
->not->toHavePublicMethodsBesides(['__construct', '__invoke', 'index', 'show', 'create', 'store', 'edit', 'update', 'destroy']);
|
->not->toHavePublicMethodsBesides(['__construct', '__invoke', 'index', 'show', 'create', 'store', 'edit', 'update', 'destroy', 'middleware']);
|
||||||
|
|
||||||
$this->expectations[] = expect([
|
$this->expectations[] = expect([
|
||||||
'dd',
|
'dd',
|
||||||
|
|||||||
@ -264,7 +264,7 @@ final class Expectation
|
|||||||
$matched = false;
|
$matched = false;
|
||||||
|
|
||||||
foreach ($expressions as $key => $callback) {
|
foreach ($expressions as $key => $callback) {
|
||||||
if ($subject != $key) {
|
if ($subject != $key) { // @pest-arch-ignore-line
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -380,7 +380,7 @@ final class Expectation
|
|||||||
if (self::hasExtend($name)) {
|
if (self::hasExtend($name)) {
|
||||||
$extend = self::$extends[$name]->bindTo($this, Expectation::class);
|
$extend = self::$extends[$name]->bindTo($this, Expectation::class);
|
||||||
|
|
||||||
if ($extend != false) {
|
if ($extend != false) { // @pest-arch-ignore-line
|
||||||
return $extend;
|
return $extend;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -509,7 +509,7 @@ final class Expectation
|
|||||||
{
|
{
|
||||||
return Targeted::make(
|
return Targeted::make(
|
||||||
$this,
|
$this,
|
||||||
fn (ObjectDescription $object): bool => (bool) preg_match('/^<\?php\s+declare\(.*?strict_types\s?=\s?1.*?\);/', (string) file_get_contents($object->path)),
|
fn (ObjectDescription $object): bool => (bool) preg_match('/^<\?php\s*(\/\*[\s\S]*?\*\/|\/\/[^\r\n]*(?:\r?\n|$)|\s)*declare\s*\(\s*strict_types\s*=\s*1\s*\)\s*;/m', (string) file_get_contents($object->path)),
|
||||||
'to use strict types',
|
'to use strict types',
|
||||||
FileLineFinder::where(fn (string $line): bool => str_contains($line, '<?php')),
|
FileLineFinder::where(fn (string $line): bool => str_contains($line, '<?php')),
|
||||||
);
|
);
|
||||||
@ -522,9 +522,9 @@ final class Expectation
|
|||||||
{
|
{
|
||||||
return Targeted::make(
|
return Targeted::make(
|
||||||
$this,
|
$this,
|
||||||
fn (ObjectDescription $object): bool => ! str_contains((string) file_get_contents($object->path), ' == '), // @pest-arch-ignore-line
|
fn (ObjectDescription $object): bool => ! str_contains((string) file_get_contents($object->path), ' == ') && ! str_contains((string) file_get_contents($object->path), ' != '),
|
||||||
'to use strict equality',
|
'to use strict equality',
|
||||||
FileLineFinder::where(fn (string $line): bool => str_contains($line, ' == ')),
|
FileLineFinder::where(fn (string $line): bool => str_contains($line, ' == ') || str_contains($line, ' != ')),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -159,9 +159,9 @@ final readonly class OppositeExpectation
|
|||||||
{
|
{
|
||||||
return Targeted::make(
|
return Targeted::make(
|
||||||
$this->original,
|
$this->original,
|
||||||
fn (ObjectDescription $object): bool => ! str_contains((string) file_get_contents($object->path), ' === '),
|
fn (ObjectDescription $object): bool => ! str_contains((string) file_get_contents($object->path), ' === ') && ! str_contains((string) file_get_contents($object->path), ' !== '),
|
||||||
'to use strict equality',
|
'to use strict equality',
|
||||||
FileLineFinder::where(fn (string $line): bool => str_contains($line, ' === ')),
|
FileLineFinder::where(fn (string $line): bool => str_contains($line, ' === ') || str_contains($line, ' !== ')),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -150,7 +150,7 @@ final readonly class Converter
|
|||||||
{
|
{
|
||||||
if ($testSuite instanceof TestSuiteForTestMethodWithDataProvider) {
|
if ($testSuite instanceof TestSuiteForTestMethodWithDataProvider) {
|
||||||
$firstTest = $this->getFirstTest($testSuite);
|
$firstTest = $this->getFirstTest($testSuite);
|
||||||
if ($firstTest != null) {
|
if ($firstTest instanceof \PHPUnit\Event\Code\TestMethod) {
|
||||||
return $this->getTestMethodNameWithoutDatasetSuffix($firstTest);
|
return $this->getTestMethodNameWithoutDatasetSuffix($firstTest);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,6 +5,7 @@ declare(strict_types=1);
|
|||||||
namespace Pest\PendingCalls;
|
namespace Pest\PendingCalls;
|
||||||
|
|
||||||
use Closure;
|
use Closure;
|
||||||
|
use Pest\Concerns\Testable;
|
||||||
use Pest\Exceptions\InvalidArgumentException;
|
use Pest\Exceptions\InvalidArgumentException;
|
||||||
use Pest\Exceptions\TestDescriptionMissing;
|
use Pest\Exceptions\TestDescriptionMissing;
|
||||||
use Pest\Factories\Attribute;
|
use Pest\Factories\Attribute;
|
||||||
@ -25,9 +26,9 @@ use PHPUnit\Framework\TestCase;
|
|||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
*
|
*
|
||||||
* @mixin HigherOrderCallables|TestCase
|
* @mixin HigherOrderCallables|TestCase|Testable
|
||||||
*/
|
*/
|
||||||
final class TestCall
|
final class TestCall // @phpstan-ignore-line
|
||||||
{
|
{
|
||||||
use Describable;
|
use Describable;
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@ namespace Pest;
|
|||||||
|
|
||||||
function version(): string
|
function version(): string
|
||||||
{
|
{
|
||||||
return '3.2.0';
|
return '3.2.5';
|
||||||
}
|
}
|
||||||
|
|
||||||
function testDirectory(string $file = ''): string
|
function testDirectory(string $file = ''): string
|
||||||
|
|||||||
@ -26,7 +26,7 @@ final class Closure
|
|||||||
|
|
||||||
$closure = BaseClosure::bind($closure, $newThis, $newScope);
|
$closure = BaseClosure::bind($closure, $newThis, $newScope);
|
||||||
|
|
||||||
if ($closure === null) {
|
if (! $closure instanceof \Closure) {
|
||||||
throw ShouldNotHappen::fromMessage('Could not bind closure.');
|
throw ShouldNotHappen::fromMessage('Could not bind closure.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
Pest Testing Framework 3.2.0.
|
Pest Testing Framework 3.2.5.
|
||||||
|
|
||||||
USAGE: pest <file> [options]
|
USAGE: pest <file> [options]
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
|
|
||||||
Pest Testing Framework 3.2.0.
|
Pest Testing Framework 3.2.5.
|
||||||
|
|
||||||
|
|||||||
@ -974,6 +974,10 @@
|
|||||||
✓ opposite missing strict equality
|
✓ opposite missing strict equality
|
||||||
✓ opposite has strict equality
|
✓ opposite has strict equality
|
||||||
|
|
||||||
|
PASS Tests\Features\Expect\toUseStrictTypes
|
||||||
|
✓ pass
|
||||||
|
✓ failures
|
||||||
|
|
||||||
PASS Tests\Features\Expect\toUseTrait
|
PASS Tests\Features\Expect\toUseTrait
|
||||||
✓ pass
|
✓ pass
|
||||||
✓ failures
|
✓ failures
|
||||||
@ -1580,4 +1584,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, 1093 passed (2644 assertions)
|
Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 17 todos, 28 skipped, 1095 passed (2648 assertions)
|
||||||
17
tests/Features/Expect/toUseStrictTypes.php
Normal file
17
tests/Features/Expect/toUseStrictTypes.php
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
use Pest\Arch\Exceptions\ArchExpectationFailedException;
|
||||||
|
use Tests\Fixtures\Arch\ToUseStrictTypes\HasNoStrictType;
|
||||||
|
use Tests\Fixtures\Arch\ToUseStrictTypes\HasStrictType;
|
||||||
|
use Tests\Fixtures\Arch\ToUseStrictTypes\HasStrictTypeWithCommentsAbove;
|
||||||
|
|
||||||
|
test('pass', function () {
|
||||||
|
expect(HasStrictType::class)->toUseStrictTypes()
|
||||||
|
->and(HasStrictTypeWithCommentsAbove::class)->toUseStrictTypes();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('failures', function () {
|
||||||
|
expect(HasNoStrictType::class)->toUseStrictTypes();
|
||||||
|
})->throws(ArchExpectationFailedException::class);
|
||||||
@ -14,5 +14,9 @@ class NotStrictEquality
|
|||||||
if ($a == $b) {
|
if ($a == $b) {
|
||||||
echo 'Equal';
|
echo 'Equal';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($a != $b) {
|
||||||
|
echo 'Equal';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,5 +14,9 @@ class StrictEquality
|
|||||||
if ($a === $b) {
|
if ($a === $b) {
|
||||||
echo 'Equal';
|
echo 'Equal';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($a !== $b) {
|
||||||
|
echo 'Equal';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
5
tests/Fixtures/Arch/ToUseStrictTypes/HasNoStrictType.php
Normal file
5
tests/Fixtures/Arch/ToUseStrictTypes/HasNoStrictType.php
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Fixtures\Arch\ToUseStrictTypes;
|
||||||
|
|
||||||
|
class HasNoStrictType {}
|
||||||
7
tests/Fixtures/Arch/ToUseStrictTypes/HasStrictType.php
Normal file
7
tests/Fixtures/Arch/ToUseStrictTypes/HasStrictType.php
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Tests\Fixtures\Arch\ToUseStrictTypes;
|
||||||
|
|
||||||
|
class HasStrictType {}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/** @noinspection PhpUnused */
|
||||||
|
|
||||||
|
// some other comment
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Tests\Fixtures\Arch\ToUseStrictTypes;
|
||||||
|
|
||||||
|
class HasStrictTypeWithCommentsAbove {}
|
||||||
@ -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, 1083 passed (2620 assertions)')
|
->toContain('Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 17 todos, 19 skipped, 1085 passed (2624 assertions)')
|
||||||
->toContain('Parallel: 3 processes');
|
->toContain('Parallel: 3 processes');
|
||||||
})->skipOnWindows();
|
})->skipOnWindows();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user