Files
pest/src/Support/StateGenerator.php
2024-08-02 11:53:24 +01:00

168 lines
6.1 KiB
PHP

<?php
declare(strict_types=1);
namespace Pest\Support;
use NunoMaduro\Collision\Adapters\Phpunit\State;
use NunoMaduro\Collision\Adapters\Phpunit\TestResult;
use NunoMaduro\Collision\Exceptions\TestOutcome;
use PHPUnit\Event\Code\TestDoxBuilder;
use PHPUnit\Event\Code\TestMethod;
use PHPUnit\Event\Code\ThrowableBuilder;
use PHPUnit\Event\Test\Errored;
use PHPUnit\Event\TestData\TestDataCollection;
use PHPUnit\Framework\SkippedWithMessageException;
use PHPUnit\Metadata\MetadataCollection;
use PHPUnit\TestRunner\TestResult\TestResult as PHPUnitTestResult;
final class StateGenerator
{
public function fromPhpUnitTestResult(int $passedTests, PHPUnitTestResult $testResult): State
{
$state = new State;
foreach ($testResult->testErroredEvents() as $testResultEvent) {
if ($testResultEvent instanceof Errored) {
$state->add(TestResult::fromPestParallelTestCase(
$testResultEvent->test(),
TestResult::FAIL,
$testResultEvent->throwable()
));
} else {
$state->add(TestResult::fromBeforeFirstTestMethodErrored($testResultEvent));
}
}
foreach ($testResult->testFailedEvents() as $testResultEvent) {
$state->add(TestResult::fromPestParallelTestCase(
$testResultEvent->test(),
TestResult::FAIL,
$testResultEvent->throwable()
));
}
foreach ($testResult->testMarkedIncompleteEvents() as $testResultEvent) {
$state->add(TestResult::fromPestParallelTestCase(
$testResultEvent->test(),
TestResult::INCOMPLETE,
$testResultEvent->throwable()
));
}
foreach ($testResult->testConsideredRiskyEvents() as $riskyEvents) {
foreach ($riskyEvents as $riskyEvent) {
$state->add(TestResult::fromPestParallelTestCase(
$riskyEvent->test(),
TestResult::RISKY,
ThrowableBuilder::from(new TestOutcome($riskyEvent->message()))
));
}
}
foreach ($testResult->testSkippedEvents() as $testResultEvent) {
if ($testResultEvent->message() === '__TODO__') {
$state->add(TestResult::fromPestParallelTestCase($testResultEvent->test(), TestResult::TODO));
continue;
}
$state->add(TestResult::fromPestParallelTestCase(
$testResultEvent->test(),
TestResult::SKIPPED,
ThrowableBuilder::from(new SkippedWithMessageException($testResultEvent->message()))
));
}
foreach ($testResult->deprecations() as $testResultEvent) {
foreach ($testResultEvent->triggeringTests() as $triggeringTest) {
['test' => $test] = $triggeringTest;
$state->add(TestResult::fromPestParallelTestCase(
$test,
TestResult::DEPRECATED,
ThrowableBuilder::from(new TestOutcome($testResultEvent->description()))
));
}
}
foreach ($testResult->phpDeprecations() as $testResultEvent) {
foreach ($testResultEvent->triggeringTests() as $triggeringTest) {
['test' => $test] = $triggeringTest;
$state->add(TestResult::fromPestParallelTestCase(
$test,
TestResult::DEPRECATED,
ThrowableBuilder::from(new TestOutcome($testResultEvent->description()))
));
}
}
foreach ($testResult->notices() as $testResultEvent) {
foreach ($testResultEvent->triggeringTests() as $triggeringTest) {
['test' => $test] = $triggeringTest;
$state->add(TestResult::fromPestParallelTestCase(
$test,
TestResult::NOTICE,
ThrowableBuilder::from(new TestOutcome($testResultEvent->description()))
));
}
}
foreach ($testResult->phpNotices() as $testResultEvent) {
foreach ($testResultEvent->triggeringTests() as $triggeringTest) {
['test' => $test] = $triggeringTest;
$state->add(TestResult::fromPestParallelTestCase(
$test,
TestResult::NOTICE,
ThrowableBuilder::from(new TestOutcome($testResultEvent->description()))
));
}
}
foreach ($testResult->warnings() as $testResultEvent) {
foreach ($testResultEvent->triggeringTests() as $triggeringTest) {
['test' => $test] = $triggeringTest;
$state->add(TestResult::fromPestParallelTestCase(
$test,
TestResult::WARN,
ThrowableBuilder::from(new TestOutcome($testResultEvent->description()))
));
}
}
foreach ($testResult->phpWarnings() as $testResultEvent) {
foreach ($testResultEvent->triggeringTests() as $triggeringTest) {
['test' => $test] = $triggeringTest;
$state->add(TestResult::fromPestParallelTestCase(
$test,
TestResult::WARN,
ThrowableBuilder::from(new TestOutcome($testResultEvent->description()))
));
}
}
// for each test that passed, we need to add it to the state
for ($i = 0; $i < $passedTests; $i++) {
$state->add(TestResult::fromPestParallelTestCase(
new TestMethod(
"$i", // @phpstan-ignore-line
'', // @phpstan-ignore-line
'', // @phpstan-ignore-line
1,
TestDoxBuilder::fromClassNameAndMethodName('', ''), // @phpstan-ignore-line
MetadataCollection::fromArray([]),
TestDataCollection::fromArray([])
),
TestResult::PASS
));
}
return $state;
}
}