/** * @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); }
/** * @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'); }
/** * @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; }
/** * @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); }
/** * @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); }