-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProblemService.php
More file actions
103 lines (82 loc) · 2.67 KB
/
Copy pathProblemService.php
File metadata and controls
103 lines (82 loc) · 2.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
namespace TaskChecker;
use TaskChecker\Problem;
use TaskChecker\ProblemParser\ProblemSerializer;
use TaskChecker\Test\ScenarioTest;
class ProblemService
{
private $problemList;
private $problemsWithoutTesters;
private $problemBaseDir;
public function __construct()
{
$this->problemBaseDir = dirname(__DIR__) . '/scenarios';
list($this->problemList, $this->problemsWithoutTesters) =
$this->buildProblemList();
}
private function buildProblemList()
{
$problemsWithTester = [];
$unimplementedProblems = [];
$path = $this->getProblemListLocation();
if (!file_exists($path)) {
return [ [], [] ];
}
$serializer = new ProblemSerializer;
$jsonData = file_get_contents($path);
$problems = $serializer->deserialize($jsonData);
foreach ($problems as $problem) {
$dir = $this->getScenariosDirectory($problem);
if (is_dir($dir)) {
$problemsWithTester[] = $problem;
} else {
$unimplementedProblems[] = $problem;
}
}
// $problems[] = new Problem(
// 'hello-world',
// 'Первая программа',
// 'Напишите программу, которая выводит какой-нибудь текст, например «Hello, World!»'
// );
return [$problemsWithTester, $unimplementedProblems];
}
public function getProblemList()
{
return $this->problemList;
}
public function getProblemWithoutTesterList()
{
return $this->problemsWithoutTesters;
}
public function getProblemById($id)
{
foreach ($this->getProblemList() as $problem) {
if ($problem->getId() == $id) {
return $problem;
}
}
foreach ($this->getProblemWithoutTesterList() as $problem) {
if ($problem->getId() == $id) {
return $problem;
}
}
return null;
}
private function getScriptNameForProblem(Problem $problem)
{
return $this->getScenariosDirectory($problem) . '/tester.php';
}
public function getScenariosDirectory(Problem $problem)
{
return $this->problemBaseDir . '/' . $problem->getId();
}
public function createTesterForProblem(ModuleFactory $factory, Problem $problem)
{
$scriptName = $this->getScriptNameForProblem($problem);
return new ScenarioTest($scriptName, $factory);
}
public function getProblemListLocation()
{
return $this->problemBaseDir . '/problems.json';
}
}