@@ -100,6 +100,14 @@ public function testChoiceLoaderOptionExpectsChoiceLoaderInterface()
100100 ]);
101101 }
102102
103+ public function testPlaceholderAttrOptionExpectsArray ()
104+ {
105+ $ this ->expectException (InvalidOptionsException::class);
106+ $ this ->factory ->create (static ::TESTED_TYPE , null , [
107+ 'placeholder_attr ' => new \stdClass (),
108+ ]);
109+ }
110+
103111 public function testChoiceListAndChoicesCanBeEmpty ()
104112 {
105113 $ this ->assertInstanceOf (FormInterface::class, $ this ->factory ->create (static ::TESTED_TYPE , null , []));
@@ -189,15 +197,19 @@ public function testExpandedChoiceListWithBooleanAndNullValuesAndFalseAsPreSetDa
189197
190198 public function testPlaceholderPresentOnNonRequiredExpandedSingleChoice ()
191199 {
200+ $ placeholderAttr = ['attr ' => 'value ' ];
201+
192202 $ form = $ this ->factory ->create (static ::TESTED_TYPE , null , [
193203 'multiple ' => false ,
194204 'expanded ' => true ,
195205 'required ' => false ,
196206 'choices ' => $ this ->choices ,
207+ 'placeholder_attr ' => $ placeholderAttr ,
197208 ]);
198209
199210 $ this ->assertArrayHasKey ('placeholder ' , $ form );
200211 $ this ->assertCount (\count ($ this ->choices ) + 1 , $ form , 'Each choice should become a new field ' );
212+ $ this ->assertSame ($ placeholderAttr , $ form ->createView ()->children ['placeholder ' ]->vars ['attr ' ]);
201213 }
202214
203215 public function testPlaceholderNotPresentIfRequired ()
@@ -1667,80 +1679,84 @@ public function testPlaceholderIsEmptyStringByDefaultIfNotRequired()
16671679 /**
16681680 * @dataProvider getOptionsWithPlaceholder
16691681 */
1670- public function testPassPlaceholderToView ($ multiple , $ expanded , $ required , $ placeholder , $ viewValue )
1682+ public function testPassPlaceholderToView ($ multiple , $ expanded , $ required , $ placeholder , $ placeholderViewValue , $ placeholderAttr , $ placeholderAttrViewValue )
16711683 {
16721684 $ view = $ this ->factory ->create (static ::TESTED_TYPE , null , [
16731685 'multiple ' => $ multiple ,
16741686 'expanded ' => $ expanded ,
16751687 'required ' => $ required ,
16761688 'placeholder ' => $ placeholder ,
1689+ 'placeholder_attr ' => $ placeholderAttr ,
16771690 'choices ' => $ this ->choices ,
16781691 ])
16791692 ->createView ();
16801693
1681- $ this ->assertSame ($ viewValue , $ view ->vars ['placeholder ' ]);
1694+ $ this ->assertSame ($ placeholderViewValue , $ view ->vars ['placeholder ' ]);
1695+ $ this ->assertSame ($ placeholderAttrViewValue , $ view ->vars ['placeholder_attr ' ]);
16821696 $ this ->assertFalse ($ view ->vars ['placeholder_in_choices ' ]);
16831697 }
16841698
16851699 /**
16861700 * @dataProvider getOptionsWithPlaceholder
16871701 */
1688- public function testDontPassPlaceholderIfContainedInChoices ($ multiple , $ expanded , $ required , $ placeholder , $ viewValue )
1702+ public function testDontPassPlaceholderIfContainedInChoices ($ multiple , $ expanded , $ required , $ placeholder , $ placeholderViewValue , $ placeholderAttr , $ placeholderAttrViewValue )
16891703 {
16901704 $ view = $ this ->factory ->create (static ::TESTED_TYPE , null , [
16911705 'multiple ' => $ multiple ,
16921706 'expanded ' => $ expanded ,
16931707 'required ' => $ required ,
16941708 'placeholder ' => $ placeholder ,
1709+ 'placeholder_attr ' => $ placeholderAttr ,
16951710 'choices ' => ['Empty ' => '' , 'A ' => 'a ' ],
16961711 ])
16971712 ->createView ();
16981713
16991714 $ this ->assertNull ($ view ->vars ['placeholder ' ]);
1715+ $ this ->assertSame ([], $ view ->vars ['placeholder_attr ' ]);
17001716 $ this ->assertTrue ($ view ->vars ['placeholder_in_choices ' ]);
17011717 }
17021718
17031719 public static function getOptionsWithPlaceholder ()
17041720 {
17051721 return [
17061722 // single non-expanded
1707- [false , false , false , 'foobar ' , 'foobar ' ],
1708- [false , false , false , '' , '' ],
1709- [false , false , false , null , null ],
1710- [false , false , false , false , null ],
1711- [false , false , true , 'foobar ' , 'foobar ' ],
1712- [false , false , true , '' , '' ],
1713- [false , false , true , null , null ],
1714- [false , false , true , false , null ],
1723+ [false , false , false , 'foobar ' , 'foobar ' , [ ' attr ' => ' value ' ], [ ' attr ' => ' value ' ] ],
1724+ [false , false , false , '' , '' , [ ' attr ' => ' value ' ], [ ' attr ' => ' value ' ] ],
1725+ [false , false , false , null , null , [ ' attr ' => ' value ' ], [] ],
1726+ [false , false , false , false , null , [ ' attr ' => ' value ' ], [] ],
1727+ [false , false , true , 'foobar ' , 'foobar ' , [ ' attr ' => ' value ' ], [ ' attr ' => ' value ' ] ],
1728+ [false , false , true , '' , '' , [ ' attr ' => ' value ' ], [ ' attr ' => ' value ' ] ],
1729+ [false , false , true , null , null , [ ' attr ' => ' value ' ], [] ],
1730+ [false , false , true , false , null , [ ' attr ' => ' value ' ], [] ],
17151731 // single expanded
1716- [false , true , false , 'foobar ' , 'foobar ' ],
1732+ [false , true , false , 'foobar ' , 'foobar ' , [ ' attr ' => ' value ' ], [ ' attr ' => ' value ' ] ],
17171733 // radios should never have an empty label
1718- [false , true , false , '' , 'None ' ],
1719- [false , true , false , null , null ],
1720- [false , true , false , false , null ],
1734+ [false , true , false , '' , 'None ' , [ ' attr ' => ' value ' ], [ ' attr ' => ' value ' ] ],
1735+ [false , true , false , null , null , [ ' attr ' => ' value ' ], [] ],
1736+ [false , true , false , false , null , [ ' attr ' => ' value ' ], [] ],
17211737 // required radios should never have a placeholder
1722- [false , true , true , 'foobar ' , null ],
1723- [false , true , true , '' , null ],
1724- [false , true , true , null , null ],
1725- [false , true , true , false , null ],
1738+ [false , true , true , 'foobar ' , null , [ ' attr ' => ' value ' ], [] ],
1739+ [false , true , true , '' , null , [ ' attr ' => ' value ' ], [] ],
1740+ [false , true , true , null , null , [ ' attr ' => ' value ' ], [] ],
1741+ [false , true , true , false , null , [ ' attr ' => ' value ' ], [] ],
17261742 // multiple non-expanded
1727- [true , false , false , 'foobar ' , null ],
1728- [true , false , false , '' , null ],
1729- [true , false , false , null , null ],
1730- [true , false , false , false , null ],
1731- [true , false , true , 'foobar ' , null ],
1732- [true , false , true , '' , null ],
1733- [true , false , true , null , null ],
1734- [true , false , true , false , null ],
1743+ [true , false , false , 'foobar ' , null , [ ' attr ' => ' value ' ], [] ],
1744+ [true , false , false , '' , null , [ ' attr ' => ' value ' ], [] ],
1745+ [true , false , false , null , null , [ ' attr ' => ' value ' ], [] ],
1746+ [true , false , false , false , null , [ ' attr ' => ' value ' ], [] ],
1747+ [true , false , true , 'foobar ' , null , [ ' attr ' => ' value ' ], [] ],
1748+ [true , false , true , '' , null , [ ' attr ' => ' value ' ], [] ],
1749+ [true , false , true , null , null , [ ' attr ' => ' value ' ], [] ],
1750+ [true , false , true , false , null , [ ' attr ' => ' value ' ], [] ],
17351751 // multiple expanded
1736- [true , true , false , 'foobar ' , null ],
1737- [true , true , false , '' , null ],
1738- [true , true , false , null , null ],
1739- [true , true , false , false , null ],
1740- [true , true , true , 'foobar ' , null ],
1741- [true , true , true , '' , null ],
1742- [true , true , true , null , null ],
1743- [true , true , true , false , null ],
1752+ [true , true , false , 'foobar ' , null , [ ' attr ' => ' value ' ], [] ],
1753+ [true , true , false , '' , null , [ ' attr ' => ' value ' ], [] ],
1754+ [true , true , false , null , null , [ ' attr ' => ' value ' ], [] ],
1755+ [true , true , false , false , null , [ ' attr ' => ' value ' ], [] ],
1756+ [true , true , true , 'foobar ' , null , [ ' attr ' => ' value ' ], [] ],
1757+ [true , true , true , '' , null , [ ' attr ' => ' value ' ], [] ],
1758+ [true , true , true , null , null , [ ' attr ' => ' value ' ], [] ],
1759+ [true , true , true , false , null , [ ' attr ' => ' value ' ], [] ],
17441760 ];
17451761 }
17461762
0 commit comments