Skip to content

Commit 7bc2d68

Browse files
committed
Merge pull request #36 from php-school/time-server-run
Allow TimeServer exercise to work in run mode
2 parents f462b44 + e1d88fd commit 7bc2d68

File tree

3 files changed

+57
-11
lines changed

3 files changed

+57
-11
lines changed

composer.lock

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Exercise/TimeServer.php

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface;
1111
use PhpSchool\PhpWorkshop\Exercise\ExerciseType;
1212
use PhpSchool\PhpWorkshop\ExerciseDispatcher;
13+
use PhpSchool\PhpWorkshop\Output\OutputInterface;
1314
use PhpSchool\PhpWorkshop\Result\Failure;
1415
use PhpSchool\PhpWorkshop\Result\StdOutFailure;
1516
use PhpSchool\PhpWorkshop\Result\Success;
@@ -63,15 +64,14 @@ public function configure(ExerciseDispatcher $exerciseDispatcher)
6364
{
6465
$eventDispatcher = $exerciseDispatcher->getEventDispatcher();
6566

66-
$eventDispatcher->listen('cli.verify.solution-execute.pre', function (CliExecuteEvent $event) {
67+
$appendArgsListener = function (CliExecuteEvent $event) {
6768
$event->appendArg('127.0.0.1');
6869
$event->appendArg($this->getRandomPort());
69-
});
70+
};
7071

71-
$eventDispatcher->listen('cli.verify.user-execute.pre', function (CliExecuteEvent $event) {
72-
$event->appendArg('127.0.0.1');
73-
$event->appendArg($this->getRandomPort());
74-
});
72+
$eventDispatcher->listen('cli.verify.solution-execute.pre', $appendArgsListener);
73+
$eventDispatcher->listen('cli.verify.user-execute.pre', $appendArgsListener);
74+
$eventDispatcher->listen('cli.run.user-execute.pre', $appendArgsListener);
7575

7676
$eventDispatcher->listen('cli.verify.solution.executing', function (CliExecuteEvent $event) {
7777
$args = $event->getArgs()->getArrayCopy();
@@ -114,6 +114,24 @@ public function configure(ExerciseDispatcher $exerciseDispatcher)
114114
}
115115
return new Success($this->getName());
116116
});
117+
118+
$eventDispatcher->listen('cli.run.executing', function (CliExecuteEvent $event) {
119+
/** @var OutputInterface $output */
120+
$output = $event->getParameter('output');
121+
$args = $event->getArgs()->getArrayCopy();
122+
$client = $this->socketFactory->createClient(...$args);
123+
124+
//wait for server to boot
125+
usleep(100000);
126+
127+
$client->connect();
128+
$out = $client->readAll();
129+
130+
//wait for shutdown
131+
usleep(100000);
132+
133+
$output->write($out);
134+
});
117135
}
118136

119137
/**

test/Exercise/TimeServerTest.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33

44
namespace PhpSchool\LearnYouPhpTest\Exercise;
55

6+
use Colors\Color;
67
use Faker\Factory;
78
use Faker\Generator;
89
use Hoa\Core\Exception\Exception;
910
use Hoa\Socket\Client;
11+
use PhpSchool\CliMenu\Terminal\TerminalInterface;
12+
use PhpSchool\CliMenu\Terminal\UnixTerminal;
1013
use PhpSchool\LearnYouPhp\Exercise\ArrayWeGo;
1114
use PhpSchool\LearnYouPhp\Exercise\TimeServer;
1215
use PhpSchool\LearnYouPhp\TcpSocketFactory;
@@ -15,6 +18,7 @@
1518
use PhpSchool\PhpWorkshop\Exercise\ExerciseType;
1619
use PhpSchool\PhpWorkshop\ExerciseDispatcher;
1720
use PhpSchool\PhpWorkshop\Factory\RunnerFactory;
21+
use PhpSchool\PhpWorkshop\Output\StdOutput;
1822
use PhpSchool\PhpWorkshop\Result\Failure;
1923
use PhpSchool\PhpWorkshop\Result\StdOutFailure;
2024
use PhpSchool\PhpWorkshop\Result\Success;
@@ -112,4 +116,28 @@ public function testSuccessIsReturnedIfOutputIsCorrect()
112116
$success = iterator_to_array($results)[0];
113117
$this->assertInstanceOf(Success::class, $success);
114118
}
119+
120+
public function testRun()
121+
{
122+
$color = new Color;
123+
$color->setForceStyle(true);
124+
$output = new StdOutput($color, $terminal = $this->getMock(TerminalInterface::class));
125+
126+
$outputRegEx = "/\n";
127+
$outputRegEx .= '\[1m\[4mArguments\[0m\[0m';
128+
$outputRegEx .= "\n";
129+
$outputRegEx .= '127.0.0.1, \d+';
130+
$outputRegEx .= "\n";
131+
$outputRegEx .= '\[1m\[4mOutput\[0m\[0m';
132+
$outputRegEx .= "\n";
133+
$outputRegEx .= '\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}';
134+
$outputRegEx .= "\n/";
135+
$this->expectOutputRegex($outputRegEx);
136+
137+
$this->exerciseDispatcher->run(
138+
$this->exercise,
139+
__DIR__ . '/../res/time-server/solution.php',
140+
$output
141+
);
142+
}
115143
}

0 commit comments

Comments
 (0)