Merge branch '2.4' into 2.5
* 2.4: Make Doctrine's dependency injection test less fragile. [Finder] [Iterator] Make the tests less fragile [Form][DateTime] Propagate invalid_message & invalid_message parameters to date & time sub widgets Fix expression language in the container when using the "container" variable
This commit is contained in:
commit
aa5179b8c8
@ -132,7 +132,11 @@ class RegisterEventListenersAndSubscribersPassTest extends \PHPUnit_Framework_Te
|
|||||||
;
|
;
|
||||||
|
|
||||||
$this->process($container);
|
$this->process($container);
|
||||||
$this->assertEquals(array('c', 'd', 'e', 'b', 'a'), $this->getServiceOrder($container, 'addEventSubscriber'));
|
$serviceOrder = $this->getServiceOrder($container, 'addEventSubscriber');
|
||||||
|
$unordered = array_splice($serviceOrder, 0, 3);
|
||||||
|
sort($unordered);
|
||||||
|
$this->assertEquals(array('c', 'd', 'e'), $unordered);
|
||||||
|
$this->assertEquals(array('b', 'a'), $serviceOrder);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testProcessNoTaggedServices()
|
public function testProcessNoTaggedServices()
|
||||||
|
@ -1230,7 +1230,7 @@ EOF;
|
|||||||
|
|
||||||
return $this->getServiceCall((string) $value, $value);
|
return $this->getServiceCall((string) $value, $value);
|
||||||
} elseif ($value instanceof Expression) {
|
} elseif ($value instanceof Expression) {
|
||||||
return $this->getExpressionLanguage()->compile((string) $value, array('container'));
|
return $this->getExpressionLanguage()->compile((string) $value, array('this' => 'container'));
|
||||||
} elseif ($value instanceof Parameter) {
|
} elseif ($value instanceof Parameter) {
|
||||||
return $this->dumpParameter($value);
|
return $this->dumpParameter($value);
|
||||||
} elseif (true === $interpolate && is_string($value)) {
|
} elseif (true === $interpolate && is_string($value)) {
|
||||||
|
@ -52,7 +52,7 @@ $container->
|
|||||||
addMethodCall('setBar', array(new Reference('foo2', ContainerInterface::NULL_ON_INVALID_REFERENCE)))->
|
addMethodCall('setBar', array(new Reference('foo2', ContainerInterface::NULL_ON_INVALID_REFERENCE)))->
|
||||||
addMethodCall('setBar', array(new Reference('foo3', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)))->
|
addMethodCall('setBar', array(new Reference('foo3', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)))->
|
||||||
addMethodCall('setBar', array(new Reference('foobaz', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)))->
|
addMethodCall('setBar', array(new Reference('foobaz', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)))->
|
||||||
addMethodCall('setBar', array(new Expression('service("foo").foo() ~ parameter("foo")')))
|
addMethodCall('setBar', array(new Expression('service("foo").foo() ~ (container.hasparameter("foo") ? parameter("foo") : "default")')))
|
||||||
;
|
;
|
||||||
$container->
|
$container->
|
||||||
register('factory_service', 'Bar')->
|
register('factory_service', 'Bar')->
|
||||||
|
@ -260,7 +260,7 @@ class ProjectServiceContainer extends Container
|
|||||||
if ($this->has('foobaz')) {
|
if ($this->has('foobaz')) {
|
||||||
$instance->setBar($this->get('foobaz', ContainerInterface::NULL_ON_INVALID_REFERENCE));
|
$instance->setBar($this->get('foobaz', ContainerInterface::NULL_ON_INVALID_REFERENCE));
|
||||||
}
|
}
|
||||||
$instance->setBar(($this->get("foo")->foo() . $this->getParameter("foo")));
|
$instance->setBar(($this->get("foo")->foo() . (($this->hasparameter("foo")) ? ($this->getParameter("foo")) : ("default"))));
|
||||||
|
|
||||||
return $instance;
|
return $instance;
|
||||||
}
|
}
|
||||||
|
@ -256,7 +256,7 @@ class ProjectServiceContainer extends Container
|
|||||||
|
|
||||||
$instance->setBar($this->get('foo'));
|
$instance->setBar($this->get('foo'));
|
||||||
$instance->setBar(NULL);
|
$instance->setBar(NULL);
|
||||||
$instance->setBar(($this->get("foo")->foo() . $this->getParameter("foo")));
|
$instance->setBar(($this->get("foo")->foo() . (($this->hasparameter("foo")) ? ($this->getParameter("foo")) : ("default"))));
|
||||||
|
|
||||||
return $instance;
|
return $instance;
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
<service id="method_call1" class="FooClass">
|
<service id="method_call1" class="FooClass">
|
||||||
<call method="setBar" />
|
<call method="setBar" />
|
||||||
<call method="setBar">
|
<call method="setBar">
|
||||||
<argument type="expression">service("foo").foo() ~ parameter("foo")</argument>
|
<argument type="expression">service("foo").foo() ~ (container.hasparameter("foo") ? parameter("foo") : "default")</argument>
|
||||||
</call>
|
</call>
|
||||||
</service>
|
</service>
|
||||||
<service id="method_call2" class="FooClass">
|
<service id="method_call2" class="FooClass">
|
||||||
|
@ -54,7 +54,7 @@
|
|||||||
<argument type="service" id="foobaz" on-invalid="ignore"/>
|
<argument type="service" id="foobaz" on-invalid="ignore"/>
|
||||||
</call>
|
</call>
|
||||||
<call method="setBar">
|
<call method="setBar">
|
||||||
<argument type="expression">service("foo").foo() ~ parameter("foo")</argument>
|
<argument type="expression">service("foo").foo() ~ (container.hasparameter("foo") ? parameter("foo") : "default")</argument>
|
||||||
</call>
|
</call>
|
||||||
</service>
|
</service>
|
||||||
<service id="factory_service" class="Bar" factory-method="getInstance" factory-service="foo.baz"/>
|
<service id="factory_service" class="Bar" factory-method="getInstance" factory-service="foo.baz"/>
|
||||||
|
@ -15,7 +15,7 @@ services:
|
|||||||
calls:
|
calls:
|
||||||
- [ setBar, [] ]
|
- [ setBar, [] ]
|
||||||
- [ setBar ]
|
- [ setBar ]
|
||||||
- [ setBar, ['@=service("foo").foo() ~ parameter("foo")'] ]
|
- [ setBar, ['@=service("foo").foo() ~ (container.hasparameter("foo") ? parameter("foo") : "default")'] ]
|
||||||
method_call2:
|
method_call2:
|
||||||
class: FooClass
|
class: FooClass
|
||||||
calls:
|
calls:
|
||||||
|
@ -38,7 +38,7 @@ services:
|
|||||||
- [setBar, ['@?foo2']]
|
- [setBar, ['@?foo2']]
|
||||||
- [setBar, ['@?foo3']]
|
- [setBar, ['@?foo3']]
|
||||||
- [setBar, ['@?foobaz']]
|
- [setBar, ['@?foobaz']]
|
||||||
- [setBar, ['@=service("foo").foo() ~ parameter("foo")']]
|
- [setBar, ['@=service("foo").foo() ~ (container.hasparameter("foo") ? parameter("foo") : "default")']]
|
||||||
|
|
||||||
factory_service:
|
factory_service:
|
||||||
class: Bar
|
class: Bar
|
||||||
|
@ -211,7 +211,7 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertEquals('sc_configure', $services['configurator1']->getConfigurator(), '->load() parses the configurator tag');
|
$this->assertEquals('sc_configure', $services['configurator1']->getConfigurator(), '->load() parses the configurator tag');
|
||||||
$this->assertEquals(array(new Reference('baz', ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, false), 'configure'), $services['configurator2']->getConfigurator(), '->load() parses the configurator tag');
|
$this->assertEquals(array(new Reference('baz', ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, false), 'configure'), $services['configurator2']->getConfigurator(), '->load() parses the configurator tag');
|
||||||
$this->assertEquals(array('BazClass', 'configureStatic'), $services['configurator3']->getConfigurator(), '->load() parses the configurator tag');
|
$this->assertEquals(array('BazClass', 'configureStatic'), $services['configurator3']->getConfigurator(), '->load() parses the configurator tag');
|
||||||
$this->assertEquals(array(array('setBar', array()), array('setBar', array(new Expression('service("foo").foo() ~ parameter("foo")')))), $services['method_call1']->getMethodCalls(), '->load() parses the method_call tag');
|
$this->assertEquals(array(array('setBar', array()), array('setBar', array(new Expression('service("foo").foo() ~ (container.hasparameter("foo") ? parameter("foo") : "default")')))), $services['method_call1']->getMethodCalls(), '->load() parses the method_call tag');
|
||||||
$this->assertEquals(array(array('setBar', array('foo', new Reference('foo'), array(true, false)))), $services['method_call2']->getMethodCalls(), '->load() parses the method_call tag');
|
$this->assertEquals(array(array('setBar', array('foo', new Reference('foo'), array(true, false)))), $services['method_call2']->getMethodCalls(), '->load() parses the method_call tag');
|
||||||
$this->assertNull($services['factory_service']->getClass());
|
$this->assertNull($services['factory_service']->getClass());
|
||||||
$this->assertEquals('getInstance', $services['factory_service']->getFactoryMethod());
|
$this->assertEquals('getInstance', $services['factory_service']->getFactoryMethod());
|
||||||
|
@ -138,7 +138,7 @@ class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertEquals('sc_configure', $services['configurator1']->getConfigurator(), '->load() parses the configurator tag');
|
$this->assertEquals('sc_configure', $services['configurator1']->getConfigurator(), '->load() parses the configurator tag');
|
||||||
$this->assertEquals(array(new Reference('baz'), 'configure'), $services['configurator2']->getConfigurator(), '->load() parses the configurator tag');
|
$this->assertEquals(array(new Reference('baz'), 'configure'), $services['configurator2']->getConfigurator(), '->load() parses the configurator tag');
|
||||||
$this->assertEquals(array('BazClass', 'configureStatic'), $services['configurator3']->getConfigurator(), '->load() parses the configurator tag');
|
$this->assertEquals(array('BazClass', 'configureStatic'), $services['configurator3']->getConfigurator(), '->load() parses the configurator tag');
|
||||||
$this->assertEquals(array(array('setBar', array()), array('setBar', array()), array('setBar', array(new Expression('service("foo").foo() ~ parameter("foo")')))), $services['method_call1']->getMethodCalls(), '->load() parses the method_call tag');
|
$this->assertEquals(array(array('setBar', array()), array('setBar', array()), array('setBar', array(new Expression('service("foo").foo() ~ (container.hasparameter("foo") ? parameter("foo") : "default")')))), $services['method_call1']->getMethodCalls(), '->load() parses the method_call tag');
|
||||||
$this->assertEquals(array(array('setBar', array('foo', new Reference('foo'), array(true, false)))), $services['method_call2']->getMethodCalls(), '->load() parses the method_call tag');
|
$this->assertEquals(array(array('setBar', array('foo', new Reference('foo'), array(true, false)))), $services['method_call2']->getMethodCalls(), '->load() parses the method_call tag');
|
||||||
$this->assertEquals('baz_factory', $services['factory_service']->getFactoryService());
|
$this->assertEquals('baz_factory', $services['factory_service']->getFactoryService());
|
||||||
|
|
||||||
|
@ -75,6 +75,16 @@ class Parser
|
|||||||
/**
|
/**
|
||||||
* Converts a token stream to a node tree.
|
* Converts a token stream to a node tree.
|
||||||
*
|
*
|
||||||
|
* The valid names is an array where the values
|
||||||
|
* are the names that the user can use in an expression.
|
||||||
|
*
|
||||||
|
* If the variable name in the compiled PHP code must be
|
||||||
|
* different, define it as the key.
|
||||||
|
*
|
||||||
|
* For instance, ['this' => 'container'] means that the
|
||||||
|
* variable 'container' can be used in the expression
|
||||||
|
* but the compiled code will use 'this'.
|
||||||
|
*
|
||||||
* @param TokenStream $stream A token stream instance
|
* @param TokenStream $stream A token stream instance
|
||||||
* @param array $names An array of valid names
|
* @param array $names An array of valid names
|
||||||
*
|
*
|
||||||
@ -194,7 +204,13 @@ class Parser
|
|||||||
throw new SyntaxError(sprintf('Variable "%s" is not valid', $token->value), $token->cursor);
|
throw new SyntaxError(sprintf('Variable "%s" is not valid', $token->value), $token->cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
$node = new Node\NameNode($token->value);
|
// is the name used in the compiled code different
|
||||||
|
// from the name used in the expression?
|
||||||
|
if (is_int($name = array_search($token->value, $this->names))) {
|
||||||
|
$name = $token->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
$node = new Node\NameNode($name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -148,6 +148,12 @@ class ParserTest extends \PHPUnit_Framework_TestCase
|
|||||||
'foo.bar().foo().baz[3]',
|
'foo.bar().foo().baz[3]',
|
||||||
array('foo'),
|
array('foo'),
|
||||||
),
|
),
|
||||||
|
|
||||||
|
array(
|
||||||
|
new Node\NameNode('foo'),
|
||||||
|
'bar',
|
||||||
|
array('foo' => 'bar'),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,6 +34,31 @@ abstract class IteratorTestCase extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertEquals($expected, array_values($values));
|
$this->assertEquals($expected, array_values($values));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Same as assertOrderedIterator, but checks the order of groups of
|
||||||
|
* array elements.
|
||||||
|
*
|
||||||
|
* @param array $expected - an array of arrays. For any two subarrays
|
||||||
|
* $a and $b such that $a goes before $b in $expected, the method
|
||||||
|
* asserts that any element of $a goes before any element of $b
|
||||||
|
* in the sequence generated by $iterator
|
||||||
|
* @param \Traversable $iterator
|
||||||
|
*/
|
||||||
|
protected function assertOrderedIteratorForGroups($expected, \Traversable $iterator)
|
||||||
|
{
|
||||||
|
$values = array_values(array_map(function (\SplFileInfo $fileinfo) { return $fileinfo->getPathname(); }, iterator_to_array($iterator)));
|
||||||
|
|
||||||
|
foreach ($expected as $subarray) {
|
||||||
|
$temp = array();
|
||||||
|
while (count($values) && count($temp) < count($subarray)) {
|
||||||
|
array_push($temp, array_shift($values));
|
||||||
|
}
|
||||||
|
sort($temp);
|
||||||
|
sort($subarray);
|
||||||
|
$this->assertEquals($subarray, $temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Same as IteratorTestCase::assertIterator with foreach usage
|
* Same as IteratorTestCase::assertIterator with foreach usage
|
||||||
*
|
*
|
||||||
|
@ -80,7 +80,11 @@ abstract class RealIteratorTestCase extends IteratorTestCase
|
|||||||
if (is_array($files)) {
|
if (is_array($files)) {
|
||||||
$f = array();
|
$f = array();
|
||||||
foreach ($files as $file) {
|
foreach ($files as $file) {
|
||||||
$f[] = self::$tmpDir.DIRECTORY_SEPARATOR.str_replace('/', DIRECTORY_SEPARATOR, $file);
|
if (is_array($file)) {
|
||||||
|
$f[] = self::toAbsolute($file);
|
||||||
|
} else {
|
||||||
|
$f[] = self::$tmpDir.DIRECTORY_SEPARATOR.str_replace('/', DIRECTORY_SEPARATOR, $file);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $f;
|
return $f;
|
||||||
|
@ -54,7 +54,13 @@ class SortableIteratorTest extends RealIteratorTestCase
|
|||||||
|
|
||||||
$iterator = new SortableIterator($inner, $mode);
|
$iterator = new SortableIterator($inner, $mode);
|
||||||
|
|
||||||
$this->assertOrderedIterator($expected, $iterator);
|
if ($mode === SortableIterator::SORT_BY_ACCESSED_TIME
|
||||||
|
|| $mode === SortableIterator::SORT_BY_CHANGED_TIME
|
||||||
|
|| $mode === SortableIterator::SORT_BY_MODIFIED_TIME) {
|
||||||
|
$this->assertOrderedIteratorForGroups($expected, $iterator);
|
||||||
|
} else {
|
||||||
|
$this->assertOrderedIterator($expected, $iterator);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getAcceptData()
|
public function getAcceptData()
|
||||||
@ -102,45 +108,53 @@ class SortableIteratorTest extends RealIteratorTestCase
|
|||||||
);
|
);
|
||||||
|
|
||||||
$sortByAccessedTime = array(
|
$sortByAccessedTime = array(
|
||||||
'foo/bar.tmp',
|
// For these two files the access time was set to 2005-10-15
|
||||||
'test.php',
|
array('foo/bar.tmp', 'test.php'),
|
||||||
'toto',
|
// These files were created more or less at the same time
|
||||||
'foo bar',
|
array(
|
||||||
'foo',
|
'.git',
|
||||||
'test.py',
|
'.foo',
|
||||||
'.foo',
|
'.foo/.bar',
|
||||||
'.foo/.bar',
|
'.foo/bar',
|
||||||
'.foo/bar',
|
'test.py',
|
||||||
'.git',
|
'foo',
|
||||||
'.bar',
|
'toto',
|
||||||
|
'foo bar',
|
||||||
|
),
|
||||||
|
// This file was accessed after sleeping for 1 sec
|
||||||
|
array('.bar'),
|
||||||
);
|
);
|
||||||
|
|
||||||
$sortByChangedTime = array(
|
$sortByChangedTime = array(
|
||||||
'foo',
|
array(
|
||||||
'foo/bar.tmp',
|
'.git',
|
||||||
'toto',
|
'.foo',
|
||||||
'.git',
|
'.foo/.bar',
|
||||||
'.bar',
|
'.foo/bar',
|
||||||
'.foo',
|
'.bar',
|
||||||
'foo bar',
|
'foo',
|
||||||
'.foo/.bar',
|
'foo/bar.tmp',
|
||||||
'.foo/bar',
|
'toto',
|
||||||
'test.php',
|
'foo bar',
|
||||||
'test.py',
|
),
|
||||||
|
array('test.php'),
|
||||||
|
array('test.py'),
|
||||||
);
|
);
|
||||||
|
|
||||||
$sortByModifiedTime = array(
|
$sortByModifiedTime = array(
|
||||||
'foo/bar.tmp',
|
array(
|
||||||
'foo',
|
'.git',
|
||||||
'toto',
|
'.foo',
|
||||||
'.git',
|
'.foo/.bar',
|
||||||
'.bar',
|
'.foo/bar',
|
||||||
'.foo',
|
'.bar',
|
||||||
'foo bar',
|
'foo',
|
||||||
'.foo/.bar',
|
'foo/bar.tmp',
|
||||||
'.foo/bar',
|
'toto',
|
||||||
'test.php',
|
'foo bar',
|
||||||
'test.py',
|
),
|
||||||
|
array('test.php'),
|
||||||
|
array('test.py'),
|
||||||
);
|
);
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
|
@ -117,6 +117,8 @@ class DateTimeType extends AbstractType
|
|||||||
'empty_value',
|
'empty_value',
|
||||||
'required',
|
'required',
|
||||||
'translation_domain',
|
'translation_domain',
|
||||||
|
'invalid_message',
|
||||||
|
'invalid_message_parameters',
|
||||||
)));
|
)));
|
||||||
|
|
||||||
$timeOptions = array_intersect_key($options, array_flip(array(
|
$timeOptions = array_intersect_key($options, array_flip(array(
|
||||||
@ -128,6 +130,8 @@ class DateTimeType extends AbstractType
|
|||||||
'empty_value',
|
'empty_value',
|
||||||
'required',
|
'required',
|
||||||
'translation_domain',
|
'translation_domain',
|
||||||
|
'invalid_message',
|
||||||
|
'invalid_message_parameters',
|
||||||
)));
|
)));
|
||||||
|
|
||||||
if (null !== $options['date_widget']) {
|
if (null !== $options['date_widget']) {
|
||||||
|
Reference in New Issue
Block a user