/** * @param ExerciseInterface $exercise * @param UserState $userState * @param WorkshopType $type * @return bool */ private function isExerciseDisabled(ExerciseInterface $exercise, UserState $userState, WorkshopType $type) { static $previous = null; if (null === $previous || !$type->isTutorialMode()) { $previous = $exercise; return false; } if (in_array($previous->getName(), $userState->getCompletedExercises())) { $previous = $exercise; return false; } $previous = $exercise; return true; }
public function testIsTutorialMode() { $tutorial = WorkshopType::TUTORIAL(); $standard = WorkshopType::STANDARD(); static::assertTrue($tutorial->isTutorialMode()); static::assertFalse($standard->isTutorialMode()); }
public function testFactoryReturnsInstance() { $container = $this->createMock(ContainerInterface::class); $userStateSerializer = $this->createMock(UserStateSerializer::class); $userStateSerializer->expects($this->once())->method('deSerialize')->will($this->returnValue(new UserState())); $exerciseRepository = $this->createMock(ExerciseRepository::class); $exercise = $this->createMock(ExerciseInterface::class); $exercise->expects($this->exactly(2))->method('getName')->will($this->returnValue('Exercise')); $exerciseRepository->expects($this->once())->method('findAll')->will($this->returnValue([$exercise])); $services = [UserStateSerializer::class => $userStateSerializer, ExerciseRepository::class => $exerciseRepository, ExerciseRenderer::class => $this->createMock(ExerciseRenderer::class), HelpCommand::class => $this->createMock(HelpCommand::class), CreditsCommand::class => $this->createMock(CreditsCommand::class), ResetProgress::class => $this->createMock(ResetProgress::class), 'workshopLogo' => 'LOGO', 'bgColour' => 'black', 'fgColour' => 'green', 'workshopTitle' => 'TITLE', WorkshopType::class => WorkshopType::STANDARD(), EventDispatcher::class => $this->createMock(EventDispatcher::class)]; $container->expects($this->any())->method('get')->will($this->returnCallback(function ($name) use($services) { return $services[$name]; })); $factory = new MenuFactory(); $this->assertInstanceOf(CliMenu::class, $factory($container)); }
use PhpSchool\PhpWorkshop\Command\PrintCommand; use PhpSchool\PhpWorkshop\Command\VerifyCommand; use PhpSchool\PhpWorkshop\Command\RunCommand; use PhpSchool\PhpWorkshop\CommandDefinition; use PhpSchool\PhpWorkshop\CommandRouter; use PhpSchool\PhpWorkshop\ExerciseRenderer; use PhpSchool\PhpWorkshop\ExerciseRepository; use PhpSchool\PhpWorkshop\Factory\MarkdownCliRendererFactory; use PhpSchool\PhpWorkshop\MarkdownRenderer; use PhpSchool\PhpWorkshop\ResultRenderer\ResultsRenderer; use PhpSchool\PhpWorkshop\UserState; use PhpSchool\PhpWorkshop\UserStateSerializer; use Symfony\Component\Filesystem\Filesystem; use Faker\Factory as FakerFactory; use Faker\Generator as FakerGenerator; return ['appName' => basename($_SERVER['argv'][0]), WorkshopType::class => WorkshopType::STANDARD(), ExerciseDispatcher::class => function (ContainerInterface $c) { return new ExerciseDispatcher($c->get(RunnerManager::class), $c->get(ResultAggregator::class), $c->get(EventDispatcher::class), $c->get(CheckRepository::class)); }, ResultAggregator::class => object(ResultAggregator::class), CheckRepository::class => function (ContainerInterface $c) { return new CheckRepository([$c->get(FileExistsCheck::class), $c->get(PhpLintCheck::class), $c->get(CodeParseCheck::class), $c->get(ComposerCheck::class), $c->get(FunctionRequirementsCheck::class), $c->get(DatabaseCheck::class)]); }, CommandRouter::class => function (ContainerInterface $c) { return new CommandRouter([new CommandDefinition('menu', [], MenuCommand::class), new CommandDefinition('help', [], HelpCommand::class), new CommandDefinition('print', [], PrintCommand::class), new CommandDefinition('verify', [], VerifyCommand::class), new CommandDefinition('run', [], RunCommand::class), new CommandDefinition('credits', [], CreditsCommand::class)], 'menu', $c->get(EventDispatcher::class), $c); }, Color::class => function () { $colors = new Color(); $colors->setForceStyle(true); return $colors; }, OutputInterface::class => function (ContainerInterface $c) { return new StdOutput($c->get(Color::class), $c->get(TerminalInterface::class)); }, ExerciseRepository::class => function (ContainerInterface $c) { return new ExerciseRepository(array_map(function ($exerciseClass) use($c) { return $c->get($exerciseClass); }, $c->get('exercises')));