/**
  * @param CliMenu $menu
  */
 public function __invoke(CliMenu $menu)
 {
     $menu->close();
     $item = $menu->getSelectedItem();
     $exercise = $this->exerciseRepository->findByName($item->getText());
     $exercises = $this->exerciseRepository->findAll();
     $this->userState->setCurrentExercise($item->getText());
     $this->userStateSerializer->serialize($this->userState);
     $numExercises = count($exercises);
     $exerciseIndex = array_search($exercise, $exercises) + 1;
     $output = "\n";
     $output .= $this->color->__invoke(' LEARN YOU THE PHP FOR MUCH WIN! ')->magenta()->bold() . "\n";
     $output .= $this->color->__invoke('*********************************')->magenta()->bold() . "\n";
     $output .= "\n";
     $output .= $this->color->__invoke(" " . $exercise->getName())->yellow()->bold() . "\n";
     $output .= $this->color->__invoke(sprintf(" Exercise %d of %d\n\n", $exerciseIndex, $numExercises))->yellow();
     $content = file_get_contents($exercise->getProblem());
     $doc = $this->markdownRenderer->render($content);
     $doc = str_replace('{appname}', $this->appName, $doc);
     $output .= $doc;
     $output .= "\n";
     $output .= $this->helpLine('To print these instructions again, run', 'print');
     $output .= $this->helpLine('To execute your program in a test environment, run', 'run program.php');
     $output .= $this->helpLine('To verify your program, run', 'verify program.php');
     $output .= $this->helpLine('For help run', 'help');
     $output .= "\n\n";
     $this->output->write($output);
 }
示例#2
0
 /**
  * @param CliMenu $menu
  */
 public function __invoke(CliMenu $menu)
 {
     $this->userStateSerializer->serialize(new UserState());
     $items = $menu->getParent()->getItems();
     foreach ($items as $item) {
         $item->hideItemExtra();
     }
     $confirm = $menu->confirm('Status Reset!');
     $confirm->getStyle()->setBg('magenta')->setFg('black');
     $confirm->display('OK');
 }
示例#3
0
 /**
  * @param Input $input The command line arguments passed to the command.
  *
  * @return int|void
  */
 public function __invoke(Input $input)
 {
     $exercise = $this->exerciseRepository->findByName($this->userState->getCurrentExercise());
     $results = $this->exerciseDispatcher->verify($exercise, $input);
     if ($results->isSuccessful()) {
         $this->userState->addCompletedExercise($exercise->getName());
         $this->userStateSerializer->serialize($this->userState);
     }
     $this->resultsRenderer->render($results, $exercise, $this->userState, $this->output);
     return $results->isSuccessful() ? 0 : 1;
 }
示例#4
0
 /**
  * @param string $appName
  * @param string $program
  *
  * @return int|void
  */
 public function __invoke($appName, $program)
 {
     if (!file_exists($program)) {
         $this->output->printError(sprintf('Could not verify. File: "%s" does not exist', $program));
         return 1;
     }
     $program = realpath($program);
     if (!$this->userState->isAssignedExercise()) {
         $this->output->printError("No active exercises. Select one from the menu");
         return 1;
     }
     $exercise = $this->exerciseRepository->findByName($this->userState->getCurrentExercise());
     $results = $this->exerciseDispatcher->verify($exercise, $program);
     if ($results->isSuccessful()) {
         $this->userState->addCompletedExercise($exercise->getName());
         $this->userStateSerializer->serialize($this->userState);
     }
     $this->resultsRenderer->render($results, $exercise, $this->userState, $this->output);
     return $results->isSuccessful() ? 0 : 1;
 }
 /**
  * @param array $data
  * @param array $expected
  * @dataProvider deserializerProvider
  */
 public function testDeserialize(array $data, array $expected)
 {
     mkdir($this->tmpDir, 0777, true);
     file_put_contents($this->tmpFile, json_encode($data));
     $serializer = new UserStateSerializer($this->tmpFile);
     $state = $serializer->deSerialize();
     $this->assertEquals($expected['completed_exercises'], $state->getCompletedExercises());
     $this->assertEquals($expected['current_exercise'], $state->getCurrentExercise());
     if (file_exists($this->tmpFile)) {
         unlink($this->tmpFile);
     }
     rmdir($this->tmpDir);
 }
示例#6
0
 /**
  * @param CliMenu $menu
  */
 public function __invoke(CliMenu $menu)
 {
     $this->userStateSerializer->serialize(new UserState());
     $this->output->writeLine("Status Reset!");
 }
 public function testOldDataWillNotBeMigratedWhenNotInCorrectWorkshopWithOtherWorkshop()
 {
     $oldSave = sprintf('%s/.phpschool.json', $this->tmpDir);
     $newSave = sprintf('%s/.phpschool-save.json', $this->tmpDir);
     $exercise1 = $this->prophesize(CliExerciseInterface::class);
     $exercise2 = $this->prophesize(CliExerciseInterface::class);
     $exercise1->getType()->willReturn(ExerciseType::CLI());
     $exercise2->getType()->willReturn(ExerciseType::CLI());
     $exercise1->getName()->willReturn('Exercise 1');
     $exercise2->getName()->willReturn('Exercise 2');
     $exercises = [$exercise1->reveal(), $exercise2->reveal()];
     $repo = new ExerciseRepository($exercises);
     $oldData = ['current_exercise' => 'Exercise 3', 'completed_exercises' => ['Exercise 1 from a diff workshop', 'Exercise 2 from a diff workshop']];
     $newData = ['My Workshop' => ['current_exercise' => 'Exercise 2', 'completed_exercises' => ['Exercise 1']]];
     mkdir($this->tmpDir, 0777, true);
     file_put_contents($oldSave, json_encode($oldData));
     file_put_contents($newSave, json_encode($newData));
     $serializer = new UserStateSerializer($this->tmpDir, $this->workshopName, $repo);
     $state = $serializer->deSerialize();
     $this->assertEquals(['Exercise 1'], $state->getCompletedExercises());
     $this->assertEquals('Exercise 2', $state->getCurrentExercise());
     $expected = ['current_exercise' => 'Exercise 3', 'completed_exercises' => ['Exercise 1 from a diff workshop', 'Exercise 2 from a diff workshop']];
     $this->assertFileExists($oldSave);
     $this->assertEquals($expected, json_decode(file_get_contents($oldSave), true));
     $this->assertFileExists($newSave);
     $this->assertEquals($newData, json_decode(file_get_contents($newSave), true));
     unlink($oldSave);
 }