@@ -22,6 +22,23 @@ public function testParse()
2222 }
2323 }
2424
25+ public function testParseWithMapObjects ()
26+ {
27+ foreach ($ this ->getTestsForMapObjectParse () as $ yaml => $ value ) {
28+ $ actual = Inline::parse ($ yaml , false , false , true );
29+ if (true === is_object ($ value )) {
30+ $ this ->assertInstanceOf (get_class ($ value ), $ actual );
31+ $ this ->assertEquals (get_object_vars ($ value ), get_object_vars ($ actual ));
32+ } elseif (true === is_array ($ value )) {
33+ $ this ->assertEquals ($ value , $ actual );
34+ $ this ->assertMixedArraysSame ($ value , $ actual );
35+ } else {
36+ $ this ->assertSame ($ value , $ actual );
37+ }
38+ }
39+
40+ }
41+
2542 public function testDump ()
2643 {
2744 $ testsForDump = $ this ->getTestsForDump ();
@@ -182,6 +199,85 @@ protected function getTestsForParse()
182199 );
183200 }
184201
202+ protected function getTestsForMapObjectParse ()
203+ {
204+ return array (
205+ '' => '' ,
206+ 'null ' => null ,
207+ 'false ' => false ,
208+ 'true ' => true ,
209+ '12 ' => 12 ,
210+ '-12 ' => -12 ,
211+ '"quoted string" ' => 'quoted string ' ,
212+ "'quoted string' " => 'quoted string ' ,
213+ '12.30e+02 ' => 12.30e+02 ,
214+ '0x4D2 ' => 0x4D2 ,
215+ '02333 ' => 02333 ,
216+ '.Inf ' => -log (0 ),
217+ '-.Inf ' => log (0 ),
218+ "'686e444' " => '686e444 ' ,
219+ '686e444 ' => 646e444 ,
220+ '123456789123456789123456789123456789 ' => '123456789123456789123456789123456789 ' ,
221+ '"foo\r\nbar" ' => "foo \r\nbar " ,
222+ "'foo#bar' " => 'foo#bar ' ,
223+ "'foo # bar' " => 'foo # bar ' ,
224+ "'#cfcfcf' " => '#cfcfcf ' ,
225+ '::form_base.html.twig ' => '::form_base.html.twig ' ,
226+
227+ '2007-10-30 ' => mktime (0 , 0 , 0 , 10 , 30 , 2007 ),
228+ '2007-10-30T02:59:43Z ' => gmmktime (2 , 59 , 43 , 10 , 30 , 2007 ),
229+ '2007-10-30 02:59:43 Z ' => gmmktime (2 , 59 , 43 , 10 , 30 , 2007 ),
230+ '1960-10-30 02:59:43 Z ' => gmmktime (2 , 59 , 43 , 10 , 30 , 1960 ),
231+ '1730-10-30T02:59:43Z ' => gmmktime (2 , 59 , 43 , 10 , 30 , 1730 ),
232+
233+ '"a \\"string \\" with \'quoted strings inside \'" ' => 'a "string" with \'quoted strings inside \'' ,
234+ "'a \"string \" with ''quoted strings inside''' " => 'a "string" with \'quoted strings inside \'' ,
235+
236+ // sequences
237+ // urls are no key value mapping. see #3609. Valid yaml "key: value" mappings require a space after the colon
238+ '[foo, http://urls.are/no/mappings, false, null, 12] ' => array ('foo ' , 'http://urls.are/no/mappings ' , false , null , 12 ),
239+ '[ foo , bar , false , null , 12 ] ' => array ('foo ' , 'bar ' , false , null , 12 ),
240+ '[ \'foo,bar \', \'foo bar \'] ' => array ('foo,bar ' , 'foo bar ' ),
241+
242+ // mappings
243+ '{foo:bar,bar:foo,false:false,null:null,integer:12} ' => (object ) array ('foo ' => 'bar ' , 'bar ' => 'foo ' , 'false ' => false , 'null ' => null , 'integer ' => 12 ),
244+ '{ foo : bar, bar : foo, false : false, null : null, integer : 12 } ' => (object ) array ('foo ' => 'bar ' , 'bar ' => 'foo ' , 'false ' => false , 'null ' => null , 'integer ' => 12 ),
245+ '{foo: \'bar \', bar: \'foo: bar \'} ' => (object ) array ('foo ' => 'bar ' , 'bar ' => 'foo: bar ' ),
246+ '{ \'foo \': \'bar \', "bar": \'foo: bar \'} ' => (object ) array ('foo ' => 'bar ' , 'bar ' => 'foo: bar ' ),
247+ '{ \'foo \'\'\': \'bar \', "bar\"": \'foo: bar \'} ' => (object ) array ('foo \'' => 'bar ' , "bar \"" => 'foo: bar ' ),
248+ '{ \'foo: \': \'bar \', "bar: ": \'foo: bar \'} ' => (object ) array ('foo: ' => 'bar ' , "bar: " => 'foo: bar ' ),
249+
250+ // nested sequences and mappings
251+ '[foo, [bar, foo]] ' => array ('foo ' , array ('bar ' , 'foo ' )),
252+ '[foo, {bar: foo}] ' => array ('foo ' , (object ) array ('bar ' => 'foo ' )),
253+ '{ foo: {bar: foo} } ' => (object ) array ('foo ' => (object ) array ('bar ' => 'foo ' )),
254+ '{ foo: [bar, foo] } ' => (object ) array ('foo ' => array ('bar ' , 'foo ' )),
255+
256+ '[ foo, [ bar, foo ] ] ' => array ('foo ' , array ('bar ' , 'foo ' )),
257+
258+ '[{ foo: {bar: foo} }] ' => array ((object ) array ('foo ' => (object ) array ('bar ' => 'foo ' ))),
259+
260+ '[foo, [bar, [foo, [bar, foo]], foo]] ' => array ('foo ' , array ('bar ' , array ('foo ' , array ('bar ' , 'foo ' )), 'foo ' )),
261+
262+ '[foo, {bar: foo, foo: [foo, {bar: foo}]}, [foo, {bar: foo}]] ' => array ('foo ' , (object ) array ('bar ' => 'foo ' , 'foo ' => array ('foo ' , (object ) array ('bar ' => 'foo ' ))), array ('foo ' , (object ) array ('bar ' => 'foo ' ))),
263+
264+ '[foo, bar: { foo: bar }] ' => array ('foo ' , '1 ' => (object ) array ('bar ' => (object ) array ('foo ' => 'bar ' ))),
265+ '[foo, \'@foo.baz \', { \'%foo% \': \'foo is %foo% \', bar: \'%foo% \' }, true, \'@service_container \'] ' => array ('foo ' , '@foo.baz ' , (object ) array ('%foo% ' => 'foo is %foo% ' , 'bar ' => '%foo% ' ,), true , '@service_container ' ,),
266+
267+ '{} ' => new \stdClass (),
268+ '{ foo : bar, bar : {} } ' => (object ) array ('foo ' => 'bar ' , 'bar ' => new \stdClass ()),
269+ '{ foo : [], bar : {} } ' => (object ) array ('foo ' => array (), 'bar ' => new \stdClass ()),
270+ '{foo: \'bar \', bar: {} } ' => (object ) array ('foo ' => 'bar ' , 'bar ' => new \stdClass ()),
271+ '{ \'foo \': \'bar \', "bar": {}} ' => (object ) array ('foo ' => 'bar ' , 'bar ' => new \stdClass ()),
272+ '{ \'foo \': \'bar \', "bar": \'{} \'} ' => (object ) array ('foo ' => 'bar ' , 'bar ' => '{} ' ),
273+
274+ '[foo, [{}, {}]] ' => array ('foo ' , array (new \stdClass (), new \stdClass ())),
275+ '[foo, [[], {}]] ' => array ('foo ' , array (array (), new \stdClass ())),
276+ '[foo, [[{}, {}], {}]] ' => array ('foo ' , array (array (new \stdClass (), new \stdClass ()), new \stdClass ())),
277+ '[foo, {bar: {}}] ' => array ('foo ' , '1 ' => (object ) array ('bar ' => new \stdClass ())),
278+ );
279+ }
280+
185281 protected function getTestsForDump ()
186282 {
187283 return array (
@@ -228,4 +324,27 @@ protected function getTestsForDump()
228324 '[foo, \'@foo.baz \', { \'%foo% \': \'foo is %foo% \', bar: \'%foo% \' }, true, \'@service_container \'] ' => array ('foo ' , '@foo.baz ' , array ('%foo% ' => 'foo is %foo% ' , 'bar ' => '%foo% ' ,), true , '@service_container ' ,),
229325 );
230326 }
327+
328+ protected function assertMixedArraysSame ($ a , $ b )
329+ {
330+
331+ foreach ($ a as $ key => $ value ) {
332+ if (array_key_exists ($ key , $ b )) {
333+ if (is_array ($ value )) {
334+ $ this ->assertMixedArraysSame ($ value , $ b [$ key ]);
335+ } else {
336+ if (true === is_object ($ value )) {
337+ $ this ->assertEquals ($ value , $ b [$ key ]);
338+ $ this ->assertInstanceOf (get_class ($ value ), $ b [$ key ]);
339+ $ this ->assertEquals (get_object_vars ($ value ), get_object_vars ($ b [$ key ]));
340+ } else {
341+ $ this ->assertSame ($ value , $ b [$ key ]);
342+ }
343+ }
344+ } else {
345+ $ this ->assertFail ();
346+ }
347+ }
348+
349+ }
231350}
0 commit comments