diff --git a/src/TestUtils/WorkshopExerciseTest.php b/src/TestUtils/WorkshopExerciseTest.php index d0d4c35d..1ebfb18e 100644 --- a/src/TestUtils/WorkshopExerciseTest.php +++ b/src/TestUtils/WorkshopExerciseTest.php @@ -21,11 +21,13 @@ use PhpSchool\PhpWorkshop\Result\ResultGroupInterface; use PhpSchool\PhpWorkshop\Result\ResultInterface; use PhpSchool\PhpWorkshop\ResultAggregator; +use PhpSchool\PhpWorkshop\Utils\ArrayObject; use PhpSchool\PhpWorkshop\Utils\Collection; use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; use PhpSchool\PhpWorkshop\Input\Input; +use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Process\Process; abstract class WorkshopExerciseTest extends TestCase @@ -58,7 +60,7 @@ abstract public function getExerciseClass(): string; abstract public function getApplication(): Application; - private function getExercise(): ExerciseInterface + protected function getExercise(): ExerciseInterface { return $this->container->get(ExerciseRepository::class) ->findByClassName($this->getExerciseClass()); @@ -147,7 +149,23 @@ public function assertResultsHasFailure(string $resultClass, string $reason): vo return $failure->getReason() === $reason; }); - $this->assertCount(1, $failures, "No failure with reason: '$reason'"); + $allFailures = (new Collection($this->results->getIterator()->getArrayCopy())) + ->filter(function (ResultInterface $result) { + return $result instanceof FailureInterface; + }) + ->map(function (FailureInterface $failure) { + return sprintf( + ' * %s%s', + get_class($failure), + $failure instanceof Failure ? ": {$failure->getReason()}" : '' + ); + }); + + $help = $allFailures->isEmpty() + ? "" + : sprintf("\n\nAll Failures:\n\n\n", $allFailures->implode("\n")); + + $this->assertCount(1, $failures, "No failure with reason: '$reason' . $help"); } public function assertOutputWasIncorrect(): void @@ -203,4 +221,16 @@ public function assertResultsHasFailureAndMatches(string $resultClass, callable $this->assertTrue($matcher($failure)); }); } + + public function removeSolutionAsset(string $file): void + { + $path = sprintf( + '%s/test/solutions/%s/%s', + rtrim($this->container->get('basePath'), '/'), + AbstractExercise::normaliseName($this->getExercise()->getName()), + $file + ); + + (new Filesystem())->remove($path); + } }