This repository has been archived on 2025-01-19. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
drupalcampbristol/vendor/chi-teck/drupal-code-generator/src/GeneratorTester.php

182 lines
4.2 KiB
PHP
Raw Normal View History

2018-11-23 12:29:20 +00:00
<?php
namespace DrupalCodeGenerator;
use DrupalCodeGenerator\Tests\QuestionHelper;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Tester\CommandTester;
/**
* Eases the testing of generator commands.
*/
class GeneratorTester {
/**
* Command to test.
*
* @var \Symfony\Component\Console\Command\Command
*/
protected $command;
/**
* Command tester.
*
* @var \Symfony\Component\Console\Tester\CommandTester
*/
protected $commandTester;
/**
* Working directory.
*
* @var string
*/
protected $directory;
/**
* An associative array representing an interaction with the generator.
*
* @var array
*/
protected $interaction = [];
/**
* The fixtures.
*
* @var array
*/
protected $fixtures = [];
/**
* GeneratorTester constructor.
*/
public function __construct(Command $command) {
$this->command = $command;
$this->commandTester = new CommandTester($this->command);
$application = ApplicationFactory::create();
$helper_set = $application->getHelperSet();
$helper_set->set(new QuestionHelper());
$application->add($this->command);
$this->setDirectory(sys_get_temp_dir() . '/dcg_' . uniqid());
}
/**
* Getter for the directory.
*
* @return string
* The directory.
*/
public function getDirectory() {
return $this->directory;
}
/**
* Setter for the directory.
*
* @param string $directory
* The directory.
*/
public function setDirectory($directory) {
$this->directory = $directory;
}
/**
* Getter for the interaction.
*
* @return array
* The interaction.
*/
public function getInteraction() {
return $this->interaction;
}
/**
* Setter for the interaction.
*
* @param array $interaction
* The interaction.
*/
public function setInteraction(array $interaction) {
$this->interaction = $interaction;
}
/**
* Getter for the fixtures.
*
* @return array
* The fixtures.
*/
public function getFixtures() {
return $this->fixtures;
}
/**
* Setter for the fixtures.
*
* @param array $fixtures
* The fixtures.
*/
public function setFixtures(array $fixtures) {
$this->fixtures = $fixtures;
}
/**
* Executes the command.
*
* @return int
* The command exit code
*/
public function execute() {
return $this->commandTester
->setInputs(array_values($this->interaction))
->execute(['--directory' => $this->getDirectory()]);
}
/**
* Gets the display returned by the last execution of the command.
*
* @return string
* The display.
*/
public function getDisplay() {
return $this->commandTester->getDisplay();
}
/**
* Gets expected display.
*
* @return string
* Expected display.
*/
public function getExpectedDisplay() {
$default_name = Utils::machine2human(basename($this->directory));
$expected_display = "\n";
$name = $this->command->getName();
$title = "Welcome to $name generator!";
$expected_display .= " $title\n";
$expected_display .= str_repeat('', strlen($title) + 2) . "\n";
foreach ($this->interaction as $question => $answer) {
$question = preg_replace('/^<\d*> /', '', $question);
$expected_display .= "\n";
$expected_display .= " $question\n";
$expected_display .= "\n";
}
$expected_display = str_replace('%default_name%', $default_name, $expected_display);
$default_machine_name = Utils::human2machine(basename($this->directory));
$expected_display = str_replace('%default_machine_name%', $default_machine_name, $expected_display);
$targets = implode("\n", array_keys($this->fixtures));
$expected_display .= "\n";
$expected_display .= " The following directories and files have been created or updated:\n";
$expected_display .= "\n";
$expected_display .= "$targets\n";
$expected_display .= "\n";
return $expected_display;
}
}