feat: only registers globals if necessary

This commit is contained in:
Nuno Maduro
2022-12-04 16:32:45 +00:00
parent 7ffc5602b4
commit 3324455e0a
2 changed files with 145 additions and 141 deletions

View File

@ -11,6 +11,8 @@ use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\OutputInterface;
(static function () { (static function () {
$_SERVER['__PEST__'] = true;
// Ensures Collision's Printer is registered. // Ensures Collision's Printer is registered.
$_SERVER['COLLISION_PRINTER'] = 'DefaultPrinter'; $_SERVER['COLLISION_PRINTER'] = 'DefaultPrinter';

View File

@ -14,149 +14,151 @@ use Pest\Support\HigherOrderTapProxy;
use Pest\TestSuite; use Pest\TestSuite;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
if (! function_exists('expect')) { if (array_key_exists('__PEST__', $_SERVER)) {
/** if (! function_exists('expect')) {
* Creates a new expectation. /**
* * Creates a new expectation.
* @template TValue *
* * @template TValue
* @param TValue|null $value *
* @return Expectation<TValue|null> * @param TValue|null $value
*/ * @return Expectation<TValue|null>
function expect(mixed $value = null): Expectation */
{ function expect(mixed $value = null): Expectation
return new Expectation($value); {
} return new Expectation($value);
}
if (! function_exists('beforeAll')) {
/**
* Runs the given closure before all tests in the current file.
*/
function beforeAll(Closure $closure): void
{
TestSuite::getInstance()->beforeAll->set($closure);
}
}
if (! function_exists('beforeEach')) {
/**
* Runs the given closure before each test in the current file.
*
* @return BeforeEachCall|TestCase|mixed
*/
function beforeEach(Closure $closure = null): BeforeEachCall
{
$filename = Backtrace::file();
return new BeforeEachCall(TestSuite::getInstance(), $filename, $closure);
}
}
if (! function_exists('dataset')) {
/**
* Registers the given dataset.
*
* @param Closure|iterable<int|string, mixed> $dataset
*/
function dataset(string $name, Closure|iterable $dataset): void
{
$scope = DatasetInfo::scope(Backtrace::datasetsFile());
DatasetsRepository::set($name, $dataset, $scope);
}
}
if (! function_exists('uses')) {
/**
* The uses function binds the given
* arguments to test closures.
*
* @param class-string ...$classAndTraits
*/
function uses(string ...$classAndTraits): UsesCall
{
$filename = Backtrace::file();
return new UsesCall($filename, array_values($classAndTraits));
}
}
if (! function_exists('test')) {
/**
* Adds the given closure as a test. The first argument
* is the test description; the second argument is
* a closure that contains the test expectations.
*
* @return TestCall|TestCase|mixed
*/
function test(string $description = null, Closure $closure = null)
{
if ($description === null && TestSuite::getInstance()->test !== null) {
return new HigherOrderTapProxy(TestSuite::getInstance()->test);
} }
}
$filename = Backtrace::testFile(); if (! function_exists('beforeAll')) {
/**
* Runs the given closure before all tests in the current file.
*/
function beforeAll(Closure $closure): void
{
TestSuite::getInstance()->beforeAll->set($closure);
}
}
return new TestCall(TestSuite::getInstance(), $filename, $description, $closure); if (! function_exists('beforeEach')) {
} /**
} * Runs the given closure before each test in the current file.
*
if (! function_exists('it')) { * @return BeforeEachCall|TestCase|mixed
/** */
* Adds the given closure as a test. The first argument function beforeEach(Closure $closure = null): BeforeEachCall
* is the test description; the second argument is {
* a closure that contains the test expectations. $filename = Backtrace::file();
*
* @return TestCall|TestCase|mixed return new BeforeEachCall(TestSuite::getInstance(), $filename, $closure);
*/ }
function it(string $description, Closure $closure = null): TestCall }
{
$description = sprintf('it %s', $description); if (! function_exists('dataset')) {
/**
/** @var TestCall $test */ * Registers the given dataset.
$test = test($description, $closure); *
* @param Closure|iterable<int|string, mixed> $dataset
return $test; */
} function dataset(string $name, Closure|iterable $dataset): void
} {
$scope = DatasetInfo::scope(Backtrace::datasetsFile());
if (! function_exists('todo')) { DatasetsRepository::set($name, $dataset, $scope);
/** }
* Adds the given todo test. Internally, this test }
* is marked as incomplete. Yet, Collision, Pest's
* printer, will display it as a "todo" test. if (! function_exists('uses')) {
* /**
* @return TestCall|TestCase|mixed * The uses function binds the given
*/ * arguments to test closures.
function todo(string $description): TestCall *
{ * @param class-string ...$classAndTraits
/* @phpstan-ignore-next-line */ */
return test($description, fn () => self::markTestSkipped( function uses(string ...$classAndTraits): UsesCall
'__TODO__', {
)); $filename = Backtrace::file();
}
} return new UsesCall($filename, array_values($classAndTraits));
}
if (! function_exists('afterEach')) { }
/**
* Runs the given closure after each test in the current file. if (! function_exists('test')) {
* /**
* @return AfterEachCall|TestCase|mixed * Adds the given closure as a test. The first argument
*/ * is the test description; the second argument is
function afterEach(Closure $closure = null): AfterEachCall * a closure that contains the test expectations.
{ *
$filename = Backtrace::file(); * @return TestCall|TestCase|mixed
*/
return new AfterEachCall(TestSuite::getInstance(), $filename, $closure); function test(string $description = null, Closure $closure = null)
} {
} if ($description === null && TestSuite::getInstance()->test !== null) {
return new HigherOrderTapProxy(TestSuite::getInstance()->test);
if (! function_exists('afterAll')) { }
/**
* Runs the given closure after all tests in the current file. $filename = Backtrace::testFile();
*/
function afterAll(Closure $closure): void return new TestCall(TestSuite::getInstance(), $filename, $description, $closure);
{ }
TestSuite::getInstance()->afterAll->set($closure); }
if (! function_exists('it')) {
/**
* Adds the given closure as a test. The first argument
* is the test description; the second argument is
* a closure that contains the test expectations.
*
* @return TestCall|TestCase|mixed
*/
function it(string $description, Closure $closure = null): TestCall
{
$description = sprintf('it %s', $description);
/** @var TestCall $test */
$test = test($description, $closure);
return $test;
}
}
if (! function_exists('todo')) {
/**
* Adds the given todo test. Internally, this test
* is marked as incomplete. Yet, Collision, Pest's
* printer, will display it as a "todo" test.
*
* @return TestCall|TestCase|mixed
*/
function todo(string $description): TestCall
{
/* @phpstan-ignore-next-line */
return test($description, fn () => self::markTestSkipped(
'__TODO__',
));
}
}
if (! function_exists('afterEach')) {
/**
* Runs the given closure after each test in the current file.
*
* @return AfterEachCall|TestCase|mixed
*/
function afterEach(Closure $closure = null): AfterEachCall
{
$filename = Backtrace::file();
return new AfterEachCall(TestSuite::getInstance(), $filename, $closure);
}
}
if (! function_exists('afterAll')) {
/**
* Runs the given closure after all tests in the current file.
*/
function afterAll(Closure $closure): void
{
TestSuite::getInstance()->afterAll->set($closure);
}
} }
} }