Merge branch '4.2'
* 4.2: Ensure final input of CommandTester works with default Do not risk waiting 100 seconds [Intl] handle null date and time types Revert "minor #28610 [Form] Check for Intl availibility (ro0NL)" Do not ignore the choice groups for caching
This commit is contained in:
commit
44aa362419
@ -162,7 +162,10 @@ trait TesterTrait
|
|||||||
{
|
{
|
||||||
$stream = fopen('php://memory', 'r+', false);
|
$stream = fopen('php://memory', 'r+', false);
|
||||||
|
|
||||||
fwrite($stream, implode(PHP_EOL, $inputs));
|
foreach ($inputs as $input) {
|
||||||
|
fwrite($stream, $input.PHP_EOL);
|
||||||
|
}
|
||||||
|
|
||||||
rewind($stream);
|
rewind($stream);
|
||||||
|
|
||||||
return $stream;
|
return $stream;
|
||||||
|
@ -112,6 +112,31 @@ class CommandTesterTest extends TestCase
|
|||||||
$this->assertEquals(implode('', $questions), $tester->getDisplay(true));
|
$this->assertEquals(implode('', $questions), $tester->getDisplay(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testCommandWithDefaultInputs()
|
||||||
|
{
|
||||||
|
$questions = array(
|
||||||
|
'What\'s your name?',
|
||||||
|
'How are you?',
|
||||||
|
'Where do you come from?',
|
||||||
|
);
|
||||||
|
|
||||||
|
$command = new Command('foo');
|
||||||
|
$command->setHelperSet(new HelperSet(array(new QuestionHelper())));
|
||||||
|
$command->setCode(function ($input, $output) use ($questions, $command) {
|
||||||
|
$helper = $command->getHelper('question');
|
||||||
|
$helper->ask($input, $output, new Question($questions[0], 'Bobby'));
|
||||||
|
$helper->ask($input, $output, new Question($questions[1], 'Fine'));
|
||||||
|
$helper->ask($input, $output, new Question($questions[2], 'France'));
|
||||||
|
});
|
||||||
|
|
||||||
|
$tester = new CommandTester($command);
|
||||||
|
$tester->setInputs(array('', '', ''));
|
||||||
|
$tester->execute(array());
|
||||||
|
|
||||||
|
$this->assertEquals(0, $tester->getStatusCode());
|
||||||
|
$this->assertEquals(implode('', $questions), $tester->getDisplay(true));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @expectedException \RuntimeException
|
* @expectedException \RuntimeException
|
||||||
* @expectedMessage Aborted
|
* @expectedMessage Aborted
|
||||||
|
@ -62,30 +62,6 @@ class CachingFactoryDecorator implements ChoiceListFactoryInterface
|
|||||||
return hash('sha256', $namespace.':'.serialize($value));
|
return hash('sha256', $namespace.':'.serialize($value));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Flattens an array into the given output variable.
|
|
||||||
*
|
|
||||||
* @param array $array The array to flatten
|
|
||||||
* @param array $output The flattened output
|
|
||||||
*
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
private static function flatten(array $array, &$output)
|
|
||||||
{
|
|
||||||
if (null === $output) {
|
|
||||||
$output = array();
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($array as $key => $value) {
|
|
||||||
if (\is_array($value)) {
|
|
||||||
self::flatten($value, $output);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$output[$key] = $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function __construct(ChoiceListFactoryInterface $decoratedFactory)
|
public function __construct(ChoiceListFactoryInterface $decoratedFactory)
|
||||||
{
|
{
|
||||||
$this->decoratedFactory = $decoratedFactory;
|
$this->decoratedFactory = $decoratedFactory;
|
||||||
@ -113,12 +89,7 @@ class CachingFactoryDecorator implements ChoiceListFactoryInterface
|
|||||||
// The value is not validated on purpose. The decorated factory may
|
// The value is not validated on purpose. The decorated factory may
|
||||||
// decide which values to accept and which not.
|
// decide which values to accept and which not.
|
||||||
|
|
||||||
// We ignore the choice groups for caching. If two choice lists are
|
$hash = self::generateHash(array($choices, $value), 'fromChoices');
|
||||||
// requested with the same choices, but a different grouping, the same
|
|
||||||
// choice list is returned.
|
|
||||||
self::flatten($choices, $flatChoices);
|
|
||||||
|
|
||||||
$hash = self::generateHash(array($flatChoices, $value), 'fromChoices');
|
|
||||||
|
|
||||||
if (!isset($this->lists[$hash])) {
|
if (!isset($this->lists[$hash])) {
|
||||||
$this->lists[$hash] = $this->decoratedFactory->createListFromChoices($choices, $value);
|
$this->lists[$hash] = $this->decoratedFactory->createListFromChoices($choices, $value);
|
||||||
|
@ -15,7 +15,6 @@ use Symfony\Component\Form\AbstractType;
|
|||||||
use Symfony\Component\Form\ChoiceList\ArrayChoiceList;
|
use Symfony\Component\Form\ChoiceList\ArrayChoiceList;
|
||||||
use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface;
|
use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface;
|
||||||
use Symfony\Component\Form\ChoiceList\Loader\IntlCallbackChoiceLoader;
|
use Symfony\Component\Form\ChoiceList\Loader\IntlCallbackChoiceLoader;
|
||||||
use Symfony\Component\Form\Exception\LogicException;
|
|
||||||
use Symfony\Component\Intl\Intl;
|
use Symfony\Component\Intl\Intl;
|
||||||
use Symfony\Component\OptionsResolver\Options;
|
use Symfony\Component\OptionsResolver\Options;
|
||||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
@ -42,10 +41,6 @@ class CountryType extends AbstractType implements ChoiceLoaderInterface
|
|||||||
{
|
{
|
||||||
$resolver->setDefaults(array(
|
$resolver->setDefaults(array(
|
||||||
'choice_loader' => function (Options $options) {
|
'choice_loader' => function (Options $options) {
|
||||||
if (!class_exists(Intl::class)) {
|
|
||||||
throw new LogicException(sprintf('The "symfony/intl" component is required to use "%s".', static::class));
|
|
||||||
}
|
|
||||||
|
|
||||||
$choiceTranslationLocale = $options['choice_translation_locale'];
|
$choiceTranslationLocale = $options['choice_translation_locale'];
|
||||||
|
|
||||||
return new IntlCallbackChoiceLoader(function () use ($choiceTranslationLocale) {
|
return new IntlCallbackChoiceLoader(function () use ($choiceTranslationLocale) {
|
||||||
|
@ -15,7 +15,6 @@ use Symfony\Component\Form\AbstractType;
|
|||||||
use Symfony\Component\Form\ChoiceList\ArrayChoiceList;
|
use Symfony\Component\Form\ChoiceList\ArrayChoiceList;
|
||||||
use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface;
|
use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface;
|
||||||
use Symfony\Component\Form\ChoiceList\Loader\IntlCallbackChoiceLoader;
|
use Symfony\Component\Form\ChoiceList\Loader\IntlCallbackChoiceLoader;
|
||||||
use Symfony\Component\Form\Exception\LogicException;
|
|
||||||
use Symfony\Component\Intl\Intl;
|
use Symfony\Component\Intl\Intl;
|
||||||
use Symfony\Component\OptionsResolver\Options;
|
use Symfony\Component\OptionsResolver\Options;
|
||||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
@ -42,10 +41,6 @@ class CurrencyType extends AbstractType implements ChoiceLoaderInterface
|
|||||||
{
|
{
|
||||||
$resolver->setDefaults(array(
|
$resolver->setDefaults(array(
|
||||||
'choice_loader' => function (Options $options) {
|
'choice_loader' => function (Options $options) {
|
||||||
if (!class_exists(Intl::class)) {
|
|
||||||
throw new LogicException(sprintf('The "symfony/intl" component is required to use "%s".', static::class));
|
|
||||||
}
|
|
||||||
|
|
||||||
$choiceTranslationLocale = $options['choice_translation_locale'];
|
$choiceTranslationLocale = $options['choice_translation_locale'];
|
||||||
|
|
||||||
return new IntlCallbackChoiceLoader(function () use ($choiceTranslationLocale) {
|
return new IntlCallbackChoiceLoader(function () use ($choiceTranslationLocale) {
|
||||||
|
@ -15,7 +15,6 @@ use Symfony\Component\Form\AbstractType;
|
|||||||
use Symfony\Component\Form\ChoiceList\ArrayChoiceList;
|
use Symfony\Component\Form\ChoiceList\ArrayChoiceList;
|
||||||
use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface;
|
use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface;
|
||||||
use Symfony\Component\Form\ChoiceList\Loader\IntlCallbackChoiceLoader;
|
use Symfony\Component\Form\ChoiceList\Loader\IntlCallbackChoiceLoader;
|
||||||
use Symfony\Component\Form\Exception\LogicException;
|
|
||||||
use Symfony\Component\Intl\Intl;
|
use Symfony\Component\Intl\Intl;
|
||||||
use Symfony\Component\OptionsResolver\Options;
|
use Symfony\Component\OptionsResolver\Options;
|
||||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
@ -42,10 +41,6 @@ class LanguageType extends AbstractType implements ChoiceLoaderInterface
|
|||||||
{
|
{
|
||||||
$resolver->setDefaults(array(
|
$resolver->setDefaults(array(
|
||||||
'choice_loader' => function (Options $options) {
|
'choice_loader' => function (Options $options) {
|
||||||
if (!class_exists(Intl::class)) {
|
|
||||||
throw new LogicException(sprintf('The "symfony/intl" component is required to use "%s".', static::class));
|
|
||||||
}
|
|
||||||
|
|
||||||
$choiceTranslationLocale = $options['choice_translation_locale'];
|
$choiceTranslationLocale = $options['choice_translation_locale'];
|
||||||
|
|
||||||
return new IntlCallbackChoiceLoader(function () use ($choiceTranslationLocale) {
|
return new IntlCallbackChoiceLoader(function () use ($choiceTranslationLocale) {
|
||||||
|
@ -15,7 +15,6 @@ use Symfony\Component\Form\AbstractType;
|
|||||||
use Symfony\Component\Form\ChoiceList\ArrayChoiceList;
|
use Symfony\Component\Form\ChoiceList\ArrayChoiceList;
|
||||||
use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface;
|
use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface;
|
||||||
use Symfony\Component\Form\ChoiceList\Loader\IntlCallbackChoiceLoader;
|
use Symfony\Component\Form\ChoiceList\Loader\IntlCallbackChoiceLoader;
|
||||||
use Symfony\Component\Form\Exception\LogicException;
|
|
||||||
use Symfony\Component\Intl\Intl;
|
use Symfony\Component\Intl\Intl;
|
||||||
use Symfony\Component\OptionsResolver\Options;
|
use Symfony\Component\OptionsResolver\Options;
|
||||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
@ -42,10 +41,6 @@ class LocaleType extends AbstractType implements ChoiceLoaderInterface
|
|||||||
{
|
{
|
||||||
$resolver->setDefaults(array(
|
$resolver->setDefaults(array(
|
||||||
'choice_loader' => function (Options $options) {
|
'choice_loader' => function (Options $options) {
|
||||||
if (!class_exists(Intl::class)) {
|
|
||||||
throw new LogicException(sprintf('The "symfony/intl" component is required to use "%s".', static::class));
|
|
||||||
}
|
|
||||||
|
|
||||||
$choiceTranslationLocale = $options['choice_translation_locale'];
|
$choiceTranslationLocale = $options['choice_translation_locale'];
|
||||||
|
|
||||||
return new IntlCallbackChoiceLoader(function () use ($choiceTranslationLocale) {
|
return new IntlCallbackChoiceLoader(function () use ($choiceTranslationLocale) {
|
||||||
|
@ -64,19 +64,24 @@ class CachingFactoryDecoratorTest extends TestCase
|
|||||||
$this->assertSame($list, $this->factory->createListFromChoices($choices2));
|
$this->assertSame($list, $this->factory->createListFromChoices($choices2));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testCreateFromChoicesFlattensChoices()
|
public function testCreateFromChoicesGroupedChoices()
|
||||||
{
|
{
|
||||||
$choices1 = array('key' => array('A' => 'a'));
|
$choices1 = array('key' => array('A' => 'a'));
|
||||||
$choices2 = array('A' => 'a');
|
$choices2 = array('A' => 'a');
|
||||||
$list = new \stdClass();
|
$list1 = new \stdClass();
|
||||||
|
$list2 = new \stdClass();
|
||||||
|
|
||||||
$this->decoratedFactory->expects($this->once())
|
$this->decoratedFactory->expects($this->at(0))
|
||||||
->method('createListFromChoices')
|
->method('createListFromChoices')
|
||||||
->with($choices1)
|
->with($choices1)
|
||||||
->will($this->returnValue($list));
|
->will($this->returnValue($list1));
|
||||||
|
$this->decoratedFactory->expects($this->at(1))
|
||||||
|
->method('createListFromChoices')
|
||||||
|
->with($choices2)
|
||||||
|
->will($this->returnValue($list2));
|
||||||
|
|
||||||
$this->assertSame($list, $this->factory->createListFromChoices($choices1));
|
$this->assertSame($list1, $this->factory->createListFromChoices($choices1));
|
||||||
$this->assertSame($list, $this->factory->createListFromChoices($choices2));
|
$this->assertSame($list2, $this->factory->createListFromChoices($choices2));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -118,13 +118,13 @@ class IntlDateFormatter
|
|||||||
private $timeZoneId;
|
private $timeZoneId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $locale The locale code. The only currently supported locale is "en" (or null using the default locale, i.e. "en")
|
* @param string $locale The locale code. The only currently supported locale is "en" (or null using the default locale, i.e. "en")
|
||||||
* @param int $datetype Type of date formatting, one of the format type constants
|
* @param int|null $datetype Type of date formatting, one of the format type constants
|
||||||
* @param int $timetype Type of time formatting, one of the format type constants
|
* @param int|null $timetype Type of time formatting, one of the format type constants
|
||||||
* @param mixed $timezone Timezone identifier
|
* @param \IntlTimeZone|\DateTimeZone|string|null $timezone Timezone identifier
|
||||||
* @param int $calendar Calendar to use for formatting or parsing. The only currently
|
* @param int $calendar Calendar to use for formatting or parsing. The only currently
|
||||||
* supported value is IntlDateFormatter::GREGORIAN (or null using the default calendar, i.e. "GREGORIAN")
|
* supported value is IntlDateFormatter::GREGORIAN (or null using the default calendar, i.e. "GREGORIAN")
|
||||||
* @param string $pattern Optional pattern to use when formatting
|
* @param string|null $pattern Optional pattern to use when formatting
|
||||||
*
|
*
|
||||||
* @see http://www.php.net/manual/en/intldateformatter.create.php
|
* @see http://www.php.net/manual/en/intldateformatter.create.php
|
||||||
* @see http://userguide.icu-project.org/formatparse/datetime
|
* @see http://userguide.icu-project.org/formatparse/datetime
|
||||||
@ -142,8 +142,8 @@ class IntlDateFormatter
|
|||||||
throw new MethodArgumentValueNotImplementedException(__METHOD__, 'calendar', $calendar, 'Only the GREGORIAN calendar is supported');
|
throw new MethodArgumentValueNotImplementedException(__METHOD__, 'calendar', $calendar, 'Only the GREGORIAN calendar is supported');
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->datetype = $datetype;
|
$this->datetype = null !== $datetype ? $datetype : self::FULL;
|
||||||
$this->timetype = $timetype;
|
$this->timetype = null !== $timetype ? $timetype : self::FULL;
|
||||||
|
|
||||||
$this->setPattern($pattern);
|
$this->setPattern($pattern);
|
||||||
$this->setTimeZone($timezone);
|
$this->setTimeZone($timezone);
|
||||||
@ -152,13 +152,13 @@ class IntlDateFormatter
|
|||||||
/**
|
/**
|
||||||
* Static constructor.
|
* Static constructor.
|
||||||
*
|
*
|
||||||
* @param string $locale The locale code. The only currently supported locale is "en" (or null using the default locale, i.e. "en")
|
* @param string $locale The locale code. The only currently supported locale is "en" (or null using the default locale, i.e. "en")
|
||||||
* @param int $datetype Type of date formatting, one of the format type constants
|
* @param int|null $datetype Type of date formatting, one of the format type constants
|
||||||
* @param int $timetype Type of time formatting, one of the format type constants
|
* @param int|null $timetype Type of time formatting, one of the format type constants
|
||||||
* @param string $timezone Timezone identifier
|
* @param \IntlTimeZone|\DateTimeZone|string|null $timezone Timezone identifier
|
||||||
* @param int $calendar Calendar to use for formatting or parsing; default is Gregorian
|
* @param int $calendar Calendar to use for formatting or parsing; default is Gregorian
|
||||||
* One of the calendar constants
|
* One of the calendar constants
|
||||||
* @param string $pattern Optional pattern to use when formatting
|
* @param string|null $pattern Optional pattern to use when formatting
|
||||||
*
|
*
|
||||||
* @return self
|
* @return self
|
||||||
*
|
*
|
||||||
@ -485,7 +485,7 @@ class IntlDateFormatter
|
|||||||
/**
|
/**
|
||||||
* Set the formatter's pattern.
|
* Set the formatter's pattern.
|
||||||
*
|
*
|
||||||
* @param string $pattern A pattern string in conformance with the ICU IntlDateFormatter documentation
|
* @param string|null $pattern A pattern string in conformance with the ICU IntlDateFormatter documentation
|
||||||
*
|
*
|
||||||
* @return bool true on success or false on failure
|
* @return bool true on success or false on failure
|
||||||
*
|
*
|
||||||
@ -506,9 +506,9 @@ class IntlDateFormatter
|
|||||||
/**
|
/**
|
||||||
* Set the formatter's timezone identifier.
|
* Set the formatter's timezone identifier.
|
||||||
*
|
*
|
||||||
* @param string $timeZoneId The time zone ID string of the time zone to use.
|
* @param string|null $timeZoneId The time zone ID string of the time zone to use.
|
||||||
* If NULL or the empty string, the default time zone for the
|
* If NULL or the empty string, the default time zone for the
|
||||||
* runtime is used.
|
* runtime is used.
|
||||||
*
|
*
|
||||||
* @return bool true on success or false on failure
|
* @return bool true on success or false on failure
|
||||||
*
|
*
|
||||||
@ -552,7 +552,7 @@ class IntlDateFormatter
|
|||||||
/**
|
/**
|
||||||
* This method was added in PHP 5.5 as replacement for `setTimeZoneId()`.
|
* This method was added in PHP 5.5 as replacement for `setTimeZoneId()`.
|
||||||
*
|
*
|
||||||
* @param mixed $timeZone
|
* @param \IntlTimeZone|\DateTimeZone|string|null $timeZone
|
||||||
*
|
*
|
||||||
* @return bool true on success or false on failure
|
* @return bool true on success or false on failure
|
||||||
*
|
*
|
||||||
|
@ -46,6 +46,20 @@ abstract class AbstractIntlDateFormatterTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testConstructorWithoutDateType()
|
||||||
|
{
|
||||||
|
$formatter = new IntlDateFormatter('en', null, IntlDateFormatter::SHORT, 'UTC', IntlDateFormatter::GREGORIAN);
|
||||||
|
|
||||||
|
$this->assertSame('EEEE, LLLL d, y, h:mm a', $formatter->getPattern());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testConstructorWithoutTimeType()
|
||||||
|
{
|
||||||
|
$formatter = new IntlDateFormatter('en', IntlDateFormatter::SHORT, null, 'UTC', IntlDateFormatter::GREGORIAN);
|
||||||
|
|
||||||
|
$this->assertSame('M/d/yy, h:mm:ss a zzzz', $formatter->getPattern());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dataProvider formatProvider
|
* @dataProvider formatProvider
|
||||||
*/
|
*/
|
||||||
|
@ -14,7 +14,6 @@ $outputs = array(
|
|||||||
'Second iteration output',
|
'Second iteration output',
|
||||||
'One more iteration output',
|
'One more iteration output',
|
||||||
'This took more time',
|
'This took more time',
|
||||||
'This one was sooooo slow',
|
|
||||||
);
|
);
|
||||||
|
|
||||||
$iterationTime = 10000;
|
$iterationTime = 10000;
|
||||||
|
Reference in New Issue
Block a user