<?php
namespace Drush\Preflight;

use PHPUnit\Framework\TestCase;

class ArgsPreprocessorTest extends TestCase
{

    use \Drush\FixtureFactory;

    /**
     * @dataProvider argTestValues
     */
    public function testArgPreprocessor(
        $argv,
        $alias,
        $selectedSite,
        $configPath,
        $aliasPath,
        $commandPath,
        $isLocal,
        $unprocessedArgs)
    {

        $argProcessor = new ArgsPreprocessor();
        $preflightArgs = new PreflightArgs();
        $preflightArgs->setHomeDir($this->environment()->homeDir());
        $argProcessor->parse($argv, $preflightArgs);

        $this->assertEquals($unprocessedArgs, implode(',', $preflightArgs->args()));
        $this->assertEquals($alias, $preflightArgs->alias());
        $this->assertEquals($selectedSite, $preflightArgs->selectedSite());
        $this->assertEquals($configPath, $preflightArgs->configPaths());
        $this->assertEquals($aliasPath, $preflightArgs->aliasPaths());
    }

    public static function argTestValues()
    {
        return [
            [
                [
                    'drush',
                    '@alias',
                    'status',
                    'version',
                ],

                '@alias',
                null,
                [],
                [],
                [],
                null,
                'drush,status,version',
            ],

            [
                [
                    'drush',
                    '#multisite',
                    'status',
                    'version',
                ],

                '#multisite',
                null,
                [],
                [],
                [],
                null,
                'drush,status,version',
            ],

            [
                [
                    'drush',
                    'user@server/path',
                    'status',
                    'version',
                ],

                'user@server/path',
                null,
                [],
                [],
                [],
                null,
                'drush,status,version',
            ],

            [
                [
                    'drush',
                    'rsync',
                    '@from',
                    '@to',
                    '--delete',
                ],

                null,
                null,
                [],
                [],
                [],
                null,
                'drush,rsync,@from,@to,--delete',
            ],

            [
                [
                    'drush',
                    '--root',
                    '/path/to/drupal',
                    'status',
                    '--verbose',
                ],

                null,
                '/path/to/drupal',
                [],
                [],
                [],
                null,
                'drush,status,--verbose',
            ],

            [
                [
                    'drush',
                    '--root=/path/to/drupal',
                    'status',
                    '--verbose',
                ],

                null,
                '/path/to/drupal',
                [],
                [],
                [],
                null,
                'drush,status,--verbose',
            ],

            [
                [
                    'drush',
                    'status',
                    '--verbose',
                    '--config',
                    '/path/to/config',
                ],

                null,
                null,
                ['/path/to/config'],
                [],
                [],
                null,
                'drush,status,--verbose',
            ],

            [
                [
                    'drush',
                    'status',
                    '--verbose',
                    '--config=/path/to/config',
                ],

                null,
                null,
                ['/path/to/config'],
                [],
                [],
                null,
                'drush,status,--verbose',
            ],

            [
                [
                    'drush',
                    'status',
                    '--verbose',
                    '--config=/path/to/config',
                    '--config=/other/path/to/config',
                ],

                null,
                null,
                ['/path/to/config','/other/path/to/config'],
                [],
                [],
                null,
                'drush,status,--verbose',
            ],

            [
                [
                    'drush',
                    'status',
                    '--verbose',
                    '--alias-path',
                    '/path/to/aliases',
                ],

                null,
                null,
                [],
                ['/path/to/aliases'],
                [],
                null,
                'drush,status,--verbose',
            ],

            [
                [
                    'drush',
                    'status',
                    '--verbose',
                    '--alias-path=/path/to/aliases',
                ],

                null,
                null,
                [],
                ['/path/to/aliases'],
                [],
                null,
                'drush,status,--verbose',
            ],

            [
                [
                    'drush',
                    'status',
                    '--verbose',
                    '--alias-path=/path/to/aliases',
                    '--alias-path=/other/path/to/aliases',
                ],

                null,
                null,
                [],
                ['/path/to/aliases','/other/path/to/aliases'],
                [],
                null,
                'drush,status,--verbose',
            ],

            [
                [
                    'drush',
                    'status',
                    '--verbose',
                    '--include',
                    '/path/to/commands',
                ],

                null,
                null,
                [],
                [],
                ['path/to/commands'],
                null,
                'drush,status,--verbose',
            ],

            [
                [
                    'drush',
                    'status',
                    '--verbose',
                    '--include=/path/to/commands',
                ],

                null,
                null,
                [],
                [],
                ['path/to/commands'],
                null,
                'drush,status,--verbose',
            ],

            [
                [
                    'drush',
                    'status',
                    '--verbose',
                    '--include=/path/to/commands',
                ],

                null,
                null,
                [],
                [],
                ['path/to/commands'],
                null,
                'drush,status,--verbose',
            ],

            [
                [
                    'drush',
                    'status',
                    '--verbose',
                    '--include=/path/to/commands',
                    '--include=/other/path/to/commands',
                ],

                null,
                null,
                [],
                [],
                ['path/to/commands','/other/path/to/commands'],
                null,
                'drush,status,--verbose',
            ],

            [
                [
                    'drush',
                    'status',
                    '--verbose',
                    '--local',
                ],

                null,
                null,
                [],
                [],
                [],
                true,
                'drush,status,--verbose',
            ],

            [
                [
                    'drush',
                    '@alias',
                    'status',
                    '--verbose',
                    '--local',
                    '--alias-path=/path/to/aliases',
                    '--config=/path/to/config',
                    '--root=/path/to/drupal',
                    '--include=/path/to/commands',
                ],

                '@alias',
                '/path/to/drupal',
                ['/path/to/config'],
                ['/path/to/aliases'],
                ['path/to/commands'],
                true,
                'drush,status,--verbose',
            ],
        ];
    }
}
