123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- <?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\Question;
- use PHPUnit\Framework\TestCase;
- use Symfony\Component\Console\Question\ChoiceQuestion;
- class ChoiceQuestionTest extends TestCase
- {
- /**
- * @dataProvider selectUseCases
- */
- public function testSelectUseCases($multiSelect, $answers, $expected, $message, $default = null)
- {
- $question = new ChoiceQuestion('A question', [
- 'First response',
- 'Second response',
- 'Third response',
- 'Fourth response',
- null,
- ], $default);
- $question->setMultiselect($multiSelect);
- foreach ($answers as $answer) {
- $validator = $question->getValidator();
- $actual = $validator($answer);
- $this->assertEquals($actual, $expected, $message);
- }
- }
- public static function selectUseCases()
- {
- return [
- [
- false,
- ['First response', 'First response ', ' First response', ' First response '],
- 'First response',
- 'When passed single answer on singleSelect, the defaultValidator must return this answer as a string',
- ],
- [
- true,
- ['First response', 'First response ', ' First response', ' First response '],
- ['First response'],
- 'When passed single answer on MultiSelect, the defaultValidator must return this answer as an array',
- ],
- [
- true,
- ['First response,Second response', ' First response , Second response '],
- ['First response', 'Second response'],
- 'When passed multiple answers on MultiSelect, the defaultValidator must return these answers as an array',
- ],
- [
- false,
- [null],
- null,
- 'When used null as default single answer on singleSelect, the defaultValidator must return this answer as null',
- ],
- [
- false,
- ['First response'],
- 'First response',
- 'When used a string as default single answer on singleSelect, the defaultValidator must return this answer as a string',
- 'First response',
- ],
- [
- false,
- [0],
- 'First response',
- 'When passed single answer using choice\'s key, the defaultValidator must return the choice value',
- ],
- [
- true,
- ['0, 2'],
- ['First response', 'Third response'],
- 'When passed multiple answers using choices\' key, the defaultValidator must return the choice values in an array',
- ],
- ];
- }
- public function testNonTrimmable()
- {
- $question = new ChoiceQuestion('A question', [
- 'First response ',
- ' Second response',
- ' Third response ',
- ]);
- $question->setTrimmable(false);
- $this->assertSame(' Third response ', $question->getValidator()(' Third response '));
- $question->setMultiselect(true);
- $this->assertSame(['First response ', ' Second response'], $question->getValidator()('First response , Second response'));
- }
- /**
- * @dataProvider selectAssociativeChoicesProvider
- */
- public function testSelectAssociativeChoices($providedAnswer, $expectedValue)
- {
- $question = new ChoiceQuestion('A question', [
- '0' => 'First choice',
- 'foo' => 'Foo',
- '99' => 'N°99',
- 'string object' => new StringChoice('String Object'),
- ]);
- $this->assertSame($expectedValue, $question->getValidator()($providedAnswer));
- }
- public static function selectAssociativeChoicesProvider()
- {
- return [
- 'select "0" choice by key' => ['0', '0'],
- 'select "0" choice by value' => ['First choice', '0'],
- 'select by key' => ['foo', 'foo'],
- 'select by value' => ['Foo', 'foo'],
- 'select by key, with numeric key' => ['99', '99'],
- 'select by value, with numeric key' => ['N°99', '99'],
- 'select by key, with string object value' => ['string object', 'string object'],
- 'select by value, with string object value' => ['String Object', 'string object'],
- ];
- }
- public function testSelectWithNonStringChoices()
- {
- $question = new ChoiceQuestion('A question', [
- $result1 = new StringChoice('foo'),
- $result2 = new StringChoice('bar'),
- $result3 = new StringChoice('baz'),
- ]);
- $this->assertSame($result1, $question->getValidator()('foo'), 'answer can be selected by its string value');
- $this->assertSame($result1, $question->getValidator()(0), 'answer can be selected by index');
- $question->setMultiselect(true);
- $this->assertSame([$result3, $result2], $question->getValidator()('baz, bar'));
- }
- }
- class StringChoice
- {
- private $string;
- public function __construct(string $string)
- {
- $this->string = $string;
- }
- public function __toString()
- {
- return $this->string;
- }
- }
|