2012-07-06 14:33:06 +01:00
< ? 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 ;
2018-07-26 10:03:18 +01:00
use Symfony\Component\EventDispatcher\EventDispatcher ;
use Symfony\Component\Form\Exception\TransformationFailedException ;
2012-07-06 14:33:06 +01:00
use Symfony\Component\Form\Form ;
2012-07-28 09:59:23 +01:00
use Symfony\Component\Form\FormConfigBuilder ;
2012-07-06 14:33:06 +01:00
use Symfony\Component\Form\FormError ;
2018-07-26 10:03:18 +01:00
use Symfony\Component\Form\FormEvent ;
use Symfony\Component\Form\FormEvents ;
2019-08-08 15:01:55 +01:00
use Symfony\Component\Form\FormInterface ;
2012-07-06 14:33:06 +01:00
use Symfony\Component\Form\Tests\Fixtures\FixedDataTransformer ;
use Symfony\Component\Form\Tests\Fixtures\FixedFilterListener ;
2018-07-26 10:03:18 +01:00
use Symfony\Component\PropertyAccess\PropertyPath ;
2012-07-06 14:33:06 +01:00
2012-12-13 14:18:14 +00:00
class SimpleFormTest_Countable implements \Countable
{
private $count ;
public function __construct ( $count )
{
$this -> count = $count ;
}
2019-08-22 14:01:48 +01:00
public function count () : int
2012-12-13 14:18:14 +00:00
{
return $this -> count ;
}
}
class SimpleFormTest_Traversable implements \IteratorAggregate
{
private $iterator ;
public function __construct ( $count )
{
2019-01-16 09:39:14 +00:00
$this -> iterator = new \ArrayIterator ( $count > 0 ? array_fill ( 0 , $count , 'Foo' ) : []);
2012-12-13 14:18:14 +00:00
}
2019-08-22 14:01:48 +01:00
public function getIterator () : \Traversable
2012-12-13 14:18:14 +00:00
{
return $this -> iterator ;
}
}
2012-07-06 14:33:06 +01:00
class SimpleFormTest extends AbstractFormTest
{
2019-03-12 20:16:42 +00:00
/**
* @ dataProvider provideFormNames
*/
public function testGetPropertyPath ( $name , $propertyPath )
{
$config = new FormConfigBuilder ( $name , null , $this -> dispatcher );
$form = new Form ( $config );
2019-04-06 15:32:25 +01:00
$this -> assertEquals ( $propertyPath , $form -> getPropertyPath ());
2019-03-12 20:16:42 +00:00
}
public function provideFormNames ()
{
yield [ null , null ];
yield [ '' , null ];
2019-04-06 15:32:25 +01:00
yield [ '0' , new PropertyPath ( '0' )];
yield [ 0 , new PropertyPath ( '0' )];
yield [ 'name' , new PropertyPath ( 'name' )];
2019-03-12 20:16:42 +00:00
}
2012-07-09 20:04:24 +01:00
public function testDataIsInitializedToConfiguredValue ()
2012-07-06 14:33:06 +01:00
{
2019-01-16 09:39:14 +00:00
$model = new FixedDataTransformer ([
2012-07-09 20:04:24 +01:00
'default' => 'foo' ,
2019-01-16 09:39:14 +00:00
]);
$view = new FixedDataTransformer ([
2012-07-06 14:33:06 +01:00
'foo' => 'bar' ,
2019-01-16 09:39:14 +00:00
]);
2012-07-06 14:33:06 +01:00
2012-07-28 09:59:23 +01:00
$config = new FormConfigBuilder ( 'name' , null , $this -> dispatcher );
2012-07-06 14:33:06 +01:00
$config -> addViewTransformer ( $view );
$config -> addModelTransformer ( $model );
2012-07-09 20:04:24 +01:00
$config -> setData ( 'default' );
2012-07-06 14:33:06 +01:00
$form = new Form ( $config );
2012-07-09 20:04:24 +01:00
$this -> assertSame ( 'default' , $form -> getData ());
2012-07-06 14:33:06 +01:00
$this -> assertSame ( 'foo' , $form -> getNormData ());
$this -> assertSame ( 'bar' , $form -> getViewData ());
}
2014-07-05 15:13:07 +01:00
public function testDataTransformationFailure ()
{
2019-08-01 23:48:42 +01:00
$this -> expectException ( 'Symfony\Component\Form\Exception\TransformationFailedException' );
$this -> expectExceptionMessage ( 'Unable to transform data for property path "name": No mapping for value "arg"' );
2019-01-16 09:39:14 +00:00
$model = new FixedDataTransformer ([
2014-07-05 15:13:07 +01:00
'default' => 'foo' ,
2019-01-16 09:39:14 +00:00
]);
$view = new FixedDataTransformer ([
2014-07-05 15:13:07 +01:00
'foo' => 'bar' ,
2019-01-16 09:39:14 +00:00
]);
2014-07-05 15:13:07 +01:00
$config = new FormConfigBuilder ( 'name' , null , $this -> dispatcher );
$config -> addViewTransformer ( $view );
$config -> addModelTransformer ( $model );
$config -> setData ( 'arg' );
$form = new Form ( $config );
$form -> getData ();
}
2012-07-26 09:55:40 +01:00
// https://github.com/symfony/symfony/commit/d4f4038f6daf7cf88ca7c7ab089473cce5ebf7d8#commitcomment-1632879
2013-04-20 16:32:55 +01:00
public function testDataIsInitializedFromSubmit ()
2012-07-26 09:55:40 +01:00
{
$mock = $this -> getMockBuilder ( '\stdClass' )
2019-01-16 09:39:14 +00:00
-> setMethods ([ 'preSetData' , 'preSubmit' ])
2012-07-26 09:55:40 +01:00
-> getMock ();
$mock -> expects ( $this -> at ( 0 ))
-> method ( 'preSetData' );
$mock -> expects ( $this -> at ( 1 ))
2013-04-20 16:32:55 +01:00
-> method ( 'preSubmit' );
2012-07-26 09:55:40 +01:00
2012-07-28 09:59:23 +01:00
$config = new FormConfigBuilder ( 'name' , null , $this -> dispatcher );
2019-01-16 09:39:14 +00:00
$config -> addEventListener ( FormEvents :: PRE_SET_DATA , [ $mock , 'preSetData' ]);
$config -> addEventListener ( FormEvents :: PRE_SUBMIT , [ $mock , 'preSubmit' ]);
2012-07-26 09:55:40 +01:00
$form = new Form ( $config );
// no call to setData() or similar where the object would be
// initialized otherwise
2013-04-20 16:32:55 +01:00
$form -> submit ( 'foobar' );
2012-07-26 09:55:40 +01:00
}
2013-04-22 14:11:14 +01:00
// https://github.com/symfony/symfony/pull/7789
public function testFalseIsConvertedToNull ()
{
$mock = $this -> getMockBuilder ( '\stdClass' )
2019-01-16 09:39:14 +00:00
-> setMethods ([ 'preSubmit' ])
2013-04-22 14:11:14 +01:00
-> getMock ();
$mock -> expects ( $this -> once ())
2014-12-26 00:42:48 +00:00
-> method ( 'preSubmit' )
2013-04-22 14:11:14 +01:00
-> with ( $this -> callback ( function ( $event ) {
return null === $event -> getData ();
}));
$config = new FormConfigBuilder ( 'name' , null , $this -> dispatcher );
2019-01-16 09:39:14 +00:00
$config -> addEventListener ( FormEvents :: PRE_SUBMIT , [ $mock , 'preSubmit' ]);
2013-04-22 14:11:14 +01:00
$form = new Form ( $config );
2015-02-26 10:33:40 +00:00
$form -> submit ( false );
2013-04-22 14:11:14 +01:00
$this -> assertTrue ( $form -> isValid ());
$this -> assertNull ( $form -> getData ());
}
2013-04-20 16:32:55 +01:00
public function testSubmitThrowsExceptionIfAlreadySubmitted ()
2012-07-06 14:33:06 +01:00
{
2019-08-01 23:48:42 +01:00
$this -> expectException ( 'Symfony\Component\Form\Exception\AlreadySubmittedException' );
2019-01-16 09:39:14 +00:00
$this -> form -> submit ([]);
$this -> form -> submit ([]);
2012-07-06 14:33:06 +01:00
}
2013-04-20 16:32:55 +01:00
public function testSubmitIsIgnoredIfDisabled ()
2012-07-06 14:33:06 +01:00
{
$form = $this -> getBuilder ()
-> setDisabled ( true )
-> setData ( 'initial' )
-> getForm ();
2013-04-20 16:32:55 +01:00
$form -> submit ( 'new' );
2012-07-06 14:33:06 +01:00
$this -> assertEquals ( 'initial' , $form -> getData ());
2013-04-20 16:32:55 +01:00
$this -> assertTrue ( $form -> isSubmitted ());
2012-07-06 14:33:06 +01:00
}
public function testNeverRequiredIfParentNotRequired ()
{
$parent = $this -> getBuilder () -> setRequired ( false ) -> getForm ();
$child = $this -> getBuilder () -> setRequired ( true ) -> getForm ();
$child -> setParent ( $parent );
$this -> assertFalse ( $child -> isRequired ());
}
public function testRequired ()
{
$parent = $this -> getBuilder () -> setRequired ( true ) -> getForm ();
$child = $this -> getBuilder () -> setRequired ( true ) -> getForm ();
$child -> setParent ( $parent );
$this -> assertTrue ( $child -> isRequired ());
}
public function testNotRequired ()
{
$parent = $this -> getBuilder () -> setRequired ( true ) -> getForm ();
$child = $this -> getBuilder () -> setRequired ( false ) -> getForm ();
$child -> setParent ( $parent );
$this -> assertFalse ( $child -> isRequired ());
}
2014-03-31 10:59:34 +01:00
/**
* @ dataProvider getDisabledStates
*/
public function testAlwaysDisabledIfParentDisabled ( $parentDisabled , $disabled , $result )
2012-07-06 14:33:06 +01:00
{
2014-03-31 10:59:34 +01:00
$parent = $this -> getBuilder () -> setDisabled ( $parentDisabled ) -> getForm ();
$child = $this -> getBuilder () -> setDisabled ( $disabled ) -> getForm ();
2012-07-06 14:33:06 +01:00
$child -> setParent ( $parent );
2014-03-31 10:59:34 +01:00
$this -> assertSame ( $result , $child -> isDisabled ());
2012-07-06 14:33:06 +01:00
}
2014-03-31 10:59:34 +01:00
public function getDisabledStates ()
2012-07-06 14:33:06 +01:00
{
2019-01-16 09:39:14 +00:00
return [
2014-03-31 10:59:34 +01:00
// parent, button, result
2019-01-16 09:39:14 +00:00
[ true , true , true ],
[ true , false , true ],
[ false , true , true ],
[ false , false , false ],
];
2012-07-06 14:33:06 +01:00
}
public function testGetRootReturnsRootOfParent ()
{
2019-01-18 17:22:25 +00:00
$root = $this -> createForm ();
$parent = $this -> createForm ();
$parent -> setParent ( $root );
2012-07-06 14:33:06 +01:00
$this -> form -> setParent ( $parent );
2019-01-18 17:22:25 +00:00
$this -> assertSame ( $root , $this -> form -> getRoot ());
2012-07-06 14:33:06 +01:00
}
public function testGetRootReturnsSelfIfNoParent ()
{
$this -> assertSame ( $this -> form , $this -> form -> getRoot ());
}
public function testEmptyIfEmptyArray ()
{
2019-01-16 09:39:14 +00:00
$this -> form -> setData ([]);
2012-07-06 14:33:06 +01:00
$this -> assertTrue ( $this -> form -> isEmpty ());
}
2012-12-13 14:18:14 +00:00
public function testEmptyIfEmptyCountable ()
{
2013-04-02 10:39:57 +01:00
$this -> form = new Form ( new FormConfigBuilder ( 'name' , __NAMESPACE__ . '\SimpleFormTest_Countable' , $this -> dispatcher ));
2012-12-13 14:18:14 +00:00
$this -> form -> setData ( new SimpleFormTest_Countable ( 0 ));
$this -> assertTrue ( $this -> form -> isEmpty ());
}
public function testNotEmptyIfFilledCountable ()
{
2013-04-02 10:39:57 +01:00
$this -> form = new Form ( new FormConfigBuilder ( 'name' , __NAMESPACE__ . '\SimpleFormTest_Countable' , $this -> dispatcher ));
2012-12-13 14:18:14 +00:00
$this -> form -> setData ( new SimpleFormTest_Countable ( 1 ));
$this -> assertFalse ( $this -> form -> isEmpty ());
}
public function testEmptyIfEmptyTraversable ()
{
2013-04-02 10:39:57 +01:00
$this -> form = new Form ( new FormConfigBuilder ( 'name' , __NAMESPACE__ . '\SimpleFormTest_Traversable' , $this -> dispatcher ));
2012-12-13 14:18:14 +00:00
$this -> form -> setData ( new SimpleFormTest_Traversable ( 0 ));
$this -> assertTrue ( $this -> form -> isEmpty ());
}
public function testNotEmptyIfFilledTraversable ()
{
2013-04-02 10:39:57 +01:00
$this -> form = new Form ( new FormConfigBuilder ( 'name' , __NAMESPACE__ . '\SimpleFormTest_Traversable' , $this -> dispatcher ));
2012-12-13 14:18:14 +00:00
$this -> form -> setData ( new SimpleFormTest_Traversable ( 1 ));
$this -> assertFalse ( $this -> form -> isEmpty ());
}
2012-07-06 14:33:06 +01:00
public function testEmptyIfNull ()
{
$this -> form -> setData ( null );
$this -> assertTrue ( $this -> form -> isEmpty ());
}
public function testEmptyIfEmptyString ()
{
$this -> form -> setData ( '' );
$this -> assertTrue ( $this -> form -> isEmpty ());
}
public function testNotEmptyIfText ()
{
$this -> form -> setData ( 'foobar' );
$this -> assertFalse ( $this -> form -> isEmpty ());
}
2013-04-20 16:32:55 +01:00
public function testValidIfSubmitted ()
2012-07-06 14:33:06 +01:00
{
$form = $this -> getBuilder () -> getForm ();
2013-04-20 16:32:55 +01:00
$form -> submit ( 'foobar' );
2012-07-06 14:33:06 +01:00
$this -> assertTrue ( $form -> isValid ());
}
2013-04-20 16:32:55 +01:00
public function testValidIfSubmittedAndDisabled ()
2012-07-06 14:33:06 +01:00
{
$form = $this -> getBuilder () -> setDisabled ( true ) -> getForm ();
2013-04-20 16:32:55 +01:00
$form -> submit ( 'foobar' );
2012-07-06 14:33:06 +01:00
$this -> assertTrue ( $form -> isValid ());
}
public function testNotValidIfErrors ()
{
$form = $this -> getBuilder () -> getForm ();
2013-04-20 16:32:55 +01:00
$form -> submit ( 'foobar' );
2012-07-06 14:33:06 +01:00
$form -> addError ( new FormError ( 'Error!' ));
$this -> assertFalse ( $form -> isValid ());
}
public function testHasErrors ()
{
$this -> form -> addError ( new FormError ( 'Error!' ));
2012-08-26 19:46:23 +01:00
$this -> assertCount ( 1 , $this -> form -> getErrors ());
2012-07-06 14:33:06 +01:00
}
public function testHasNoErrors ()
{
2012-08-26 19:46:23 +01:00
$this -> assertCount ( 0 , $this -> form -> getErrors ());
2012-07-06 14:33:06 +01:00
}
2013-04-20 16:32:55 +01:00
public function testSetParentThrowsExceptionIfAlreadySubmitted ()
2012-07-06 14:33:06 +01:00
{
2019-08-01 23:48:42 +01:00
$this -> expectException ( 'Symfony\Component\Form\Exception\AlreadySubmittedException' );
2019-01-16 09:39:14 +00:00
$this -> form -> submit ([]);
2012-07-06 14:33:06 +01:00
$this -> form -> setParent ( $this -> getBuilder ( 'parent' ) -> getForm ());
}
2013-04-20 16:32:55 +01:00
public function testSubmitted ()
2012-07-06 14:33:06 +01:00
{
$form = $this -> getBuilder () -> getForm ();
2013-04-20 16:32:55 +01:00
$form -> submit ( 'foobar' );
2012-07-06 14:33:06 +01:00
2013-04-20 16:32:55 +01:00
$this -> assertTrue ( $form -> isSubmitted ());
2012-07-06 14:33:06 +01:00
}
2013-04-20 16:32:55 +01:00
public function testNotSubmitted ()
2012-07-06 14:33:06 +01:00
{
2013-04-20 16:32:55 +01:00
$this -> assertFalse ( $this -> form -> isSubmitted ());
2012-07-06 14:33:06 +01:00
}
2013-04-20 16:32:55 +01:00
public function testSetDataThrowsExceptionIfAlreadySubmitted ()
2012-07-06 14:33:06 +01:00
{
2019-08-01 23:48:42 +01:00
$this -> expectException ( 'Symfony\Component\Form\Exception\AlreadySubmittedException' );
2019-01-16 09:39:14 +00:00
$this -> form -> submit ([]);
2012-07-06 14:33:06 +01:00
$this -> form -> setData ( null );
}
public function testSetDataClonesObjectIfNotByReference ()
{
$data = new \stdClass ();
$form = $this -> getBuilder ( 'name' , null , '\stdClass' ) -> setByReference ( false ) -> getForm ();
$form -> setData ( $data );
$this -> assertNotSame ( $data , $form -> getData ());
$this -> assertEquals ( $data , $form -> getData ());
}
public function testSetDataDoesNotCloneObjectIfByReference ()
{
$data = new \stdClass ();
$form = $this -> getBuilder ( 'name' , null , '\stdClass' ) -> setByReference ( true ) -> getForm ();
$form -> setData ( $data );
$this -> assertSame ( $data , $form -> getData ());
}
public function testSetDataExecutesTransformationChain ()
{
// use real event dispatcher now
$form = $this -> getBuilder ( 'name' , new EventDispatcher ())
2019-01-16 09:39:14 +00:00
-> addEventSubscriber ( new FixedFilterListener ([
'preSetData' => [
2013-04-20 16:32:55 +01:00
'app' => 'filtered' ,
2019-01-16 09:39:14 +00:00
],
]))
-> addModelTransformer ( new FixedDataTransformer ([
2013-04-20 16:32:55 +01:00
'' => '' ,
'filtered' => 'norm' ,
2019-01-16 09:39:14 +00:00
]))
-> addViewTransformer ( new FixedDataTransformer ([
2013-04-20 16:32:55 +01:00
'' => '' ,
'norm' => 'client' ,
2019-01-16 09:39:14 +00:00
]))
2012-07-06 14:33:06 +01:00
-> getForm ();
$form -> setData ( 'app' );
$this -> assertEquals ( 'filtered' , $form -> getData ());
$this -> assertEquals ( 'norm' , $form -> getNormData ());
$this -> assertEquals ( 'client' , $form -> getViewData ());
}
public function testSetDataExecutesViewTransformersInOrder ()
{
$form = $this -> getBuilder ()
2019-01-16 09:39:14 +00:00
-> addViewTransformer ( new FixedDataTransformer ([
2013-04-20 16:32:55 +01:00
'' => '' ,
'first' => 'second' ,
2019-01-16 09:39:14 +00:00
]))
-> addViewTransformer ( new FixedDataTransformer ([
2013-04-20 16:32:55 +01:00
'' => '' ,
'second' => 'third' ,
2019-01-16 09:39:14 +00:00
]))
2012-07-06 14:33:06 +01:00
-> getForm ();
$form -> setData ( 'first' );
$this -> assertEquals ( 'third' , $form -> getViewData ());
}
public function testSetDataExecutesModelTransformersInReverseOrder ()
{
$form = $this -> getBuilder ()
2019-01-16 09:39:14 +00:00
-> addModelTransformer ( new FixedDataTransformer ([
2013-04-20 16:32:55 +01:00
'' => '' ,
'second' => 'third' ,
2019-01-16 09:39:14 +00:00
]))
-> addModelTransformer ( new FixedDataTransformer ([
2013-04-20 16:32:55 +01:00
'' => '' ,
'first' => 'second' ,
2019-01-16 09:39:14 +00:00
]))
2012-07-06 14:33:06 +01:00
-> getForm ();
$form -> setData ( 'first' );
$this -> assertEquals ( 'third' , $form -> getNormData ());
}
/*
* When there is no data transformer , the data must have the same format
* in all three representations
*/
public function testSetDataConvertsScalarToStringIfNoTransformer ()
{
$form = $this -> getBuilder () -> getForm ();
$form -> setData ( 1 );
$this -> assertSame ( '1' , $form -> getData ());
$this -> assertSame ( '1' , $form -> getNormData ());
$this -> assertSame ( '1' , $form -> getViewData ());
}
/*
* Data in client format should , if possible , always be a string to
* facilitate differentiation between '0' and ''
*/
public function testSetDataConvertsScalarToStringIfOnlyModelTransformer ()
{
$form = $this -> getBuilder ()
2019-01-16 09:39:14 +00:00
-> addModelTransformer ( new FixedDataTransformer ([
2012-07-06 14:33:06 +01:00
'' => '' ,
1 => 23 ,
2019-01-16 09:39:14 +00:00
]))
2012-07-06 14:33:06 +01:00
-> getForm ();
$form -> setData ( 1 );
$this -> assertSame ( 1 , $form -> getData ());
$this -> assertSame ( 23 , $form -> getNormData ());
$this -> assertSame ( '23' , $form -> getViewData ());
}
/*
* NULL remains NULL in app and norm format to remove the need to treat
2012-07-16 20:54:46 +01:00
* empty values and NULL explicitly in the application
2012-07-06 14:33:06 +01:00
*/
public function testSetDataConvertsNullToStringIfNoTransformer ()
{
$form = $this -> getBuilder () -> getForm ();
$form -> setData ( null );
$this -> assertNull ( $form -> getData ());
$this -> assertNull ( $form -> getNormData ());
$this -> assertSame ( '' , $form -> getViewData ());
}
2012-07-09 20:04:24 +01:00
public function testSetDataIsIgnoredIfDataIsLocked ()
{
$form = $this -> getBuilder ()
-> setData ( 'default' )
-> setDataLocked ( true )
-> getForm ();
$form -> setData ( 'foobar' );
$this -> assertSame ( 'default' , $form -> getData ());
}
2017-03-05 19:10:06 +00:00
public function testPreSetDataChangesDataIfDataIsLocked ()
2017-02-01 21:47:52 +00:00
{
$config = new FormConfigBuilder ( 'name' , null , $this -> dispatcher );
$config
-> setData ( 'default' )
-> setDataLocked ( true )
2017-03-05 19:10:06 +00:00
-> addEventListener ( FormEvents :: PRE_SET_DATA , function ( FormEvent $event ) {
2017-02-01 21:47:52 +00:00
$event -> setData ( 'foobar' );
});
$form = new Form ( $config );
$this -> assertSame ( 'foobar' , $form -> getData ());
2017-03-05 19:10:06 +00:00
$this -> assertSame ( 'foobar' , $form -> getNormData ());
$this -> assertSame ( 'foobar' , $form -> getViewData ());
2017-02-01 21:47:52 +00:00
}
2013-04-20 16:32:55 +01:00
public function testSubmitConvertsEmptyToNullIfNoTransformer ()
2012-07-06 14:33:06 +01:00
{
$form = $this -> getBuilder () -> getForm ();
2013-04-20 16:32:55 +01:00
$form -> submit ( '' );
2012-07-06 14:33:06 +01:00
$this -> assertNull ( $form -> getData ());
$this -> assertNull ( $form -> getNormData ());
$this -> assertSame ( '' , $form -> getViewData ());
}
2013-04-20 16:32:55 +01:00
public function testSubmitExecutesTransformationChain ()
2012-07-06 14:33:06 +01:00
{
// use real event dispatcher now
$form = $this -> getBuilder ( 'name' , new EventDispatcher ())
2019-01-16 09:39:14 +00:00
-> addEventSubscriber ( new FixedFilterListener ([
'preSubmit' => [
2013-04-20 16:32:55 +01:00
'client' => 'filteredclient' ,
2019-01-16 09:39:14 +00:00
],
'onSubmit' => [
2013-04-20 16:32:55 +01:00
'norm' => 'filterednorm' ,
2019-01-16 09:39:14 +00:00
],
]))
-> addViewTransformer ( new FixedDataTransformer ([
2013-04-20 16:32:55 +01:00
'' => '' ,
// direction is reversed!
'norm' => 'filteredclient' ,
2014-09-21 19:53:12 +01:00
'filterednorm' => 'cleanedclient' ,
2019-01-16 09:39:14 +00:00
]))
-> addModelTransformer ( new FixedDataTransformer ([
2013-04-20 16:32:55 +01:00
'' => '' ,
// direction is reversed!
'app' => 'filterednorm' ,
2019-01-16 09:39:14 +00:00
]))
2012-07-06 14:33:06 +01:00
-> getForm ();
2013-04-20 16:32:55 +01:00
$form -> submit ( 'client' );
2012-07-06 14:33:06 +01:00
$this -> assertEquals ( 'app' , $form -> getData ());
$this -> assertEquals ( 'filterednorm' , $form -> getNormData ());
$this -> assertEquals ( 'cleanedclient' , $form -> getViewData ());
}
2013-04-20 16:32:55 +01:00
public function testSubmitExecutesViewTransformersInReverseOrder ()
2012-07-06 14:33:06 +01:00
{
$form = $this -> getBuilder ()
2019-01-16 09:39:14 +00:00
-> addViewTransformer ( new FixedDataTransformer ([
2013-04-20 16:32:55 +01:00
'' => '' ,
'third' => 'second' ,
2019-01-16 09:39:14 +00:00
]))
-> addViewTransformer ( new FixedDataTransformer ([
2013-04-20 16:32:55 +01:00
'' => '' ,
'second' => 'first' ,
2019-01-16 09:39:14 +00:00
]))
2012-07-06 14:33:06 +01:00
-> getForm ();
2013-04-20 16:32:55 +01:00
$form -> submit ( 'first' );
2012-07-06 14:33:06 +01:00
$this -> assertEquals ( 'third' , $form -> getNormData ());
}
2013-04-20 16:32:55 +01:00
public function testSubmitExecutesModelTransformersInOrder ()
2012-07-06 14:33:06 +01:00
{
$form = $this -> getBuilder ()
2019-01-16 09:39:14 +00:00
-> addModelTransformer ( new FixedDataTransformer ([
2013-04-20 16:32:55 +01:00
'' => '' ,
'second' => 'first' ,
2019-01-16 09:39:14 +00:00
]))
-> addModelTransformer ( new FixedDataTransformer ([
2013-04-20 16:32:55 +01:00
'' => '' ,
'third' => 'second' ,
2019-01-16 09:39:14 +00:00
]))
2012-07-06 14:33:06 +01:00
-> getForm ();
2013-04-20 16:32:55 +01:00
$form -> submit ( 'first' );
2012-07-06 14:33:06 +01:00
$this -> assertEquals ( 'third' , $form -> getData ());
}
public function testSynchronizedByDefault ()
{
$this -> assertTrue ( $this -> form -> isSynchronized ());
}
2013-04-20 16:32:55 +01:00
public function testSynchronizedAfterSubmission ()
2012-07-06 14:33:06 +01:00
{
2013-04-20 16:32:55 +01:00
$this -> form -> submit ( 'foobar' );
2012-07-06 14:33:06 +01:00
$this -> assertTrue ( $this -> form -> isSynchronized ());
}
2012-07-11 15:49:59 +01:00
public function testNotSynchronizedIfViewReverseTransformationFailed ()
2012-07-06 14:33:06 +01:00
{
$transformer = $this -> getDataTransformer ();
$transformer -> expects ( $this -> once ())
-> method ( 'reverseTransform' )
2018-12-22 19:54:00 +00:00
-> willThrowException ( new TransformationFailedException ());
2012-07-06 14:33:06 +01:00
$form = $this -> getBuilder ()
-> addViewTransformer ( $transformer )
-> getForm ();
2013-04-20 16:32:55 +01:00
$form -> submit ( 'foobar' );
2012-07-06 14:33:06 +01:00
$this -> assertFalse ( $form -> isSynchronized ());
}
2012-07-11 15:49:59 +01:00
public function testNotSynchronizedIfModelReverseTransformationFailed ()
{
$transformer = $this -> getDataTransformer ();
$transformer -> expects ( $this -> once ())
-> method ( 'reverseTransform' )
2018-12-22 19:54:00 +00:00
-> willThrowException ( new TransformationFailedException ());
2012-07-11 15:49:59 +01:00
$form = $this -> getBuilder ()
-> addModelTransformer ( $transformer )
-> getForm ();
2013-04-20 16:32:55 +01:00
$form -> submit ( 'foobar' );
2012-07-11 15:49:59 +01:00
$this -> assertFalse ( $form -> isSynchronized ());
}
2012-07-06 14:33:06 +01:00
public function testEmptyDataCreatedBeforeTransforming ()
{
$form = $this -> getBuilder ()
-> setEmptyData ( 'foo' )
2019-01-16 09:39:14 +00:00
-> addViewTransformer ( new FixedDataTransformer ([
2016-10-30 09:34:06 +00:00
'' => '' ,
// direction is reversed!
'bar' => 'foo' ,
2019-01-16 09:39:14 +00:00
]))
2012-07-06 14:33:06 +01:00
-> getForm ();
2013-04-20 16:32:55 +01:00
$form -> submit ( '' );
2012-07-06 14:33:06 +01:00
$this -> assertEquals ( 'bar' , $form -> getData ());
}
public function testEmptyDataFromClosure ()
{
$form = $this -> getBuilder ()
2014-12-03 22:04:33 +00:00
-> setEmptyData ( function ( $form ) {
2016-10-30 09:34:06 +00:00
// the form instance is passed to the closure to allow use
// of form data when creating the empty value
2016-11-03 08:04:31 +00:00
$this -> assertInstanceOf ( 'Symfony\Component\Form\FormInterface' , $form );
2012-07-06 14:33:06 +01:00
2016-10-30 09:34:06 +00:00
return 'foo' ;
})
2019-01-16 09:39:14 +00:00
-> addViewTransformer ( new FixedDataTransformer ([
2016-10-30 09:34:06 +00:00
'' => '' ,
// direction is reversed!
'bar' => 'foo' ,
2019-01-16 09:39:14 +00:00
]))
2012-07-06 14:33:06 +01:00
-> getForm ();
2013-04-20 16:32:55 +01:00
$form -> submit ( '' );
2012-07-06 14:33:06 +01:00
$this -> assertEquals ( 'bar' , $form -> getData ());
}
2013-04-20 16:32:55 +01:00
public function testSubmitResetsErrors ()
2012-07-06 14:33:06 +01:00
{
$this -> form -> addError ( new FormError ( 'Error!' ));
2013-04-20 16:32:55 +01:00
$this -> form -> submit ( 'foobar' );
2012-07-06 14:33:06 +01:00
2013-12-31 16:24:28 +00:00
$this -> assertCount ( 0 , $this -> form -> getErrors ());
2012-07-06 14:33:06 +01:00
}
2012-07-12 18:17:14 +01:00
public function testCreateView ()
2012-07-06 14:33:06 +01:00
{
2016-12-19 09:02:29 +00:00
$type = $this -> getMockBuilder ( 'Symfony\Component\Form\ResolvedFormTypeInterface' ) -> getMock ();
$view = $this -> getMockBuilder ( 'Symfony\Component\Form\FormView' ) -> getMock ();
2012-07-12 18:17:14 +01:00
$form = $this -> getBuilder () -> setType ( $type ) -> getForm ();
2012-07-06 14:33:06 +01:00
2012-07-12 18:17:14 +01:00
$type -> expects ( $this -> once ())
-> method ( 'createView' )
-> with ( $form )
2019-05-30 15:56:20 +01:00
-> willReturn ( $view );
2012-07-12 18:17:14 +01:00
$this -> assertSame ( $view , $form -> createView ());
}
public function testCreateViewWithParent ()
{
2016-12-19 09:02:29 +00:00
$type = $this -> getMockBuilder ( 'Symfony\Component\Form\ResolvedFormTypeInterface' ) -> getMock ();
$view = $this -> getMockBuilder ( 'Symfony\Component\Form\FormView' ) -> getMock ();
2019-01-18 17:22:25 +00:00
$parentType = $this -> getMockBuilder ( 'Symfony\Component\Form\ResolvedFormTypeInterface' ) -> getMock ();
$parentForm = $this -> getBuilder () -> setType ( $parentType ) -> getForm ();
2016-12-19 09:02:29 +00:00
$parentView = $this -> getMockBuilder ( 'Symfony\Component\Form\FormView' ) -> getMock ();
2012-07-12 18:17:14 +01:00
$form = $this -> getBuilder () -> setType ( $type ) -> getForm ();
$form -> setParent ( $parentForm );
2019-01-18 17:22:25 +00:00
$parentType -> expects ( $this -> once ())
2012-07-12 18:17:14 +01:00
-> method ( 'createView' )
2019-05-30 15:56:20 +01:00
-> willReturn ( $parentView );
2012-07-12 18:17:14 +01:00
$type -> expects ( $this -> once ())
-> method ( 'createView' )
-> with ( $form , $parentView )
2019-05-30 15:56:20 +01:00
-> willReturn ( $view );
2012-07-12 18:17:14 +01:00
$this -> assertSame ( $view , $form -> createView ());
}
public function testCreateViewWithExplicitParent ()
{
2016-12-19 09:02:29 +00:00
$type = $this -> getMockBuilder ( 'Symfony\Component\Form\ResolvedFormTypeInterface' ) -> getMock ();
$view = $this -> getMockBuilder ( 'Symfony\Component\Form\FormView' ) -> getMock ();
$parentView = $this -> getMockBuilder ( 'Symfony\Component\Form\FormView' ) -> getMock ();
2012-07-12 18:17:14 +01:00
$form = $this -> getBuilder () -> setType ( $type ) -> getForm ();
$type -> expects ( $this -> once ())
-> method ( 'createView' )
-> with ( $form , $parentView )
2019-05-30 15:56:20 +01:00
-> willReturn ( $view );
2012-07-06 14:33:06 +01:00
2012-07-12 18:17:14 +01:00
$this -> assertSame ( $view , $form -> createView ( $parentView ));
2012-07-06 14:33:06 +01:00
}
public function testFormCanHaveEmptyName ()
{
$form = $this -> getBuilder ( '' ) -> getForm ();
$this -> assertEquals ( '' , $form -> getName ());
}
2012-08-26 20:12:48 +01:00
public function testSetNullParentWorksWithEmptyName ()
{
$form = $this -> getBuilder ( '' ) -> getForm ();
$form -> setParent ( null );
$this -> assertNull ( $form -> getParent ());
}
2012-07-06 14:33:06 +01:00
public function testFormCannotHaveEmptyNameNotInRootLevel ()
{
2019-08-01 23:48:42 +01:00
$this -> expectException ( 'Symfony\Component\Form\Exception\LogicException' );
$this -> expectExceptionMessage ( 'A form with an empty name cannot have a parent form.' );
2012-07-06 14:33:06 +01:00
$this -> getBuilder ()
-> setCompound ( true )
-> setDataMapper ( $this -> getDataMapper ())
-> add ( $this -> getBuilder ( '' ))
-> getForm ();
}
public function testGetPropertyPathReturnsConfiguredPath ()
{
$form = $this -> getBuilder () -> setPropertyPath ( 'address.street' ) -> getForm ();
$this -> assertEquals ( new PropertyPath ( 'address.street' ), $form -> getPropertyPath ());
}
// see https://github.com/symfony/symfony/issues/3903
public function testGetPropertyPathDefaultsToNameIfParentHasDataClass ()
{
$parent = $this -> getBuilder ( null , null , 'stdClass' )
-> setCompound ( true )
-> setDataMapper ( $this -> getDataMapper ())
-> getForm ();
$form = $this -> getBuilder ( 'name' ) -> getForm ();
$parent -> add ( $form );
$this -> assertEquals ( new PropertyPath ( 'name' ), $form -> getPropertyPath ());
}
// see https://github.com/symfony/symfony/issues/3903
public function testGetPropertyPathDefaultsToIndexedNameIfParentDataClassIsNull ()
{
$parent = $this -> getBuilder ()
-> setCompound ( true )
-> setDataMapper ( $this -> getDataMapper ())
-> getForm ();
$form = $this -> getBuilder ( 'name' ) -> getForm ();
$parent -> add ( $form );
$this -> assertEquals ( new PropertyPath ( '[name]' ), $form -> getPropertyPath ());
}
2013-01-05 13:26:33 +00:00
public function testGetPropertyPathDefaultsToNameIfFirstParentWithoutInheritDataHasDataClass ()
{
$grandParent = $this -> getBuilder ( null , null , 'stdClass' )
-> setCompound ( true )
-> setDataMapper ( $this -> getDataMapper ())
-> getForm ();
$parent = $this -> getBuilder ()
-> setCompound ( true )
-> setDataMapper ( $this -> getDataMapper ())
-> setInheritData ( true )
-> getForm ();
$form = $this -> getBuilder ( 'name' ) -> getForm ();
$grandParent -> add ( $parent );
$parent -> add ( $form );
$this -> assertEquals ( new PropertyPath ( 'name' ), $form -> getPropertyPath ());
}
public function testGetPropertyPathDefaultsToIndexedNameIfDataClassOfFirstParentWithoutInheritDataIsNull ()
{
$grandParent = $this -> getBuilder ()
-> setCompound ( true )
-> setDataMapper ( $this -> getDataMapper ())
-> getForm ();
$parent = $this -> getBuilder ()
-> setCompound ( true )
-> setDataMapper ( $this -> getDataMapper ())
-> setInheritData ( true )
-> getForm ();
$form = $this -> getBuilder ( 'name' ) -> getForm ();
$grandParent -> add ( $parent );
$parent -> add ( $form );
$this -> assertEquals ( new PropertyPath ( '[name]' ), $form -> getPropertyPath ());
}
2015-11-26 09:11:54 +00:00
public function testViewDataMayBeObjectIfDataClassIsNull ()
2012-07-06 14:33:06 +01:00
{
2015-11-26 09:11:54 +00:00
$object = new \stdClass ();
2012-07-28 09:59:23 +01:00
$config = new FormConfigBuilder ( 'name' , null , $this -> dispatcher );
2019-01-16 09:39:14 +00:00
$config -> addViewTransformer ( new FixedDataTransformer ([
2012-07-06 14:33:06 +01:00
'' => '' ,
2015-11-26 09:11:54 +00:00
'foo' => $object ,
2019-01-16 09:39:14 +00:00
]));
2012-07-06 14:33:06 +01:00
$form = new Form ( $config );
$form -> setData ( 'foo' );
2015-11-26 09:11:54 +00:00
$this -> assertSame ( $object , $form -> getViewData ());
2012-07-06 14:33:06 +01:00
}
public function testViewDataMayBeArrayAccessIfDataClassIsNull ()
{
2016-12-19 09:02:29 +00:00
$arrayAccess = $this -> getMockBuilder ( '\ArrayAccess' ) -> getMock ();
2012-07-28 09:59:23 +01:00
$config = new FormConfigBuilder ( 'name' , null , $this -> dispatcher );
2019-01-16 09:39:14 +00:00
$config -> addViewTransformer ( new FixedDataTransformer ([
2012-07-06 14:33:06 +01:00
'' => '' ,
'foo' => $arrayAccess ,
2019-01-16 09:39:14 +00:00
]));
2012-07-06 14:33:06 +01:00
$form = new Form ( $config );
$form -> setData ( 'foo' );
$this -> assertSame ( $arrayAccess , $form -> getViewData ());
}
public function testViewDataMustBeObjectIfDataClassIsSet ()
{
2019-08-01 23:48:42 +01:00
$this -> expectException ( 'Symfony\Component\Form\Exception\LogicException' );
2012-07-28 09:59:23 +01:00
$config = new FormConfigBuilder ( 'name' , 'stdClass' , $this -> dispatcher );
2019-01-16 09:39:14 +00:00
$config -> addViewTransformer ( new FixedDataTransformer ([
2012-07-06 14:33:06 +01:00
'' => '' ,
2019-01-16 09:39:14 +00:00
'foo' => [ 'bar' => 'baz' ],
]));
2012-07-06 14:33:06 +01:00
$form = new Form ( $config );
$form -> setData ( 'foo' );
}
2012-07-16 11:47:05 +01:00
public function testSetDataCannotInvokeItself ()
{
2019-08-01 23:48:42 +01:00
$this -> expectException ( 'Symfony\Component\Form\Exception\RuntimeException' );
$this -> expectExceptionMessage ( 'A cycle was detected. Listeners to the PRE_SET_DATA event must not call setData(). You should call setData() on the FormEvent object instead.' );
2012-07-16 11:47:05 +01:00
// Cycle detection to prevent endless loops
2012-07-28 09:59:23 +01:00
$config = new FormConfigBuilder ( 'name' , 'stdClass' , $this -> dispatcher );
2012-07-16 11:47:05 +01:00
$config -> addEventListener ( FormEvents :: PRE_SET_DATA , function ( FormEvent $event ) {
$event -> getForm () -> setData ( 'bar' );
});
$form = new Form ( $config );
$form -> setData ( 'foo' );
}
2013-04-20 16:32:55 +01:00
public function testSubmittingWrongDataIsIgnored ()
2012-08-24 23:05:19 +01:00
{
2017-03-18 09:10:35 +00:00
$called = 0 ;
2012-08-24 23:05:19 +01:00
$child = $this -> getBuilder ( 'child' , $this -> dispatcher );
2017-03-18 09:10:35 +00:00
$child -> addEventListener ( FormEvents :: PRE_SUBMIT , function () use ( & $called ) {
++ $called ;
2012-08-24 23:05:19 +01:00
});
$parent = $this -> getBuilder ( 'parent' , new EventDispatcher ())
-> setCompound ( true )
-> setDataMapper ( $this -> getDataMapper ())
-> add ( $child )
-> getForm ();
2013-04-20 16:32:55 +01:00
$parent -> submit ( 'not-an-array' );
2017-03-18 09:10:35 +00:00
$this -> assertSame ( 0 , $called , 'PRE_SUBMIT event listeners are not called for wrong data' );
2012-08-24 23:05:19 +01:00
}
2013-04-20 14:56:42 +01:00
public function testHandleRequestForwardsToRequestHandler ()
2012-12-30 15:38:36 +00:00
{
2016-12-19 09:02:29 +00:00
$handler = $this -> getMockBuilder ( 'Symfony\Component\Form\RequestHandlerInterface' ) -> getMock ();
2012-12-30 15:38:36 +00:00
$form = $this -> getBuilder ()
2013-04-29 16:31:30 +01:00
-> setRequestHandler ( $handler )
2012-12-30 15:38:36 +00:00
-> getForm ();
2013-04-29 16:31:30 +01:00
$handler -> expects ( $this -> once ())
2013-04-20 14:56:42 +01:00
-> method ( 'handleRequest' )
2012-12-30 15:38:36 +00:00
-> with ( $this -> identicalTo ( $form ), 'REQUEST' );
2013-04-20 14:56:42 +01:00
$this -> assertSame ( $form , $form -> handleRequest ( 'REQUEST' ));
2012-12-30 15:38:36 +00:00
}
2013-01-05 13:26:33 +00:00
public function testFormInheritsParentData ()
{
$child = $this -> getBuilder ( 'child' )
-> setInheritData ( true );
$parent = $this -> getBuilder ( 'parent' )
-> setCompound ( true )
-> setDataMapper ( $this -> getDataMapper ())
-> setData ( 'foo' )
2019-01-16 09:39:14 +00:00
-> addModelTransformer ( new FixedDataTransformer ([
2013-01-05 13:26:33 +00:00
'foo' => 'norm[foo]' ,
2019-01-16 09:39:14 +00:00
]))
-> addViewTransformer ( new FixedDataTransformer ([
2013-01-05 13:26:33 +00:00
'norm[foo]' => 'view[foo]' ,
2019-01-16 09:39:14 +00:00
]))
2013-01-05 13:26:33 +00:00
-> add ( $child )
-> getForm ();
$this -> assertSame ( 'foo' , $parent -> get ( 'child' ) -> getData ());
$this -> assertSame ( 'norm[foo]' , $parent -> get ( 'child' ) -> getNormData ());
$this -> assertSame ( 'view[foo]' , $parent -> get ( 'child' ) -> getViewData ());
}
public function testInheritDataDisallowsSetData ()
{
2019-08-01 23:48:42 +01:00
$this -> expectException ( 'Symfony\Component\Form\Exception\RuntimeException' );
2013-01-05 13:26:33 +00:00
$form = $this -> getBuilder ()
-> setInheritData ( true )
-> getForm ();
$form -> setData ( 'foo' );
}
public function testGetDataRequiresParentToBeSetIfInheritData ()
{
2019-08-01 23:48:42 +01:00
$this -> expectException ( 'Symfony\Component\Form\Exception\RuntimeException' );
2013-01-05 13:26:33 +00:00
$form = $this -> getBuilder ()
-> setInheritData ( true )
-> getForm ();
$form -> getData ();
}
public function testGetNormDataRequiresParentToBeSetIfInheritData ()
{
2019-08-01 23:48:42 +01:00
$this -> expectException ( 'Symfony\Component\Form\Exception\RuntimeException' );
2013-01-05 13:26:33 +00:00
$form = $this -> getBuilder ()
-> setInheritData ( true )
-> getForm ();
$form -> getNormData ();
}
public function testGetViewDataRequiresParentToBeSetIfInheritData ()
{
2019-08-01 23:48:42 +01:00
$this -> expectException ( 'Symfony\Component\Form\Exception\RuntimeException' );
2013-01-05 13:26:33 +00:00
$form = $this -> getBuilder ()
-> setInheritData ( true )
-> getForm ();
$form -> getViewData ();
}
2013-04-20 16:32:55 +01:00
public function testPostSubmitDataIsNullIfInheritData ()
2013-01-05 13:26:33 +00:00
{
$form = $this -> getBuilder ()
2014-12-03 22:04:33 +00:00
-> addEventListener ( FormEvents :: POST_SUBMIT , function ( FormEvent $event ) {
$this -> assertNull ( $event -> getData ());
2013-01-05 13:26:33 +00:00
})
-> setInheritData ( true )
-> getForm ();
2013-04-20 16:32:55 +01:00
$form -> submit ( 'foo' );
2013-01-05 13:26:33 +00:00
}
2013-04-20 16:32:55 +01:00
public function testSubmitIsNeverFiredIfInheritData ()
2013-01-05 13:26:33 +00:00
{
2017-03-18 09:10:35 +00:00
$called = 0 ;
2013-01-05 13:26:33 +00:00
$form = $this -> getBuilder ()
2017-03-18 09:10:35 +00:00
-> addEventListener ( FormEvents :: SUBMIT , function () use ( & $called ) {
++ $called ;
2013-01-05 13:26:33 +00:00
})
-> setInheritData ( true )
-> getForm ();
2013-04-20 16:32:55 +01:00
$form -> submit ( 'foo' );
2017-03-18 09:10:35 +00:00
$this -> assertSame ( 0 , $called , 'The SUBMIT event is not fired when data are inherited from the parent form' );
2013-01-05 13:26:33 +00:00
}
2013-04-29 16:31:30 +01:00
public function testInitializeSetsDefaultData ()
{
$config = $this -> getBuilder () -> setData ( 'DEFAULT' ) -> getFormConfig ();
2019-01-16 09:39:14 +00:00
$form = $this -> getMockBuilder ( 'Symfony\Component\Form\Form' ) -> setMethods ([ 'setData' ]) -> setConstructorArgs ([ $config ]) -> getMock ();
2013-04-29 16:31:30 +01:00
$form -> expects ( $this -> once ())
-> method ( 'setData' )
-> with ( $this -> identicalTo ( 'DEFAULT' ));
/* @var Form $form */
$form -> initialize ();
}
public function testInitializeFailsIfParent ()
{
2019-08-01 23:48:42 +01:00
$this -> expectException ( 'Symfony\Component\Form\Exception\RuntimeException' );
2013-04-29 16:31:30 +01:00
$parent = $this -> getBuilder () -> setRequired ( false ) -> getForm ();
$child = $this -> getBuilder () -> setRequired ( true ) -> getForm ();
$child -> setParent ( $parent );
$child -> initialize ();
}
2017-03-24 09:02:28 +00:00
public function testCannotCallGetDataInPreSetDataListenerIfDataHasNotAlreadyBeenSet ()
{
2019-08-01 23:48:42 +01:00
$this -> expectException ( 'Symfony\Component\Form\Exception\RuntimeException' );
$this -> expectExceptionMessage ( 'A cycle was detected. Listeners to the PRE_SET_DATA event must not call getData() if the form data has not already been set. You should call getData() on the FormEvent object instead.' );
2017-03-24 09:02:28 +00:00
$config = new FormConfigBuilder ( 'name' , 'stdClass' , $this -> dispatcher );
$config -> addEventListener ( FormEvents :: PRE_SET_DATA , function ( FormEvent $event ) {
$event -> getForm () -> getData ();
});
$form = new Form ( $config );
$form -> setData ( 'foo' );
}
public function testCannotCallGetNormDataInPreSetDataListener ()
{
2019-08-01 23:48:42 +01:00
$this -> expectException ( 'Symfony\Component\Form\Exception\RuntimeException' );
$this -> expectExceptionMessage ( 'A cycle was detected. Listeners to the PRE_SET_DATA event must not call getNormData() if the form data has not already been set.' );
2017-03-24 09:02:28 +00:00
$config = new FormConfigBuilder ( 'name' , 'stdClass' , $this -> dispatcher );
$config -> addEventListener ( FormEvents :: PRE_SET_DATA , function ( FormEvent $event ) {
$event -> getForm () -> getNormData ();
});
$form = new Form ( $config );
$form -> setData ( 'foo' );
}
public function testCannotCallGetViewDataInPreSetDataListener ()
{
2019-08-01 23:48:42 +01:00
$this -> expectException ( 'Symfony\Component\Form\Exception\RuntimeException' );
$this -> expectExceptionMessage ( 'A cycle was detected. Listeners to the PRE_SET_DATA event must not call getViewData() if the form data has not already been set.' );
2017-03-24 09:02:28 +00:00
$config = new FormConfigBuilder ( 'name' , 'stdClass' , $this -> dispatcher );
$config -> addEventListener ( FormEvents :: PRE_SET_DATA , function ( FormEvent $event ) {
$event -> getForm () -> getViewData ();
});
$form = new Form ( $config );
$form -> setData ( 'foo' );
}
2019-07-25 17:09:28 +01:00
public function testIsEmptyCallback ()
{
$config = new FormConfigBuilder ( 'foo' , null , $this -> dispatcher );
$config -> setIsEmptyCallback ( function ( $modelData ) : bool { return 'ccc' === $modelData ; });
$form = new Form ( $config );
$form -> setData ( 'ccc' );
$this -> assertTrue ( $form -> isEmpty ());
$config -> setIsEmptyCallback ( function () : bool { return false ; });
$form = new Form ( $config );
$form -> setData ( null );
$this -> assertFalse ( $form -> isEmpty ());
}
2019-08-08 15:01:55 +01:00
protected function createForm () : FormInterface
2012-07-06 14:33:06 +01:00
{
return $this -> getBuilder () -> getForm ();
}
}