Skip to content

Commit

Permalink
bug #32503 Fix multiSelect ChoiceQuestion when answers have spaces (I…
Browse files Browse the repository at this point in the history
…ceMaD)

This PR was merged into the 3.4 branch.

Discussion
----------

Fix multiSelect ChoiceQuestion when answers have spaces

| Q             | A
| ------------- | ---
| Branch?       | 3.4
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #32502
| License       | MIT
| Doc PR        | N/A

Probleme is explained in the issue

Commits
-------

9104ef1 Fix multiSelect ChoiceQuestion when answers have spaces
  • Loading branch information
Robin Chalas committed Jul 24, 2019
2 parents 639041c + 9104ef1 commit 1ce527a
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 6 deletions.
10 changes: 4 additions & 6 deletions src/Symfony/Component/Console/Question/ChoiceQuestion.php
Expand Up @@ -134,17 +134,15 @@ private function getDefaultValidator()
$isAssoc = $this->isAssoc($choices);

return function ($selected) use ($choices, $errorMessage, $multiselect, $isAssoc) {
// Collapse all spaces.
$selectedChoices = str_replace(' ', '', $selected);

if ($multiselect) {
// Check for a separated comma values
if (!preg_match('/^[^,]+(?:,[^,]+)*$/', $selectedChoices, $matches)) {
if (!preg_match('/^[^,]+(?:,[^,]+)*$/', $selected, $matches)) {
throw new InvalidArgumentException(sprintf($errorMessage, $selected));
}
$selectedChoices = explode(',', $selectedChoices);

$selectedChoices = array_map('trim', explode(',', $selected));
} else {
$selectedChoices = [$selected];
$selectedChoices = [trim($selected)];
}

$multiselectChoices = [];
Expand Down
@@ -0,0 +1,64 @@
<?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)
{
$question = new ChoiceQuestion('A question', [
'First response',
'Second response',
'Third response',
'Fourth response',
]);

$question->setMultiselect($multiSelect);

foreach ($answers as $answer) {
$validator = $question->getValidator();
$actual = $validator($answer);

$this->assertEquals($actual, $expected, $message);
}
}

public 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',
],
];
}
}

0 comments on commit 1ce527a

Please sign in to comment.