Skip to content

Commit

Permalink
Merge branch '10.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
sebastianbergmann committed Feb 3, 2023
2 parents 92ff570 + 95c8121 commit f34c205
Show file tree
Hide file tree
Showing 2 changed files with 114 additions and 94 deletions.
2 changes: 0 additions & 2 deletions .psalm/baseline.xml
Expand Up @@ -297,8 +297,6 @@
<file src="src/Framework/TestSuite.php">
<ArgumentTypeCoercion>
<code>$this-&gt;name</code>
<code>$this-&gt;name</code>
<code>$this-&gt;name</code>
</ArgumentTypeCoercion>
<LessSpecificReturnStatement>
<code>$this-&gt;providedTests</code>
Expand Down
206 changes: 114 additions & 92 deletions src/Framework/TestSuite.php
Expand Up @@ -340,62 +340,8 @@ public function run(): void

$emitter->testSuiteStarted($testSuiteValueObjectForEvents);

$methodsCalledBeforeFirstTest = [];

if ($this->isForTestClass()) {
$beforeClassMethods = (new HookMethods)->hookMethods($this->name)['beforeClass'];

try {
foreach ($beforeClassMethods as $beforeClassMethod) {
if ($this->methodDoesNotExistOrIsDeclaredInTestCase($beforeClassMethod)) {
continue;
}

if ($missingRequirements = (new Requirements)->requirementsNotSatisfiedFor($this->name, $beforeClassMethod)) {
$this->markTestSuiteSkipped(implode(PHP_EOL, $missingRequirements));
}

$methodCalledBeforeFirstTest = new Event\Code\ClassMethod(
$this->name,
$beforeClassMethod
);

$emitter->testBeforeFirstTestMethodCalled(
$this->name,
$methodCalledBeforeFirstTest
);

$methodsCalledBeforeFirstTest[] = $methodCalledBeforeFirstTest;

call_user_func([$this->name, $beforeClassMethod]);
}
} catch (SkippedTestSuiteError) {
return;
} catch (Throwable $t) {
assert(isset($methodCalledBeforeFirstTest));

$emitter->testBeforeFirstTestMethodErrored(
$this->name,
$methodCalledBeforeFirstTest,
Event\Code\Throwable::from($t)
);

if (!empty($methodsCalledBeforeFirstTest)) {
$emitter->testBeforeFirstTestMethodFinished(
$this->name,
...$methodsCalledBeforeFirstTest
);
}

return;
}
}

if (!empty($methodsCalledBeforeFirstTest)) {
$emitter->testBeforeFirstTestMethodFinished(
$this->name,
...$methodsCalledBeforeFirstTest
);
if (!$this->invokeMethodsBeforeFirstTest($emitter)) {
return;
}

foreach ($this as $test) {
Expand All @@ -406,42 +352,7 @@ public function run(): void
$test->run();
}

$methodsCalledAfterLastTest = [];

if ($this->isForTestClass()) {
$afterClassMethods = (new HookMethods)->hookMethods($this->name)['afterClass'];

foreach ($afterClassMethods as $afterClassMethod) {
if ($this->methodDoesNotExistOrIsDeclaredInTestCase($afterClassMethod)) {
continue;
}

try {
call_user_func([$this->name, $afterClassMethod]);

$methodCalledAfterLastTest = new Event\Code\ClassMethod(
$this->name,
$afterClassMethod
);

$emitter->testAfterLastTestMethodCalled(
$this->name,
$methodCalledAfterLastTest
);

$methodsCalledAfterLastTest[] = $methodCalledAfterLastTest;
} catch (Throwable) {
// @todo
}
}
}

if (!empty($methodsCalledAfterLastTest)) {
$emitter->testAfterLastTestMethodFinished(
$this->name,
...$methodsCalledAfterLastTest
);
}
$this->invokeMethodsAfterLastTest($emitter);

$emitter->testSuiteFinished($testSuiteValueObjectForEvents);
}
Expand Down Expand Up @@ -695,4 +606,115 @@ private function throwableToString(Throwable $t): string
Filter::getFilteredStacktrace($t)
);
}

/**
* @throws Exception
* @throws NoPreviousThrowableException
*/
private function invokeMethodsBeforeFirstTest(Event\Emitter $emitter): bool
{
if (!$this->isForTestClass()) {
return true;
}

$methodsCalledBeforeFirstTest = [];

$beforeClassMethods = (new HookMethods)->hookMethods($this->name)['beforeClass'];

try {
foreach ($beforeClassMethods as $beforeClassMethod) {
if ($this->methodDoesNotExistOrIsDeclaredInTestCase($beforeClassMethod)) {
continue;
}

if ($missingRequirements = (new Requirements)->requirementsNotSatisfiedFor($this->name, $beforeClassMethod)) {
$this->markTestSuiteSkipped(implode(PHP_EOL, $missingRequirements));
}

$methodCalledBeforeFirstTest = new Event\Code\ClassMethod(
$this->name,
$beforeClassMethod
);

$emitter->testBeforeFirstTestMethodCalled(
$this->name,
$methodCalledBeforeFirstTest
);

$methodsCalledBeforeFirstTest[] = $methodCalledBeforeFirstTest;

call_user_func([$this->name, $beforeClassMethod]);
}
} catch (SkippedTestSuiteError) {
return false;
} catch (Throwable $t) {
assert(isset($methodCalledBeforeFirstTest));

$emitter->testBeforeFirstTestMethodErrored(
$this->name,
$methodCalledBeforeFirstTest,
Event\Code\Throwable::from($t)
);

if (!empty($methodsCalledBeforeFirstTest)) {
$emitter->testBeforeFirstTestMethodFinished(
$this->name,
...$methodsCalledBeforeFirstTest
);
}

return false;
}

if (!empty($methodsCalledBeforeFirstTest)) {
$emitter->testBeforeFirstTestMethodFinished(
$this->name,
...$methodsCalledBeforeFirstTest
);
}

return true;
}

private function invokeMethodsAfterLastTest(Event\Emitter $emitter): void
{
if (!$this->isForTestClass()) {
return;
}

$methodsCalledAfterLastTest = [];

$afterClassMethods = (new HookMethods)->hookMethods($this->name)['afterClass'];

foreach ($afterClassMethods as $afterClassMethod) {
if ($this->methodDoesNotExistOrIsDeclaredInTestCase($afterClassMethod)) {
continue;
}

try {
call_user_func([$this->name, $afterClassMethod]);

$methodCalledAfterLastTest = new Event\Code\ClassMethod(
$this->name,
$afterClassMethod
);

$emitter->testAfterLastTestMethodCalled(
$this->name,
$methodCalledAfterLastTest
);

$methodsCalledAfterLastTest[] = $methodCalledAfterLastTest;
} catch (Throwable) {
// @todo
}
}

if (!empty($methodsCalledAfterLastTest)) {
$emitter->testAfterLastTestMethodFinished(
$this->name,
...$methodsCalledAfterLastTest
);
}
}
}

0 comments on commit f34c205

Please sign in to comment.