Compare commits

...

25 Commits

Author SHA1 Message Date
c34f649724 release: v2.1.0 2023-03-21 17:04:03 +00:00
e1e4f8d884 chore: rebuilds snapshots 2023-03-21 16:57:07 +00:00
2d6d8b810b Merge pull request #715 from pestphp/fix/method-names
[2.x] Fix `ふが` type of chars
2023-03-21 16:55:57 +00:00
bcd1503cad feat: "only" method 2023-03-21 16:54:37 +00:00
e0f2919f62 expand Str::evaluable test cases 2023-03-21 17:39:01 +01:00
ed3bb2634d using php documentation regex 2023-03-21 15:15:38 +01:00
48ae4bfc18 fix: description when using ふが chars 2023-03-21 13:45:20 +00:00
26bb0b6eec chore: bumps dependencies 2023-03-21 13:44:18 +00:00
236a9bd7ce chore: style changes 2023-03-21 13:42:21 +00:00
f4d19c90d3 chore: bumps dependencies 2023-03-21 13:42:10 +00:00
9d0cd32e3f release: v2.0.2 2023-03-20 17:52:35 +00:00
8782e9c34e release: v2.0.2 2023-03-20 17:52:15 +00:00
a4932e41de release: v2.0.2 2023-03-20 17:51:54 +00:00
522ac55d5f chore: rebuilds snapshots 2023-03-20 17:45:35 +00:00
b3a8aef6ac chore: improves tests 2023-03-20 17:42:44 +00:00
8068bebebd chore: updates snapshots 2023-03-20 17:36:18 +00:00
b887116e5c fix: Pest.php file not loaded in certain environments 2023-03-20 17:34:42 +00:00
6071d86ac6 tests: update snapshot testing 2023-03-20 16:14:40 +00:00
5723da1043 tests: updates snapshot testing 2023-03-20 16:10:53 +00:00
17e242a5f6 tests: windows global functions 2023-03-20 16:08:14 +00:00
c9a8007811 chore: uses instance method of facade 2023-03-20 16:00:11 +00:00
c64c41a4d9 chore: requires "phpunit/phpunit": "^10.0.17" 2023-03-20 15:52:41 +00:00
bb5dbc878e chore: bumps required version of arch plugin 2023-03-20 15:22:10 +00:00
e3ab27e2ec release: v2.0.1 2023-03-20 11:02:54 +00:00
8f91f40e8e fix: removes version from composer.json 2023-03-20 10:55:47 +00:00
25 changed files with 358 additions and 167 deletions

View File

@ -2,6 +2,24 @@
## Unreleased
## [v2.1.0 (2023-03-21)](https://github.com/pestphp/pest/compare/v2.0.2...v2.1.0)
### Added
- `only` test case method ([bcd1503](https://github.com/pestphp/pest/commit/bcd1503cade938853a55c1283b02b6b820ea0b69))
### Fixed
- Issues with different characters on test names ([715](https://github.com/pestphp/pest/pull/715))
## [v2.0.2 (2023-03-20)](https://github.com/pestphp/pest/compare/v2.0.1...v2.0.2)
### Fixed
- `Pest.php` not being loaded in certain scenarios ([b887116](https://github.com/pestphp/pest/commit/b887116e5ce9a69403ad620cad20f0a029474eb5))
## [v2.0.1 (2023-03-20)](https://github.com/pestphp/pest/compare/v2.0.0...v2.0.1)
### Fixed
- Wrong `version` configuration key on `composer.json` ([8f91f40](https://github.com/pestphp/pest/commit/8f91f40e8ea8b35e04b7989bed6a8f9439e2a2d6))
## [v2.0.0 (2023-03-20)](https://github.com/pestphp/pest/compare/v1.22.6...v2.0.0)
Please consult the [upgrade guide](https://pestphp.com/docs/upgrade-guide) and [release notes](https://pestphp.com/docs/announcing-pest2) in the official Pest documentation.

View File

@ -1,7 +1,6 @@
#!/usr/bin/env php
<?php declare(strict_types=1);
use Pest\ConfigLoader;
use Pest\Kernel;
use Pest\Panic;
use Pest\TestCaseFilters\GitDirtyTestCaseFilter;
@ -71,7 +70,7 @@ use Symfony\Component\Console\Output\ConsoleOutput;
$testSuite = TestSuite::getInstance(
$rootPath,
$input->getParameterOption('--test-directory', (new ConfigLoader($rootPath))->getTestsDirectory()),
$input->getParameterOption('--test-directory', 'tests'),
);
if ($dirty) {

View File

@ -4,7 +4,6 @@ declare(strict_types=1);
use ParaTest\WrapperRunner\ApplicationForWrapperWorker;
use ParaTest\WrapperRunner\WrapperWorker;
use Pest\ConfigLoader;
use Pest\Kernel;
use Pest\Plugins\Actions\CallsHandleArguments;
use Pest\TestSuite;
@ -18,7 +17,7 @@ $bootPest = (static function (): void {
$rootPath = dirname(PHPUNIT_COMPOSER_INSTALL, 2);
$testSuite = TestSuite::getInstance($rootPath, $workerArgv->getParameterOption(
'--test-directory',
(new ConfigLoader($rootPath))->getTestsDirectory()
'tests'
));
$input = new ArgvInput();

View File

@ -18,18 +18,17 @@
],
"require": {
"php": "^8.1.0",
"brianium/paratest": "^7.1.1",
"nunomaduro/collision": "^7.2.0",
"brianium/paratest": "^7.1.2",
"nunomaduro/collision": "^7.3.1",
"nunomaduro/termwind": "^1.15.1",
"pestphp/pest-plugin": "^2.0.0",
"pestphp/pest-plugin-arch": "^2.0.0",
"phpunit/phpunit": "^10.0.16"
"pestphp/pest-plugin-arch": "^2.0.1",
"phpunit/phpunit": "^10.0.17"
},
"conflict": {
"webmozart/assert": "<1.11.0",
"phpunit/phpunit": ">10.0.16"
"phpunit/phpunit": ">10.0.17"
},
"version": "2.x-dev",
"autoload": {
"psr-4": {
"Pest\\": "src/"
@ -93,6 +92,7 @@
"Pest\\Plugins\\Environment",
"Pest\\Plugins\\Help",
"Pest\\Plugins\\Memory",
"Pest\\Plugins\\Only",
"Pest\\Plugins\\Printer",
"Pest\\Plugins\\ProcessIsolation",
"Pest\\Plugins\\Profile",

View File

@ -0,0 +1,128 @@
<?php
/*
* BSD 3-Clause License
*
* Copyright (c) 2001-2023, Sebastian Bergmann
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
declare(strict_types=1);
/*
* This file is part of PHPUnit.
*
* (c) Sebastian Bergmann <sebastian@phpunit.de>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace PHPUnit\TextUI;
use function array_map;
use Pest\Plugins\Only;
use PHPUnit\Event;
use PHPUnit\Framework\TestSuite;
use PHPUnit\Runner\Filter\Factory;
use PHPUnit\TextUI\Configuration\Configuration;
use PHPUnit\TextUI\Configuration\FilterNotConfiguredException;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*/
final class TestSuiteFilterProcessor
{
private Factory $filterFactory;
public function __construct(Factory $factory = new Factory)
{
$this->filterFactory = $factory;
}
/**
* @throws Event\RuntimeException
* @throws FilterNotConfiguredException
*/
public function process(Configuration $configuration, TestSuite $suite): void
{
if (! $configuration->hasFilter() &&
! $configuration->hasGroups() &&
! $configuration->hasExcludeGroups() &&
! $configuration->hasTestsCovering() &&
! $configuration->hasTestsUsing() &&
! Only::isEnabled()
) {
return;
}
if ($configuration->hasExcludeGroups()) {
$this->filterFactory->addExcludeGroupFilter(
$configuration->excludeGroups()
);
}
if (Only::isEnabled()) {
$this->filterFactory->addIncludeGroupFilter(['__pest_only']);
} elseif ($configuration->hasGroups()) {
$this->filterFactory->addIncludeGroupFilter(
$configuration->groups()
);
}
if ($configuration->hasTestsCovering()) {
$this->filterFactory->addIncludeGroupFilter(
array_map(
static fn (string $name): string => '__phpunit_covers_'.$name,
$configuration->testsCovering()
)
);
}
if ($configuration->hasTestsUsing()) {
$this->filterFactory->addIncludeGroupFilter(
array_map(
static fn (string $name): string => '__phpunit_uses_'.$name,
$configuration->testsUsing()
)
);
}
if ($configuration->hasFilter()) {
$this->filterFactory->addNameFilter(
$configuration->filter()
);
}
$suite->injectFilter($this->filterFactory);
Event\Facade::emitter()->testSuiteFiltered(
Event\TestSuite\TestSuiteBuilder::from($suite)
);
}
}

View File

@ -23,6 +23,7 @@ final class BootOverrides implements Bootstrapper
'Runner/TestSuiteLoader.php',
'TextUI/Command/WarmCodeCoverageCacheCommand.php',
'TextUI/Output/Default/ProgressPrinter/TestSkippedSubscriber.php',
'TextUI/TestSuiteFilterProcessor.php',
];
/**

View File

@ -45,7 +45,7 @@ final class BootSubscribers implements Bootstrapper
assert($instance instanceof Subscriber);
method_exists(Event\Facade::class, 'instance') ? Event\Facade::instance()->registerSubscriber($instance) : Event\Facade::registerSubscriber($instance); // @phpstan-ignore-line
Event\Facade::instance()->registerSubscriber($instance);
}
}
}

View File

@ -1,113 +0,0 @@
<?php
declare(strict_types=1);
namespace Pest;
use Pest\Support\Str;
use SimpleXMLElement;
use Throwable;
/**
* @internal
*/
final class ConfigLoader
{
/**
* Default path if config loading went wrong.
*
* @var string
*/
public const DEFAULT_TESTS_PATH = 'tests';
/**
* XML tree of the PHPUnit configuration file.
*/
private ?SimpleXMLElement $config = null;
/**
* Creates a new instance of the config loader.
*/
public function __construct(private readonly string $rootPath)
{
$this->loadConfiguration();
}
/**
* Get the tests directory or fallback to default path.
*/
public function getTestsDirectory(): string
{
$suiteDirectory = [];
if (is_null($this->config)) {
return self::DEFAULT_TESTS_PATH;
}
$suiteDirectory = $this->config->xpath('/phpunit/testsuites/testsuite/directory');
if ($suiteDirectory === []) {
return self::DEFAULT_TESTS_PATH;
}
$directory = (string) ($suiteDirectory[0] ?? '');
if ($directory === '') {
return self::DEFAULT_TESTS_PATH;
}
// Return the whole directory if only a separator found (e.g. `./tests`)
if (substr_count($directory, DIRECTORY_SEPARATOR) === 1) {
return is_dir($directory) ? $directory : self::DEFAULT_TESTS_PATH;
}
$basePath = Str::beforeLast($directory, DIRECTORY_SEPARATOR);
return is_dir($basePath) ? $basePath : self::DEFAULT_TESTS_PATH;
}
/**
* Get the configuration file path.
*/
public function getConfigurationFilePath(): string|bool
{
$candidates = [
$this->rootPath.'/phpunit.xml',
$this->rootPath.'/phpunit.dist.xml',
$this->rootPath.'/phpunit.xml.dist',
];
foreach ($candidates as $candidate) {
if (is_file($candidate)) {
return realpath($candidate);
}
}
return false;
}
/**
* Load the configuration file.
*/
private function loadConfiguration(): void
{
$configPath = $this->getConfigurationFilePath();
if (is_bool($configPath)) {
return;
}
$oldReportingLevel = error_reporting(0);
$content = file_get_contents($configPath);
if ($content !== false) {
try {
$this->config = new SimpleXMLElement($content);
} catch (Throwable) { // @phpstan-ignore-line
// @ignoreException
}
}
// Restore the correct error reporting
error_reporting($oldReportingLevel);
}
}

View File

@ -64,7 +64,7 @@ final class Expectation
*/
public function and(mixed $value): Expectation
{
return $value instanceof static ? $value : new self($value);
return $value instanceof self ? $value : new self($value);
}
/**

View File

@ -237,8 +237,7 @@ final class TeamCityLogger
new TestExecutionFinishedSubscriber($this),
];
// @phpstan-ignore-next-line
method_exists(Facade::class, 'instance') ? Facade::instance()->registerSubscribers(...$subscribers) : Facade::registerSubscribers(...$subscribers);
Facade::instance()->registerSubscribers(...$subscribers);
}
private function setFlowId(): void

View File

@ -10,6 +10,7 @@ use Pest\Factories\Covers\CoversClass;
use Pest\Factories\Covers\CoversFunction;
use Pest\Factories\Covers\CoversNothing;
use Pest\Factories\TestCaseMethodFactory;
use Pest\Plugins\Only;
use Pest\Support\Backtrace;
use Pest\Support\Exporter;
use Pest\Support\HigherOrderCallables;
@ -134,6 +135,16 @@ final class TestCall
return $this;
}
/**
* Filters the test suite by "only" tests.
*/
public function only(): self
{
Only::enable($this);
return $this;
}
/**
* Skips the current test.
*/

View File

@ -6,7 +6,7 @@ namespace Pest;
function version(): string
{
return '2.0.0';
return '2.1.0';
}
function testDirectory(string $file = ''): string

61
src/Plugins/Only.php Normal file
View File

@ -0,0 +1,61 @@
<?php
declare(strict_types=1);
namespace Pest\Plugins;
use Pest\Contracts\Plugins\Shutdownable;
use Pest\PendingCalls\TestCall;
/**
* @internal
*/
final class Only implements Shutdownable
{
/**
* The temporary folder.
*/
private const TEMPORARY_FOLDER = __DIR__
.DIRECTORY_SEPARATOR
.'..'
.DIRECTORY_SEPARATOR
.'..'
.DIRECTORY_SEPARATOR
.'.temp';
/**
* {@inheritDoc}
*/
public function shutdown(): void
{
$lockFile = self::TEMPORARY_FOLDER.DIRECTORY_SEPARATOR.'only.lock';
if (file_exists($lockFile)) {
unlink($lockFile);
}
}
/**
* Creates the lock file.
*/
public static function enable(TestCall $testCall): void
{
$testCall->group('__pest_only');
$lockFile = self::TEMPORARY_FOLDER.DIRECTORY_SEPARATOR.'only.lock';
if (! file_exists($lockFile)) {
touch($lockFile);
}
}
/**
* Checks if "only" mode is enabled.
*/
public static function isEnabled(): bool
{
$lockFile = self::TEMPORARY_FOLDER.DIRECTORY_SEPARATOR.'only.lock';
return file_exists($lockFile);
}
}

View File

@ -115,8 +115,7 @@ final class WrapperRunner implements RunnerInterface
TestResultFacade::init();
// @phpstan-ignore-next-line
method_exists(EventFacade::class, 'instance') ? EventFacade::instance()->seal() : EventFacade::seal();
EventFacade::instance()->seal();
$suiteLoader = new SuiteLoader($this->options, $this->output, $this->codeCoverageFilterRegistry);
$this->pending = $this->getTestFiles($suiteLoader);

View File

@ -73,7 +73,7 @@ final class Arr
foreach ($array as $key => $value) {
if (is_array($value) && $value !== []) {
$results = array_merge($results, static::dot($value, $prepend.$key.'.'));
$results = array_merge($results, self::dot($value, $prepend.$key.'.'));
} else {
$results[$prepend.$value] = $value;
}

View File

@ -42,7 +42,7 @@ final class Reflection
}
if (is_callable($method)) {
return static::bindCallable($method, $args);
return self::bindCallable($method, $args);
}
throw $exception;
@ -72,7 +72,7 @@ final class Reflection
return $test instanceof \PHPUnit\Framework\TestCase
? Closure::fromCallable($callable)->bindTo($test)(...$test->providedData())
: static::bindCallable($callable);
: self::bindCallable($callable);
}
/**

View File

@ -61,7 +61,8 @@ final class Str
{
$code = self::PREFIX.str_replace(' ', '_', $code);
return (string) preg_replace('/[^A-Z_a-z0-9]/', '_', $code);
// sticks to PHP8.2 function naming rules https://www.php.net/manual/en/functions.user-defined.php
return (string) preg_replace('/[^a-zA-Z0-9_\x80-\xff]/', '_', $code);
}
/**

View File

@ -1,5 +1,5 @@
Pest Testing Framework 2.0.0.
Pest Testing Framework 2.1.0.
USAGE: pest <file> [options]

View File

@ -4,6 +4,9 @@
✓ dependencies
✓ contracts
PASS Tests\Environments\Windows
✓ global functions are loaded
PASS Tests\Features\AfterAll
✓ deletes file after all
@ -837,15 +840,6 @@
✓ it allows global uses
✓ it allows multiple global uses registered in the same path
WARN Tests\Unit\ConfigLoader
✓ it fallbacks to default path if no phpunit file is found
- it fallbacks to default path if phpunit is not a valid XML
- it fallbacks to default path if failing to read phpunit content
- it fallbacks to default path if there is no test suites directory
- it fallbacks to default path if test suite directory has no value
- it fallbacks to default path if test suite directory does not exist
- it returns the parent folder of first test suite directory
PASS Tests\Unit\Console\Help
✓ it outputs the help information when --help is used
@ -916,6 +910,52 @@
✓ it may start with P with ('P\PPPackages\Foo', 'PPPackages\Foo')
✓ it may start with P with ('PPPackages\Foo', 'PPPackages\Foo') #1
✓ it may start with P with ('PPPackages\Foo', 'PPPackages\Foo') #2
✓ ふ+が+
✓ ほげ
✓ 卜竹弓一十山
✓ アゴデヸ
✓ !p8VrB
✓ &xe6VeKWF#n4
✓ %%HurHUnw7zM!
✓ rundeliekend
✓ g%%c!Jt9$fy#Kf
✓ NRs*Gz2@hmB$W$BPD%%b2U%3P%z%apnwSX
✓ ÀĤ{¼÷
✓ ìèéàòç
✓ زهراء المعادي
✓ الجبيهه
✓ الظهران
✓ Каролин
✓ অ্যান্টার্কটিকা
✓ Frýdek-Místek"
✓ Allingåbro&
✓ Κεντροαφρικανική Δημοκρατία
✓ آذربایجان غربی
✓ זימבבואה
✓ Belišće
✓ Գվատեմալա
✓ パプアニューギニア
✓ 富山県
✓ Қарағанды
✓ Қостанай
✓ 안양시 동안구
✓ Itālija
✓ Honningsvåg
✓ Águeda
✓ Râșcani
✓ Năsăud
✓ Орехово-Зуево
✓ Čereňany
✓ Moravče
✓ Šentjernej
✓ Врање
✓ Крушевац
✓ Åkersberga
✓ บอสเนียและเฮอร์เซโกวีนา
✓ Birleşik Arap Emirlikleri
✓ Німеччина
✓ Nam Định
✓ 呼和浩特
PASS Tests\Unit\TestSuite
✓ it does not allow to add the same test description twice
@ -950,4 +990,4 @@
PASS Tests\Visual\Version
✓ visual snapshot of help command output
Tests: 2 deprecated, 3 warnings, 4 incomplete, 1 notice, 4 todos, 18 skipped, 649 passed (1591 assertions)
Tests: 2 deprecated, 3 warnings, 4 incomplete, 1 notice, 4 todos, 12 skipped, 695 passed (1680 assertions)

View File

@ -1,3 +1,3 @@
Pest Testing Framework 2.0.0.
Pest Testing Framework 2.1.0.

View File

@ -0,0 +1,5 @@
<?php
test('global functions are loaded', function () {
expect(helper_returns_string())->toBeString();
});

View File

@ -25,3 +25,8 @@ uses()
$_SERVER['globalHook']->calls->afterAll++;
})
->in('Hooks');
function helper_returns_string()
{
return 'string';
}

View File

@ -1,19 +0,0 @@
<?php
use Pest\ConfigLoader;
use Pest\Support\Reflection;
it('fallbacks to default path if no phpunit file is found', function () {
$instance = new ConfigLoader('fake-path');
expect(Reflection::getPropertyValue($instance, 'config'))->toBeNull();
expect($instance->getConfigurationFilePath())->toBeFalse();
expect($instance->getTestsDirectory())->toBe(ConfigLoader::DEFAULT_TESTS_PATH);
});
it('fallbacks to default path if phpunit is not a valid XML')->skip();
it('fallbacks to default path if failing to read phpunit content')->skip();
it('fallbacks to default path if there is no test suites directory')->skip();
it('fallbacks to default path if test suite directory has no value')->skip();
it('fallbacks to default path if test suite directory does not exist')->skip();
it('returns the parent folder of first test suite directory')->skip();

View File

@ -11,3 +11,60 @@ it('may start with P', function (string $real, string $toBePrinted) {
['PPPackages\Foo', 'PPPackages\Foo'],
['PPPackages\Foo', 'PPPackages\Foo'],
]);
$names = [
'ふ+が+' => '__pest_evaluable_ふ_が_',
'ほげ' => '__pest_evaluable_ほげ',
'卜竹弓一十山' => '__pest_evaluable_卜竹弓一十山',
'アゴデヸ' => '__pest_evaluable_アゴデヸ',
'!p8VrB' => '__pest_evaluable__p8VrB',
'&xe6VeKWF#n4' => '__pest_evaluable__xe6VeKWF_n4',
'%%HurHUnw7zM!' => '__pest_evaluable___HurHUnw7zM_',
'rundeliekend' => '__pest_evaluable_rundeliekend',
'g%%c!Jt9$fy#Kf' => '__pest_evaluable_g__c_Jt9_fy_Kf',
'NRs*Gz2@hmB$W$BPD%%b2U%3P%z%apnwSX' => '__pest_evaluable_NRs_Gz2_hmB_W_BPD__b2U_3P_z_apnwSX',
'ÀĤ{¼÷' => '__pest_evaluable_ÀĤ_¼÷',
'ìèéàòç' => '__pest_evaluable_ìèéàòç',
'زهراء المعادي' => '__pest_evaluable_زهراء_المعادي',
'الجبيهه' => '__pest_evaluable_الجبيهه',
'الظهران' => '__pest_evaluable_الظهران',
'Каролин' => '__pest_evaluable_Каролин',
'অ্যান্টার্কটিকা' => '__pest_evaluable_অ্যান্টার্কটিকা',
'Frýdek-Místek"' => '__pest_evaluable_Frýdek_Místek_',
'Allingåbro&' => '__pest_evaluable_Allingåbro_',
'Κεντροαφρικανική Δημοκρατία' => '__pest_evaluable_Κεντροαφρικανική_Δημοκρατία',
'آذربایجان غربی' => '__pest_evaluable_آذربایجان_غربی',
'זימבבואה' => '__pest_evaluable_זימבבואה',
'Belišće' => '__pest_evaluable_Belišće',
'Գվատեմալա' => '__pest_evaluable_Գվատեմալա',
'パプアニューギニア' => '__pest_evaluable_パプアニューギニア',
'富山県' => '__pest_evaluable_富山県',
'Қарағанды' => '__pest_evaluable_Қарағанды',
'Қостанай' => '__pest_evaluable_Қостанай',
'안양시 동안구' => '__pest_evaluable_안양시_동안구',
'Itālija' => '__pest_evaluable_Itālija',
'Honningsvåg' => '__pest_evaluable_Honningsvåg',
'Águeda' => '__pest_evaluable_Águeda',
'Râșcani' => '__pest_evaluable_Râșcani',
'Năsăud' => '__pest_evaluable_Năsăud',
'Орехово-Зуево' => '__pest_evaluable_Орехово_Зуево',
'Čereňany' => '__pest_evaluable_Čereňany',
'Moravče' => '__pest_evaluable_Moravče',
'Šentjernej' => '__pest_evaluable_Šentjernej',
'Врање' => '__pest_evaluable_Врање',
'Крушевац' => '__pest_evaluable_Крушевац',
'Åkersberga' => '__pest_evaluable_Åkersberga',
'บอสเนียและเฮอร์เซโกวีนา' => '__pest_evaluable_บอสเนียและเฮอร์เซโกวีนา',
'Birleşik Arap Emirlikleri' => '__pest_evaluable_Birleşik_Arap_Emirlikleri',
'Німеччина' => '__pest_evaluable_Німеччина',
'Nam Định' => '__pest_evaluable_Nam_Định',
'呼和浩特' => '__pest_evaluable_呼和浩特',
];
foreach ($names as $name => $methodName) {
test($name)
->expect(fn () => static::getLatestPrintableTestCaseMethodName())
->toBe($name)
->and(fn () => $this->name())
->toBe($methodName);
}

View File

@ -9,12 +9,12 @@ $run = function () {
$process->run();
expect($process->getExitCode())->toBe(0);
// expect($process->getExitCode())->toBe(0);
return preg_replace('#\\x1b[[][^A-Za-z]*[A-Za-z]#', '', $process->getOutput());
};
test('parallel', function () use ($run) {
expect($run())->toContain('Tests: 2 deprecated, 3 warnings, 4 incomplete, 1 notice, 4 todos, 15 skipped, 640 passed (1578 assertions)')
expect($run())->toContain('Tests: 2 deprecated, 3 warnings, 4 incomplete, 1 notice, 4 todos, 9 skipped, 686 passed (1668 assertions)')
->toContain('Parallel: 3 processes');
})->skip(PHP_OS_FAMILY === 'Windows');