function it_does_not_generate_interface_when_prompt_is_answered_with_no(ConsoleIO $io, ExampleEvent $exampleEvent, SuiteEvent $suiteEvent, GeneratorManager $generator) { $io->askConfirmation('Would you like me to generate an interface `Example\\ExampleClass` for you?')->willReturn(false); $this->afterExample($exampleEvent); $this->afterSuite($suiteEvent); $generator->generate(Argument::cetera())->shouldNotHaveBeenCalled(); $suiteEvent->markAsWorthRerunning()->shouldNotHaveBeenCalled(); }
public function beforeSuite() { if ($bootstrap = $this->io->getBootstrapPath()) { if (!is_file($bootstrap)) { throw new \RuntimeException(sprintf("Bootstrap file '%s' does not exist", $bootstrap)); } require $bootstrap; } }
function it_prompts_and_warns_when_one_method_name_is_correct_but_other_reserved($exampleEvent, SuiteEvent $suiteEvent, ConsoleIO $io, NameChecker $nameChecker) { $this->callAfterExample($exampleEvent, $nameChecker, 'throw', false); $this->callAfterExample($exampleEvent, $nameChecker, 'foo'); $io->writeBrokenCodeBlock("I cannot generate the method 'throw' for you because it is a reserved keyword", 2)->shouldBeCalled(); $io->askConfirmation('Do you want me to create `stdClass::foo()` for you?')->shouldBeCalled(); $suiteEvent->markAsNotWorthRerunning()->shouldBeCalled(); $this->afterSuite($suiteEvent); }
/** * @param ExampleEvent $event * * @throws \PhpSpec\Exception\Example\StopOnFailureException */ public function afterExample(ExampleEvent $event) { if (!$this->io->isStopOnFailureEnabled()) { return; } if ($event->getResult() === ExampleEvent::FAILED || $event->getResult() === ExampleEvent::BROKEN) { throw new StopOnFailureException('Example failed', 0, null, $event->getResult()); } }
function it_outputs_progress_as_33_when_3_of_3_examples_have_run_and_one_passed(ExampleEvent $event, ConsoleIO $io, StatisticsCollector $stats) { $stats->getEventsCount()->willReturn(3); $stats->getCountsHash()->willReturn(array('passed' => 1, 'pending' => 0, 'skipped' => 0, 'failed' => 2, 'broken' => 0)); $stats->getTotalSpecs()->willReturn(3); $stats->getTotalSpecsCount()->willReturn(3); $this->afterExample($event); $expected = '/ skipped: 0% / pending: 0% / passed: 33% / failed: 66% / broken: 0% / 3 examples'; $io->writeTemp($expected)->shouldHaveBeenCalled(); }
/** * @param Resource $resource * @param array $data */ public function generate(Resource $resource, array $data = array()) { $filepath = $resource->getSrcFilename(); $methodName = $data['name']; $arguments = $data['arguments']; $content = $this->getContent($resource, $methodName, $arguments); $code = $this->appendMethodToCode($this->filesystem->getFileContents($filepath), $content); $this->filesystem->putFileContents($filepath, $code); $this->io->writeln(sprintf("<info>Method <value>%s::%s()</value> has been created.</info>\n", $resource->getSrcClassname(), $methodName), 2); }
/** * @param Resource $resource * @param array $data */ public function generate(Resource $resource, array $data) { $filepath = $resource->getSrcFilename(); if (!($content = $this->templates->render('private-constructor', array()))) { $content = $this->templates->renderString($this->getTemplate(), array()); } $code = $this->filesystem->getFileContents($filepath); $code = $this->codeWriter->insertMethodFirstInClass($code, $content); $this->filesystem->putFileContents($filepath, $code); $this->io->writeln("<info>Private constructor has been created.</info>\n", 2); }
public function displayFatal(CurrentExampleTracker $currentExample, $error) { if (null !== $error && ($currentExample->getCurrentExample() || $error['type'] == E_ERROR) || is_null($currentExample->getCurrentExample()) && defined('HHVM_VERSION')) { ini_set('display_errors', "stderr"); $failedOpen = $this->io->isDecorated() ? '<failed>' : ''; $failedClosed = $this->io->isDecorated() ? '</failed>' : ''; $failedCross = $this->io->isDecorated() ? '✘' : ''; $this->io->writeln("{$failedOpen}{$failedCross} Fatal error happened while executing the following {$failedClosed}"); $this->io->writeln("{$failedOpen} {$currentExample->getCurrentExample()} {$failedClosed}"); $this->io->writeln("{$failedOpen} {$error['message']} in {$error['file']} on line {$error['line']} {$failedClosed}"); } }
/** * @param Resource $resource * @param array $data */ public function generate(Resource $resource, array $data = array()) { $filepath = $resource->getSrcFilename(); $name = $data['name']; $arguments = $data['arguments']; $argString = $this->buildArgumentString($arguments); $values = array('%name%' => $name, '%arguments%' => $argString); if (!($content = $this->templates->render('interface-method-signature', $values))) { $content = $this->templates->renderString($this->getTemplate(), $values); } $this->insertMethodSignature($filepath, $content); $this->io->writeln(sprintf("<info>Method signature <value>%s::%s()</value> has been created.</info>\n", $resource->getSrcClassname(), $name), 2); }
/** * @param Resource $resource * @param array $data */ public function generate(Resource $resource, array $data = array()) { $filepath = $resource->getSrcFilename(); $name = $data['name']; $arguments = $data['arguments']; $argString = count($arguments) ? '$argument' . implode(', $argument', range(1, count($arguments))) : ''; $values = array('%name%' => $name, '%arguments%' => $argString); if (!($content = $this->templates->render('method', $values))) { $content = $this->templates->renderString($this->getTemplate(), $values); } $code = $this->filesystem->getFileContents($filepath); $this->filesystem->putFileContents($filepath, $this->getUpdatedCode($name, $content, $code)); $this->io->writeln(sprintf("<info>Method <value>%s::%s()</value> has been created.</info>\n", $resource->getSrcClassname(), $name), 2); }
/** * @param Resource $resource * @param array $data * * @return mixed */ public function generate(Resource $resource, array $data = array()) { $filepath = $resource->getSrcFilename(); $name = $data['name']; $arguments = $data['arguments']; $argString = $this->argumentBuilder->buildFrom($arguments); $values = array('%name%' => $name, '%arguments%' => $argString); if (!($content = $this->templates->render('method', $values))) { $content = $this->templates->renderString($this->getTemplate(), $values); } $code = $this->filesystem->getFileContents($filepath); $code = preg_replace('/}[ \\n]*$/', rtrim($content) . "\n}\n", trim($code)); $this->filesystem->putFileContents($filepath, $code); $this->io->writeln(sprintf("\n<info>Method <value>%s::%s()</value> has been created.</info>", $resource->getSrcClassname(), $name), 2); }
/** * @param Resource $resource * @param array $data */ public function generate(Resource $resource, array $data) { $method = $data['method']; $expected = $data['expected']; $code = $this->filesystem->getFileContents($resource->getSrcFilename()); $values = array('%constant%' => var_export($expected, true)); if (!($content = $this->templates->render('method', $values))) { $content = $this->templates->renderString($this->getTemplate(), $values); } $pattern = '/' . '(function\\s+' . preg_quote($method, '/') . '\\s*\\([^\\)]*\\))\\s+{[^}]*?}/'; $replacement = '$1' . $content; $modifiedCode = preg_replace($pattern, $replacement, $code); $this->filesystem->putFileContents($resource->getSrcFilename(), $modifiedCode); $this->io->writeln(sprintf("<info>Method <value>%s::%s()</value> has been modified.</info>\n", $resource->getSrcClassname(), $method), 2); }
private function writeErrorMessage() { foreach ($this->wrongMethodNames as $methodName) { $message = sprintf("I cannot generate the method '%s' for you because it is a reserved keyword", $methodName); $this->io->writeBrokenCodeBlock($message, 2); } }
public function afterSuite(SuiteEvent $event) { if (!$this->io->isCodeGenerationEnabled()) { return; } if (!$this->io->isFakingEnabled()) { return; } foreach ($this->nullMethods as $methodString => $failedCall) { $failedCall['expected'] = array_unique($failedCall['expected']); if (count($failedCall['expected']) > 1) { continue; } $expected = current($failedCall['expected']); $class = $failedCall['class']; $message = sprintf('Do you want me to make `%s()` always return %s for you?', $methodString, var_export($expected, true)); try { $resource = $this->resources->createResource($class); } catch (\RuntimeException $exception) { continue; } if ($this->io->askConfirmation($message)) { $this->generator->generate($resource, 'returnConstant', array('method' => $failedCall['method'], 'expected' => $expected)); $event->markAsWorthRerunning(); } } }
/** * @param SuiteEvent $event */ public function afterSuite(SuiteEvent $event) { if (!$this->io->isCodeGenerationEnabled()) { return; } foreach ($this->exceptions as $exception) { $resource = $this->resources->createResource($exception->getCollaboratorName()); if ($this->resourceIsInSpecNamespace($exception, $resource)) { continue; } if ($this->io->askConfirmation(sprintf('Would you like me to generate an interface `%s` for you?', $exception->getCollaboratorName()))) { $this->generator->generate($resource, 'interface'); $event->markAsWorthRerunning(); } } }
function it_logs_the_generated_method(File $file, ConsoleIO $io, Method $method, Object $object) { $generatedMethod = new GeneratedMethod($file->getWrappedObject()); $file->getStructure()->willReturn($object); $object->getName()->willReturn(self::CLASS_NAME); $object->allMethods()->willReturn([$method]); $method->getName()->willReturn(self::METHOD_NAME); $className = self::CLASS_NAME; $methodName = self::METHOD_NAME; $io->write(<<<OUTPUT <info>Generated <value>{$className}#{$methodName}</value></info> OUTPUT )->shouldBeCalled(); $this->onGeneratedMethod($generatedMethod); }
function it_logs_the_generated_constructor(File $file, ConsoleIO $io, Method $method, Object $object, Property $property) { $generatedConstructor = new GeneratedConstructor($file->getWrappedObject()); $file->getStructure()->willReturn($object); $object->getName()->willReturn(self::CLASS_NAME); $object->allProperties()->willReturn([$property]); $object->allMethods()->willReturn([$method]); $method->getName()->willReturn(self::METHOD_NAME); $className = self::CLASS_NAME; $methodName = self::METHOD_NAME; $propertiesCount = self::PROPERTIES_COUNT; $io->write(<<<OUTPUT <info>Generated <value>{$propertiesCount}</value> property for <value>{$className}</value>, with its constructor</info> OUTPUT )->shouldBeCalled(); $this->onGeneratedConstructor($generatedConstructor); }
function it_outputs_a_suite_summary(SuiteEvent $event, ConsoleIO $io, StatisticsCollector $stats) { $stats->getEventsCount()->willReturn(1); $stats->getFailedEvents()->willReturn(array()); $stats->getBrokenEvents()->willReturn(array()); $stats->getPendingEvents()->willReturn(array()); $stats->getSkippedEvents()->willReturn(array()); $stats->getTotalSpecs()->willReturn(15); $event->getTime()->willReturn(12.345); $stats->getCountsHash()->willReturn(array('passed' => 1, 'pending' => 0, 'skipped' => 0, 'failed' => 2, 'broken' => 0)); $this->afterSuite($event); $io->writeln('15 specs')->shouldHaveBeenCalled(); $io->writeln("\n12345ms")->shouldHaveBeenCalled(); $io->write('1 example ')->shouldHaveBeenCalled(); $expected = '(<passed>1 passed</passed>, <failed>2 failed</failed>)'; $io->write($expected)->shouldHaveBeenCalled(); }
/** * @param Resource $resource * @param string $filepath */ private function generateFileAndRenderTemplate(Resource $resource, $filepath) { $content = $this->renderTemplate($resource, $filepath); $this->filesystem->putFileContents($filepath, $content); $this->io->writeln($this->getGeneratedMessage($resource, $filepath)); }
/** * @param ConsoleIO $io * @param array $progress * @param int $total */ private function updateProgressBar(ConsoleIO $io, array $progress, $total) { if ($io->isDecorated()) { $progressBar = implode('', $progress); $pad = $this->getIO()->getBlockWidth() - strlen(strip_tags($progressBar)); $io->writeTemp($progressBar . str_repeat(' ', $pad + 1) . $total); } else { $io->writeTemp('/' . implode('/', $progress) . '/ ' . $total . ' examples'); } }
public function reRunSuite() { if ($this->io->isRerunEnabled()) { $this->decoratedRerunner->reRunSuite(); } }
function it_does_not_rerun_the_suite_if_it_is_disabled_in_the_config(ConsoleIO $io, ReRunner $decoratedReRunner) { $io->isRerunEnabled()->willReturn(false); $this->reRunSuite(); $decoratedReRunner->reRunSuite()->shouldNotHaveBeenCalled(); }
function it_invokes_method_body_generation_when_prompt_is_answered_yes(MethodCallEvent $methodCallEvent, ExampleEvent $exampleEvent, ConsoleIO $io, GeneratorManager $generatorManager, ResourceManager $resourceManager, Resource $resource, SuiteEvent $event) { $io->askConfirmation(Argument::any())->willReturn(true); $resourceManager->createResource(Argument::any())->willReturn($resource); $methodCallEvent->getSubject()->willReturn(new \StdClass()); $methodCallEvent->getMethod()->willReturn('myMethod'); $this->afterMethodCall($methodCallEvent); $this->afterExample($exampleEvent); $this->afterSuite($event); $generatorManager->generate($resource, 'returnConstant', array('method' => 'myMethod', 'expected' => 100))->shouldHaveBeenCalled(); }
function let(ConsoleIO $io, ResourceManager $resourceManager, GeneratorManager $generatorManager, SuiteEvent $suiteEvent, ExampleEvent $exampleEvent) { $io->writeln(Argument::any())->willReturn(); $io->askConfirmation(Argument::any())->willReturn(); $this->beConstructedWith($io, $resourceManager, $generatorManager); }
function let(ConsoleIO $io) { $io->isStopOnFailureEnabled()->willReturn(false); $this->beConstructedWith($io); }
function it_outputs_undefined_progress_on_afterexample_event(SpecificationEvent $specEvent, ExampleEvent $exampleEvent, ExampleNode $example, SpecificationNode $spec, ConsoleIO $io, StatisticsCollector $stats) { $specEvent->getSpecification()->willReturn($spec); $exampleEvent->getExample()->willReturn($example); $example->getTitle()->willReturn('foobar'); $exampleEvent->getResult()->willReturn(999); $spec->getTitle()->willReturn('spec1'); $this->beforeSpecification($specEvent); $this->afterExample($exampleEvent); $expected = "not ok 1 - spec1: foobar\n ---\n message: 'The example result type was unknown to formatter'\n severity: fail\n ..."; $io->writeln($expected)->shouldHaveBeenCalled(); }