Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 224fa1b

Browse files
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
Lines changed: 62 additions & 0 deletions
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+
}
Lines changed: 80 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /