mirror of
https://github.com/pestphp/pest.git
synced 2026-03-06 15:57:21 +01:00
Compare commits
42 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d66361b272 | |||
| 93b5611059 | |||
| 2ded999adf | |||
| cde074cfd4 | |||
| 499480f28a | |||
| f8c88bd14d | |||
| d454a36a48 | |||
| 61b6b8c7d9 | |||
| e8aaa586cb | |||
| 9ceb0834ae | |||
| 86d2191cae | |||
| 748beb17d5 | |||
| 7ba235f61a | |||
| 700bd517f4 | |||
| cbcfa2c5e2 | |||
| 243e45a551 | |||
| 823c3d4b17 | |||
| 39c9b15bc0 | |||
| b13acb630d | |||
| 172d94c0ca | |||
| 0697555dc2 | |||
| d0ff2c8ec2 | |||
| 5e41e546a0 | |||
| 6a8a4f3243 | |||
| ef29b4f091 | |||
| ef120125e0 | |||
| 8a9a416133 | |||
| 4783334f15 | |||
| e8f122bf47 | |||
| 9fc607a2b8 | |||
| b33af71036 | |||
| 3c6c89a6ad | |||
| 55f6b5696e | |||
| 303f4c0113 | |||
| 35a1fcd0cf | |||
| adb2fb51df | |||
| 0ccbe5c8f0 | |||
| a4f8ae1a12 | |||
| 6094682158 | |||
| 2c3234fb3d | |||
| 1b64fef7ba | |||
| a136231503 |
44
.github/workflows/static.yml
vendored
44
.github/workflows/static.yml
vendored
@ -1,44 +0,0 @@
|
||||
name: Static Analysis
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
|
||||
jobs:
|
||||
static:
|
||||
if: github.event_name != 'schedule' || github.repository == 'pestphp/pest'
|
||||
name: Static Tests
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
dependency-version: [prefer-lowest, prefer-stable]
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: 8.1
|
||||
tools: composer:v2
|
||||
coverage: none
|
||||
|
||||
- name: Install Dependencies
|
||||
run: composer update --prefer-stable --no-interaction --no-progress --ansi
|
||||
|
||||
- name: Type Check
|
||||
run: composer test:type:check
|
||||
|
||||
- name: Type Coverage
|
||||
run: composer test:type:coverage
|
||||
|
||||
- name: Refacto
|
||||
run: composer test:refacto
|
||||
|
||||
- name: Style
|
||||
run: composer test:lint
|
||||
7
.github/workflows/tests.yml
vendored
7
.github/workflows/tests.yml
vendored
@ -14,11 +14,8 @@ jobs:
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||
symfony: ['6.4', '7.0']
|
||||
php: ['8.1', '8.2', '8.3']
|
||||
dependency_version: [prefer-lowest, prefer-stable]
|
||||
exclude:
|
||||
- php: '8.1'
|
||||
symfony: '7.0'
|
||||
php: ['8.2', '8.3', '8.4']
|
||||
dependency_version: [prefer-stable]
|
||||
|
||||
name: PHP ${{ matrix.php }} - Symfony ^${{ matrix.symfony }} - ${{ matrix.os }} - ${{ matrix.dependency_version }}
|
||||
|
||||
|
||||
@ -21,6 +21,8 @@ We cannot thank our sponsors enough for their incredible support in funding Pest
|
||||
|
||||
### Platinum Sponsors
|
||||
|
||||
- **[LaraJobs](https://larajobs.com)**
|
||||
- **[Brokerchooser](https://brokerchooser.com)**
|
||||
- **[Forge](https://forge.laravel.com)**
|
||||
- **[Spatie](https://spatie.be)**
|
||||
- **[Worksome](https://www.worksome.com/)**
|
||||
@ -29,10 +31,10 @@ We cannot thank our sponsors enough for their incredible support in funding Pest
|
||||
|
||||
- [Akaunting](https://akaunting.com/?ref=pestphp)
|
||||
- [Codecourse](https://codecourse.com/?ref=pestphp)
|
||||
- [DocuWriter.ai](https://www.docuwriter.ai/?ref=pestphp)
|
||||
- [Laracasts](https://laracasts.com/?ref=pestphp)
|
||||
- [Laradir](https://laradir.com/?ref=pestphp)
|
||||
- [Localazy](https://localazy.com/?ref=pestphp)
|
||||
- [Stormlikes](https://www.stormlikes.net/?ref=pestphp)
|
||||
- [Route4Me](https://www.route4me.com/?ref=pestphp)
|
||||
- [Zapiet](https://www.zapiet.com/?ref=pestphp)
|
||||
|
||||
Pest is an open-sourced software licensed under the **[MIT license](https://opensource.org/licenses/MIT)**.
|
||||
|
||||
@ -12,7 +12,7 @@ use Symfony\Component\Console\Output\ConsoleOutput;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
$bootPest = (static function (): void {
|
||||
$workerArgv = new ArgvInput();
|
||||
$workerArgv = new ArgvInput;
|
||||
|
||||
$rootPath = dirname(PHPUNIT_COMPOSER_INSTALL, 2);
|
||||
$testSuite = TestSuite::getInstance($rootPath, $workerArgv->getParameterOption(
|
||||
@ -20,7 +20,7 @@ $bootPest = (static function (): void {
|
||||
'tests'
|
||||
));
|
||||
|
||||
$input = new ArgvInput();
|
||||
$input = new ArgvInput;
|
||||
|
||||
$output = new ConsoleOutput(OutputInterface::VERBOSITY_NORMAL, true);
|
||||
|
||||
|
||||
@ -17,16 +17,17 @@
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": "^8.1.0",
|
||||
"brianium/paratest": "^7.3.1",
|
||||
"nunomaduro/collision": "^7.10.0|^8.1.1",
|
||||
"nunomaduro/termwind": "^1.15.1|^2.0.1",
|
||||
"php": "^8.2.0",
|
||||
"brianium/paratest": "^7.4.9",
|
||||
"nunomaduro/collision": "^7.11.0|^8.5.0",
|
||||
"nunomaduro/termwind": "^1.16.0|^2.3.3",
|
||||
"pestphp/pest-plugin": "^2.1.1",
|
||||
"pestphp/pest-plugin-arch": "^2.7.0",
|
||||
"phpunit/phpunit": "^10.5.17"
|
||||
"phpunit/phpunit": "^10.5.63"
|
||||
},
|
||||
"conflict": {
|
||||
"phpunit/phpunit": ">10.5.17",
|
||||
"filp/whoops": "<2.16.0",
|
||||
"phpunit/phpunit": ">10.5.63",
|
||||
"sebastian/exporter": "<5.1.0",
|
||||
"webmozart/assert": "<1.11.0"
|
||||
},
|
||||
@ -51,9 +52,9 @@
|
||||
]
|
||||
},
|
||||
"require-dev": {
|
||||
"pestphp/pest-dev-tools": "^2.16.0",
|
||||
"pestphp/pest-plugin-type-coverage": "^2.8.1",
|
||||
"symfony/process": "^6.4.0|^7.0.4"
|
||||
"pestphp/pest-dev-tools": "^2.17.0",
|
||||
"pestphp/pest-plugin-type-coverage": "^2.8.7",
|
||||
"symfony/process": "^6.4.0|^7.4.4"
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true,
|
||||
@ -68,22 +69,12 @@
|
||||
"bin/pest"
|
||||
],
|
||||
"scripts": {
|
||||
"refacto": "rector",
|
||||
"lint": "pint",
|
||||
"test:refacto": "rector --dry-run",
|
||||
"test:lint": "pint --test",
|
||||
"test:type:check": "phpstan analyse --ansi --memory-limit=-1 --debug",
|
||||
"test:type:coverage": "php bin/pest --type-coverage --min=100",
|
||||
"test:unit": "php bin/pest --colors=always --exclude-group=integration --compact",
|
||||
"test:inline": "php bin/pest --colors=always --configuration=phpunit.inline.xml",
|
||||
"test:parallel": "php bin/pest --colors=always --exclude-group=integration --parallel --processes=3",
|
||||
"test:integration": "php bin/pest --colors=always --group=integration",
|
||||
"update:snapshots": "REBUILD_SNAPSHOTS=true php bin/pest --colors=always --update-snapshots",
|
||||
"test": [
|
||||
"@test:refacto",
|
||||
"@test:lint",
|
||||
"@test:type:check",
|
||||
"@test:type:coverage",
|
||||
"@test:unit",
|
||||
"@test:parallel",
|
||||
"@test:integration"
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
includes:
|
||||
- vendor/phpstan/phpstan-strict-rules/rules.neon
|
||||
- vendor/ergebnis/phpstan-rules/rules.neon
|
||||
- vendor/thecodingmachine/phpstan-strict-rules/phpstan-strict-rules.neon
|
||||
|
||||
parameters:
|
||||
@ -12,12 +11,4 @@ parameters:
|
||||
reportUnmatchedIgnoredErrors: true
|
||||
|
||||
ignoreErrors:
|
||||
- "#has a nullable return type declaration.#"
|
||||
- "#Language construct isset\\(\\) should not be used.#"
|
||||
- "#is not allowed to extend#"
|
||||
- "#is concrete, but does not have a Test suffix#"
|
||||
- "#with a nullable type declaration#"
|
||||
- "#type mixed is not subtype of native#"
|
||||
- "# with null as default value#"
|
||||
- "#has parameter \\$closure with default value.#"
|
||||
- "#has parameter \\$description with default value.#"
|
||||
|
||||
@ -32,8 +32,7 @@ final class BootSubscribers implements Bootstrapper
|
||||
*/
|
||||
public function __construct(
|
||||
private readonly Container $container,
|
||||
) {
|
||||
}
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Boots the list of Subscribers.
|
||||
|
||||
@ -234,11 +234,13 @@ trait Testable
|
||||
$afterEach = ChainableClosure::bound($this->__afterEach, $afterEach);
|
||||
}
|
||||
|
||||
$this->__callClosure($afterEach, func_get_args());
|
||||
try {
|
||||
$this->__callClosure($afterEach, func_get_args());
|
||||
} finally {
|
||||
parent::tearDown();
|
||||
|
||||
parent::tearDown();
|
||||
|
||||
TestSuite::getInstance()->test = null;
|
||||
TestSuite::getInstance()->test = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -50,7 +50,7 @@ final class Thanks
|
||||
$wantsToSupport = false;
|
||||
|
||||
if (getenv('PEST_NO_SUPPORT') !== 'true' && $this->input->isInteractive()) {
|
||||
$wantsToSupport = (new SymfonyQuestionHelper())->ask(
|
||||
$wantsToSupport = (new SymfonyQuestionHelper)->ask(
|
||||
new ArrayInput([]),
|
||||
$this->output,
|
||||
new ConfirmationQuestion(
|
||||
|
||||
31
src/Exceptions/TestClosureMustNotBeStatic.php
Normal file
31
src/Exceptions/TestClosureMustNotBeStatic.php
Normal file
@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Pest\Exceptions;
|
||||
|
||||
use InvalidArgumentException;
|
||||
use NunoMaduro\Collision\Contracts\RenderlessEditor;
|
||||
use NunoMaduro\Collision\Contracts\RenderlessTrace;
|
||||
use Pest\Factories\TestCaseMethodFactory;
|
||||
use Symfony\Component\Console\Exception\ExceptionInterface;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class TestClosureMustNotBeStatic extends InvalidArgumentException implements ExceptionInterface, RenderlessEditor, RenderlessTrace
|
||||
{
|
||||
/**
|
||||
* Creates a new Exception instance.
|
||||
*/
|
||||
public function __construct(TestCaseMethodFactory $method)
|
||||
{
|
||||
parent::__construct(
|
||||
sprintf(
|
||||
'Test closure must not be static. Please remove the `static` keyword from the `%s` method in `%s`.',
|
||||
$method->description,
|
||||
$method->filename
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -421,7 +421,7 @@ final class Expectation
|
||||
*/
|
||||
public function any(): Any
|
||||
{
|
||||
return new Any();
|
||||
return new Any;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -441,7 +441,7 @@ final class Expectation
|
||||
{
|
||||
return Targeted::make(
|
||||
$this,
|
||||
fn (ObjectDescription $object): bool => str_contains((string) file_get_contents($object->path), 'declare(strict_types=1);'),
|
||||
fn (ObjectDescription $object): bool => (bool) preg_match('/^<\?php\s+declare\(.*?strict_types\s?=\s?1.*?\);/', (string) file_get_contents($object->path)),
|
||||
'to use strict types',
|
||||
FileLineFinder::where(fn (string $line): bool => str_contains($line, '<?php')),
|
||||
);
|
||||
@ -515,7 +515,7 @@ final class Expectation
|
||||
return Targeted::make(
|
||||
$this,
|
||||
fn (ObjectDescription $object): bool => $object->reflectionClass->hasMethod($method),
|
||||
'to have method',
|
||||
sprintf("to have method '%s'", $method),
|
||||
FileLineFinder::where(fn (string $line): bool => str_contains($line, 'class')),
|
||||
);
|
||||
}
|
||||
|
||||
@ -24,9 +24,7 @@ final class EachExpectation
|
||||
*
|
||||
* @param Expectation<TValue> $original
|
||||
*/
|
||||
public function __construct(private readonly Expectation $original)
|
||||
{
|
||||
}
|
||||
public function __construct(private readonly Expectation $original) {}
|
||||
|
||||
/**
|
||||
* Creates a new expectation.
|
||||
|
||||
@ -36,9 +36,7 @@ final class OppositeExpectation
|
||||
*
|
||||
* @param Expectation<TValue> $original
|
||||
*/
|
||||
public function __construct(private readonly Expectation $original)
|
||||
{
|
||||
}
|
||||
public function __construct(private readonly Expectation $original) {}
|
||||
|
||||
/**
|
||||
* Asserts that the value array not has the provided $keys.
|
||||
@ -84,7 +82,7 @@ final class OppositeExpectation
|
||||
{
|
||||
return Targeted::make(
|
||||
$this->original,
|
||||
fn (ObjectDescription $object): bool => ! str_contains((string) file_get_contents($object->path), 'declare(strict_types=1);'),
|
||||
fn (ObjectDescription $object): bool => ! (bool) preg_match('/^<\?php\s+declare\(.*?strict_types\s?=\s?1.*?\);/', (string) file_get_contents($object->path)),
|
||||
'not to use strict types',
|
||||
FileLineFinder::where(fn (string $line): bool => str_contains($line, '<?php')),
|
||||
);
|
||||
|
||||
@ -20,7 +20,7 @@ abstract class Attribute
|
||||
* @param array<int, string> $attributes
|
||||
* @return array<int, string>
|
||||
*/
|
||||
public function __invoke(TestCaseMethodFactory $method, array $attributes): array // @phpstan-ignore-line
|
||||
public function __invoke(TestCaseMethodFactory $method, array $attributes): array
|
||||
{
|
||||
return $attributes;
|
||||
}
|
||||
|
||||
@ -28,8 +28,8 @@ trait HigherOrderable
|
||||
*/
|
||||
private function bootHigherOrderable(): void
|
||||
{
|
||||
$this->chains = new HigherOrderMessageCollection();
|
||||
$this->factoryProxies = new HigherOrderMessageCollection();
|
||||
$this->proxies = new HigherOrderMessageCollection();
|
||||
$this->chains = new HigherOrderMessageCollection;
|
||||
$this->factoryProxies = new HigherOrderMessageCollection;
|
||||
$this->proxies = new HigherOrderMessageCollection;
|
||||
}
|
||||
}
|
||||
|
||||
@ -9,7 +9,5 @@ namespace Pest\Factories\Covers;
|
||||
*/
|
||||
final class CoversClass
|
||||
{
|
||||
public function __construct(public string $class)
|
||||
{
|
||||
}
|
||||
public function __construct(public string $class) {}
|
||||
}
|
||||
|
||||
@ -9,7 +9,5 @@ namespace Pest\Factories\Covers;
|
||||
*/
|
||||
final class CoversFunction
|
||||
{
|
||||
public function __construct(public string $function)
|
||||
{
|
||||
}
|
||||
public function __construct(public string $function) {}
|
||||
}
|
||||
|
||||
@ -7,6 +7,4 @@ namespace Pest\Factories\Covers;
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class CoversNothing
|
||||
{
|
||||
}
|
||||
final class CoversNothing {}
|
||||
|
||||
@ -11,6 +11,7 @@ use Pest\Contracts\HasPrintableTestCaseName;
|
||||
use Pest\Exceptions\DatasetMissing;
|
||||
use Pest\Exceptions\ShouldNotHappen;
|
||||
use Pest\Exceptions\TestAlreadyExist;
|
||||
use Pest\Exceptions\TestClosureMustNotBeStatic;
|
||||
use Pest\Exceptions\TestDescriptionMissing;
|
||||
use Pest\Factories\Concerns\HigherOrderable;
|
||||
use Pest\Support\Reflection;
|
||||
@ -154,7 +155,7 @@ final class TestCaseFactory
|
||||
foreach ($classAvailableAttributes as $attribute) {
|
||||
$classAttributes = array_reduce(
|
||||
$methods,
|
||||
fn (array $carry, TestCaseMethodFactory $methodFactory): array => (new $attribute())->__invoke($methodFactory, $carry),
|
||||
fn (array $carry, TestCaseMethodFactory $methodFactory): array => (new $attribute)->__invoke($methodFactory, $carry),
|
||||
$classAttributes
|
||||
);
|
||||
}
|
||||
@ -193,7 +194,7 @@ final class TestCaseFactory
|
||||
}
|
||||
PHP;
|
||||
|
||||
eval($classCode); // @phpstan-ignore-line
|
||||
eval($classCode);
|
||||
} catch (ParseError $caught) {
|
||||
throw new RuntimeException(sprintf(
|
||||
"Unable to create test case for test file at %s. \n %s",
|
||||
@ -216,6 +217,14 @@ final class TestCaseFactory
|
||||
throw new TestAlreadyExist($method->filename, $method->description);
|
||||
}
|
||||
|
||||
if (
|
||||
$method->closure instanceof \Closure &&
|
||||
(new \ReflectionFunction($method->closure))->isStatic()
|
||||
) {
|
||||
|
||||
throw new TestClosureMustNotBeStatic($method);
|
||||
}
|
||||
|
||||
if (! $method->receivesArguments()) {
|
||||
if (! $method->closure instanceof \Closure) {
|
||||
throw ShouldNotHappen::fromMessage('The test closure may not be empty.');
|
||||
|
||||
@ -138,11 +138,11 @@ final class TestCaseMethodFactory
|
||||
$attributes = [];
|
||||
|
||||
foreach ($annotationsToUse as $annotation) {
|
||||
$annotations = (new $annotation())->__invoke($this, $annotations);
|
||||
$annotations = (new $annotation)->__invoke($this, $annotations);
|
||||
}
|
||||
|
||||
foreach ($attributesToUse as $attribute) {
|
||||
$attributes = (new $attribute())->__invoke($this, $attributes);
|
||||
$attributes = (new $attribute)->__invoke($this, $attributes);
|
||||
}
|
||||
|
||||
if ($this->datasets !== [] || $this->repetitions > 1) {
|
||||
|
||||
@ -67,7 +67,7 @@ final class Kernel
|
||||
->add(Container::class, $container);
|
||||
|
||||
$kernel = new self(
|
||||
new Application(),
|
||||
new Application,
|
||||
$output,
|
||||
);
|
||||
|
||||
|
||||
@ -40,7 +40,7 @@ final class KernelDump
|
||||
*/
|
||||
public function disable(): void
|
||||
{
|
||||
@ob_clean(); // @phpstan-ignore-line
|
||||
@ob_clean();
|
||||
|
||||
if ($this->buffer !== '') {
|
||||
$this->flush();
|
||||
|
||||
@ -36,7 +36,7 @@ final class Converter
|
||||
public function __construct(
|
||||
private readonly string $rootPath,
|
||||
) {
|
||||
$this->stateGenerator = new StateGenerator();
|
||||
$this->stateGenerator = new StateGenerator;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -17,8 +17,7 @@ final class ServiceMessage
|
||||
public function __construct(
|
||||
private readonly string $type,
|
||||
private readonly array $parameters,
|
||||
) {
|
||||
}
|
||||
) {}
|
||||
|
||||
public function toString(): string
|
||||
{
|
||||
|
||||
@ -14,9 +14,7 @@ abstract class Subscriber
|
||||
/**
|
||||
* Creates a new Subscriber instance.
|
||||
*/
|
||||
public function __construct(private readonly TeamCityLogger $logger)
|
||||
{
|
||||
}
|
||||
public function __construct(private readonly TeamCityLogger $logger) {}
|
||||
|
||||
/**
|
||||
* Creates a new TeamCityLogger instance.
|
||||
|
||||
@ -7,6 +7,4 @@ namespace Pest\Matchers;
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class Any
|
||||
{
|
||||
}
|
||||
final class Any {}
|
||||
|
||||
@ -314,7 +314,7 @@ final class Expectation
|
||||
*
|
||||
* @return self<TValue>
|
||||
*/
|
||||
public function toHaveProperty(string $name, mixed $value = new Any(), string $message = ''): self
|
||||
public function toHaveProperty(string $name, mixed $value = new Any, string $message = ''): self
|
||||
{
|
||||
$this->toBeObject();
|
||||
|
||||
@ -467,6 +467,18 @@ final class Expectation
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts that the value is a list.
|
||||
*
|
||||
* @return self<TValue>
|
||||
*/
|
||||
public function toBeList(string $message = ''): self
|
||||
{
|
||||
Assert::assertIsList($this->value, $message);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts that the value is of type bool.
|
||||
*
|
||||
@ -642,7 +654,7 @@ final class Expectation
|
||||
*
|
||||
* @return self<TValue>
|
||||
*/
|
||||
public function toHaveKey(string|int $key, mixed $value = new Any(), string $message = ''): self
|
||||
public function toHaveKey(string|int $key, mixed $value = new Any, string $message = ''): self
|
||||
{
|
||||
if (is_object($this->value) && method_exists($this->value, 'toArray')) {
|
||||
$array = $this->value->toArray();
|
||||
|
||||
@ -42,7 +42,7 @@ final class Panic
|
||||
try {
|
||||
$output = Container::getInstance()->get(OutputInterface::class);
|
||||
} catch (Throwable) { // @phpstan-ignore-line
|
||||
$output = new ConsoleOutput();
|
||||
$output = new ConsoleOutput;
|
||||
}
|
||||
|
||||
assert($output instanceof OutputInterface);
|
||||
|
||||
@ -39,7 +39,7 @@ final class AfterEachCall
|
||||
) {
|
||||
$this->closure = $closure instanceof Closure ? $closure : NullClosure::create();
|
||||
|
||||
$this->proxies = new HigherOrderMessageCollection();
|
||||
$this->proxies = new HigherOrderMessageCollection;
|
||||
|
||||
$this->describing = DescribeCall::describing();
|
||||
}
|
||||
|
||||
@ -44,8 +44,8 @@ final class BeforeEachCall
|
||||
) {
|
||||
$this->closure = $closure instanceof Closure ? $closure : NullClosure::create();
|
||||
|
||||
$this->testCallProxies = new HigherOrderMessageCollection();
|
||||
$this->testCaseProxies = new HigherOrderMessageCollection();
|
||||
$this->testCallProxies = new HigherOrderMessageCollection;
|
||||
$this->testCaseProxies = new HigherOrderMessageCollection;
|
||||
|
||||
$this->describing = DescribeCall::describing();
|
||||
}
|
||||
|
||||
@ -369,7 +369,7 @@ final class TestCall
|
||||
*/
|
||||
public function coversNothing(): self
|
||||
{
|
||||
$this->testCaseMethod->covers = [new CoversNothing()];
|
||||
$this->testCaseMethod->covers = [new CoversNothing];
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
@ -6,7 +6,7 @@ namespace Pest;
|
||||
|
||||
function version(): string
|
||||
{
|
||||
return '2.34.7';
|
||||
return '2.36.1';
|
||||
}
|
||||
|
||||
function testDirectory(string $file = ''): string
|
||||
|
||||
@ -97,7 +97,7 @@ final class Help implements HandlesArguments
|
||||
*/
|
||||
private function getContent(): array
|
||||
{
|
||||
$helpReflection = new PHPUnitHelp();
|
||||
$helpReflection = new PHPUnitHelp;
|
||||
|
||||
$content = (fn (): array => $this->elements())->call($helpReflection);
|
||||
|
||||
|
||||
@ -41,7 +41,7 @@ final class Parallel implements HandlesArguments
|
||||
*/
|
||||
public static function isEnabled(): bool
|
||||
{
|
||||
$argv = new ArgvInput();
|
||||
$argv = new ArgvInput;
|
||||
if ($argv->hasParameterOption('--parallel')) {
|
||||
return true;
|
||||
}
|
||||
@ -126,7 +126,7 @@ final class Parallel implements HandlesArguments
|
||||
$arguments
|
||||
);
|
||||
|
||||
$exitCode = $this->paratestCommand()->run(new ArgvInput($filteredArguments), new CleanConsoleOutput());
|
||||
$exitCode = $this->paratestCommand()->run(new ArgvInput($filteredArguments), new CleanConsoleOutput);
|
||||
|
||||
return CallsAddsOutput::execute($exitCode);
|
||||
}
|
||||
@ -173,7 +173,7 @@ final class Parallel implements HandlesArguments
|
||||
*/
|
||||
private function hasArgumentsThatWouldBeFasterWithoutParallel(): bool
|
||||
{
|
||||
$arguments = new ArgvInput();
|
||||
$arguments = new ArgvInput;
|
||||
|
||||
foreach (self::UNSUPPORTED_ARGUMENTS as $unsupportedArgument) {
|
||||
if ($arguments->hasParameterOption($unsupportedArgument)) {
|
||||
|
||||
@ -63,8 +63,7 @@ final class ResultPrinter
|
||||
{
|
||||
public function __construct(
|
||||
private readonly OutputInterface $output,
|
||||
) {
|
||||
}
|
||||
) {}
|
||||
|
||||
public function print(string $buffer): void
|
||||
{
|
||||
@ -79,9 +78,7 @@ final class ResultPrinter
|
||||
$this->output->write(OutputFormatter::escape($buffer));
|
||||
}
|
||||
|
||||
public function flush(): void
|
||||
{
|
||||
}
|
||||
public function flush(): void {}
|
||||
};
|
||||
|
||||
$this->compactPrinter = CompactPrinter::default();
|
||||
@ -172,7 +169,7 @@ final class ResultPrinter
|
||||
return;
|
||||
}
|
||||
|
||||
$state = (new StateGenerator())->fromPhpUnitTestResult($this->passedTests, $testResult);
|
||||
$state = (new StateGenerator)->fromPhpUnitTestResult($this->passedTests, $testResult);
|
||||
|
||||
$this->compactPrinter->errors($state);
|
||||
$this->compactPrinter->recap($state, $testResult, $duration, $this->options);
|
||||
|
||||
@ -91,13 +91,13 @@ final class WrapperRunner implements RunnerInterface
|
||||
private readonly OutputInterface $output
|
||||
) {
|
||||
$this->printer = new ResultPrinter($output, $options);
|
||||
$this->timer = new Timer();
|
||||
$this->timer = new Timer;
|
||||
|
||||
$wrapper = realpath(
|
||||
dirname(__DIR__, 4).DIRECTORY_SEPARATOR.'bin'.DIRECTORY_SEPARATOR.'worker.php',
|
||||
);
|
||||
assert($wrapper !== false);
|
||||
$phpFinder = new PhpExecutableFinder();
|
||||
$phpFinder = new PhpExecutableFinder;
|
||||
$phpBin = $phpFinder->find(false);
|
||||
assert($phpBin !== false);
|
||||
$parameters = [$phpBin];
|
||||
@ -110,7 +110,7 @@ final class WrapperRunner implements RunnerInterface
|
||||
$parameters[] = $wrapper;
|
||||
|
||||
$this->parameters = $parameters;
|
||||
$this->codeCoverageFilterRegistry = new CodeCoverageFilterRegistry();
|
||||
$this->codeCoverageFilterRegistry = new CodeCoverageFilterRegistry;
|
||||
}
|
||||
|
||||
public function run(): int
|
||||
@ -357,7 +357,7 @@ final class WrapperRunner implements RunnerInterface
|
||||
return;
|
||||
}
|
||||
|
||||
$coverageManager = new CodeCoverage();
|
||||
$coverageManager = new CodeCoverage;
|
||||
$coverageManager->init(
|
||||
$this->options->configuration,
|
||||
$this->codeCoverageFilterRegistry,
|
||||
@ -389,8 +389,8 @@ final class WrapperRunner implements RunnerInterface
|
||||
return;
|
||||
}
|
||||
|
||||
$testSuite = (new LogMerger())->merge($this->junitFiles);
|
||||
(new Writer())->write(
|
||||
$testSuite = (new LogMerger)->merge($this->junitFiles);
|
||||
(new Writer)->write(
|
||||
$testSuite,
|
||||
$this->options->configuration->logfileJunit(),
|
||||
);
|
||||
|
||||
@ -21,8 +21,7 @@ final class SnapshotRepository
|
||||
public function __construct(
|
||||
readonly private string $testsPath,
|
||||
readonly private string $snapshotsPath,
|
||||
) {
|
||||
}
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Checks if the snapshot exists.
|
||||
|
||||
@ -40,28 +40,31 @@ final class Result
|
||||
*/
|
||||
public static function exitCode(Configuration $configuration, TestResult $result): int
|
||||
{
|
||||
if ($result->wasSuccessfulIgnoringPhpunitWarnings()
|
||||
&& ! $result->hasTestTriggeredPhpunitWarningEvents()) {
|
||||
return self::SUCCESS_EXIT;
|
||||
if ($result->wasSuccessful()) {
|
||||
if ($configuration->failOnWarning()) {
|
||||
$warnings = $result->numberOfTestsWithTestTriggeredPhpunitWarningEvents()
|
||||
+ count($result->warnings())
|
||||
+ count($result->phpWarnings());
|
||||
|
||||
if ($warnings > 0) {
|
||||
return self::FAILURE_EXIT;
|
||||
}
|
||||
}
|
||||
|
||||
if (! $result->hasTestTriggeredPhpunitWarningEvents()) {
|
||||
return self::SUCCESS_EXIT;
|
||||
}
|
||||
}
|
||||
|
||||
if ($configuration->failOnEmptyTestSuite() && ResultReflection::numberOfTests($result) === 0) {
|
||||
return self::FAILURE_EXIT;
|
||||
}
|
||||
|
||||
if ($result->wasSuccessfulIgnoringPhpunitWarnings()) {
|
||||
if ($result->wasSuccessful()) {
|
||||
if ($configuration->failOnRisky() && $result->hasTestConsideredRiskyEvents()) {
|
||||
$returnCode = self::FAILURE_EXIT;
|
||||
}
|
||||
|
||||
$warnings = $result->numberOfTestsWithTestTriggeredPhpunitWarningEvents()
|
||||
+ count($result->warnings())
|
||||
+ count($result->phpWarnings());
|
||||
|
||||
if ($configuration->failOnWarning() && $warnings > 0) {
|
||||
$returnCode = self::FAILURE_EXIT;
|
||||
}
|
||||
|
||||
if ($configuration->failOnIncomplete() && $result->hasTestMarkedIncompleteEvents()) {
|
||||
$returnCode = self::FAILURE_EXIT;
|
||||
}
|
||||
|
||||
@ -24,8 +24,7 @@ final class EnsureTeamCityEnabled implements ConfiguredSubscriber
|
||||
private readonly InputInterface $input,
|
||||
private readonly OutputInterface $output,
|
||||
private readonly TestSuite $testSuite,
|
||||
) {
|
||||
}
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Runs the subscriber.
|
||||
|
||||
@ -26,7 +26,7 @@ final class Container
|
||||
public static function getInstance(): self
|
||||
{
|
||||
if (! self::$instance instanceof \Pest\Support\Container) {
|
||||
self::$instance = new self();
|
||||
self::$instance = new self;
|
||||
}
|
||||
|
||||
return self::$instance;
|
||||
|
||||
@ -37,7 +37,7 @@ final class Coverage
|
||||
*/
|
||||
public static function isAvailable(): bool
|
||||
{
|
||||
$runtime = new Runtime();
|
||||
$runtime = new Runtime;
|
||||
|
||||
if (! $runtime->canCollectCodeCoverage()) {
|
||||
return false;
|
||||
@ -67,7 +67,7 @@ final class Coverage
|
||||
*/
|
||||
public static function usingXdebug(): bool
|
||||
{
|
||||
return (new Runtime())->hasXdebug();
|
||||
return (new Runtime)->hasXdebug();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -30,8 +30,7 @@ final class ExpectationPipeline
|
||||
*/
|
||||
public function __construct(
|
||||
private readonly Closure $closure
|
||||
) {
|
||||
}
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Creates a new instance of Expectation Pipeline with given closure.
|
||||
|
||||
@ -32,7 +32,7 @@ final class Exporter
|
||||
public static function default(): self
|
||||
{
|
||||
return new self(
|
||||
new BaseExporter()
|
||||
new BaseExporter
|
||||
);
|
||||
}
|
||||
|
||||
@ -47,7 +47,7 @@ final class Exporter
|
||||
$array = $data;
|
||||
$itemsCount = 0;
|
||||
$exporter = self::default();
|
||||
$context ??= new Context();
|
||||
$context ??= new Context;
|
||||
|
||||
$context->add($data);
|
||||
|
||||
|
||||
@ -16,7 +16,6 @@ final class NullClosure
|
||||
*/
|
||||
public static function create(): Closure
|
||||
{
|
||||
return Closure::fromCallable(function (): void {
|
||||
});
|
||||
return Closure::fromCallable(function (): void {});
|
||||
}
|
||||
}
|
||||
|
||||
@ -20,7 +20,7 @@ final class StateGenerator
|
||||
{
|
||||
public function fromPhpUnitTestResult(int $passedTests, PHPUnitTestResult $testResult): State
|
||||
{
|
||||
$state = new State();
|
||||
$state = new State;
|
||||
|
||||
foreach ($testResult->testErroredEvents() as $testResultEvent) {
|
||||
if ($testResultEvent instanceof Errored) {
|
||||
|
||||
@ -76,7 +76,7 @@ final class GitDirtyTestCaseFilter implements TestCaseFilter
|
||||
$dirtyFiles = array_values($dirtyFiles);
|
||||
|
||||
if ($dirtyFiles === []) {
|
||||
Panic::with(new NoDirtyTestsFound());
|
||||
Panic::with(new NoDirtyTestsFound);
|
||||
}
|
||||
|
||||
$this->changedFiles = $dirtyFiles;
|
||||
|
||||
@ -71,11 +71,11 @@ final class TestSuite
|
||||
string $rootPath,
|
||||
public string $testPath,
|
||||
) {
|
||||
$this->beforeAll = new BeforeAllRepository();
|
||||
$this->beforeEach = new BeforeEachRepository();
|
||||
$this->tests = new TestRepository();
|
||||
$this->afterEach = new AfterEachRepository();
|
||||
$this->afterAll = new AfterAllRepository();
|
||||
$this->beforeAll = new BeforeAllRepository;
|
||||
$this->beforeEach = new BeforeEachRepository;
|
||||
$this->tests = new TestRepository;
|
||||
$this->afterEach = new AfterEachRepository;
|
||||
$this->afterAll = new AfterAllRepository;
|
||||
$this->rootPath = (string) realpath($rootPath);
|
||||
$this->snapshots = new SnapshotRepository(
|
||||
implode(DIRECTORY_SEPARATOR, [$this->rootPath, $this->testPath]),
|
||||
@ -101,7 +101,7 @@ final class TestSuite
|
||||
}
|
||||
|
||||
if (! self::$instance instanceof self) {
|
||||
Panic::with(new InvalidPestCommand());
|
||||
Panic::with(new InvalidPestCommand);
|
||||
}
|
||||
|
||||
return self::$instance;
|
||||
|
||||
@ -6,5 +6,5 @@ use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
|
||||
|
||||
abstract class TestCase extends BaseTestCase
|
||||
{
|
||||
use CreatesApplication;
|
||||
//
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
|
||||
Pest Testing Framework 2.34.7.
|
||||
Pest Testing Framework 2.36.1.
|
||||
|
||||
USAGE: pest <file> [options]
|
||||
|
||||
@ -45,7 +45,7 @@
|
||||
--disallow-test-output ................. Be strict about output during tests
|
||||
--enforce-time-limit ................. Enforce time limit based on test size
|
||||
--default-time-limit [sec] Timeout in seconds for tests that have no declared size
|
||||
--dont-report-useless-tests .. Do not report tests that do not test anything
|
||||
--do-not-report-useless-tests Do not report tests that do not test anything
|
||||
--stop-on-defect ... Stop after first error, failure, warning, or risky test
|
||||
--stop-on-error ..................................... Stop after first error
|
||||
--stop-on-failure ................................. Stop after first failure
|
||||
@ -59,9 +59,21 @@
|
||||
--fail-on-warning Signal failure using shell exit code when a warning was triggered
|
||||
--fail-on-risky Signal failure using shell exit code when a test was considered risky
|
||||
--fail-on-deprecation Signal failure using shell exit code when a deprecation was triggered
|
||||
--fail-on-phpunit-deprecation Signal failure using shell exit code when a PHPUnit deprecation was triggered
|
||||
--fail-on-phpunit-warning Signal failure using shell exit code when a PHPUnit warning was triggered
|
||||
--fail-on-notice Signal failure using shell exit code when a notice was triggered
|
||||
--fail-on-skipped Signal failure using shell exit code when a test was skipped
|
||||
--fail-on-incomplete Signal failure using shell exit code when a test was marked incomplete
|
||||
--fail-on-all-issues Signal failure using shell exit code when an issue is triggered
|
||||
--do-not-fail-on-empty-test-suite Do not signal failure using shell exit code when no tests were run
|
||||
--do-not-fail-on-warning Do not signal failure using shell exit code when a warning was triggered
|
||||
--do-not-fail-on-risky Do not signal failure using shell exit code when a test was considered risky
|
||||
--do-not-fail-on-deprecation Do not signal failure using shell exit code when a deprecation was triggered
|
||||
--do-not-fail-on-phpunit-deprecation Do not signal failure using shell exit code when a PHPUnit deprecation was triggered
|
||||
--do-not-fail-on-phpunit-warning Do not signal failure using shell exit code when a PHPUnit warning was triggered
|
||||
--do-not-fail-on-notice Do not signal failure using shell exit code when a notice was triggered
|
||||
--do-not-fail-on-skipped Do not signal failure using shell exit code when a test was skipped
|
||||
--do-not-fail-on-incomplete Do not signal failure using shell exit code when a test was marked incomplete
|
||||
--cache-result ............................ Write test results to cache file
|
||||
--do-not-cache-result .............. Do not write test results to cache file
|
||||
--order-by [order] Run tests in order: default|defects|depends|duration|no-depends|random|reverse|size
|
||||
@ -78,9 +90,11 @@
|
||||
--display-incomplete .................. Display details for incomplete tests
|
||||
--display-skipped ........................ Display details for skipped tests
|
||||
--display-deprecations . Display details for deprecations triggered by tests
|
||||
--display-phpunit-deprecations .... Display details for PHPUnit deprecations
|
||||
--display-errors ............. Display details for errors triggered by tests
|
||||
--display-notices ........... Display details for notices triggered by tests
|
||||
--display-warnings ......... Display details for warnings triggered by tests
|
||||
--display-all-issues ..... Display details for all issues that are triggered
|
||||
--reverse-list .............................. Print defects in reverse order
|
||||
--teamcity . Replace default progress and result output with TeamCity format
|
||||
--testdox ................ Replace default result output with TestDox format
|
||||
@ -105,6 +119,8 @@
|
||||
--coverage-html [dir] Write code coverage report in HTML format to directory
|
||||
--coverage-php [file] .......... Write serialized code coverage data to file
|
||||
--coverage-text=[file] Write code coverage report in text format to file [default: standard output]
|
||||
--only-summary-for-coverage-text Option for code coverage report in text format: only show summary
|
||||
--show-uncovered-for-coverage-text Option for code coverage report in text format: show uncovered files
|
||||
--coverage-xml [dir] . Write code coverage report in XML format to directory
|
||||
--warm-coverage-cache ........................... Warm static analysis cache
|
||||
--coverage-filter [dir] ........... Include [dir] in code coverage reporting
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
|
||||
Pest Testing Framework 2.34.7.
|
||||
Pest Testing Framework 2.36.1.
|
||||
|
||||
|
||||
@ -511,6 +511,12 @@
|
||||
✓ passes with strings
|
||||
✓ failures
|
||||
✓ failures with custom message
|
||||
✓ not failures
|
||||
|
||||
PASS Tests\Features\Expect\toBeList
|
||||
✓ pass
|
||||
✓ failures
|
||||
✓ failures with custom message
|
||||
✓ not failures
|
||||
|
||||
PASS Tests\Features\Expect\toBeLowercase
|
||||
@ -1167,16 +1173,6 @@
|
||||
PASS Tests\Hooks\BeforeEachTest
|
||||
✓ global beforeEach execution order
|
||||
|
||||
PASS Tests\Overrides\VersionsTest
|
||||
✓ versions with dataset "Runner/Filter/NameFilterIterator.php"
|
||||
✓ versions with dataset "Runner/ResultCache/DefaultResultCache.php"
|
||||
✓ versions with dataset "Runner/TestSuiteLoader.php"
|
||||
✓ versions with dataset "TextUI/Command/Commands/WarmCodeCoverageCacheCommand.php"
|
||||
✓ versions with dataset "TextUI/Output/Default/ProgressPrinter/Subscriber/TestSkippedSubscriber.php"
|
||||
✓ versions with dataset "TextUI/TestSuiteFilterProcessor.php"
|
||||
✓ versions with dataset "Event/Value/ThrowableBuilder.php"
|
||||
✓ versions with dataset "Logging/JUnit/JunitXmlLogger.php"
|
||||
|
||||
PASS Tests\PHPUnit\CustomAffixes\InvalidTestName
|
||||
✓ it runs file names like @#$%^&()-_=+.php
|
||||
|
||||
@ -1281,26 +1277,6 @@
|
||||
✓ it can resolve builtin value types
|
||||
✓ it cannot resolve a parameter without type
|
||||
|
||||
PASS Tests\Unit\Support\DatasetInfo
|
||||
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/project/tests/Datase…rs.php', true)
|
||||
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/project/tests/Datasets.php', false)
|
||||
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/project/tests/Featur…rs.php', true)
|
||||
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/project/tests/Featur…rs.php', false)
|
||||
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/project/tests/Featur…ts.php', false)
|
||||
✓ it can check if dataset is defined inside a Datasets.php file with ('/var/www/project/tests/Datase…rs.php', false)
|
||||
✓ it can check if dataset is defined inside a Datasets.php file with ('/var/www/project/tests/Datasets.php', true)
|
||||
✓ it can check if dataset is defined inside a Datasets.php file with ('/var/www/project/tests/Featur…rs.php', false) #1
|
||||
✓ it can check if dataset is defined inside a Datasets.php file with ('/var/www/project/tests/Featur…rs.php', false) #2
|
||||
✓ it can check if dataset is defined inside a Datasets.php file with ('/var/www/project/tests/Featur…ts.php', true)
|
||||
✓ it computes the dataset scope with ('/var/www/project/tests/Datase…rs.php', '/var/www/project/tests')
|
||||
✓ it computes the dataset scope with ('/var/www/project/tests/Datasets.php', '/var/www/project/tests')
|
||||
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…rs.php', '/var/www/project/tests/Features')
|
||||
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…rs.php', '/var/www/project/tests/Featur…rs.php') #1
|
||||
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…ts.php', '/var/www/project/tests/Features')
|
||||
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…rs.php', '/var/www/project/tests/Featur…ollers')
|
||||
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…rs.php', '/var/www/project/tests/Featur…rs.php') #2
|
||||
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…ts.php', '/var/www/project/tests/Featur…ollers')
|
||||
|
||||
PASS Tests\Unit\Support\ExceptionTrace
|
||||
✓ it ensures the given closures reports the correct class name
|
||||
✓ it ensures the given closures reports the correct class name and suggests the [uses()] function
|
||||
@ -1375,6 +1351,7 @@
|
||||
|
||||
PASS Tests\Unit\TestSuite
|
||||
✓ it does not allow to add the same test description twice
|
||||
✓ it does not allow static closures
|
||||
✓ it alerts users about tests with arguments but no input
|
||||
✓ it can return an array of all test suite filenames
|
||||
|
||||
@ -1418,4 +1395,4 @@
|
||||
WARN Tests\Visual\Version
|
||||
- visual snapshot of help command output
|
||||
|
||||
Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 20 skipped, 1009 passed (2395 assertions)
|
||||
Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 20 skipped, 988 passed (2381 assertions)
|
||||
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
$state = new stdClass();
|
||||
$state = new stdClass;
|
||||
|
||||
beforeEach(function () use ($state) {
|
||||
$this->state = $state;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
$foo = new \stdClass();
|
||||
$foo = new \stdClass;
|
||||
$foo->bar = 0;
|
||||
|
||||
beforeAll(function () use ($foo) {
|
||||
|
||||
@ -7,7 +7,7 @@ use Symfony\Component\Console\Output\ConsoleOutput;
|
||||
it('has plugin')->assertTrue(class_exists(CoveragePlugin::class));
|
||||
|
||||
it('adds coverage if --coverage exist', function () {
|
||||
$plugin = new CoveragePlugin(new ConsoleOutput());
|
||||
$plugin = new CoveragePlugin(new ConsoleOutput);
|
||||
|
||||
expect($plugin->coverage)->toBeFalse();
|
||||
$arguments = $plugin->handleArguments([]);
|
||||
@ -20,7 +20,7 @@ it('adds coverage if --coverage exist', function () {
|
||||
})->skip(! \Pest\Support\Coverage::isAvailable() || ! function_exists('xdebug_info') || ! in_array('coverage', xdebug_info('mode'), true), 'Coverage is not available');
|
||||
|
||||
it('adds coverage if --min exist', function () {
|
||||
$plugin = new CoveragePlugin(new ConsoleOutput());
|
||||
$plugin = new CoveragePlugin(new ConsoleOutput);
|
||||
expect($plugin->coverageMin)->toEqual(0.0)
|
||||
->and($plugin->coverage)->toBeFalse();
|
||||
|
||||
@ -35,7 +35,7 @@ it('adds coverage if --min exist', function () {
|
||||
});
|
||||
|
||||
it('generates coverage based on file input', function () {
|
||||
expect(Coverage::getMissingCoverage(new class()
|
||||
expect(Coverage::getMissingCoverage(new class
|
||||
{
|
||||
public function lineCoverageData(): array
|
||||
{
|
||||
|
||||
@ -10,9 +10,7 @@ use Tests\Fixtures\Covers\CoversTrait;
|
||||
|
||||
$runCounter = 0;
|
||||
|
||||
function testCoversFunction()
|
||||
{
|
||||
}
|
||||
function testCoversFunction() {}
|
||||
|
||||
it('uses the correct PHPUnit attribute for class', function () {
|
||||
$attributes = (new ReflectionClass($this))->getAttributes();
|
||||
|
||||
@ -46,7 +46,7 @@ test('it truncates the description', function () {
|
||||
// it gets tested by the integration test
|
||||
})->with([str_repeat('Fooo', 10)]);
|
||||
|
||||
$state = new stdClass();
|
||||
$state = new stdClass;
|
||||
$state->text = '';
|
||||
|
||||
$datasets = [[1], [2]];
|
||||
@ -119,7 +119,7 @@ class Bar
|
||||
}
|
||||
|
||||
$namedDatasets = [
|
||||
new Bar(),
|
||||
new Bar,
|
||||
];
|
||||
|
||||
test('lazy named datasets', function ($text) {
|
||||
@ -132,12 +132,12 @@ it('creates unique test case names', function (string $name, Plugin $plugin, boo
|
||||
expect(true)->toBeTrue();
|
||||
$counter++;
|
||||
})->with([
|
||||
['Name 1', new Plugin(), true],
|
||||
['Name 1', new Plugin(), true],
|
||||
['Name 1', new Plugin(), false],
|
||||
['Name 2', new Plugin(), false],
|
||||
['Name 2', new Plugin(), true],
|
||||
['Name 1', new Plugin(), true],
|
||||
['Name 1', new Plugin, true],
|
||||
['Name 1', new Plugin, true],
|
||||
['Name 1', new Plugin, false],
|
||||
['Name 2', new Plugin, false],
|
||||
['Name 2', new Plugin, true],
|
||||
['Name 1', new Plugin, true],
|
||||
]);
|
||||
|
||||
it('creates unique test case names - count', function () use (&$counter) {
|
||||
@ -230,7 +230,7 @@ test('more than two datasets did the job right', function () use ($state) {
|
||||
expect($state->text)->toBe('121212121212131423241314232411122122111221221112212213142324135136145146235236245246');
|
||||
});
|
||||
|
||||
$wrapped_generator_state = new stdClass();
|
||||
$wrapped_generator_state = new stdClass;
|
||||
$wrapped_generator_state->text = '';
|
||||
$wrapped_generator_function_datasets = [1, 2, 3, 4];
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
it('gives access the the underlying expectException', function () {
|
||||
$this->expectException(InvalidArgumentException::class);
|
||||
|
||||
throw new InvalidArgumentException();
|
||||
throw new InvalidArgumentException;
|
||||
});
|
||||
|
||||
it('catch exceptions', function () {
|
||||
|
||||
@ -1,29 +1,29 @@
|
||||
<?php
|
||||
|
||||
it('can access methods', function () {
|
||||
expect(new HasMethods())
|
||||
expect(new HasMethods)
|
||||
->name()->toBeString()->toEqual('Has Methods');
|
||||
});
|
||||
|
||||
it('can access multiple methods', function () {
|
||||
expect(new HasMethods())
|
||||
expect(new HasMethods)
|
||||
->name()->toBeString()->toEqual('Has Methods')
|
||||
->quantity()->toBeInt()->toEqual(20);
|
||||
});
|
||||
|
||||
it('works with not', function () {
|
||||
expect(new HasMethods())
|
||||
expect(new HasMethods)
|
||||
->name()->not->toEqual('world')->toEqual('Has Methods')
|
||||
->quantity()->toEqual(20)->not()->toEqual('bar')->not->toBeNull;
|
||||
});
|
||||
|
||||
it('can accept arguments', function () {
|
||||
expect(new HasMethods())
|
||||
expect(new HasMethods)
|
||||
->multiply(5, 4)->toBeInt->toEqual(20);
|
||||
});
|
||||
|
||||
it('works with each', function () {
|
||||
expect(new HasMethods())
|
||||
expect(new HasMethods)
|
||||
->attributes()->toBeArray->each->not()->toBeNull
|
||||
->attributes()->each(function ($attribute) {
|
||||
$attribute->not->toBeNull();
|
||||
@ -31,14 +31,14 @@ it('works with each', function () {
|
||||
});
|
||||
|
||||
it('works inside of each', function () {
|
||||
expect(new HasMethods())
|
||||
expect(new HasMethods)
|
||||
->books()->each(function ($book) {
|
||||
$book->title->not->toBeNull->cost->toBeGreaterThan(19);
|
||||
});
|
||||
});
|
||||
|
||||
it('works with sequence', function () {
|
||||
expect(new HasMethods())
|
||||
expect(new HasMethods)
|
||||
->books()->sequence(
|
||||
function ($book) {
|
||||
$book->title->toEqual('Foo')->cost->toEqual(20);
|
||||
@ -50,7 +50,7 @@ it('works with sequence', function () {
|
||||
});
|
||||
|
||||
it('can compose complex expectations', function () {
|
||||
expect(new HasMethods())
|
||||
expect(new HasMethods)
|
||||
->toBeObject()
|
||||
->name()->toEqual('Has Methods')->not()->toEqual('bar')
|
||||
->quantity()->not->toEqual('world')->toEqual(20)->toBeInt
|
||||
@ -68,7 +68,7 @@ it('can compose complex expectations', function () {
|
||||
});
|
||||
|
||||
it('can handle nested method calls', function () {
|
||||
expect(new HasMethods())
|
||||
expect(new HasMethods)
|
||||
->newInstance()->newInstance()->name()->toEqual('Has Methods')->toBeString()
|
||||
->newInstance()->name()->toEqual('Has Methods')->not->toBeInt
|
||||
->name()->toEqual('Has Methods')
|
||||
@ -76,14 +76,14 @@ it('can handle nested method calls', function () {
|
||||
});
|
||||
|
||||
it('works with higher order tests')
|
||||
->expect(new HasMethods())
|
||||
->expect(new HasMethods)
|
||||
->newInstance()->newInstance()->name()->toEqual('Has Methods')->toBeString()
|
||||
->newInstance()->name()->toEqual('Has Methods')->not->toBeArray
|
||||
->name()->toEqual('Has Methods')
|
||||
->books()->each->toBeArray;
|
||||
|
||||
it('can use the scoped method to lock into the given level for expectations', function () {
|
||||
expect(new HasMethods())
|
||||
expect(new HasMethods)
|
||||
->attributes()->scoped(fn ($attributes) => $attributes
|
||||
->name->toBe('Has Methods')
|
||||
->quantity->toBe(20)
|
||||
@ -100,7 +100,7 @@ it('can use the scoped method to lock into the given level for expectations', fu
|
||||
});
|
||||
|
||||
it('works consistently with the json expectation method', function () {
|
||||
expect(new HasMethods())
|
||||
expect(new HasMethods)
|
||||
->jsonString()->json()->id->toBe(1)
|
||||
->jsonString()->json()->name->toBe('Has Methods')->toBeString()
|
||||
->jsonString()->json()->quantity->toBe(20)->toBeInt();
|
||||
@ -152,6 +152,6 @@ class HasMethods
|
||||
|
||||
public function newInstance()
|
||||
{
|
||||
return new static();
|
||||
return new static;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
<?php
|
||||
|
||||
it('can access methods and properties', function () {
|
||||
expect(new HasMethodsAndProperties())
|
||||
expect(new HasMethodsAndProperties)
|
||||
->name->toEqual('Has Methods and Properties')->not()->toEqual('bar')
|
||||
->multiply(3, 4)->not->toBeString->toEqual(12)
|
||||
->posts->each(function ($post) {
|
||||
@ -19,7 +19,7 @@ it('can access methods and properties', function () {
|
||||
});
|
||||
|
||||
it('can handle nested methods and properties', function () {
|
||||
expect(new HasMethodsAndProperties())
|
||||
expect(new HasMethodsAndProperties)
|
||||
->meta->foo->bar->toBeString()->toEqual('baz')->not->toBeInt
|
||||
->newInstance()->meta->foo->toBeArray()
|
||||
->newInstance()->multiply(2, 2)->toEqual(4)->not->toEqual(5)
|
||||
@ -27,14 +27,14 @@ it('can handle nested methods and properties', function () {
|
||||
});
|
||||
|
||||
it('works with higher order tests')
|
||||
->expect(new HasMethodsAndProperties())
|
||||
->expect(new HasMethodsAndProperties)
|
||||
->meta->foo->bar->toBeString()->toEqual('baz')->not->toBeInt
|
||||
->newInstance()->meta->foo->toBeArray
|
||||
->newInstance()->multiply(2, 2)->toEqual(4)->not->toEqual(5)
|
||||
->newInstance()->books()->toBeArray();
|
||||
|
||||
it('can start a new higher order expectation using the and syntax', function () {
|
||||
expect(new HasMethodsAndProperties())
|
||||
expect(new HasMethodsAndProperties)
|
||||
->toBeInstanceOf(HasMethodsAndProperties::class)
|
||||
->meta->toBeArray
|
||||
->and(['foo' => 'bar'])
|
||||
@ -45,7 +45,7 @@ it('can start a new higher order expectation using the and syntax', function ()
|
||||
});
|
||||
|
||||
it('can start a new higher order expectation using the and syntax in higher order tests')
|
||||
->expect(new HasMethodsAndProperties())
|
||||
->expect(new HasMethodsAndProperties)
|
||||
->toBeInstanceOf(HasMethodsAndProperties::class)
|
||||
->meta->toBeArray
|
||||
->and(['foo' => 'bar'])
|
||||
@ -53,7 +53,7 @@ it('can start a new higher order expectation using the and syntax in higher orde
|
||||
->foo->toEqual('bar');
|
||||
|
||||
it('can start a new higher order expectation using the and syntax without nesting expectations', function () {
|
||||
expect(new HasMethodsAndProperties())
|
||||
expect(new HasMethodsAndProperties)
|
||||
->toBeInstanceOf(HasMethodsAndProperties::class)
|
||||
->meta
|
||||
->sequence(
|
||||
@ -101,6 +101,6 @@ class HasMethodsAndProperties
|
||||
|
||||
public function newInstance()
|
||||
{
|
||||
return new static();
|
||||
return new static;
|
||||
}
|
||||
}
|
||||
|
||||
@ -53,7 +53,7 @@ it('can compose complex expectations', function () {
|
||||
});
|
||||
|
||||
it('works with objects', function () {
|
||||
expect(new HasProperties())
|
||||
expect(new HasProperties)
|
||||
->name->toEqual('foo')->not->toEqual('world')
|
||||
->posts->toHaveCount(2)->each(function ($post) {
|
||||
$post->is_published->toBeTrue();
|
||||
@ -69,13 +69,13 @@ it('works with objects', function () {
|
||||
});
|
||||
|
||||
it('works with nested properties', function () {
|
||||
expect(new HasProperties())
|
||||
expect(new HasProperties)
|
||||
->nested->foo->bar->toBeString()->toEqual('baz')
|
||||
->posts->toBeArray()->toHaveCount(2);
|
||||
});
|
||||
|
||||
it('works with higher order tests')
|
||||
->expect(new HasProperties())
|
||||
->expect(new HasProperties)
|
||||
->nested->foo->bar->toBeString()->toEqual('baz')
|
||||
->posts->toBeArray()->toHaveCount(2);
|
||||
|
||||
|
||||
@ -56,7 +56,7 @@ class State
|
||||
}
|
||||
}
|
||||
|
||||
$state = new State();
|
||||
$state = new State;
|
||||
|
||||
/*
|
||||
* Overrides toBe to assert two Characters are the same
|
||||
|
||||
@ -5,8 +5,8 @@ use PHPUnit\Framework\ExpectationFailedException;
|
||||
expect(true)->toBeTrue()->and(false)->toBeFalse();
|
||||
|
||||
test('strict comparisons', function () {
|
||||
$nuno = new stdClass();
|
||||
$dries = new stdClass();
|
||||
$nuno = new stdClass;
|
||||
$dries = new stdClass;
|
||||
|
||||
expect($nuno)->toBe($nuno)->not->toBe($dries);
|
||||
});
|
||||
|
||||
@ -3,8 +3,7 @@
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
test('pass', function () {
|
||||
expect(function () {
|
||||
})->toBeCallable();
|
||||
expect(function () {})->toBeCallable();
|
||||
expect(null)->not->toBeCallable();
|
||||
});
|
||||
|
||||
|
||||
@ -8,8 +8,8 @@ test('passes', function () {
|
||||
});
|
||||
|
||||
test('passes with DateTime and DateTimeImmutable', function () {
|
||||
$now = new DateTime();
|
||||
$past = (new DateTimeImmutable())->modify('-1 day');
|
||||
$now = new DateTime;
|
||||
$past = (new DateTimeImmutable)->modify('-1 day');
|
||||
|
||||
expect($now)->toBeGreaterThan($past);
|
||||
|
||||
|
||||
@ -8,8 +8,8 @@ test('passes', function () {
|
||||
});
|
||||
|
||||
test('passes with DateTime and DateTimeImmutable', function () {
|
||||
$now = new DateTime();
|
||||
$past = (new DateTimeImmutable())->modify('-1 day');
|
||||
$now = new DateTime;
|
||||
$past = (new DateTimeImmutable)->modify('-1 day');
|
||||
|
||||
expect($now)->toBeGreaterThanOrEqual($now);
|
||||
|
||||
|
||||
@ -3,18 +3,18 @@
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
test('pass', function () {
|
||||
expect(new Exception())->toBeInstanceOf(Exception::class);
|
||||
expect(new Exception())->not->toBeInstanceOf(RuntimeException::class);
|
||||
expect(new Exception)->toBeInstanceOf(Exception::class);
|
||||
expect(new Exception)->not->toBeInstanceOf(RuntimeException::class);
|
||||
});
|
||||
|
||||
test('failures', function () {
|
||||
expect(new Exception())->toBeInstanceOf(RuntimeException::class);
|
||||
expect(new Exception)->toBeInstanceOf(RuntimeException::class);
|
||||
})->throws(ExpectationFailedException::class);
|
||||
|
||||
test('failures with custom message', function () {
|
||||
expect(new Exception())->toBeInstanceOf(RuntimeException::class, 'oh no!');
|
||||
expect(new Exception)->toBeInstanceOf(RuntimeException::class, 'oh no!');
|
||||
})->throws(ExpectationFailedException::class, 'oh no!');
|
||||
|
||||
test('not failures', function () {
|
||||
expect(new Exception())->not->toBeInstanceOf(Exception::class);
|
||||
expect(new Exception)->not->toBeInstanceOf(Exception::class);
|
||||
})->throws(ExpectationFailedException::class);
|
||||
|
||||
@ -8,8 +8,8 @@ test('passes', function () {
|
||||
});
|
||||
|
||||
test('passes with DateTime and DateTimeImmutable', function () {
|
||||
$now = new DateTime();
|
||||
$past = (new DateTimeImmutable())->modify('-1 day');
|
||||
$now = new DateTime;
|
||||
$past = (new DateTimeImmutable)->modify('-1 day');
|
||||
|
||||
expect($past)->toBeLessThan($now);
|
||||
|
||||
|
||||
@ -8,8 +8,8 @@ test('passes', function () {
|
||||
});
|
||||
|
||||
test('passes with DateTime and DateTimeImmutable', function () {
|
||||
$now = new DateTime();
|
||||
$past = (new DateTimeImmutable())->modify('-1 day');
|
||||
$now = new DateTime;
|
||||
$past = (new DateTimeImmutable)->modify('-1 day');
|
||||
|
||||
expect($now)->toBeLessThanOrEqual($now);
|
||||
|
||||
|
||||
21
tests/Features/Expect/toBeList.php
Normal file
21
tests/Features/Expect/toBeList.php
Normal file
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
test('pass', function () {
|
||||
expect([1, 2, 3])->toBeList();
|
||||
expect(['a' => 1, 'b' => 2, 'c' => 3])->not->toBeList();
|
||||
expect('1, 2, 3')->not->toBeList();
|
||||
});
|
||||
|
||||
test('failures', function () {
|
||||
expect(null)->toBeList();
|
||||
})->throws(ExpectationFailedException::class);
|
||||
|
||||
test('failures with custom message', function () {
|
||||
expect(null)->toBeList('oh no!');
|
||||
})->throws(ExpectationFailedException::class, 'oh no!');
|
||||
|
||||
test('not failures', function () {
|
||||
expect(['a', 'b', 'c'])->not->toBeList();
|
||||
})->throws(ExpectationFailedException::class);
|
||||
@ -3,7 +3,7 @@
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
beforeEach(function () {
|
||||
$this->times = [new DateTimeImmutable(), new DateTimeImmutable()];
|
||||
$this->times = [new DateTimeImmutable, new DateTimeImmutable];
|
||||
});
|
||||
|
||||
test('pass', function () {
|
||||
|
||||
@ -4,13 +4,9 @@ use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
$object = new class
|
||||
{
|
||||
public function foo(): void
|
||||
{
|
||||
}
|
||||
public function foo(): void {}
|
||||
|
||||
public function bar(): void
|
||||
{
|
||||
}
|
||||
public function bar(): void {}
|
||||
};
|
||||
|
||||
test('pass', function () use ($object) {
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
test('pass', function () {
|
||||
$object = new stdClass();
|
||||
$object = new stdClass;
|
||||
$object->name = 'John';
|
||||
$object->age = 21;
|
||||
|
||||
@ -16,7 +16,7 @@ test('pass', function () {
|
||||
});
|
||||
|
||||
test('failures', function () {
|
||||
$object = new stdClass();
|
||||
$object = new stdClass;
|
||||
$object->name = 'John';
|
||||
|
||||
expect($object)
|
||||
@ -28,7 +28,7 @@ test('failures', function () {
|
||||
})->throws(ExpectationFailedException::class);
|
||||
|
||||
test('failures with custom message', function () {
|
||||
$object = new stdClass();
|
||||
$object = new stdClass;
|
||||
$object->name = 'John';
|
||||
|
||||
expect($object)
|
||||
@ -40,7 +40,7 @@ test('failures with custom message', function () {
|
||||
})->throws(ExpectationFailedException::class, 'oh no!');
|
||||
|
||||
test('not failures', function () {
|
||||
$object = new stdClass();
|
||||
$object = new stdClass;
|
||||
$object->name = 'John';
|
||||
$object->age = 21;
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
$obj = new stdClass();
|
||||
$obj = new stdClass;
|
||||
$obj->foo = 'bar';
|
||||
$obj->fooNull = null;
|
||||
|
||||
|
||||
@ -4,17 +4,17 @@ use PHPUnit\Framework\Constraint\IsTrue;
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
test('pass', function () {
|
||||
expect(true)->toMatchConstraint(new IsTrue());
|
||||
expect(true)->toMatchConstraint(new IsTrue);
|
||||
});
|
||||
|
||||
test('failures', function () {
|
||||
expect(false)->toMatchConstraint(new IsTrue());
|
||||
expect(false)->toMatchConstraint(new IsTrue);
|
||||
})->throws(ExpectationFailedException::class);
|
||||
|
||||
test('failures with custom message', function () {
|
||||
expect(false)->toMatchConstraint(new IsTrue(), 'oh no!');
|
||||
expect(false)->toMatchConstraint(new IsTrue, 'oh no!');
|
||||
})->throws(ExpectationFailedException::class, 'oh no!');
|
||||
|
||||
test('not failures', function () {
|
||||
expect(true)->not->toMatchConstraint(new IsTrue());
|
||||
expect(true)->not->toMatchConstraint(new IsTrue);
|
||||
})->throws(ExpectationFailedException::class);
|
||||
|
||||
@ -18,7 +18,7 @@ test('pass', function () {
|
||||
});
|
||||
|
||||
test('pass with class', function () {
|
||||
expect(new class()
|
||||
expect(new class
|
||||
{
|
||||
public $name = 'Nuno';
|
||||
|
||||
|
||||
@ -43,9 +43,7 @@ test('pass with `__toString`', function () {
|
||||
|
||||
$object = new class($this->snapshotable)
|
||||
{
|
||||
public function __construct(protected string $snapshotable)
|
||||
{
|
||||
}
|
||||
public function __construct(protected string $snapshotable) {}
|
||||
|
||||
public function __toString()
|
||||
{
|
||||
@ -61,9 +59,7 @@ test('pass with `toString`', function () {
|
||||
|
||||
$object = new class($this->snapshotable)
|
||||
{
|
||||
public function __construct(protected string $snapshotable)
|
||||
{
|
||||
}
|
||||
public function __construct(protected string $snapshotable) {}
|
||||
|
||||
public function toString()
|
||||
{
|
||||
@ -97,9 +93,7 @@ test('pass with `toArray`', function () {
|
||||
|
||||
$object = new class($this->snapshotable)
|
||||
{
|
||||
public function __construct(protected string $snapshotable)
|
||||
{
|
||||
}
|
||||
public function __construct(protected string $snapshotable) {}
|
||||
|
||||
public function toArray()
|
||||
{
|
||||
@ -125,9 +119,7 @@ test('pass with `toSnapshot`', function () {
|
||||
|
||||
$object = new class($this->snapshotable)
|
||||
{
|
||||
public function __construct(protected string $snapshotable)
|
||||
{
|
||||
}
|
||||
public function __construct(protected string $snapshotable) {}
|
||||
|
||||
public function toSnapshot()
|
||||
{
|
||||
|
||||
@ -2,60 +2,52 @@
|
||||
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
class CustomException extends Exception
|
||||
{
|
||||
}
|
||||
class CustomException extends Exception {}
|
||||
|
||||
test('passes', function () {
|
||||
expect(function () {
|
||||
throw new RuntimeException();
|
||||
throw new RuntimeException;
|
||||
})->toThrow(RuntimeException::class);
|
||||
expect(function () {
|
||||
throw new RuntimeException();
|
||||
throw new RuntimeException;
|
||||
})->toThrow(Exception::class);
|
||||
expect(function () {
|
||||
throw new RuntimeException();
|
||||
})->toThrow(function (RuntimeException $e) {
|
||||
});
|
||||
throw new RuntimeException;
|
||||
})->toThrow(function (RuntimeException $e) {});
|
||||
expect(function () {
|
||||
throw new RuntimeException('actual message');
|
||||
})->toThrow(function (Exception $e) {
|
||||
expect($e->getMessage())->toBe('actual message');
|
||||
});
|
||||
expect(function () {
|
||||
})->not->toThrow(Exception::class);
|
||||
expect(function () {})->not->toThrow(Exception::class);
|
||||
expect(function () {
|
||||
throw new RuntimeException('actual message');
|
||||
})->toThrow('actual message');
|
||||
expect(function () {
|
||||
throw new Exception();
|
||||
throw new Exception;
|
||||
})->not->toThrow(RuntimeException::class);
|
||||
expect(function () {
|
||||
throw new RuntimeException('actual message');
|
||||
})->toThrow(RuntimeException::class, 'actual message');
|
||||
expect(function () {
|
||||
throw new RuntimeException('actual message');
|
||||
})->toThrow(function (RuntimeException $e) {
|
||||
}, 'actual message');
|
||||
})->toThrow(function (RuntimeException $e) {}, 'actual message');
|
||||
expect(function () {
|
||||
throw new CustomException('foo');
|
||||
})->toThrow(new CustomException('foo'));
|
||||
});
|
||||
|
||||
test('failures 1', function () {
|
||||
expect(function () {
|
||||
})->toThrow(RuntimeException::class);
|
||||
expect(function () {})->toThrow(RuntimeException::class);
|
||||
})->throws(ExpectationFailedException::class, 'Exception "'.RuntimeException::class.'" not thrown.');
|
||||
|
||||
test('failures 2', function () {
|
||||
expect(function () {
|
||||
})->toThrow(function (RuntimeException $e) {
|
||||
});
|
||||
expect(function () {})->toThrow(function (RuntimeException $e) {});
|
||||
})->throws(ExpectationFailedException::class, 'Exception "'.RuntimeException::class.'" not thrown.');
|
||||
|
||||
test('failures 3', function () {
|
||||
expect(function () {
|
||||
throw new Exception();
|
||||
throw new Exception;
|
||||
})->toThrow(function (RuntimeException $e) {
|
||||
//
|
||||
});
|
||||
@ -77,8 +69,7 @@ test('failures 5', function () {
|
||||
})->throws(ExpectationFailedException::class, 'Failed asserting that \'actual message\' [ASCII](length: 14) contains "expected message" [ASCII](length: 16).');
|
||||
|
||||
test('failures 6', function () {
|
||||
expect(function () {
|
||||
})->toThrow('actual message');
|
||||
expect(function () {})->toThrow('actual message');
|
||||
})->throws(ExpectationFailedException::class, 'Exception with message "actual message" not thrown');
|
||||
|
||||
test('failures 7', function () {
|
||||
@ -101,34 +92,30 @@ test('failures with custom message', function () {
|
||||
|
||||
test('not failures', function () {
|
||||
expect(function () {
|
||||
throw new RuntimeException();
|
||||
throw new RuntimeException;
|
||||
})->not->toThrow(RuntimeException::class);
|
||||
})->throws(ExpectationFailedException::class);
|
||||
|
||||
test('closure missing parameter', function () {
|
||||
expect(function () {
|
||||
})->toThrow(function () {
|
||||
});
|
||||
expect(function () {})->toThrow(function () {});
|
||||
})->throws(InvalidArgumentException::class, 'The given closure must have a single parameter type-hinted as the class string.');
|
||||
|
||||
test('closure missing type-hint', function () {
|
||||
expect(function () {
|
||||
})->toThrow(function ($e) {
|
||||
});
|
||||
expect(function () {})->toThrow(function ($e) {});
|
||||
})->throws(InvalidArgumentException::class, 'The given closure\'s parameter must be type-hinted as the class string.');
|
||||
|
||||
it('can handle a non-defined exception', function () {
|
||||
expect(function () {
|
||||
throw new NonExistingException();
|
||||
throw new NonExistingException;
|
||||
})->toThrow(NonExistingException::class);
|
||||
})->throws(Error::class, 'Class "NonExistingException" not found');
|
||||
|
||||
it('can handle a class not found Error', function () {
|
||||
expect(function () {
|
||||
throw new NonExistingException();
|
||||
throw new NonExistingException;
|
||||
})->toThrow('Class "NonExistingException" not found');
|
||||
|
||||
expect(function () {
|
||||
throw new NonExistingException();
|
||||
throw new NonExistingException;
|
||||
})->toThrow(Error::class, 'Class "NonExistingException" not found');
|
||||
});
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
beforeEach(function () {
|
||||
$this->unlessObject = new stdClass();
|
||||
$this->unlessObject = new stdClass;
|
||||
$this->unlessObject->trueValue = true;
|
||||
$this->unlessObject->foo = 'foo';
|
||||
});
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
beforeEach(function () {
|
||||
$this->whenObject = new stdClass();
|
||||
$this->whenObject = new stdClass;
|
||||
$this->whenObject->trueValue = true;
|
||||
$this->whenObject->foo = 'foo';
|
||||
});
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
$state = new stdClass();
|
||||
$state = new stdClass;
|
||||
$state->text = '';
|
||||
test('uses dataset', function ($value) use ($state) {
|
||||
$state->text .= $value;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
$state = new stdClass();
|
||||
$state = new stdClass;
|
||||
$state->text = '';
|
||||
test('uses dataset', function ($value) use ($state) {
|
||||
$state->text .= $value;
|
||||
|
||||
@ -4,7 +4,7 @@ dataset('numbers.array', [
|
||||
1, 2, 3, 4, 5, 'ScopedDatasets/ScopedDatasets.php',
|
||||
]);
|
||||
|
||||
$state = new stdClass();
|
||||
$state = new stdClass;
|
||||
$state->text = '';
|
||||
test('uses dataset', function ($value) use ($state) {
|
||||
$state->text .= $value;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
$state = new stdClass();
|
||||
$state = new stdClass;
|
||||
$state->text = '';
|
||||
test('uses dataset', function ($value) use ($state) {
|
||||
$state->text .= $value;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
$state = new stdClass();
|
||||
$state = new stdClass;
|
||||
$state->text = '';
|
||||
test('uses dataset', function ($value) use ($state) {
|
||||
$state->text .= $value;
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
use function PHPUnit\Framework\assertFalse;
|
||||
|
||||
$foo = new stdClass();
|
||||
$foo = new stdClass;
|
||||
$foo->beforeAll = false;
|
||||
$foo->beforeEach = false;
|
||||
$foo->afterEach = false;
|
||||
|
||||
@ -6,8 +6,5 @@ namespace Tests\Fixtures\Arch\ToBeInvokable\IsInvokable;
|
||||
|
||||
class InvokableClass
|
||||
{
|
||||
public function __invoke(): void
|
||||
{
|
||||
|
||||
}
|
||||
public function __invoke(): void {}
|
||||
}
|
||||
|
||||
@ -6,8 +6,5 @@ namespace Tests\Fixtures\Arch\ToBeInvokable\IsInvokable;
|
||||
|
||||
class ParentInvokableClass
|
||||
{
|
||||
public function __invoke(): void
|
||||
{
|
||||
|
||||
}
|
||||
public function __invoke(): void {}
|
||||
}
|
||||
|
||||
@ -6,8 +6,5 @@ namespace Tests\Fixtures\Arch\ToBeInvokable\IsNotInvokable;
|
||||
|
||||
class IsNotInvokableClass
|
||||
{
|
||||
public function handle(): void
|
||||
{
|
||||
|
||||
}
|
||||
public function handle(): void {}
|
||||
}
|
||||
|
||||
@ -7,6 +7,4 @@ namespace Tests\Fixtures\Arch\ToHaveAttribute\Attributes;
|
||||
use Attribute;
|
||||
|
||||
#[Attribute()]
|
||||
class AsAttribute
|
||||
{
|
||||
}
|
||||
class AsAttribute {}
|
||||
|
||||
@ -7,6 +7,4 @@ namespace Tests\Fixtures\Arch\ToHaveAttribute\HaveAttribute;
|
||||
use Tests\Fixtures\Arch\ToHaveAttribute\Attributes\AsAttribute;
|
||||
|
||||
#[AsAttribute]
|
||||
class HaveAttributeClass
|
||||
{
|
||||
}
|
||||
class HaveAttributeClass {}
|
||||
|
||||
@ -4,6 +4,4 @@ declare(strict_types=1);
|
||||
|
||||
namespace Tests\Fixtures\Arch\ToHaveAttribute\NotHaveAttribute;
|
||||
|
||||
class NotHaveAttributeClass
|
||||
{
|
||||
}
|
||||
class NotHaveAttributeClass {}
|
||||
|
||||
@ -6,8 +6,5 @@ namespace Tests\Fixtures\Arch\ToHaveConstructor\HasConstructor;
|
||||
|
||||
class HasConstructor
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
|
||||
}
|
||||
public function __construct() {}
|
||||
}
|
||||
|
||||
@ -4,6 +4,4 @@ declare(strict_types=1);
|
||||
|
||||
namespace Tests\Fixtures\Arch\ToHaveConstructor\HasNoConstructor;
|
||||
|
||||
class HasNoConstructor
|
||||
{
|
||||
}
|
||||
class HasNoConstructor {}
|
||||
|
||||
@ -6,8 +6,5 @@ namespace Tests\Fixtures\Arch\ToHaveDestructor\HasDestructor;
|
||||
|
||||
class HasDestructor
|
||||
{
|
||||
public function __destruct()
|
||||
{
|
||||
|
||||
}
|
||||
public function __destruct() {}
|
||||
}
|
||||
|
||||
@ -4,6 +4,4 @@ declare(strict_types=1);
|
||||
|
||||
namespace Tests\Fixtures\Arch\ToHaveDestructor\HasNoDestructor;
|
||||
|
||||
class HasNoDestructor
|
||||
{
|
||||
}
|
||||
class HasNoDestructor {}
|
||||
|
||||
@ -6,8 +6,5 @@ namespace Tests\Fixtures\Arch\ToHaveMethod\HasMethod;
|
||||
|
||||
class HasMethod
|
||||
{
|
||||
public function foo(): void
|
||||
{
|
||||
|
||||
}
|
||||
public function foo(): void {}
|
||||
}
|
||||
|
||||
@ -6,8 +6,5 @@ namespace Tests\Fixtures\Arch\ToHaveMethod\HasMethod;
|
||||
|
||||
trait HasMethodTrait
|
||||
{
|
||||
public function foo(): void
|
||||
{
|
||||
|
||||
}
|
||||
public function foo(): void {}
|
||||
}
|
||||
|
||||
@ -6,8 +6,5 @@ namespace Tests\Fixtures\Arch\ToHaveMethod\HasMethod;
|
||||
|
||||
class ParentHasMethodClass
|
||||
{
|
||||
public function foo(): void
|
||||
{
|
||||
|
||||
}
|
||||
public function foo(): void {}
|
||||
}
|
||||
|
||||
@ -6,8 +6,5 @@ namespace Tests\Fixtures\Arch\ToHaveMethod\HasNoMethod;
|
||||
|
||||
class HasNoMethodClass
|
||||
{
|
||||
public function bar(): void
|
||||
{
|
||||
|
||||
}
|
||||
public function bar(): void {}
|
||||
}
|
||||
|
||||
@ -4,6 +4,4 @@ declare(strict_types=1);
|
||||
|
||||
namespace Tests\Fixtures\Arch\ToHavePrefix\HasNoPrefix;
|
||||
|
||||
class ClassWithout
|
||||
{
|
||||
}
|
||||
class ClassWithout {}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user