Your IP : 13.58.77.244
<?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\Form\Tests;
use Symfony\Component\Form\ResolvedFormType;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\Form;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class ResolvedFormTypeTest extends \PHPUnit_Framework_TestCase
{
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $dispatcher;
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $factory;
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $dataMapper;
private $parentType;
private $type;
private $extension1;
private $extension2;
private $parentResolvedType;
private $resolvedType;
protected function setUp()
{
$this->dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
$this->factory = $this->getMock('Symfony\Component\Form\FormFactoryInterface');
$this->dataMapper = $this->getMock('Symfony\Component\Form\DataMapperInterface');
$this->parentType = $this->getMockFormType();
$this->type = $this->getMockFormType();
$this->extension1 = $this->getMockFormTypeExtension();
$this->extension2 = $this->getMockFormTypeExtension();
$this->parentResolvedType = new ResolvedFormType($this->parentType);
$this->resolvedType = new ResolvedFormType($this->type, array($this->extension1, $this->extension2), $this->parentResolvedType);
}
public function testGetOptionsResolver()
{
if (version_compare(\PHPUnit_Runner_Version::id(), '3.7', '<')) {
$this->markTestSkipped('This test requires PHPUnit 3.7.');
}
$test = $this;
$i = 0;
$assertIndexAndAddOption = function ($index, $option, $default) use (&$i, $test) {
return function (OptionsResolverInterface $resolver) use (&$i, $test, $index, $option, $default) {
/* @var \PHPUnit_Framework_TestCase $test */
$test->assertEquals($index, $i, 'Executed at index '.$index);
++$i;
$resolver->setDefaults(array($option => $default));
};
};
// First the default options are generated for the super type
$this->parentType->expects($this->once())
->method('setDefaultOptions')
->will($this->returnCallback($assertIndexAndAddOption(0, 'a', 'a_default')));
// The form type itself
$this->type->expects($this->once())
->method('setDefaultOptions')
->will($this->returnCallback($assertIndexAndAddOption(1, 'b', 'b_default')));
// And its extensions
$this->extension1->expects($this->once())
->method('setDefaultOptions')
->will($this->returnCallback($assertIndexAndAddOption(2, 'c', 'c_default')));
$this->extension2->expects($this->once())
->method('setDefaultOptions')
->will($this->returnCallback($assertIndexAndAddOption(3, 'd', 'd_default')));
$givenOptions = array('a' => 'a_custom', 'c' => 'c_custom');
$resolvedOptions = array('a' => 'a_custom', 'b' => 'b_default', 'c' => 'c_custom', 'd' => 'd_default');
$resolver = $this->resolvedType->getOptionsResolver();
$this->assertEquals($resolvedOptions, $resolver->resolve($givenOptions));
}
public function testCreateBuilder()
{
if (version_compare(\PHPUnit_Runner_Version::id(), '3.7', '<')) {
$this->markTestSkipped('This test requires PHPUnit 3.7.');
}
$givenOptions = array('a' => 'a_custom', 'c' => 'c_custom');
$resolvedOptions = array('a' => 'a_custom', 'b' => 'b_default', 'c' => 'c_custom', 'd' => 'd_default');
$optionsResolver = $this->getMock('Symfony\Component\OptionsResolver\OptionsResolverInterface');
$this->resolvedType = $this->getMockBuilder('Symfony\Component\Form\ResolvedFormType')
->setConstructorArgs(array($this->type, array($this->extension1, $this->extension2), $this->parentResolvedType))
->setMethods(array('getOptionsResolver'))
->getMock();
$this->resolvedType->expects($this->once())
->method('getOptionsResolver')
->will($this->returnValue($optionsResolver));
$optionsResolver->expects($this->once())
->method('resolve')
->with($givenOptions)
->will($this->returnValue($resolvedOptions));
$factory = $this->getMockFormFactory();
$builder = $this->resolvedType->createBuilder($factory, 'name', $givenOptions);
$this->assertSame($this->resolvedType, $builder->getType());
$this->assertSame($resolvedOptions, $builder->getOptions());
$this->assertNull($builder->getDataClass());
}
public function testCreateBuilderWithDataClassOption()
{
if (version_compare(\PHPUnit_Runner_Version::id(), '3.7', '<')) {
$this->markTestSkipped('This test requires PHPUnit 3.7.');
}
$givenOptions = array('data_class' => 'Foo');
$resolvedOptions = array('data_class' => '\stdClass');
$optionsResolver = $this->getMock('Symfony\Component\OptionsResolver\OptionsResolverInterface');
$this->resolvedType = $this->getMockBuilder('Symfony\Component\Form\ResolvedFormType')
->setConstructorArgs(array($this->type, array($this->extension1, $this->extension2), $this->parentResolvedType))
->setMethods(array('getOptionsResolver'))
->getMock();
$this->resolvedType->expects($this->once())
->method('getOptionsResolver')
->will($this->returnValue($optionsResolver));
$optionsResolver->expects($this->once())
->method('resolve')
->with($givenOptions)
->will($this->returnValue($resolvedOptions));
$factory = $this->getMockFormFactory();
$builder = $this->resolvedType->createBuilder($factory, 'name', $givenOptions);
$this->assertSame($this->resolvedType, $builder->getType());
$this->assertSame($resolvedOptions, $builder->getOptions());
$this->assertSame('\stdClass', $builder->getDataClass());
}
public function testBuildForm()
{
if (version_compare(\PHPUnit_Runner_Version::id(), '3.7', '<')) {
$this->markTestSkipped('This test requires PHPUnit 3.7.');
}
$test = $this;
$i = 0;
$assertIndex = function ($index) use (&$i, $test) {
return function () use (&$i, $test, $index) {
/* @var \PHPUnit_Framework_TestCase $test */
$test->assertEquals($index, $i, 'Executed at index '.$index);
++$i;
};
};
$options = array('a' => 'Foo', 'b' => 'Bar');
$builder = $this->getMock('Symfony\Component\Form\Test\FormBuilderInterface');
// First the form is built for the super type
$this->parentType->expects($this->once())
->method('buildForm')
->with($builder, $options)
->will($this->returnCallback($assertIndex(0)));
// Then the type itself
$this->type->expects($this->once())
->method('buildForm')
->with($builder, $options)
->will($this->returnCallback($assertIndex(1)));
// Then its extensions
$this->extension1->expects($this->once())
->method('buildForm')
->with($builder, $options)
->will($this->returnCallback($assertIndex(2)));
$this->extension2->expects($this->once())
->method('buildForm')
->with($builder, $options)
->will($this->returnCallback($assertIndex(3)));
$this->resolvedType->buildForm($builder, $options);
}
public function testCreateView()
{
$form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
$view = $this->resolvedType->createView($form);
$this->assertInstanceOf('Symfony\Component\Form\FormView', $view);
$this->assertNull($view->parent);
}
public function testCreateViewWithParent()
{
$form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
$parentView = $this->getMock('Symfony\Component\Form\FormView');
$view = $this->resolvedType->createView($form, $parentView);
$this->assertInstanceOf('Symfony\Component\Form\FormView', $view);
$this->assertSame($parentView, $view->parent);
}
public function testBuildView()
{
$options = array('a' => '1', 'b' => '2');
$form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
$view = $this->getMock('Symfony\Component\Form\FormView');
$test = $this;
$i = 0;
$assertIndex = function ($index) use (&$i, $test) {
return function () use (&$i, $test, $index) {
/* @var \PHPUnit_Framework_TestCase $test */
$test->assertEquals($index, $i, 'Executed at index '.$index);
++$i;
};
};
// First the super type
$this->parentType->expects($this->once())
->method('buildView')
->with($view, $form, $options)
->will($this->returnCallback($assertIndex(0)));
// Then the type itself
$this->type->expects($this->once())
->method('buildView')
->with($view, $form, $options)
->will($this->returnCallback($assertIndex(1)));
// Then its extensions
$this->extension1->expects($this->once())
->method('buildView')
->with($view, $form, $options)
->will($this->returnCallback($assertIndex(2)));
$this->extension2->expects($this->once())
->method('buildView')
->with($view, $form, $options)
->will($this->returnCallback($assertIndex(3)));
$this->resolvedType->buildView($view, $form, $options);
}
public function testFinishView()
{
$options = array('a' => '1', 'b' => '2');
$form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
$view = $this->getMock('Symfony\Component\Form\FormView');
$test = $this;
$i = 0;
$assertIndex = function ($index) use (&$i, $test) {
return function () use (&$i, $test, $index) {
/* @var \PHPUnit_Framework_TestCase $test */
$test->assertEquals($index, $i, 'Executed at index '.$index);
++$i;
};
};
// First the super type
$this->parentType->expects($this->once())
->method('finishView')
->with($view, $form, $options)
->will($this->returnCallback($assertIndex(0)));
// Then the type itself
$this->type->expects($this->once())
->method('finishView')
->with($view, $form, $options)
->will($this->returnCallback($assertIndex(1)));
// Then its extensions
$this->extension1->expects($this->once())
->method('finishView')
->with($view, $form, $options)
->will($this->returnCallback($assertIndex(2)));
$this->extension2->expects($this->once())
->method('finishView')
->with($view, $form, $options)
->will($this->returnCallback($assertIndex(3)));
$this->resolvedType->finishView($view, $form, $options);
}
/**
* @return \PHPUnit_Framework_MockObject_MockObject
*/
private function getMockFormType()
{
return $this->getMock('Symfony\Component\Form\FormTypeInterface');
}
/**
* @return \PHPUnit_Framework_MockObject_MockObject
*/
private function getMockFormTypeExtension()
{
return $this->getMock('Symfony\Component\Form\FormTypeExtensionInterface');
}
/**
* @return \PHPUnit_Framework_MockObject_MockObject
*/
private function getMockFormFactory()
{
return $this->getMock('Symfony\Component\Form\FormFactoryInterface');
}
/**
* @param string $name
* @param array $options
*
* @return FormBuilder
*/
protected function getBuilder($name = 'name', array $options = array())
{
return new FormBuilder($name, null, $this->dispatcher, $this->factory, $options);
}
}