PhpSchool\LearnYouPhp\Exercise\TimeServer::configure PHP Method

configure() public method

public configure ( PhpSchool\PhpWorkshop\ExerciseDispatcher $exerciseDispatcher )
$exerciseDispatcher PhpSchool\PhpWorkshop\ExerciseDispatcher
    public function configure(ExerciseDispatcher $exerciseDispatcher)
    {
        $eventDispatcher = $exerciseDispatcher->getEventDispatcher();
        $appendArgsListener = function (CliExecuteEvent $event) {
            $event->appendArg('127.0.0.1');
            $event->appendArg($this->getRandomPort());
        };
        $eventDispatcher->listen('cli.verify.reference-execute.pre', $appendArgsListener);
        $eventDispatcher->listen('cli.verify.student-execute.pre', $appendArgsListener);
        $eventDispatcher->listen('cli.run.student-execute.pre', $appendArgsListener);
        $eventDispatcher->listen('cli.verify.reference.executing', function (CliExecuteEvent $event) {
            $args = $event->getArgs()->getArrayCopy();
            $client = $this->socketFactory->createClient(...$args);
            //wait for server to boot
            usleep(100000);
            $client->connect();
            $client->readAll();
            //wait for shutdown
            usleep(100000);
        });
        $eventDispatcher->insertVerifier('cli.verify.student.executing', function (CliExecuteEvent $event) {
            $args = $event->getArgs()->getArrayCopy();
            $client = $this->socketFactory->createClient(...$args);
            //wait for server to boot
            usleep(100000);
            try {
                $client->connect();
            } catch (Exception $e) {
                return Failure::fromNameAndReason($this->getName(), $e->getMessage());
            }
            $out = $client->readAll();
            //wait for shutdown
            usleep(100000);
            $date = new \DateTime();
            //match the current date but any seconds
            //since we can't mock time in PHP easily
            if (!preg_match(sprintf('/^%s:([0-5][0-9]|60)\\n$/', $date->format('Y-m-d H:i')), $out)) {
                return ComparisonFailure::fromNameAndValues($this->getName(), $date->format("Y-m-d H:i:s\n"), $out);
            }
            return new Success($this->getName());
        });
        $eventDispatcher->listen('cli.run.student.executing', function (CliExecuteEvent $event) {
            /** @var OutputInterface $output */
            $output = $event->getParameter('output');
            $args = $event->getArgs()->getArrayCopy();
            $client = $this->socketFactory->createClient(...$args);
            //wait for server to boot
            usleep(100000);
            $client->connect();
            $out = $client->readAll();
            //wait for shutdown
            usleep(100000);
            $output->write($out);
        });
    }