Skip to content

Commit 224fa1b

Browse files
committed
Introduce new class to prepare environment files
1 parent 0e24fd9 commit 224fa1b

File tree

2 files changed

+142
-0
lines changed

2 files changed

+142
-0
lines changed

Diff for: src/ExerciseRunner/EnvironmentManager.php

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
3+
namespace PhpSchool\PhpWorkshop\ExerciseRunner;
4+
5+
use PhpSchool\PhpWorkshop\Exercise\ProvidesSolution;
6+
use PhpSchool\PhpWorkshop\Exercise\Scenario\ExerciseScenario;
7+
use PhpSchool\PhpWorkshop\ExerciseRunner\Context\ExecutionContext;
8+
use PhpSchool\PhpWorkshop\Utils\Path;
9+
use Symfony\Component\Filesystem\Filesystem;
10+
11+
class EnvironmentManager
12+
{
13+
public function __construct(private Filesystem $filesystem)
14+
{
15+
}
16+
17+
public function prepareStudent(ExecutionContext $context, ExerciseScenario $scenario): void
18+
{
19+
$this->copyExerciseFiles($scenario, $context->getStudentExecutionDirectory());
20+
}
21+
22+
public function prepareReference(ExecutionContext $context, ExerciseScenario $scenario): void
23+
{
24+
$exercise = $context->getExercise();
25+
26+
if (!$exercise instanceof ProvidesSolution) {
27+
return;
28+
}
29+
30+
$this->filesystem->mkdir($context->getReferenceExecutionDirectory());
31+
32+
$solution = $exercise->getSolution();
33+
34+
foreach ($solution->getFiles() as $file) {
35+
$this->filesystem->copy(
36+
$file->getAbsolutePath(),
37+
Path::join($context->getReferenceExecutionDirectory(), $file->getRelativePath())
38+
);
39+
}
40+
41+
$this->copyExerciseFiles($scenario, $context->getReferenceExecutionDirectory());
42+
}
43+
44+
private function copyExerciseFiles(ExerciseScenario $scenario, string $dir): void
45+
{
46+
foreach ($scenario->getFiles() as $fileName => $content) {
47+
$this->filesystem->dumpFile(
48+
Path::join($dir, $fileName),
49+
$content
50+
);
51+
}
52+
}
53+
54+
public function cleanup(ExecutionContext $context, ExerciseScenario $scenario): void
55+
{
56+
$this->filesystem->remove($context->getReferenceExecutionDirectory());
57+
58+
foreach ($scenario->getFiles() as $fileName => $content) {
59+
$this->filesystem->remove(Path::join($context->getStudentExecutionDirectory(), $fileName));
60+
}
61+
}
62+
}

Diff for: test/ExerciseRunner/EnvironmentManagerTest.php

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<?php
2+
3+
namespace PhpSchool\PhpWorkshopTest\ExerciseRunner;
4+
5+
use PhpSchool\PhpWorkshop\Exercise\MockExercise;
6+
use PhpSchool\PhpWorkshop\Exercise\Scenario\CliScenario;
7+
use PhpSchool\PhpWorkshop\ExerciseRunner\Context\TestContext;
8+
use PhpSchool\PhpWorkshop\ExerciseRunner\EnvironmentManager;
9+
use PhpSchool\PhpWorkshop\Solution\DirectorySolution;
10+
use PhpSchool\PhpWorkshop\Solution\SingleFileSolution;
11+
use PhpSchool\PhpWorkshopTest\Asset\CliExerciseImpl;
12+
use PHPUnit\Framework\TestCase;
13+
use Symfony\Component\Filesystem\Filesystem;
14+
15+
class EnvironmentManagerTest extends TestCase
16+
{
17+
public function testPrepareStudentCopiesAllScenarioFilesToExecutionDirectory(): void
18+
{
19+
$context = new TestContext();
20+
$context->createStudentSolutionDirectory();
21+
22+
$scenario = (new CliScenario())
23+
->withFile('file.txt', 'content')
24+
->withFile('file2.txt', 'content2');
25+
26+
$manager = new EnvironmentManager(new Filesystem());
27+
$manager->prepareStudent($context, $scenario);
28+
29+
static::assertStringEqualsFile($context->getStudentExecutionDirectory() . '/file.txt', 'content');
30+
static::assertStringEqualsFile($context->getStudentExecutionDirectory() . '/file2.txt', 'content2');
31+
}
32+
33+
public function testPrepareReferenceCopiesAllScenarioFilesAndSolutionFilesToExecutionDirectory(): void
34+
{
35+
$exercise = new CliExerciseImpl();
36+
$solution = SingleFileSolution::fromFile(realpath(__DIR__ . '/../res/cli/solution.php'));
37+
$exercise->setSolution($solution);
38+
39+
$context = new TestContext($exercise);
40+
41+
$scenario = (new CliScenario())
42+
->withFile('file.txt', 'content')
43+
->withFile('file2.txt', 'content2');
44+
45+
$manager = new EnvironmentManager(new Filesystem());
46+
$manager->prepareReference($context, $scenario);
47+
48+
static::assertFileEquals($context->getReferenceExecutionDirectory() . '/solution.php', __DIR__ . '/../res/cli/solution.php');
49+
static::assertStringEqualsFile($context->getReferenceExecutionDirectory() . '/file.txt', 'content');
50+
static::assertStringEqualsFile($context->getReferenceExecutionDirectory() . '/file2.txt', 'content2');
51+
}
52+
53+
public function testCleanupRemovesReferenceDirectoryAndFilesCopiesToStudentDirectory(): void
54+
{
55+
$exercise = new CliExerciseImpl();
56+
$solution = SingleFileSolution::fromFile(realpath(__DIR__ . '/../res/cli/solution.php'));
57+
$exercise->setSolution($solution);
58+
59+
$context = new TestContext($exercise);
60+
$context->createStudentSolutionDirectory();
61+
62+
$scenario = (new CliScenario())
63+
->withFile('file.txt', 'content')
64+
->withFile('file2.txt', 'content2');
65+
66+
$manager = new EnvironmentManager(new Filesystem());
67+
$manager->prepareStudent($context, $scenario);
68+
$manager->prepareReference($context, $scenario);
69+
70+
static::assertFileExists($context->getStudentExecutionDirectory());
71+
static::assertFileExists($context->getReferenceExecutionDirectory());
72+
73+
$manager->cleanup($context, $scenario);
74+
75+
static::assertFileExists($context->getStudentExecutionDirectory());
76+
static::assertFileNotExists($context->getReferenceExecutionDirectory() . '/file.txt');
77+
static::assertFileNotExists($context->getReferenceExecutionDirectory() . '/file2.txt');
78+
static::assertFileNotExists($context->getReferenceExecutionDirectory());
79+
}
80+
}

0 commit comments

Comments
 (0)