123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791 |
- <?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\Tests\Component\Form;
- use Symfony\Component\Form\FormError;
- use Symfony\Component\Form\FormView;
- use Symfony\Component\Form\FormFactory;
- use Symfony\Component\Form\Extension\Core\CoreExtension;
- use Symfony\Component\Form\Extension\Csrf\CsrfExtension;
- abstract class AbstractLayoutTest extends \PHPUnit_Framework_TestCase
- {
- protected $csrfProvider;
- protected $factory;
- protected function setUp()
- {
- if (!extension_loaded('intl')) {
- $this->markTestSkipped('The "intl" extension is not available');
- }
- \Locale::setDefault('en');
- $this->csrfProvider = $this->getMock('Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface');
- $this->factory = new FormFactory(array(
- new CoreExtension(),
- new CsrfExtension($this->csrfProvider),
- ));
- }
- protected function tearDown()
- {
- $this->csrfProvider = null;
- $this->factory = null;
- }
- protected function assertXpathNodeValue(\DomElement $element, $expression, $nodeValue)
- {
- $xpath = new \DOMXPath($element->ownerDocument);
- $nodeList = $xpath->evaluate($expression);
- $this->assertEquals(1, $nodeList->length);
- $this->assertEquals($nodeValue, $nodeList->item(0)->nodeValue);
- }
- protected function assertMatchesXpath($html, $expression, $count = 1)
- {
- $dom = new \DomDocument('UTF-8');
- try {
- // Wrap in <root> node so we can load HTML with multiple tags at
- // the top level
- $dom->loadXml('<root>'.$html.'</root>');
- } catch (\Exception $e) {
- return $this->fail(sprintf(
- "Failed loading HTML:\n\n%s\n\nError: %s",
- $html,
- $e->getMessage()
- ));
- }
- $xpath = new \DOMXPath($dom);
- $nodeList = $xpath->evaluate('/root'.$expression);
- if ($nodeList->length != $count) {
- $dom->formatOutput = true;
- $this->fail(sprintf(
- "Failed asserting that \n\n%s\n\nmatches exactly %s. Matches %s in \n\n%s",
- $expression,
- $count == 1 ? 'once' : $count . ' times',
- $nodeList->length == 1 ? 'once' : $nodeList->length . ' times',
- // strip away <root> and </root>
- substr($dom->saveHTML(), 6, -8)
- ));
- }
- }
- protected function assertWidgetMatchesXpath(FormView $view, array $vars, $xpath)
- {
- // include ampersands everywhere to validate escaping
- $html = $this->renderWidget($view, array_merge(array(
- 'id' => 'my&id',
- 'attr' => array('class' => 'my&class'),
- ), $vars));
- $xpath = trim($xpath).'
- [@id="my&id"]
- [@class="my&class"]';
- $this->assertMatchesXpath($html, $xpath);
- }
- abstract protected function renderEnctype(FormView $view);
- abstract protected function renderLabel(FormView $view, $label = null, array $vars = array());
- abstract protected function renderErrors(FormView $view);
- abstract protected function renderWidget(FormView $view, array $vars = array());
- abstract protected function renderRow(FormView $view, array $vars = array());
- abstract protected function renderRest(FormView $view, array $vars = array());
- abstract protected function setTheme(FormView $view, array $themes);
- public function testEnctype()
- {
- $form = $this->factory->createNamedBuilder('form', 'na&me', null, array(
- 'property_path' => 'name',
- ))
- ->add('file', 'file')
- ->getForm();
- $this->assertEquals('enctype="multipart/form-data"', $this->renderEnctype($form->createView()));
- }
- public function testNoEnctype()
- {
- $form = $this->factory->createNamedBuilder('form', 'na&me', null, array(
- 'property_path' => 'name',
- ))
- ->add('text', 'text')
- ->getForm();
- $this->assertEquals('', $this->renderEnctype($form->createView()));
- }
- public function testLabel()
- {
- $form = $this->factory->createNamed('text', 'na&me', null, array(
- 'property_path' => 'name',
- ));
- $view = $form->createView();
- $this->renderWidget($view, array('label' => 'foo'));
- $html = $this->renderLabel($view);
- $this->assertMatchesXpath($html,
- '/label
- [@for="na&me"]
- [.="[trans]Na&me[/trans]"]
- '
- );
- }
- public function testLabelOnForm()
- {
- $form = $this->factory->createNamed('date', 'na&me', null, array(
- 'property_path' => 'name',
- ));
- $view = $form->createView();
- $this->renderWidget($view, array('label' => 'foo'));
- $html = $this->renderLabel($view);
- $this->assertMatchesXpath($html,
- '/label
- [@class=" required"]
- [.="[trans]Na&me[/trans]"]
- '
- );
- }
- public function testLabelWithCustomTextPassedAsOption()
- {
- $form = $this->factory->createNamed('text', 'na&me', null, array(
- 'property_path' => 'name',
- 'label' => 'Custom label',
- ));
- $html = $this->renderLabel($form->createView());
- $this->assertMatchesXpath($html,
- '/label
- [@for="na&me"]
- [.="[trans]Custom label[/trans]"]
- '
- );
- }
- public function testLabelWithCustomTextPassedDirectly()
- {
- $form = $this->factory->createNamed('text', 'na&me', null, array(
- 'property_path' => 'name',
- ));
- $html = $this->renderLabel($form->createView(), 'Custom label');
- $this->assertMatchesXpath($html,
- '/label
- [@for="na&me"]
- [.="[trans]Custom label[/trans]"]
- '
- );
- }
- public function testLabelWithCustomTextPassedAsOptionAndDirectly()
- {
- $form = $this->factory->createNamed('text', 'na&me', null, array(
- 'property_path' => 'name',
- 'label' => 'Custom label',
- ));
- $html = $this->renderLabel($form->createView(), 'Overridden label');
- $this->assertMatchesXpath($html,
- '/label
- [@for="na&me"]
- [.="[trans]Overridden label[/trans]"]
- '
- );
- }
- public function testLabelWithCustomOptionsPassedDirectly()
- {
- $form = $this->factory->createNamed('text', 'na&me', null, array(
- 'property_path' => 'name',
- ));
- $html = $this->renderLabel($form->createView(), null, array(
- 'attr' => array(
- 'class' => 'my&class'
- ),
- ));
- $this->assertMatchesXpath($html,
- '/label
- [@for="na&me"]
- [@class="my&class required"]
- '
- );
- }
- public function testLabelWithCustomTextAndCustomOptionsPassedDirectly()
- {
- $form = $this->factory->createNamed('text', 'na&me', null, array(
- 'property_path' => 'name',
- ));
- $html = $this->renderLabel($form->createView(), 'Custom label', array(
- 'attr' => array(
- 'class' => 'my&class'
- ),
- ));
- $this->assertMatchesXpath($html,
- '/label
- [@for="na&me"]
- [@class="my&class required"]
- [.="[trans]Custom label[/trans]"]
- '
- );
- }
- public function testErrors()
- {
- $form = $this->factory->createNamed('text', 'na&me', null, array(
- 'property_path' => 'name',
- ));
- $form->addError(new FormError('Error 1'));
- $form->addError(new FormError('Error 2'));
- $view = $form->createView();
- $html = $this->renderErrors($view);
- $this->assertMatchesXpath($html,
- '/ul
- [
- ./li[.="[trans]Error 1[/trans]"]
- /following-sibling::li[.="[trans]Error 2[/trans]"]
- ]
- [count(./li)=2]
- '
- );
- }
- public function testWidgetById()
- {
- $form = $this->factory->createNamed('text', 'text_id');
- $html = $this->renderWidget($form->createView());
- $this->assertMatchesXpath($html,
- '/div
- [
- ./input
- [@type="text"]
- [@id="text_id"]
- ]
- [@id="container"]
- '
- );
- }
- public function testCheckedCheckbox()
- {
- $form = $this->factory->createNamed('checkbox', 'na&me', true, array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="checkbox"]
- [@name="na&me"]
- [@checked="checked"]
- [@value="1"]
- '
- );
- }
- public function testCheckedCheckboxWithValue()
- {
- $form = $this->factory->createNamed('checkbox', 'na&me', true, array(
- 'property_path' => 'name',
- 'value' => 'foo&bar',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="checkbox"]
- [@name="na&me"]
- [@checked="checked"]
- [@value="foo&bar"]
- '
- );
- }
- public function testUncheckedCheckbox()
- {
- $form = $this->factory->createNamed('checkbox', 'na&me', false, array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="checkbox"]
- [@name="na&me"]
- [not(@checked)]
- '
- );
- }
- public function testSingleChoice()
- {
- $form = $this->factory->createNamed('choice', 'na&me', '&a', array(
- 'property_path' => 'name',
- 'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
- 'multiple' => false,
- 'expanded' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/select
- [@name="na&me"]
- [@required="required"]
- [
- ./option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
- /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
- ]
- [count(./option)=2]
- '
- );
- }
- public function testSingleChoiceWithPreferred()
- {
- $form = $this->factory->createNamed('choice', 'na&me', '&a', array(
- 'property_path' => 'name',
- 'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
- 'preferred_choices' => array('&b'),
- 'multiple' => false,
- 'expanded' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array('separator' => '-- sep --'),
- '/select
- [@name="na&me"]
- [@required="required"]
- [
- ./option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
- /following-sibling::option[@disabled="disabled"][not(@selected)][.="-- sep --"]
- /following-sibling::option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
- ]
- [count(./option)=3]
- '
- );
- }
- public function testSingleChoiceWithPreferredAndNoSeparator()
- {
- $form = $this->factory->createNamed('choice', 'na&me', '&a', array(
- 'property_path' => 'name',
- 'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
- 'preferred_choices' => array('&b'),
- 'multiple' => false,
- 'expanded' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array('separator' => null),
- '/select
- [@name="na&me"]
- [@required="required"]
- [
- ./option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
- /following-sibling::option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
- ]
- [count(./option)=2]
- '
- );
- }
- public function testSingleChoiceWithPreferredAndBlankSeparator()
- {
- $form = $this->factory->createNamed('choice', 'na&me', '&a', array(
- 'property_path' => 'name',
- 'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
- 'preferred_choices' => array('&b'),
- 'multiple' => false,
- 'expanded' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array('separator' => ''),
- '/select
- [@name="na&me"]
- [@required="required"]
- [
- ./option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
- /following-sibling::option[@disabled="disabled"][not(@selected)][.=""]
- /following-sibling::option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
- ]
- [count(./option)=3]
- '
- );
- }
- public function testChoiceWithOnlyPreferred()
- {
- $form = $this->factory->createNamed('choice', 'na&me', '&a', array(
- 'property_path' => 'name',
- 'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
- 'preferred_choices' => array('&a', '&b'),
- 'multiple' => false,
- 'expanded' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/select
- [count(./option)=2]
- '
- );
- }
- public function testSingleChoiceNonRequired()
- {
- $form = $this->factory->createNamed('choice', 'na&me', '&a', array(
- 'property_path' => 'name',
- 'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
- 'required' => false,
- 'multiple' => false,
- 'expanded' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/select
- [@name="na&me"]
- [not(@required)]
- [
- ./option[@value=""][.="[trans][/trans]"]
- /following-sibling::option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
- /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
- ]
- [count(./option)=3]
- '
- );
- }
- public function testSingleChoiceNonRequiredNoneSelected()
- {
- $form = $this->factory->createNamed('choice', 'na&me', null, array(
- 'property_path' => 'name',
- 'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
- 'required' => false,
- 'multiple' => false,
- 'expanded' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/select
- [@name="na&me"]
- [not(@required)]
- [
- ./option[@value=""][.="[trans][/trans]"]
- /following-sibling::option[@value="&a"][not(@selected)][.="[trans]Choice&A[/trans]"]
- /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
- ]
- [count(./option)=3]
- '
- );
- }
- public function testSingleChoiceWithNonRequiredEmptyValue()
- {
- $form = $this->factory->createNamed('choice', 'na&me', '&a', array(
- 'property_path' => 'name',
- 'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
- 'multiple' => false,
- 'expanded' => false,
- 'required' => false,
- 'empty_value' => 'Select&Anything&Not&Me',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/select
- [@name="na&me"]
- [not(@required)]
- [
- ./option[@value=""][not(@selected)][.="[trans]Select&Anything&Not&Me[/trans]"]
- /following-sibling::option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
- /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
- ]
- [count(./option)=3]
- '
- );
- }
- public function testSingleChoiceRequiredWithEmptyValue()
- {
- $form = $this->factory->createNamed('choice', 'na&me', '&a', array(
- 'property_path' => 'name',
- 'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
- 'required' => true,
- 'multiple' => false,
- 'expanded' => false,
- 'empty_value' => 'Test&Me'
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/select
- [@name="na&me"]
- [@required="required"]
- [
- ./option[@value=""][.="[trans]Test&Me[/trans]"]
- /following-sibling::option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
- /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
- ]
- [count(./option)=3]
- '
- );
- }
- public function testSingleChoiceRequiredWithEmptyValueViaView()
- {
- $form = $this->factory->createNamed('choice', 'na&me', '&a', array(
- 'property_path' => 'name',
- 'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
- 'required' => true,
- 'multiple' => false,
- 'expanded' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array('empty_value' => ''),
- '/select
- [@name="na&me"]
- [@required="required"]
- [
- ./option[@value=""][.="[trans][/trans]"]
- /following-sibling::option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
- /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
- ]
- [count(./option)=3]
- '
- );
- }
- public function testSingleChoiceGrouped()
- {
- $form = $this->factory->createNamed('choice', 'na&me', '&a', array(
- 'property_path' => 'name',
- 'choices' => array(
- 'Group&1' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
- 'Group&2' => array('&c' => 'Choice&C'),
- ),
- 'multiple' => false,
- 'expanded' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/select
- [@name="na&me"]
- [./optgroup[@label="[trans]Group&1[/trans]"]
- [
- ./option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
- /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
- ]
- [count(./option)=2]
- ]
- [./optgroup[@label="[trans]Group&2[/trans]"]
- [./option[@value="&c"][not(@selected)][.="[trans]Choice&C[/trans]"]]
- [count(./option)=1]
- ]
- [count(./optgroup)=2]
- '
- );
- }
- public function testMultipleChoice()
- {
- $form = $this->factory->createNamed('choice', 'na&me', array('&a'), array(
- 'property_path' => 'name',
- 'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
- 'multiple' => true,
- 'expanded' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/select
- [@name="na&me[]"]
- [@multiple="multiple"]
- [
- ./option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
- /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
- ]
- [count(./option)=2]
- '
- );
- }
- public function testMultipleChoiceSkipEmptyValue()
- {
- $form = $this->factory->createNamed('choice', 'na&me', array('&a'), array(
- 'property_path' => 'name',
- 'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
- 'multiple' => true,
- 'expanded' => false,
- 'empty_value' => 'Test&Me'
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/select
- [@name="na&me[]"]
- [@multiple="multiple"]
- [
- ./option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
- /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
- ]
- [count(./option)=2]
- '
- );
- }
- public function testMultipleChoiceNonRequired()
- {
- $form = $this->factory->createNamed('choice', 'na&me', array('&a'), array(
- 'property_path' => 'name',
- 'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
- 'required' => false,
- 'multiple' => true,
- 'expanded' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/select
- [@name="na&me[]"]
- [@multiple="multiple"]
- [
- ./option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
- /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
- ]
- [count(./option)=2]
- '
- );
- }
- public function testSingleChoiceExpanded()
- {
- $form = $this->factory->createNamed('choice', 'na&me', '&a', array(
- 'property_path' => 'name',
- 'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
- 'multiple' => false,
- 'expanded' => true,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./input[@type="radio"][@name="na&me"][@id="na&me_&a"][@checked]
- /following-sibling::label[@for="na&me_&a"][.="[trans]Choice&A[/trans]"]
- /following-sibling::input[@type="radio"][@name="na&me"][@id="na&me_&b"][not(@checked)]
- /following-sibling::label[@for="na&me_&b"][.="[trans]Choice&B[/trans]"]
- ]
- [count(./input)=2]
- '
- );
- }
- public function testSingleChoiceExpandedSkipEmptyValue()
- {
- $form = $this->factory->createNamed('choice', 'na&me', '&a', array(
- 'property_path' => 'name',
- 'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
- 'multiple' => false,
- 'expanded' => true,
- 'empty_value' => 'Test&Me'
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./input[@type="radio"][@name="na&me"][@id="na&me_&a"][@checked]
- /following-sibling::label[@for="na&me_&a"][.="[trans]Choice&A[/trans]"]
- /following-sibling::input[@type="radio"][@name="na&me"][@id="na&me_&b"][not(@checked)]
- /following-sibling::label[@for="na&me_&b"][.="[trans]Choice&B[/trans]"]
- ]
- [count(./input)=2]
- '
- );
- }
- public function testSingleChoiceExpandedWithBooleanValue()
- {
- $form = $this->factory->createNamed('choice', 'na&me', true, array(
- 'property_path' => 'name',
- 'choices' => array('1' => 'Choice&A', '0' => 'Choice&B'),
- 'multiple' => false,
- 'expanded' => true,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./input[@type="radio"][@name="na&me"][@id="na&me_1"][@checked]
- /following-sibling::label[@for="na&me_1"][.="[trans]Choice&A[/trans]"]
- /following-sibling::input[@type="radio"][@name="na&me"][@id="na&me_0"][not(@checked)]
- /following-sibling::label[@for="na&me_0"][.="[trans]Choice&B[/trans]"]
- ]
- [count(./input)=2]
- '
- );
- }
- public function testMultipleChoiceExpanded()
- {
- $form = $this->factory->createNamed('choice', 'na&me', array('&a', '&c'), array(
- 'property_path' => 'name',
- 'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B', '&c' => 'Choice&C'),
- 'multiple' => true,
- 'expanded' => true,
- 'required' => true,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./input[@type="checkbox"][@name="na&me[&a]"][@id="na&me_&a"][@checked][not(@required)]
- /following-sibling::label[@for="na&me_&a"][.="[trans]Choice&A[/trans]"]
- /following-sibling::input[@type="checkbox"][@name="na&me[&b]"][@id="na&me_&b"][not(@checked)][not(@required)]
- /following-sibling::label[@for="na&me_&b"][.="[trans]Choice&B[/trans]"]
- /following-sibling::input[@type="checkbox"][@name="na&me[&c]"][@id="na&me_&c"][@checked][not(@required)]
- /following-sibling::label[@for="na&me_&c"][.="[trans]Choice&C[/trans]"]
- ]
- [count(./input)=3]
- '
- );
- }
- public function testCountry()
- {
- $form = $this->factory->createNamed('country', 'na&me', 'AT', array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/select
- [@name="na&me"]
- [./option[@value="AT"][@selected="selected"][.="[trans]Austria[/trans]"]]
- [count(./option)>200]
- '
- );
- }
- public function testCountryWithEmptyValue()
- {
- $form = $this->factory->createNamed('country', 'na&me', 'AT', array(
- 'property_path' => 'name',
- 'empty_value' => 'Select&Country',
- 'required' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/select
- [@name="na&me"]
- [./option[@value=""][not(@selected)][.="[trans]Select&Country[/trans]"]]
- [./option[@value="AT"][@selected="selected"][.="[trans]Austria[/trans]"]]
- [count(./option)>201]
- '
- );
- }
- public function testCsrf()
- {
- $this->csrfProvider->expects($this->any())
- ->method('generateCsrfToken')
- ->will($this->returnValue('foo&bar'));
- $form = $this->factory->createNamed('csrf', 'na&me', null, array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="hidden"]
- [@value="foo&bar"]
- '
- );
- }
- public function testDateTime()
- {
- $form = $this->factory->createNamed('datetime', 'na&me', '2011-02-03 04:05:06', array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'with_seconds' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./div
- [@id="na&me_date"]
- [
- ./select
- [@id="na&me_date_month"]
- [./option[@value="2"][@selected="selected"]]
- /following-sibling::select
- [@id="na&me_date_day"]
- [./option[@value="3"][@selected="selected"]]
- /following-sibling::select
- [@id="na&me_date_year"]
- [./option[@value="2011"][@selected="selected"]]
- ]
- /following-sibling::div
- [@id="na&me_time"]
- [
- ./select
- [@id="na&me_time_hour"]
- [./option[@value="4"][@selected="selected"]]
- /following-sibling::select
- [@id="na&me_time_minute"]
- [./option[@value="5"][@selected="selected"]]
- ]
- ]
- [count(.//select)=5]
- '
- );
- }
- public function testDateTimeWithEmptyValueGlobal()
- {
- $form = $this->factory->createNamed('datetime', 'na&me', null, array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'empty_value' => 'Change&Me',
- 'required' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./div
- [@id="na&me_date"]
- [
- ./select
- [@id="na&me_date_month"]
- [./option[@value=""][.="[trans]Change&Me[/trans]"]]
- /following-sibling::select
- [@id="na&me_date_day"]
- [./option[@value=""][.="[trans]Change&Me[/trans]"]]
- /following-sibling::select
- [@id="na&me_date_year"]
- [./option[@value=""][.="[trans]Change&Me[/trans]"]]
- ]
- /following-sibling::div
- [@id="na&me_time"]
- [
- ./select
- [@id="na&me_time_hour"]
- [./option[@value=""][.="[trans]Change&Me[/trans]"]]
- /following-sibling::select
- [@id="na&me_time_minute"]
- [./option[@value=""][.="[trans]Change&Me[/trans]"]]
- ]
- ]
- [count(.//select)=5]
- '
- );
- }
- public function testDateTimeWithEmptyValueOnTime()
- {
- $form = $this->factory->createNamed('datetime', 'na&me', '2011-02-03', array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'empty_value' => array('hour' => 'Change&Me', 'minute' => 'Change&Me'),
- 'required' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./div
- [@id="na&me_date"]
- [
- ./select
- [@id="na&me_date_month"]
- [./option[@value="2"][@selected="selected"]]
- /following-sibling::select
- [@id="na&me_date_day"]
- [./option[@value="3"][@selected="selected"]]
- /following-sibling::select
- [@id="na&me_date_year"]
- [./option[@value="2011"][@selected="selected"]]
- ]
- /following-sibling::div
- [@id="na&me_time"]
- [
- ./select
- [@id="na&me_time_hour"]
- [./option[@value=""][.="[trans]Change&Me[/trans]"]]
- /following-sibling::select
- [@id="na&me_time_minute"]
- [./option[@value=""][.="[trans]Change&Me[/trans]"]]
- ]
- ]
- [count(.//select)=5]
- '
- );
- }
- public function testDateTimeWithSeconds()
- {
- $form = $this->factory->createNamed('datetime', 'na&me', '2011-02-03 04:05:06', array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'with_seconds' => true,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./div
- [@id="na&me_date"]
- [
- ./select
- [@id="na&me_date_month"]
- [./option[@value="2"][@selected="selected"]]
- /following-sibling::select
- [@id="na&me_date_day"]
- [./option[@value="3"][@selected="selected"]]
- /following-sibling::select
- [@id="na&me_date_year"]
- [./option[@value="2011"][@selected="selected"]]
- ]
- /following-sibling::div
- [@id="na&me_time"]
- [
- ./select
- [@id="na&me_time_hour"]
- [./option[@value="4"][@selected="selected"]]
- /following-sibling::select
- [@id="na&me_time_minute"]
- [./option[@value="5"][@selected="selected"]]
- /following-sibling::select
- [@id="na&me_time_second"]
- [./option[@value="6"][@selected="selected"]]
- ]
- ]
- [count(.//select)=6]
- '
- );
- }
- public function testDateTimeSingleText()
- {
- $form = $this->factory->createNamed('datetime', 'na&me', '2011-02-03 04:05:06', array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'date_widget' => 'single_text',
- 'time_widget' => 'single_text',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./input
- [@type="text"]
- [@id="na&me_date"]
- [@name="na&me[date]"]
- [@value="Feb 3, 2011"]
- /following-sibling::input
- [@type="text"]
- [@id="na&me_time"]
- [@name="na&me[time]"]
- [@value="04:05:00"]
- ]
- '
- );
- }
- public function testDateTimeWithWidgetSingleText()
- {
- $form = $this->factory->createNamed('datetime', 'name', '2011-02-03 04:05:06', array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'widget' => 'single_text',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="text"]
- [@name="name"]
- [@value="2011-02-03 04:05:00"]
- '
- );
- }
- public function testDateTimeWithWidgetSingleTextIgnoreDateAndTimeWidgets()
- {
- $form = $this->factory->createNamed('datetime', 'na&me', '2011-02-03 04:05:06', array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'date_widget' => 'choice',
- 'time_widget' => 'choice',
- 'widget' => 'single_text',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="text"]
- [@name="na&me"]
- [@value="2011-02-03 04:05:00"]
- '
- );
- }
- public function testDateChoice()
- {
- $form = $this->factory->createNamed('date', 'na&me', '2011-02-03', array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'widget' => 'choice',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./select
- [@id="na&me_month"]
- [./option[@value="2"][@selected="selected"]]
- /following-sibling::select
- [@id="na&me_day"]
- [./option[@value="3"][@selected="selected"]]
- /following-sibling::select
- [@id="na&me_year"]
- [./option[@value="2011"][@selected="selected"]]
- ]
- [count(./select)=3]
- '
- );
- }
- public function testDateChoiceWithEmptyValueGlobal()
- {
- $form = $this->factory->createNamed('date', 'na&me', null, array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'widget' => 'choice',
- 'empty_value' => 'Change&Me',
- 'required' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./select
- [@id="na&me_month"]
- [./option[@value=""][.="[trans]Change&Me[/trans]"]]
- /following-sibling::select
- [@id="na&me_day"]
- [./option[@value=""][.="[trans]Change&Me[/trans]"]]
- /following-sibling::select
- [@id="na&me_year"]
- [./option[@value=""][.="[trans]Change&Me[/trans]"]]
- ]
- [count(./select)=3]
- '
- );
- }
- public function testDateChoiceWithEmptyValueOnYear()
- {
- $form = $this->factory->createNamed('date', 'na&me', null, array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'widget' => 'choice',
- 'required' => false,
- 'empty_value' => array('year' => 'Change&Me'),
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./select
- [@id="na&me_month"]
- [./option[@value="1"]]
- /following-sibling::select
- [@id="na&me_day"]
- [./option[@value="1"]]
- /following-sibling::select
- [@id="na&me_year"]
- [./option[@value=""][.="[trans]Change&Me[/trans]"]]
- ]
- [count(./select)=3]
- '
- );
- }
- public function testDateText()
- {
- $form = $this->factory->createNamed('date', 'na&me', '2011-02-03', array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'widget' => 'text',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./input
- [@id="na&me_month"]
- [@type="text"]
- [@value="2"]
- /following-sibling::input
- [@id="na&me_day"]
- [@type="text"]
- [@value="3"]
- /following-sibling::input
- [@id="na&me_year"]
- [@type="text"]
- [@value="2011"]
- ]
- [count(./input)=3]
- '
- );
- }
- public function testDateSingleText()
- {
- $form = $this->factory->createNamed('date', 'na&me', '2011-02-03', array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'widget' => 'single_text',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="text"]
- [@name="na&me"]
- [@value="Feb 3, 2011"]
- '
- );
- }
- public function testDateErrorBubbling()
- {
- $child = $this->factory->createNamed('date', 'date');
- $form = $this->factory->createNamed('form', 'form')->add($child);
- $child->addError(new FormError('Error!'));
- $view = $form->createView();
- $this->assertEmpty($this->renderErrors($view));
- $this->assertNotEmpty($this->renderErrors($view['date']));
- }
- public function testBirthDay()
- {
- $form = $this->factory->createNamed('birthday', 'na&me', '2000-02-03', array(
- 'property_path' => 'name',
- 'input' => 'string',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./select
- [@id="na&me_month"]
- [./option[@value="2"][@selected="selected"]]
- /following-sibling::select
- [@id="na&me_day"]
- [./option[@value="3"][@selected="selected"]]
- /following-sibling::select
- [@id="na&me_year"]
- [./option[@value="2000"][@selected="selected"]]
- ]
- [count(./select)=3]
- '
- );
- }
- public function testBirthDayWithEmptyValue()
- {
- $form = $this->factory->createNamed('birthday', 'na&me', '1950-01-01', array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'empty_value' => '',
- 'required' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./select
- [@id="na&me_month"]
- [./option[@value=""][.="[trans][/trans]"]]
- [./option[@value="1"][@selected="selected"]]
- /following-sibling::select
- [@id="na&me_day"]
- [./option[@value=""][.="[trans][/trans]"]]
- [./option[@value="1"][@selected="selected"]]
- /following-sibling::select
- [@id="na&me_year"]
- [./option[@value=""][.="[trans][/trans]"]]
- [./option[@value="1950"][@selected="selected"]]
- ]
- [count(./select)=3]
- '
- );
- }
- public function testEmail()
- {
- $form = $this->factory->createNamed('email', 'na&me', 'foo&bar', array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="email"]
- [@name="na&me"]
- [@value="foo&bar"]
- [not(@maxlength)]
- '
- );
- }
- public function testEmailWithMaxLength()
- {
- $form = $this->factory->createNamed('email', 'na&me', 'foo&bar', array(
- 'property_path' => 'name',
- 'max_length' => 123,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="email"]
- [@name="na&me"]
- [@value="foo&bar"]
- [@maxlength="123"]
- '
- );
- }
- public function testFile()
- {
- $form = $this->factory->createNamed('file', 'na&me', null, array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="file"]
- '
- );
- }
- public function testHidden()
- {
- $form = $this->factory->createNamed('hidden', 'na&me', 'foo&bar', array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="hidden"]
- [@name="na&me"]
- [@value="foo&bar"]
- '
- );
- }
- public function testInteger()
- {
- $form = $this->factory->createNamed('integer', 'na&me', 123, array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="number"]
- [@name="na&me"]
- [@value="123"]
- '
- );
- }
- public function testLanguage()
- {
- $form = $this->factory->createNamed('language', 'na&me', 'de', array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/select
- [@name="na&me"]
- [./option[@value="de"][@selected="selected"][.="[trans]German[/trans]"]]
- [count(./option)>200]
- '
- );
- }
- public function testLocale()
- {
- $form = $this->factory->createNamed('locale', 'na&me', 'de_AT', array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/select
- [@name="na&me"]
- [./option[@value="de_AT"][@selected="selected"][.="[trans]German (Austria)[/trans]"]]
- [count(./option)>200]
- '
- );
- }
- public function testMoney()
- {
- $form = $this->factory->createNamed('money', 'na&me', 1234.56, array(
- 'property_path' => 'name',
- 'currency' => 'EUR',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="text"]
- [@name="na&me"]
- [@value="1234.56"]
- [contains(.., "€")]
- '
- );
- }
- public function testNumber()
- {
- $form = $this->factory->createNamed('number', 'na&me', 1234.56, array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="text"]
- [@name="na&me"]
- [@value="1234.56"]
- '
- );
- }
- public function testPassword()
- {
- $form = $this->factory->createNamed('password', 'na&me', 'foo&bar', array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="password"]
- [@name="na&me"]
- '
- );
- }
- public function testPasswordBoundNotAlwaysEmpty()
- {
- $form = $this->factory->createNamed('password', 'na&me', null, array(
- 'property_path' => 'name',
- 'always_empty' => false,
- ));
- $form->bind('foo&bar');
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="password"]
- [@name="na&me"]
- [@value="foo&bar"]
- '
- );
- }
- public function testPasswordWithMaxLength()
- {
- $form = $this->factory->createNamed('password', 'na&me', 'foo&bar', array(
- 'property_path' => 'name',
- 'max_length' => 123,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="password"]
- [@name="na&me"]
- [@maxlength="123"]
- '
- );
- }
- public function testPercent()
- {
- $form = $this->factory->createNamed('percent', 'na&me', 0.1, array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="text"]
- [@name="na&me"]
- [@value="10"]
- [contains(.., "%")]
- '
- );
- }
- public function testCheckedRadio()
- {
- $form = $this->factory->createNamed('radio', 'na&me', true, array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="radio"]
- [@name="na&me"]
- [@checked="checked"]
- [@value=""]
- '
- );
- }
- public function testCheckedRadioWithValue()
- {
- $form = $this->factory->createNamed('radio', 'na&me', true, array(
- 'property_path' => 'name',
- 'value' => 'foo&bar',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="radio"]
- [@name="na&me"]
- [@checked="checked"]
- [@value="foo&bar"]
- '
- );
- }
- public function testUncheckedRadio()
- {
- $form = $this->factory->createNamed('radio', 'na&me', false, array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="radio"]
- [@name="na&me"]
- [not(@checked)]
- '
- );
- }
- public function testTextarea()
- {
- $form = $this->factory->createNamed('textarea', 'na&me', 'foo&bar', array(
- 'property_path' => 'name',
- 'pattern' => 'foo',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/textarea
- [@name="na&me"]
- [not(@pattern)]
- [.="foo&bar"]
- '
- );
- }
- public function testText()
- {
- $form = $this->factory->createNamed('text', 'na&me', 'foo&bar', array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="text"]
- [@name="na&me"]
- [@value="foo&bar"]
- [not(@maxlength)]
- '
- );
- }
- public function testTextWithMaxLength()
- {
- $form = $this->factory->createNamed('text', 'na&me', 'foo&bar', array(
- 'property_path' => 'name',
- 'max_length' => 123,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="text"]
- [@name="na&me"]
- [@value="foo&bar"]
- [@maxlength="123"]
- '
- );
- }
- public function testSearch()
- {
- $form = $this->factory->createNamed('search', 'na&me', 'foo&bar', array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="search"]
- [@name="na&me"]
- [@value="foo&bar"]
- [not(@maxlength)]
- '
- );
- }
- public function testTime()
- {
- $form = $this->factory->createNamed('time', 'na&me', '04:05:06', array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'with_seconds' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./select
- [@id="na&me_hour"]
- [@size="1"]
- [./option[@value="4"][@selected="selected"]]
- /following-sibling::select
- [@id="na&me_minute"]
- [@size="1"]
- [./option[@value="5"][@selected="selected"]]
- ]
- [count(./select)=2]
- '
- );
- }
- public function testTimeWithSeconds()
- {
- $form = $this->factory->createNamed('time', 'na&me', '04:05:06', array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'with_seconds' => true,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./select
- [@id="na&me_hour"]
- [@size="1"]
- [./option[@value="4"][@selected="selected"]]
- [count(./option)>23]
- /following-sibling::select
- [@id="na&me_minute"]
- [@size="1"]
- [./option[@value="5"][@selected="selected"]]
- [count(./option)>59]
- /following-sibling::select
- [@id="na&me_second"]
- [@size="1"]
- [./option[@value="6"][@selected="selected"]]
- [count(./option)>59]
- ]
- [count(./select)=3]
- '
- );
- }
- public function testTimeText()
- {
- $form = $this->factory->createNamed('time', 'na&me', '04:05:06', array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'widget' => 'text',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./input
- [@type="text"]
- [@id="na&me_hour"]
- [@name="na&me[hour]"]
- [@value="04"]
- [@size="1"]
- [@required="required"]
- /following-sibling::input
- [@type="text"]
- [@id="na&me_minute"]
- [@name="na&me[minute]"]
- [@value="05"]
- [@size="1"]
- [@required="required"]
- ]
- [count(./input)=2]
- '
- );
- }
- public function testTimeSingleText()
- {
- $form = $this->factory->createNamed('time', 'na&me', '04:05:06', array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'widget' => 'single_text',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="text"]
- [@name="na&me"]
- [@value="04:05:00"]
- '
- );
- }
- public function testTimeWithEmptyValueGlobal()
- {
- $form = $this->factory->createNamed('time', 'na&me', null, array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'empty_value' => 'Change&Me',
- 'required' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./select
- [@id="na&me_hour"]
- [./option[@value=""][.="[trans]Change&Me[/trans]"]]
- [count(./option)>24]
- /following-sibling::select
- [@id="na&me_minute"]
- [./option[@value=""][.="[trans]Change&Me[/trans]"]]
- [count(./option)>60]
- ]
- [count(./select)=2]
- '
- );
- }
- public function testTimeWithEmptyValueOnYear()
- {
- $form = $this->factory->createNamed('time', 'na&me', null, array(
- 'property_path' => 'name',
- 'input' => 'string',
- 'required' => false,
- 'empty_value' => array('hour' => 'Change&Me'),
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/div
- [
- ./select
- [@id="na&me_hour"]
- [./option[@value=""][.="[trans]Change&Me[/trans]"]]
- [count(./option)>24]
- /following-sibling::select
- [@id="na&me_minute"]
- [./option[@value="1"]]
- [count(./option)>59]
- ]
- [count(./select)=2]
- '
- );
- }
- public function testTimeErrorBubbling()
- {
- $child = $this->factory->createNamed('time', 'time');
- $form = $this->factory->createNamed('form', 'form')->add($child);
- $child->addError(new FormError('Error!'));
- $view = $form->createView();
- $this->assertEmpty($this->renderErrors($view));
- $this->assertNotEmpty($this->renderErrors($view['time']));
- }
- public function testTimezone()
- {
- $form = $this->factory->createNamed('timezone', 'na&me', 'Europe/Vienna', array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/select
- [@name="na&me"]
- [@required="required"]
- [./optgroup
- [@label="[trans]Europe[/trans]"]
- [./option[@value="Europe/Vienna"][@selected="selected"][.="[trans]Vienna[/trans]"]]
- ]
- [count(./optgroup)>10]
- [count(.//option)>200]
- '
- );
- }
- public function testTimezoneWithEmptyValue()
- {
- $form = $this->factory->createNamed('timezone', 'na&me', null, array(
- 'property_path' => 'name',
- 'empty_value' => 'Select&Timezone',
- 'required' => false,
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/select
- [./option[@value=""][.="[trans]Select&Timezone[/trans]"]]
- [count(./optgroup)>10]
- [count(.//option)>201]
- '
- );
- }
- public function testUrl()
- {
- $url = 'http://www.google.com?foo1=bar1&foo2=bar2';
- $form = $this->factory->createNamed('url', 'na&me', $url, array(
- 'property_path' => 'name',
- ));
- $this->assertWidgetMatchesXpath($form->createView(), array(),
- '/input
- [@type="url"]
- [@name="na&me"]
- [@value="http://www.google.com?foo1=bar1&foo2=bar2"]
- '
- );
- }
- public function testCollectionPrototype()
- {
- $form = $this->factory->createNamedBuilder('form', 'na&me', array('items' => array('one', 'two', 'three')))
- ->add('items', 'collection', array('allow_add' => true))
- ->getForm()
- ->createView();
- $html = $this->renderWidget($form);
- $this->assertMatchesXpath($html,
- '//div[@id="na&me_items"][@data-prototype]
- |
- //table[@id="na&me_items"][@data-prototype]
- '
- );
- }
- }
|