--- /dev/null
+<?php
+
+namespace Unish;
+
+use Webmozart\PathUtil\Path;
+
+/**
+ * @group base
+ */
+class AnnotatedCommandCase extends CommandUnishTestCase
+{
+ use TestModuleHelperTrait;
+
+ public function testGlobal()
+ {
+ $globalIncludes = $targetDir = Path::join(__DIR__, 'resources/global-includes');
+
+ $options = [];
+
+ // We modified the set of available Drush commands; we need to clear the Drush command cache
+ $this->drush('cc', ['drush'], $options);
+
+ // drush foobar
+ $options['include'] = "$globalIncludes";
+ $this->drush('foobar', [], $options);
+ $output = $this->getOutput();
+ $this->assertEquals('baz', $output);
+
+ // Drush foobaz
+ $this->drush('foobaz', [], $options);
+ $output = $this->getOutput();
+ $this->assertEquals('bar', $output);
+
+ $options = [
+ 'yes' => null,
+ 'include' => $globalIncludes,
+ 'directory' => self::getSandbox(),
+ ];
+
+ $original = getenv('SHELL_INTERACTIVE');
+ $this->setEnv(['SHELL_INTERACTIVE' => 1]);
+ $this->drush('generate', ['foo-example'], $options);
+ $this->setEnv(['SHELL_INTERACTIVE' => $original]);
+
+ $target = Path::join($this->getSandbox(), 'foo.php');
+ $actual = trim(file_get_contents($target));
+ $this->assertEquals('Foo.', $actual);
+ unlink($target);
+ }
+
+ public function testExecute()
+ {
+ $this->setUpDrupal(1, true);
+
+ // Copy the 'woot' module over to the Drupal site we just set up.
+ $this->setupModulesForTests(['woot'], Path::join(__DIR__, 'resources/modules/d8'));
+
+ // Enable our module. This will also clear the commandfile cache.
+ $this->drush('pm-enable', ['woot']);
+
+ // In theory this is not necessary, but this test keeps failing.
+ // $this->drush('cc', array('drush'), $options);
+
+ // Make sure that modules can supply DCG Generators and they work.
+ $optionsExample['answers'] = json_encode([
+ 'name' => 'foo',
+ 'machine_name' => 'bar',
+ ]);
+ $optionsExample['directory'] = self::getSandbox();
+ $optionsExample['yes'] = null;
+ $original = getenv('SHELL_INTERACTIVE');
+ $this->setEnv(['SHELL_INTERACTIVE' => 1]);
+ $this->drush('generate', ['woot-example'], $optionsExample);
+ $this->setEnv(['SHELL_INTERACTIVE' => $original]);
+ $target = Path::join(self::getSandbox(), '/src/Commands/ExampleBarCommands.php');
+ $actual = trim(file_get_contents($target));
+ $this->assertEquals('ExampleBarCommands says Woot mightily.', $actual);
+
+ // drush woot
+ $this->drush('woot');
+ $output = $this->getOutput();
+ $this->assertEquals('Woot!', $output);
+
+ // drush my-cat bet alpha --flip
+ $this->drush('my-cat', ['bet', 'alpha'], ['flip' => null]);
+ $output = $this->getOutput();
+ $this->assertEquals('alphabet', $output);
+
+ // drush my-cat bet alpha --flip
+ $this->drush('my-cat', ['bet', 'alpha'], ['flip' => null, 'ignored-modules' => 'woot'], null, null, self::EXIT_ERROR);
+
+ $this->drush('try-formatters');
+ $output = $this->getOutput();
+ $expected = <<<EOT
+ ------ ------ -------
+ I II III
+ ------ ------ -------
+ One Two Three
+ Eins Zwei Drei
+ Ichi Ni San
+ Uno Dos Tres
+ ------ ------ -------
+EOT;
+ $this->assertEquals(trim(preg_replace('#[ \n]+#', ' ', $expected)), trim(preg_replace('#[ \n]+#', ' ', $output)));
+
+ $this->drush('try-formatters --format=yaml --fields=III,II', [], [], null, null, self::EXIT_SUCCESS);
+ $output = $this->getOutput();
+ // TODO: If there are different versions of symfony/yaml in Drush and Drupal,
+ // then we can get indentation errors. Ignore that in these tests; this is not
+ // a problem with site-local Drush.
+ $output = str_replace(' ', ' ', $output);
+ $expected = <<<EOT
+en:
+ third: Three
+ second: Two
+de:
+ third: Drei
+ second: Zwei
+jp:
+ third: San
+ second: Ni
+es:
+ third: Tres
+ second: Dos
+EOT;
+ $this->assertEquals($expected, $output);
+
+ $this->drush('try-formatters', [], ['format' => 'json']);
+ $data = $this->getOutput();
+ $expected = <<<EOT
+{
+ "en": {
+ "first": "One",
+ "second": "Two",
+ "third": "Three"
+ },
+ "de": {
+ "first": "Eins",
+ "second": "Zwei",
+ "third": "Drei"
+ },
+ "jp": {
+ "first": "Ichi",
+ "second": "Ni",
+ "third": "San"
+ },
+ "es": {
+ "first": "Uno",
+ "second": "Dos",
+ "third": "Tres"
+ }
+}
+EOT;
+ $this->assertEquals($expected, $data);
+
+ // drush help my-cat
+ $this->drush('help', ['my-cat']);
+ $output = $this->getOutput();
+ $this->assertContains('bet alpha --flip Concatinate "alpha" and "bet".', $output);
+ $this->assertContains('Aliases: c', $output);
+
+ // drush help woot
+ $this->drush('help', ['woot']);
+ $output = $this->getOutput();
+ $this->assertContains('Woot mightily.', $output);
+
+ // TODO: support console.command commands
+ $this->drush('annotated:greet symfony');
+ $output = $this->getOutput();
+ $this->assertEquals('Hello symfony', $output);
+
+ $this->drush('demo:greet symfony');
+ $output = $this->getOutput();
+ $this->assertEquals('Hello symfony', $output);
+
+ $this->markTestSkipped('--help not working yet.');
+
+ // drush my-cat --help
+ $this->drush('my-cat', [], ['help' => null]);
+ $output = $this->getOutput();
+ $this->assertContains('my-cat bet alpha --flip', $output);
+ $this->assertContains('The first parameter', $output);
+ $this->assertContains('The other parameter', $output);
+ $this->assertContains('Whether or not the second parameter', $output);
+
+ // drush woot --help
+ $this->drush('woot', [], ['help' => null]);
+ $output = $this->getOutput();
+ $this->assertContains('Usage:', $output);
+ $this->assertContains('woot [options]', $output);
+ $this->assertContains('Woot mightily.', $output);
+
+ // drush try-formatters --help
+ $this->drush('try-formatters', [], ['help' => null]);
+ $output = $this->getOutput();
+ $this->assertContains('Demonstrate formatters', $output);
+ $this->assertContains('try:formatters --fields=first,third', $output);
+ $this->assertContains('try:formatters --fields=III,II', $output);
+ // $this->assertContains('--fields=<first, second, third>', $output);
+ $this->assertContains('Available fields:', $output);
+ $this->assertContains('[default: "table"]', $output);
+
+ $this->markTestSkipped('--ignored-modules not supported yet');
+
+ // TODO: Support --ignored-modules
+ // drush woot --help with the 'woot' module ignored
+ $this->drush('woot', [], ['help' => null, 'ignored-modules' => 'woot'], null, null, self::EXIT_ERROR);
+ }
+
+ public function setupGlobalExtensionsForTests()
+ {
+ $globalExtension = __DIR__ . '/resources/global-includes';
+ $targetDir = Path::join(self::getSandbox(), 'global-includes');
+ $this->mkdir($targetDir);
+ $this->recursiveCopy($globalExtension, $targetDir);
+ return $targetDir;
+ }
+}