radarrplexorganizrnginxsonarrdashboardserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboardmuximuxlandingpagestartpagelandinghtpc
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							959 lines
						
					
					
						
							41 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							959 lines
						
					
					
						
							41 KiB
						
					
					
				
								<?php
							 | 
						|
								
							 | 
						|
								/*
							 | 
						|
								 * This file is part of the Symfony package.
							 | 
						|
								 *
							 | 
						|
								 * (c) Fabien Potencier <fabien@symfony.com>
							 | 
						|
								 *
							 | 
						|
								 * For the full copyright and license information, please view the LICENSE
							 | 
						|
								 * file that was distributed with this source code.
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								namespace Symfony\Component\Console\Tests\Helper;
							 | 
						|
								
							 | 
						|
								use Symfony\Component\Console\Formatter\OutputFormatter;
							 | 
						|
								use Symfony\Component\Console\Helper\QuestionHelper;
							 | 
						|
								use Symfony\Component\Console\Helper\HelperSet;
							 | 
						|
								use Symfony\Component\Console\Helper\FormatterHelper;
							 | 
						|
								use Symfony\Component\Console\Output\StreamOutput;
							 | 
						|
								use Symfony\Component\Console\Question\ChoiceQuestion;
							 | 
						|
								use Symfony\Component\Console\Question\ConfirmationQuestion;
							 | 
						|
								use Symfony\Component\Console\Question\Question;
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * @group tty
							 | 
						|
								 */
							 | 
						|
								class QuestionHelperTest extends AbstractQuestionHelperTest
							 | 
						|
								{
							 | 
						|
								    public function testAskChoice()
							 | 
						|
								    {
							 | 
						|
								        $questionHelper = new QuestionHelper();
							 | 
						|
								
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $questionHelper->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $heroes = array('Superman', 'Batman', 'Spiderman');
							 | 
						|
								
							 | 
						|
								        $inputStream = $this->getInputStream("\n1\n  1  \nFabien\n1\nFabien\n1\n0,2\n 0 , 2  \n\n\n");
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('What is your favorite superhero?', $heroes, '2');
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								        // first answer is an empty answer, we're supposed to receive the default value
							 | 
						|
								        $this->assertEquals('Spiderman', $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('What is your favorite superhero?', $heroes);
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								        $this->assertEquals('Batman', $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('Batman', $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('What is your favorite superhero?', $heroes);
							 | 
						|
								        $question->setErrorMessage('Input "%s" is not a superhero!');
							 | 
						|
								        $question->setMaxAttempts(2);
							 | 
						|
								        $this->assertEquals('Batman', $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream), $output = $this->createOutputInterface(), $question));
							 | 
						|
								
							 | 
						|
								        rewind($output->getStream());
							 | 
						|
								        $stream = stream_get_contents($output->getStream());
							 | 
						|
								        $this->assertContains('Input "Fabien" is not a superhero!', $stream);
							 | 
						|
								
							 | 
						|
								        try {
							 | 
						|
								            $question = new ChoiceQuestion('What is your favorite superhero?', $heroes, '1');
							 | 
						|
								            $question->setMaxAttempts(1);
							 | 
						|
								            $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream), $output = $this->createOutputInterface(), $question);
							 | 
						|
								            $this->fail();
							 | 
						|
								        } catch (\InvalidArgumentException $e) {
							 | 
						|
								            $this->assertEquals('Value "Fabien" is invalid', $e->getMessage());
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('What is your favorite superhero?', $heroes, null);
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								        $question->setMultiselect(true);
							 | 
						|
								
							 | 
						|
								        $this->assertEquals(array('Batman'), $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals(array('Superman', 'Spiderman'), $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals(array('Superman', 'Spiderman'), $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('What is your favorite superhero?', $heroes, '0,1');
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								        $question->setMultiselect(true);
							 | 
						|
								
							 | 
						|
								        $this->assertEquals(array('Superman', 'Batman'), $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('What is your favorite superhero?', $heroes, ' 0 , 1 ');
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								        $question->setMultiselect(true);
							 | 
						|
								
							 | 
						|
								        $this->assertEquals(array('Superman', 'Batman'), $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('What is your favorite superhero?', $heroes, 0);
							 | 
						|
								        // We are supposed to get the default value since we are not in interactive mode
							 | 
						|
								        $this->assertEquals('Superman', $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream, true), $this->createOutputInterface(), $question));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testAsk()
							 | 
						|
								    {
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								
							 | 
						|
								        $inputStream = $this->getInputStream("\n8AM\n");
							 | 
						|
								
							 | 
						|
								        $question = new Question('What time is it?', '2PM');
							 | 
						|
								        $this->assertEquals('2PM', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								
							 | 
						|
								        $question = new Question('What time is it?', '2PM');
							 | 
						|
								        $this->assertEquals('8AM', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $output = $this->createOutputInterface(), $question));
							 | 
						|
								
							 | 
						|
								        rewind($output->getStream());
							 | 
						|
								        $this->assertEquals('What time is it?', stream_get_contents($output->getStream()));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testAskWithAutocomplete()
							 | 
						|
								    {
							 | 
						|
								        if (!$this->hasSttyAvailable()) {
							 | 
						|
								            $this->markTestSkipped('`stty` is required to test autocomplete functionality');
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        // Acm<NEWLINE>
							 | 
						|
								        // Ac<BACKSPACE><BACKSPACE>s<TAB>Test<NEWLINE>
							 | 
						|
								        // <NEWLINE>
							 | 
						|
								        // <UP ARROW><UP ARROW><NEWLINE>
							 | 
						|
								        // <UP ARROW><UP ARROW><UP ARROW><UP ARROW><UP ARROW><TAB>Test<NEWLINE>
							 | 
						|
								        // <DOWN ARROW><NEWLINE>
							 | 
						|
								        // S<BACKSPACE><BACKSPACE><DOWN ARROW><DOWN ARROW><NEWLINE>
							 | 
						|
								        // F00<BACKSPACE><BACKSPACE>oo<TAB><NEWLINE>
							 | 
						|
								        $inputStream = $this->getInputStream("Acm\nAc\177\177s\tTest\n\n\033[A\033[A\n\033[A\033[A\033[A\033[A\033[A\tTest\n\033[B\nS\177\177\033[B\033[B\nF00\177\177oo\t\n");
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $dialog->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $question = new Question('Please select a bundle', 'FrameworkBundle');
							 | 
						|
								        $question->setAutocompleterValues(array('AcmeDemoBundle', 'AsseticBundle', 'SecurityBundle', 'FooBundle'));
							 | 
						|
								
							 | 
						|
								        $this->assertEquals('AcmeDemoBundle', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('AsseticBundleTest', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('FrameworkBundle', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('SecurityBundle', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('FooBundleTest', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('AcmeDemoBundle', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('AsseticBundle', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('FooBundle', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testAskWithAutocompleteWithNonSequentialKeys()
							 | 
						|
								    {
							 | 
						|
								        if (!$this->hasSttyAvailable()) {
							 | 
						|
								            $this->markTestSkipped('`stty` is required to test autocomplete functionality');
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        // <UP ARROW><UP ARROW><NEWLINE><DOWN ARROW><DOWN ARROW><NEWLINE>
							 | 
						|
								        $inputStream = $this->getInputStream("\033[A\033[A\n\033[B\033[B\n");
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $dialog->setHelperSet(new HelperSet(array(new FormatterHelper())));
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('Please select a bundle', array(1 => 'AcmeDemoBundle', 4 => 'AsseticBundle'));
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								
							 | 
						|
								        $this->assertEquals('AcmeDemoBundle', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('AsseticBundle', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testAskWithAutocompleteWithExactMatch()
							 | 
						|
								    {
							 | 
						|
								        if (!$this->hasSttyAvailable()) {
							 | 
						|
								            $this->markTestSkipped('`stty` is required to test autocomplete functionality');
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        $inputStream = $this->getInputStream("b\n");
							 | 
						|
								
							 | 
						|
								        $possibleChoices = array(
							 | 
						|
								            'a' => 'berlin',
							 | 
						|
								            'b' => 'copenhagen',
							 | 
						|
								            'c' => 'amsterdam',
							 | 
						|
								        );
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $dialog->setHelperSet(new HelperSet(array(new FormatterHelper())));
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('Please select a city', $possibleChoices);
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								
							 | 
						|
								        $this->assertSame('b', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testAutocompleteWithTrailingBackslash()
							 | 
						|
								    {
							 | 
						|
								        if (!$this->hasSttyAvailable()) {
							 | 
						|
								            $this->markTestSkipped('`stty` is required to test autocomplete functionality');
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        $inputStream = $this->getInputStream('E');
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $dialog->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $question = new Question('');
							 | 
						|
								        $expectedCompletion = 'ExampleNamespace\\';
							 | 
						|
								        $question->setAutocompleterValues(array($expectedCompletion));
							 | 
						|
								
							 | 
						|
								        $output = $this->createOutputInterface();
							 | 
						|
								        $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $output, $question);
							 | 
						|
								
							 | 
						|
								        $outputStream = $output->getStream();
							 | 
						|
								        rewind($outputStream);
							 | 
						|
								        $actualOutput = stream_get_contents($outputStream);
							 | 
						|
								
							 | 
						|
								        // Shell control (esc) sequences are not so important: we only care that
							 | 
						|
								        // <hl> tag is interpreted correctly and replaced
							 | 
						|
								        $irrelevantEscSequences = array(
							 | 
						|
								            "\0337" => '', // Save cursor position
							 | 
						|
								            "\0338" => '', // Restore cursor position
							 | 
						|
								            "\033[K" => '', // Clear line from cursor till the end
							 | 
						|
								        );
							 | 
						|
								
							 | 
						|
								        $importantActualOutput = strtr($actualOutput, $irrelevantEscSequences);
							 | 
						|
								
							 | 
						|
								        // Remove colors (e.g. "\033[30m", "\033[31;41m")
							 | 
						|
								        $importantActualOutput = preg_replace('/\033\[\d+(;\d+)?m/', '', $importantActualOutput);
							 | 
						|
								
							 | 
						|
								        $this->assertEquals($expectedCompletion, $importantActualOutput);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testAskHiddenResponse()
							 | 
						|
								    {
							 | 
						|
								        if ('\\' === DIRECTORY_SEPARATOR) {
							 | 
						|
								            $this->markTestSkipped('This test is not supported on Windows');
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								
							 | 
						|
								        $question = new Question('What time is it?');
							 | 
						|
								        $question->setHidden(true);
							 | 
						|
								
							 | 
						|
								        $this->assertEquals('8AM', $dialog->ask($this->createStreamableInputInterfaceMock($this->getInputStream("8AM\n")), $this->createOutputInterface(), $question));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @dataProvider getAskConfirmationData
							 | 
						|
								     */
							 | 
						|
								    public function testAskConfirmation($question, $expected, $default = true)
							 | 
						|
								    {
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								
							 | 
						|
								        $inputStream = $this->getInputStream($question."\n");
							 | 
						|
								        $question = new ConfirmationQuestion('Do you like French fries?', $default);
							 | 
						|
								        $this->assertEquals($expected, $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question), 'confirmation question should '.($expected ? 'pass' : 'cancel'));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getAskConfirmationData()
							 | 
						|
								    {
							 | 
						|
								        return array(
							 | 
						|
								            array('', true),
							 | 
						|
								            array('', false, false),
							 | 
						|
								            array('y', true),
							 | 
						|
								            array('yes', true),
							 | 
						|
								            array('n', false),
							 | 
						|
								            array('no', false),
							 | 
						|
								        );
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testAskConfirmationWithCustomTrueAnswer()
							 | 
						|
								    {
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								
							 | 
						|
								        $inputStream = $this->getInputStream("j\ny\n");
							 | 
						|
								        $question = new ConfirmationQuestion('Do you like French fries?', false, '/^(j|y)/i');
							 | 
						|
								        $this->assertTrue($dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $question = new ConfirmationQuestion('Do you like French fries?', false, '/^(j|y)/i');
							 | 
						|
								        $this->assertTrue($dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testAskAndValidate()
							 | 
						|
								    {
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $dialog->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $error = 'This is not a color!';
							 | 
						|
								        $validator = function ($color) use ($error) {
							 | 
						|
								            if (!in_array($color, array('white', 'black'))) {
							 | 
						|
								                throw new \InvalidArgumentException($error);
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            return $color;
							 | 
						|
								        };
							 | 
						|
								
							 | 
						|
								        $question = new Question('What color was the white horse of Henry IV?', 'white');
							 | 
						|
								        $question->setValidator($validator);
							 | 
						|
								        $question->setMaxAttempts(2);
							 | 
						|
								
							 | 
						|
								        $inputStream = $this->getInputStream("\nblack\n");
							 | 
						|
								        $this->assertEquals('white', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('black', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								
							 | 
						|
								        try {
							 | 
						|
								            $dialog->ask($this->createStreamableInputInterfaceMock($this->getInputStream("green\nyellow\norange\n")), $this->createOutputInterface(), $question);
							 | 
						|
								            $this->fail();
							 | 
						|
								        } catch (\InvalidArgumentException $e) {
							 | 
						|
								            $this->assertEquals($error, $e->getMessage());
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @dataProvider simpleAnswerProvider
							 | 
						|
								     */
							 | 
						|
								    public function testSelectChoiceFromSimpleChoices($providedAnswer, $expectedValue)
							 | 
						|
								    {
							 | 
						|
								        $possibleChoices = array(
							 | 
						|
								            'My environment 1',
							 | 
						|
								            'My environment 2',
							 | 
						|
								            'My environment 3',
							 | 
						|
								        );
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $dialog->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('Please select the environment to load', $possibleChoices);
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								        $answer = $dialog->ask($this->createStreamableInputInterfaceMock($this->getInputStream($providedAnswer."\n")), $this->createOutputInterface(), $question);
							 | 
						|
								
							 | 
						|
								        $this->assertSame($expectedValue, $answer);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function simpleAnswerProvider()
							 | 
						|
								    {
							 | 
						|
								        return array(
							 | 
						|
								            array(0, 'My environment 1'),
							 | 
						|
								            array(1, 'My environment 2'),
							 | 
						|
								            array(2, 'My environment 3'),
							 | 
						|
								            array('My environment 1', 'My environment 1'),
							 | 
						|
								            array('My environment 2', 'My environment 2'),
							 | 
						|
								            array('My environment 3', 'My environment 3'),
							 | 
						|
								        );
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @dataProvider specialCharacterInMultipleChoice
							 | 
						|
								     */
							 | 
						|
								    public function testSpecialCharacterChoiceFromMultipleChoiceList($providedAnswer, $expectedValue)
							 | 
						|
								    {
							 | 
						|
								        $possibleChoices = array(
							 | 
						|
								            '.',
							 | 
						|
								            'src',
							 | 
						|
								        );
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $inputStream = $this->getInputStream($providedAnswer."\n");
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $dialog->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('Please select the directory', $possibleChoices);
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								        $question->setMultiselect(true);
							 | 
						|
								        $answer = $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question);
							 | 
						|
								
							 | 
						|
								        $this->assertSame($expectedValue, $answer);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function specialCharacterInMultipleChoice()
							 | 
						|
								    {
							 | 
						|
								        return array(
							 | 
						|
								            array('.', array('.')),
							 | 
						|
								            array('., src', array('.', 'src')),
							 | 
						|
								        );
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @dataProvider mixedKeysChoiceListAnswerProvider
							 | 
						|
								     */
							 | 
						|
								    public function testChoiceFromChoicelistWithMixedKeys($providedAnswer, $expectedValue)
							 | 
						|
								    {
							 | 
						|
								        $possibleChoices = array(
							 | 
						|
								            '0' => 'No environment',
							 | 
						|
								            '1' => 'My environment 1',
							 | 
						|
								            'env_2' => 'My environment 2',
							 | 
						|
								            3 => 'My environment 3',
							 | 
						|
								        );
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $dialog->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('Please select the environment to load', $possibleChoices);
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								        $answer = $dialog->ask($this->createStreamableInputInterfaceMock($this->getInputStream($providedAnswer."\n")), $this->createOutputInterface(), $question);
							 | 
						|
								
							 | 
						|
								        $this->assertSame($expectedValue, $answer);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function mixedKeysChoiceListAnswerProvider()
							 | 
						|
								    {
							 | 
						|
								        return array(
							 | 
						|
								            array('0', '0'),
							 | 
						|
								            array('No environment', '0'),
							 | 
						|
								            array('1', '1'),
							 | 
						|
								            array('env_2', 'env_2'),
							 | 
						|
								            array(3, '3'),
							 | 
						|
								            array('My environment 1', '1'),
							 | 
						|
								        );
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @dataProvider answerProvider
							 | 
						|
								     */
							 | 
						|
								    public function testSelectChoiceFromChoiceList($providedAnswer, $expectedValue)
							 | 
						|
								    {
							 | 
						|
								        $possibleChoices = array(
							 | 
						|
								            'env_1' => 'My environment 1',
							 | 
						|
								            'env_2' => 'My environment',
							 | 
						|
								            'env_3' => 'My environment',
							 | 
						|
								        );
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $dialog->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('Please select the environment to load', $possibleChoices);
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								        $answer = $dialog->ask($this->createStreamableInputInterfaceMock($this->getInputStream($providedAnswer."\n")), $this->createOutputInterface(), $question);
							 | 
						|
								
							 | 
						|
								        $this->assertSame($expectedValue, $answer);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @expectedException        \InvalidArgumentException
							 | 
						|
								     * @expectedExceptionMessage The provided answer is ambiguous. Value should be one of env_2 or env_3.
							 | 
						|
								     */
							 | 
						|
								    public function testAmbiguousChoiceFromChoicelist()
							 | 
						|
								    {
							 | 
						|
								        $possibleChoices = array(
							 | 
						|
								            'env_1' => 'My first environment',
							 | 
						|
								            'env_2' => 'My environment',
							 | 
						|
								            'env_3' => 'My environment',
							 | 
						|
								        );
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $dialog->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('Please select the environment to load', $possibleChoices);
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								
							 | 
						|
								        $dialog->ask($this->createStreamableInputInterfaceMock($this->getInputStream("My environment\n")), $this->createOutputInterface(), $question);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function answerProvider()
							 | 
						|
								    {
							 | 
						|
								        return array(
							 | 
						|
								            array('env_1', 'env_1'),
							 | 
						|
								            array('env_2', 'env_2'),
							 | 
						|
								            array('env_3', 'env_3'),
							 | 
						|
								            array('My environment 1', 'env_1'),
							 | 
						|
								        );
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testNoInteraction()
							 | 
						|
								    {
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $question = new Question('Do you have a job?', 'not yet');
							 | 
						|
								        $this->assertEquals('not yet', $dialog->ask($this->createStreamableInputInterfaceMock(null, false), $this->createOutputInterface(), $question));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @requires function mb_strwidth
							 | 
						|
								     */
							 | 
						|
								    public function testChoiceOutputFormattingQuestionForUtf8Keys()
							 | 
						|
								    {
							 | 
						|
								        $question = 'Lorem ipsum?';
							 | 
						|
								        $possibleChoices = array(
							 | 
						|
								            'foo' => 'foo',
							 | 
						|
								            'żółw' => 'bar',
							 | 
						|
								            'łabądź' => 'baz',
							 | 
						|
								        );
							 | 
						|
								        $outputShown = array(
							 | 
						|
								            $question,
							 | 
						|
								            '  [<info>foo   </info>] foo',
							 | 
						|
								            '  [<info>żółw  </info>] bar',
							 | 
						|
								            '  [<info>łabądź</info>] baz',
							 | 
						|
								        );
							 | 
						|
								        $output = $this->getMockBuilder('\Symfony\Component\Console\Output\OutputInterface')->getMock();
							 | 
						|
								        $output->method('getFormatter')->willReturn(new OutputFormatter());
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $dialog->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $output->expects($this->once())->method('writeln')->with($this->equalTo($outputShown));
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion($question, $possibleChoices, 'foo');
							 | 
						|
								        $dialog->ask($this->createStreamableInputInterfaceMock($this->getInputStream("\n")), $output, $question);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @group legacy
							 | 
						|
								     */
							 | 
						|
								    public function testLegacyAskChoice()
							 | 
						|
								    {
							 | 
						|
								        $questionHelper = new QuestionHelper();
							 | 
						|
								
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $questionHelper->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $heroes = array('Superman', 'Batman', 'Spiderman');
							 | 
						|
								
							 | 
						|
								        $questionHelper->setInputStream($this->getInputStream("\n1\n  1  \nFabien\n1\nFabien\n1\n0,2\n 0 , 2  \n\n\n"));
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('What is your favorite superhero?', $heroes, '2');
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								        // first answer is an empty answer, we're supposed to receive the default value
							 | 
						|
								        $this->assertEquals('Spiderman', $questionHelper->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('What is your favorite superhero?', $heroes);
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								        $this->assertEquals('Batman', $questionHelper->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('Batman', $questionHelper->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('What is your favorite superhero?', $heroes);
							 | 
						|
								        $question->setErrorMessage('Input "%s" is not a superhero!');
							 | 
						|
								        $question->setMaxAttempts(2);
							 | 
						|
								        $this->assertEquals('Batman', $questionHelper->ask($this->createInputInterfaceMock(), $output = $this->createOutputInterface(), $question));
							 | 
						|
								
							 | 
						|
								        rewind($output->getStream());
							 | 
						|
								        $stream = stream_get_contents($output->getStream());
							 | 
						|
								        $this->assertContains('Input "Fabien" is not a superhero!', $stream);
							 | 
						|
								
							 | 
						|
								        try {
							 | 
						|
								            $question = new ChoiceQuestion('What is your favorite superhero?', $heroes, '1');
							 | 
						|
								            $question->setMaxAttempts(1);
							 | 
						|
								            $questionHelper->ask($this->createInputInterfaceMock(), $output = $this->createOutputInterface(), $question);
							 | 
						|
								            $this->fail();
							 | 
						|
								        } catch (\InvalidArgumentException $e) {
							 | 
						|
								            $this->assertEquals('Value "Fabien" is invalid', $e->getMessage());
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('What is your favorite superhero?', $heroes, null);
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								        $question->setMultiselect(true);
							 | 
						|
								
							 | 
						|
								        $this->assertEquals(array('Batman'), $questionHelper->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals(array('Superman', 'Spiderman'), $questionHelper->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals(array('Superman', 'Spiderman'), $questionHelper->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('What is your favorite superhero?', $heroes, '0,1');
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								        $question->setMultiselect(true);
							 | 
						|
								
							 | 
						|
								        $this->assertEquals(array('Superman', 'Batman'), $questionHelper->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('What is your favorite superhero?', $heroes, ' 0 , 1 ');
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								        $question->setMultiselect(true);
							 | 
						|
								
							 | 
						|
								        $this->assertEquals(array('Superman', 'Batman'), $questionHelper->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @group legacy
							 | 
						|
								     */
							 | 
						|
								    public function testLegacyAsk()
							 | 
						|
								    {
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								
							 | 
						|
								        $dialog->setInputStream($this->getInputStream("\n8AM\n"));
							 | 
						|
								
							 | 
						|
								        $question = new Question('What time is it?', '2PM');
							 | 
						|
								        $this->assertEquals('2PM', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								
							 | 
						|
								        $question = new Question('What time is it?', '2PM');
							 | 
						|
								        $this->assertEquals('8AM', $dialog->ask($this->createInputInterfaceMock(), $output = $this->createOutputInterface(), $question));
							 | 
						|
								
							 | 
						|
								        rewind($output->getStream());
							 | 
						|
								        $this->assertEquals('What time is it?', stream_get_contents($output->getStream()));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @group legacy
							 | 
						|
								     */
							 | 
						|
								    public function testLegacyAskWithAutocomplete()
							 | 
						|
								    {
							 | 
						|
								        if (!$this->hasSttyAvailable()) {
							 | 
						|
								            $this->markTestSkipped('`stty` is required to test autocomplete functionality');
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        // Acm<NEWLINE>
							 | 
						|
								        // Ac<BACKSPACE><BACKSPACE>s<TAB>Test<NEWLINE>
							 | 
						|
								        // <NEWLINE>
							 | 
						|
								        // <UP ARROW><UP ARROW><NEWLINE>
							 | 
						|
								        // <UP ARROW><UP ARROW><UP ARROW><UP ARROW><UP ARROW><TAB>Test<NEWLINE>
							 | 
						|
								        // <DOWN ARROW><NEWLINE>
							 | 
						|
								        // S<BACKSPACE><BACKSPACE><DOWN ARROW><DOWN ARROW><NEWLINE>
							 | 
						|
								        // F00<BACKSPACE><BACKSPACE>oo<TAB><NEWLINE>
							 | 
						|
								        $inputStream = $this->getInputStream("Acm\nAc\177\177s\tTest\n\n\033[A\033[A\n\033[A\033[A\033[A\033[A\033[A\tTest\n\033[B\nS\177\177\033[B\033[B\nF00\177\177oo\t\n");
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $dialog->setInputStream($inputStream);
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $dialog->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $question = new Question('Please select a bundle', 'FrameworkBundle');
							 | 
						|
								        $question->setAutocompleterValues(array('AcmeDemoBundle', 'AsseticBundle', 'SecurityBundle', 'FooBundle'));
							 | 
						|
								
							 | 
						|
								        $this->assertEquals('AcmeDemoBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('AsseticBundleTest', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('FrameworkBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('SecurityBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('FooBundleTest', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('AcmeDemoBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('AsseticBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('FooBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @group legacy
							 | 
						|
								     */
							 | 
						|
								    public function testLegacyAskWithAutocompleteWithNonSequentialKeys()
							 | 
						|
								    {
							 | 
						|
								        if (!$this->hasSttyAvailable()) {
							 | 
						|
								            $this->markTestSkipped('`stty` is required to test autocomplete functionality');
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        // <UP ARROW><UP ARROW><NEWLINE><DOWN ARROW><DOWN ARROW><NEWLINE>
							 | 
						|
								        $inputStream = $this->getInputStream("\033[A\033[A\n\033[B\033[B\n");
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $dialog->setInputStream($inputStream);
							 | 
						|
								        $dialog->setHelperSet(new HelperSet(array(new FormatterHelper())));
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('Please select a bundle', array(1 => 'AcmeDemoBundle', 4 => 'AsseticBundle'));
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								
							 | 
						|
								        $this->assertEquals('AcmeDemoBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('AsseticBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @group legacy
							 | 
						|
								     */
							 | 
						|
								    public function testLegacyAskHiddenResponse()
							 | 
						|
								    {
							 | 
						|
								        if ('\\' === DIRECTORY_SEPARATOR) {
							 | 
						|
								            $this->markTestSkipped('This test is not supported on Windows');
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $dialog->setInputStream($this->getInputStream("8AM\n"));
							 | 
						|
								
							 | 
						|
								        $question = new Question('What time is it?');
							 | 
						|
								        $question->setHidden(true);
							 | 
						|
								
							 | 
						|
								        $this->assertEquals('8AM', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @group        legacy
							 | 
						|
								     * @dataProvider getAskConfirmationData
							 | 
						|
								     */
							 | 
						|
								    public function testLegacyAskConfirmation($question, $expected, $default = true)
							 | 
						|
								    {
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								
							 | 
						|
								        $dialog->setInputStream($this->getInputStream($question."\n"));
							 | 
						|
								        $question = new ConfirmationQuestion('Do you like French fries?', $default);
							 | 
						|
								        $this->assertEquals($expected, $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question), 'confirmation question should '.($expected ? 'pass' : 'cancel'));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @group legacy
							 | 
						|
								     */
							 | 
						|
								    public function testLegacyAskConfirmationWithCustomTrueAnswer()
							 | 
						|
								    {
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								
							 | 
						|
								        $dialog->setInputStream($this->getInputStream("j\ny\n"));
							 | 
						|
								        $question = new ConfirmationQuestion('Do you like French fries?', false, '/^(j|y)/i');
							 | 
						|
								        $this->assertTrue($dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								        $question = new ConfirmationQuestion('Do you like French fries?', false, '/^(j|y)/i');
							 | 
						|
								        $this->assertTrue($dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @group legacy
							 | 
						|
								     */
							 | 
						|
								    public function testLegacyAskAndValidate()
							 | 
						|
								    {
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $dialog->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $error = 'This is not a color!';
							 | 
						|
								        $validator = function ($color) use ($error) {
							 | 
						|
								            if (!in_array($color, array('white', 'black'))) {
							 | 
						|
								                throw new \InvalidArgumentException($error);
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            return $color;
							 | 
						|
								        };
							 | 
						|
								
							 | 
						|
								        $question = new Question('What color was the white horse of Henry IV?', 'white');
							 | 
						|
								        $question->setValidator($validator);
							 | 
						|
								        $question->setMaxAttempts(2);
							 | 
						|
								
							 | 
						|
								        $dialog->setInputStream($this->getInputStream("\nblack\n"));
							 | 
						|
								        $this->assertEquals('white', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('black', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
							 | 
						|
								
							 | 
						|
								        $dialog->setInputStream($this->getInputStream("green\nyellow\norange\n"));
							 | 
						|
								        try {
							 | 
						|
								            $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question);
							 | 
						|
								            $this->fail();
							 | 
						|
								        } catch (\InvalidArgumentException $e) {
							 | 
						|
								            $this->assertEquals($error, $e->getMessage());
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @group        legacy
							 | 
						|
								     * @dataProvider simpleAnswerProvider
							 | 
						|
								     */
							 | 
						|
								    public function testLegacySelectChoiceFromSimpleChoices($providedAnswer, $expectedValue)
							 | 
						|
								    {
							 | 
						|
								        $possibleChoices = array(
							 | 
						|
								            'My environment 1',
							 | 
						|
								            'My environment 2',
							 | 
						|
								            'My environment 3',
							 | 
						|
								        );
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $dialog->setInputStream($this->getInputStream($providedAnswer."\n"));
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $dialog->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('Please select the environment to load', $possibleChoices);
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								        $answer = $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question);
							 | 
						|
								
							 | 
						|
								        $this->assertSame($expectedValue, $answer);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @group        legacy
							 | 
						|
								     * @dataProvider mixedKeysChoiceListAnswerProvider
							 | 
						|
								     */
							 | 
						|
								    public function testLegacyChoiceFromChoicelistWithMixedKeys($providedAnswer, $expectedValue)
							 | 
						|
								    {
							 | 
						|
								        $possibleChoices = array(
							 | 
						|
								            '0' => 'No environment',
							 | 
						|
								            '1' => 'My environment 1',
							 | 
						|
								            'env_2' => 'My environment 2',
							 | 
						|
								            3 => 'My environment 3',
							 | 
						|
								        );
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $dialog->setInputStream($this->getInputStream($providedAnswer."\n"));
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $dialog->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('Please select the environment to load', $possibleChoices);
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								        $answer = $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question);
							 | 
						|
								
							 | 
						|
								        $this->assertSame($expectedValue, $answer);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @group        legacy
							 | 
						|
								     * @dataProvider answerProvider
							 | 
						|
								     */
							 | 
						|
								    public function testLegacySelectChoiceFromChoiceList($providedAnswer, $expectedValue)
							 | 
						|
								    {
							 | 
						|
								        $possibleChoices = array(
							 | 
						|
								            'env_1' => 'My environment 1',
							 | 
						|
								            'env_2' => 'My environment',
							 | 
						|
								            'env_3' => 'My environment',
							 | 
						|
								        );
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $dialog->setInputStream($this->getInputStream($providedAnswer."\n"));
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $dialog->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('Please select the environment to load', $possibleChoices);
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								        $answer = $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question);
							 | 
						|
								
							 | 
						|
								        $this->assertSame($expectedValue, $answer);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @group                    legacy
							 | 
						|
								     * @expectedException        \InvalidArgumentException
							 | 
						|
								     * @expectedExceptionMessage The provided answer is ambiguous. Value should be one of env_2 or env_3.
							 | 
						|
								     */
							 | 
						|
								    public function testLegacyAmbiguousChoiceFromChoicelist()
							 | 
						|
								    {
							 | 
						|
								        $possibleChoices = array(
							 | 
						|
								            'env_1' => 'My first environment',
							 | 
						|
								            'env_2' => 'My environment',
							 | 
						|
								            'env_3' => 'My environment',
							 | 
						|
								        );
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $dialog->setInputStream($this->getInputStream("My environment\n"));
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $dialog->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion('Please select the environment to load', $possibleChoices);
							 | 
						|
								        $question->setMaxAttempts(1);
							 | 
						|
								
							 | 
						|
								        $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @requires function mb_strwidth
							 | 
						|
								     * @group legacy
							 | 
						|
								     */
							 | 
						|
								    public function testLegacyChoiceOutputFormattingQuestionForUtf8Keys()
							 | 
						|
								    {
							 | 
						|
								        $question = 'Lorem ipsum?';
							 | 
						|
								        $possibleChoices = array(
							 | 
						|
								            'foo' => 'foo',
							 | 
						|
								            'żółw' => 'bar',
							 | 
						|
								            'łabądź' => 'baz',
							 | 
						|
								        );
							 | 
						|
								        $outputShown = array(
							 | 
						|
								            $question,
							 | 
						|
								            '  [<info>foo   </info>] foo',
							 | 
						|
								            '  [<info>żółw  </info>] bar',
							 | 
						|
								            '  [<info>łabądź</info>] baz',
							 | 
						|
								        );
							 | 
						|
								        $output = $this->getMockBuilder('\Symfony\Component\Console\Output\OutputInterface')->getMock();
							 | 
						|
								        $output->method('getFormatter')->willReturn(new OutputFormatter());
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $dialog->setInputStream($this->getInputStream("\n"));
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $dialog->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $output->expects($this->once())->method('writeln')->with($this->equalTo($outputShown));
							 | 
						|
								
							 | 
						|
								        $question = new ChoiceQuestion($question, $possibleChoices, 'foo');
							 | 
						|
								        $dialog->ask($this->createInputInterfaceMock(), $output, $question);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @expectedException        \Symfony\Component\Console\Exception\RuntimeException
							 | 
						|
								     * @expectedExceptionMessage Aborted
							 | 
						|
								     */
							 | 
						|
								    public function testAskThrowsExceptionOnMissingInput()
							 | 
						|
								    {
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $dialog->ask($this->createStreamableInputInterfaceMock($this->getInputStream('')), $this->createOutputInterface(), new Question('What\'s your name?'));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @expectedException        \Symfony\Component\Console\Exception\RuntimeException
							 | 
						|
								     * @expectedExceptionMessage Aborted
							 | 
						|
								     */
							 | 
						|
								    public function testAskThrowsExceptionOnMissingInputWithValidator()
							 | 
						|
								    {
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								
							 | 
						|
								        $question = new Question('What\'s your name?');
							 | 
						|
								        $question->setValidator(function () {
							 | 
						|
								            if (!$value) {
							 | 
						|
								                throw new \Exception('A value is required.');
							 | 
						|
								            }
							 | 
						|
								        });
							 | 
						|
								
							 | 
						|
								        $dialog->ask($this->createStreamableInputInterfaceMock($this->getInputStream('')), $this->createOutputInterface(), $question);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @expectedException \LogicException
							 | 
						|
								     * @expectedExceptionMessage Choice question must have at least 1 choice available.
							 | 
						|
								     */
							 | 
						|
								    public function testEmptyChoices()
							 | 
						|
								    {
							 | 
						|
								        new ChoiceQuestion('Question', array(), 'irrelevant');
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testTraversableAutocomplete()
							 | 
						|
								    {
							 | 
						|
								        if (!$this->hasSttyAvailable()) {
							 | 
						|
								            $this->markTestSkipped('`stty` is required to test autocomplete functionality');
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        // Acm<NEWLINE>
							 | 
						|
								        // Ac<BACKSPACE><BACKSPACE>s<TAB>Test<NEWLINE>
							 | 
						|
								        // <NEWLINE>
							 | 
						|
								        // <UP ARROW><UP ARROW><NEWLINE>
							 | 
						|
								        // <UP ARROW><UP ARROW><UP ARROW><UP ARROW><UP ARROW><TAB>Test<NEWLINE>
							 | 
						|
								        // <DOWN ARROW><NEWLINE>
							 | 
						|
								        // S<BACKSPACE><BACKSPACE><DOWN ARROW><DOWN ARROW><NEWLINE>
							 | 
						|
								        // F00<BACKSPACE><BACKSPACE>oo<TAB><NEWLINE>
							 | 
						|
								        $inputStream = $this->getInputStream("Acm\nAc\177\177s\tTest\n\n\033[A\033[A\n\033[A\033[A\033[A\033[A\033[A\tTest\n\033[B\nS\177\177\033[B\033[B\nF00\177\177oo\t\n");
							 | 
						|
								
							 | 
						|
								        $dialog = new QuestionHelper();
							 | 
						|
								        $helperSet = new HelperSet(array(new FormatterHelper()));
							 | 
						|
								        $dialog->setHelperSet($helperSet);
							 | 
						|
								
							 | 
						|
								        $question = new Question('Please select a bundle', 'FrameworkBundle');
							 | 
						|
								        $question->setAutocompleterValues(new AutocompleteValues(array('irrelevant' => 'AcmeDemoBundle', 'AsseticBundle', 'SecurityBundle', 'FooBundle')));
							 | 
						|
								
							 | 
						|
								        $this->assertEquals('AcmeDemoBundle', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('AsseticBundleTest', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('FrameworkBundle', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('SecurityBundle', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('FooBundleTest', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('AcmeDemoBundle', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('AsseticBundle', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								        $this->assertEquals('FooBundle', $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    protected function getInputStream($input)
							 | 
						|
								    {
							 | 
						|
								        $stream = fopen('php://memory', 'r+', false);
							 | 
						|
								        fwrite($stream, $input);
							 | 
						|
								        rewind($stream);
							 | 
						|
								
							 | 
						|
								        return $stream;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    protected function createOutputInterface()
							 | 
						|
								    {
							 | 
						|
								        return new StreamOutput(fopen('php://memory', 'r+', false));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    protected function createInputInterfaceMock($interactive = true)
							 | 
						|
								    {
							 | 
						|
								        $mock = $this->getMockBuilder('Symfony\Component\Console\Input\InputInterface')->getMock();
							 | 
						|
								        $mock->expects($this->any())
							 | 
						|
								            ->method('isInteractive')
							 | 
						|
								            ->will($this->returnValue($interactive));
							 | 
						|
								
							 | 
						|
								        return $mock;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    private function hasSttyAvailable()
							 | 
						|
								    {
							 | 
						|
								        exec('stty 2>&1', $output, $exitcode);
							 | 
						|
								
							 | 
						|
								        return 0 === $exitcode;
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								class AutocompleteValues implements \IteratorAggregate
							 | 
						|
								{
							 | 
						|
								    private $values;
							 | 
						|
								
							 | 
						|
								    public function __construct(array $values)
							 | 
						|
								    {
							 | 
						|
								        $this->values = $values;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getIterator()
							 | 
						|
								    {
							 | 
						|
								        return new \ArrayIterator($this->values);
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 |