mirror of
https://github.com/pestphp/pest.git
synced 2026-03-07 16:27:23 +01:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| df2212055b | |||
| b1a137c513 | |||
| 62267dfd3e | |||
| f996a48dfa | |||
| 54e00dd4dc | |||
| f1414a0beb | |||
| 47f2ae32c1 | |||
| 306b7eb2a6 | |||
| 02f72aabb2 | |||
| e3a21384e6 | |||
| 331381eed5 | |||
| 75a7d77a80 | |||
| cc242a50d1 | |||
| 704acbf6de | |||
| 7baa48e068 | |||
| b00bc4d5ea | |||
| 8abc0d1920 | |||
| ea967b439f |
12
CHANGELOG.md
12
CHANGELOG.md
@ -2,6 +2,18 @@
|
||||
|
||||
## Unreleased
|
||||
|
||||
## [v2.13.0 (2023-08-09)](https://github.com/pestphp/pest/compare/v2.12.2...v2.13.0)
|
||||
|
||||
### Added
|
||||
|
||||
- `expect()->ddWhen` and `expect()->ddUnless` ([306b7eb](https://github.com/pestphp/pest/commit/306b7eb2a6a57e570d58228b46501ad9ba4062b4))
|
||||
|
||||
## [v2.12.2 (2023-08-07)](https://github.com/pestphp/pest/compare/v2.12.0...v2.12.2)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Running tests from `uses` parent class ([#898](https://github.com/pestphp/pest/pull/898))
|
||||
|
||||
## [v2.12.0 (2023-08-02)](https://github.com/pestphp/pest/compare/v2.11.0...v2.12.0)
|
||||
|
||||
### Added
|
||||
|
||||
@ -18,8 +18,8 @@
|
||||
],
|
||||
"require": {
|
||||
"php": "^8.1.0",
|
||||
"brianium/paratest": "^7.2.4",
|
||||
"nunomaduro/collision": "^7.8.0",
|
||||
"brianium/paratest": "^7.2.5",
|
||||
"nunomaduro/collision": "^7.8.1",
|
||||
"nunomaduro/termwind": "^1.15.1",
|
||||
"pestphp/pest-plugin": "^2.0.1",
|
||||
"pestphp/pest-plugin-arch": "^2.2.3",
|
||||
|
||||
@ -60,6 +60,11 @@ final class TestSuiteLoader
|
||||
*/
|
||||
private static array $loadedClasses = [];
|
||||
|
||||
/**
|
||||
* @psalm-var array<string, array<class-string>>
|
||||
*/
|
||||
private static array $loadedClassesByFilename = [];
|
||||
|
||||
/**
|
||||
* @psalm-var list<class-string>
|
||||
*/
|
||||
@ -97,6 +102,17 @@ final class TestSuiteLoader
|
||||
|
||||
self::$loadedClasses = array_merge($loadedClasses, self::$loadedClasses);
|
||||
|
||||
foreach ($loadedClasses as $loadedClass) {
|
||||
$reflection = new ReflectionClass($loadedClass);
|
||||
$filename = $reflection->getFileName();
|
||||
self::$loadedClassesByFilename[$filename] = [
|
||||
$loadedClass,
|
||||
...self::$loadedClassesByFilename[$filename] ?? [],
|
||||
];
|
||||
}
|
||||
|
||||
$loadedClasses = array_merge(self::$loadedClassesByFilename[$suiteClassFile] ?? [], $loadedClasses);
|
||||
|
||||
if (empty($loadedClasses)) {
|
||||
return $this->exceptionFor($suiteClassName, $suiteClassFile);
|
||||
}
|
||||
|
||||
@ -127,6 +127,40 @@ final class Expectation
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump the expectation value when the result of the condition is truthy.
|
||||
*
|
||||
* @param (\Closure(TValue): bool)|bool $condition
|
||||
* @return self<TValue>
|
||||
*/
|
||||
public function ddWhen(Closure|bool $condition, mixed ...$arguments): Expectation
|
||||
{
|
||||
$condition = $condition instanceof Closure ? $condition($this->value) : $condition;
|
||||
|
||||
if (! $condition) {
|
||||
return $this;
|
||||
}
|
||||
|
||||
$this->dd(...$arguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump the expectation value when the result of the condition is falsy.
|
||||
*
|
||||
* @param (\Closure(TValue): bool)|bool $condition
|
||||
* @return self<TValue>
|
||||
*/
|
||||
public function ddUnless(Closure|bool $condition, mixed ...$arguments): Expectation
|
||||
{
|
||||
$condition = $condition instanceof Closure ? $condition($this->value) : $condition;
|
||||
|
||||
if ($condition) {
|
||||
return $this;
|
||||
}
|
||||
|
||||
$this->dd(...$arguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send the expectation value to Ray along with all given arguments.
|
||||
*
|
||||
|
||||
@ -961,4 +961,52 @@ final class Expectation
|
||||
|
||||
return $this->exporter->shortenedExport($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts that the value is uppercase.
|
||||
*
|
||||
* @return self<TValue>
|
||||
*/
|
||||
public function toBeUppercase(string $message = ''): self
|
||||
{
|
||||
Assert::assertTrue(ctype_upper((string) $this->value), $message);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts that the value is lowercase.
|
||||
*
|
||||
* @return self<TValue>
|
||||
*/
|
||||
public function toBeLowercase(string $message = ''): self
|
||||
{
|
||||
Assert::assertTrue(ctype_lower((string) $this->value), $message);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts that the value is alphanumeric.
|
||||
*
|
||||
* @return self<TValue>
|
||||
*/
|
||||
public function toBeAlphaNumeric(string $message = ''): self
|
||||
{
|
||||
Assert::assertTrue(ctype_alnum((string) $this->value), $message);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts that the value is alpha.
|
||||
*
|
||||
* @return self<TValue>
|
||||
*/
|
||||
public function toBeAlpha(string $message = ''): self
|
||||
{
|
||||
Assert::assertTrue(ctype_alpha((string) $this->value), $message);
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
||||
@ -6,7 +6,7 @@ namespace Pest;
|
||||
|
||||
function version(): string
|
||||
{
|
||||
return '2.12.0';
|
||||
return '2.14.0';
|
||||
}
|
||||
|
||||
function testDirectory(string $file = ''): string
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
|
||||
Pest Testing Framework 2.12.0.
|
||||
Pest Testing Framework 2.14.0.
|
||||
|
||||
USAGE: pest <file> [options]
|
||||
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
|
||||
Pest Testing Framework 2.12.0.
|
||||
Pest Testing Framework 2.14.0.
|
||||
|
||||
|
||||
@ -308,6 +308,18 @@
|
||||
✓ strict comparisons
|
||||
✓ failures
|
||||
✓ failures with custom message
|
||||
✓ not failures
|
||||
|
||||
PASS Tests\Features\Expect\toBeAlpha
|
||||
✓ pass
|
||||
✓ failures
|
||||
✓ failures with custom message
|
||||
✓ not failures
|
||||
|
||||
PASS Tests\Features\Expect\toBeAlphaNumeric
|
||||
✓ pass
|
||||
✓ failures
|
||||
✓ failures with custom message
|
||||
✓ not failures
|
||||
|
||||
PASS Tests\Features\Expect\toBeArray
|
||||
@ -443,6 +455,12 @@
|
||||
✓ passes with DateTime and DateTimeImmutable
|
||||
✓ failures
|
||||
✓ failures with custom message
|
||||
✓ not failures
|
||||
|
||||
PASS Tests\Features\Expect\toBeLowercase
|
||||
✓ pass
|
||||
✓ failures
|
||||
✓ failures with custom message
|
||||
✓ not failures
|
||||
|
||||
PASS Tests\Features\Expect\toBeNAN
|
||||
@ -518,6 +536,12 @@
|
||||
✓ passes as not truthy with ('0')
|
||||
✓ failures
|
||||
✓ failures with custom message
|
||||
✓ not failures
|
||||
|
||||
PASS Tests\Features\Expect\toBeUppercase
|
||||
✓ pass
|
||||
✓ failures
|
||||
✓ failures with custom message
|
||||
✓ not failures
|
||||
|
||||
PASS Tests\Features\Expect\toBeWritableDirectory
|
||||
@ -1015,9 +1039,15 @@
|
||||
PASS Tests\PHPUnit\CustomAffixes\snakecasespec
|
||||
✓ it runs file names like snake_case_spec.php
|
||||
|
||||
PASS Tests\CustomTestCase\ChildTest
|
||||
✓ override method
|
||||
|
||||
PASS Tests\CustomTestCase\ExecutedTest
|
||||
✓ that gets executed
|
||||
|
||||
PASS Tests\CustomTestCase\ParentTest
|
||||
✓ override method
|
||||
|
||||
PASS Tests\PHPUnit\CustomTestCase\UsesPerDirectory
|
||||
✓ closure was bound to CustomTestCase
|
||||
|
||||
@ -1210,4 +1240,4 @@
|
||||
WARN Tests\Visual\Version
|
||||
- visual snapshot of help command output
|
||||
|
||||
Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 19 skipped, 860 passed (1975 assertions)
|
||||
Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 19 skipped, 878 passed (2013 assertions)
|
||||
@ -19,7 +19,13 @@
|
||||
↓ something todo later chained
|
||||
↓ something todo later chained and with function body
|
||||
|
||||
PASS Tests\CustomTestCase\ChildTest
|
||||
✓ override method
|
||||
|
||||
PASS Tests\CustomTestCase\ExecutedTest
|
||||
✓ that gets executed
|
||||
|
||||
Tests: 13 todos, 1 passed (1 assertions)
|
||||
PASS Tests\CustomTestCase\ParentTest
|
||||
✓ override method
|
||||
|
||||
Tests: 13 todos, 3 passed (3 assertions)
|
||||
|
||||
20
tests/Features/Expect/toBeAlpha.php
Normal file
20
tests/Features/Expect/toBeAlpha.php
Normal file
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
test('pass', function () {
|
||||
expect('abc')->toBeAlpha();
|
||||
expect('123')->not->toBeAlpha();
|
||||
});
|
||||
|
||||
test('failures', function () {
|
||||
expect('123')->toBeAlpha();
|
||||
})->throws(ExpectationFailedException::class);
|
||||
|
||||
test('failures with custom message', function () {
|
||||
expect('123')->toBeAlpha('oh no!');
|
||||
})->throws(ExpectationFailedException::class, 'oh no!');
|
||||
|
||||
test('not failures', function () {
|
||||
expect('abc')->not->toBeAlpha();
|
||||
})->throws(ExpectationFailedException::class);
|
||||
20
tests/Features/Expect/toBeAlphaNumeric.php
Normal file
20
tests/Features/Expect/toBeAlphaNumeric.php
Normal file
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
test('pass', function () {
|
||||
expect('abc123')->toBeAlphaNumeric();
|
||||
expect('-')->not->toBeAlphaNumeric();
|
||||
});
|
||||
|
||||
test('failures', function () {
|
||||
expect('-')->toBeAlphaNumeric();
|
||||
})->throws(ExpectationFailedException::class);
|
||||
|
||||
test('failures with custom message', function () {
|
||||
expect('-')->toBeAlphaNumeric('oh no!');
|
||||
})->throws(ExpectationFailedException::class, 'oh no!');
|
||||
|
||||
test('not failures', function () {
|
||||
expect('abc123')->not->toBeAlphaNumeric();
|
||||
})->throws(ExpectationFailedException::class);
|
||||
20
tests/Features/Expect/toBeLowercase.php
Normal file
20
tests/Features/Expect/toBeLowercase.php
Normal file
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
test('pass', function () {
|
||||
expect('lowercase')->toBeLowercase();
|
||||
expect('UPPERCASE')->not->toBeLowercase();
|
||||
});
|
||||
|
||||
test('failures', function () {
|
||||
expect('UPPERCASE')->toBeLowercase();
|
||||
})->throws(ExpectationFailedException::class);
|
||||
|
||||
test('failures with custom message', function () {
|
||||
expect('UPPERCASE')->toBeLowercase('oh no!');
|
||||
})->throws(ExpectationFailedException::class, 'oh no!');
|
||||
|
||||
test('not failures', function () {
|
||||
expect('lowercase')->not->toBeLowercase();
|
||||
})->throws(ExpectationFailedException::class);
|
||||
20
tests/Features/Expect/toBeUppercase.php
Normal file
20
tests/Features/Expect/toBeUppercase.php
Normal file
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
use PHPUnit\Framework\ExpectationFailedException;
|
||||
|
||||
test('pass', function () {
|
||||
expect('UPPERCASE')->toBeUppercase();
|
||||
expect('lowercase')->not->toBeUppercase();
|
||||
});
|
||||
|
||||
test('failures', function () {
|
||||
expect('lowercase')->toBeUppercase();
|
||||
})->throws(ExpectationFailedException::class);
|
||||
|
||||
test('failures with custom message', function () {
|
||||
expect('lowercase')->toBeUppercase('oh no!');
|
||||
})->throws(ExpectationFailedException::class, 'oh no!');
|
||||
|
||||
test('not failures', function () {
|
||||
expect('UPPERCASE')->not->toBeUppercase();
|
||||
})->throws(ExpectationFailedException::class);
|
||||
13
tests/PHPUnit/CustomTestCase/ChildTest.php
Normal file
13
tests/PHPUnit/CustomTestCase/ChildTest.php
Normal file
@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests\CustomTestCase;
|
||||
|
||||
class ChildTest extends ParentTest
|
||||
{
|
||||
private function getEntity(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
22
tests/PHPUnit/CustomTestCase/ParentTest.php
Normal file
22
tests/PHPUnit/CustomTestCase/ParentTest.php
Normal file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests\CustomTestCase;
|
||||
|
||||
use function PHPUnit\Framework\assertTrue;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class ParentTest extends TestCase
|
||||
{
|
||||
private function getEntity(): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function testOverrideMethod(): void
|
||||
{
|
||||
assertTrue($this->getEntity() || true);
|
||||
}
|
||||
}
|
||||
@ -16,7 +16,7 @@ $run = function () {
|
||||
|
||||
test('parallel', function () use ($run) {
|
||||
expect($run('--exclude-group=integration'))
|
||||
->toContain('Tests: 1 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 15 skipped, 849 passed (1960 assertions)')
|
||||
->toContain('Tests: 1 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 15 skipped, 867 passed (1998 assertions)')
|
||||
->toContain('Parallel: 3 processes');
|
||||
})->skipOnWindows();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user