Bladeren bron

Merged r25058 from trunk

git-svn-id: http://framework.zend.com/svn/framework/standard/branches/release-1.12@25059 44c647ce-9c0f-0410-b52a-842ac1e357ba
rob 13 jaren geleden
bovenliggende
commit
cf4f174777
2 gewijzigde bestanden met toevoegingen van 39 en 3 verwijderingen
  1. 3 2
      library/Zend/Json/Encoder.php
  2. 36 1
      tests/Zend/JsonTest.php

+ 3 - 2
library/Zend/Json/Encoder.php

@@ -74,7 +74,6 @@ class Zend_Json_Encoder
     public static function encode($value, $cycleCheck = false, $options = array())
     {
         $encoder = new self(($cycleCheck) ? true : false, $options);
-
         return $encoder->_encodeValue($value);
     }
 
@@ -138,7 +137,9 @@ class Zend_Json_Encoder
         if (method_exists($value, 'toJson')) {
             $props =',' . preg_replace("/^\{(.*)\}$/","\\1",$value->toJson());
         } else {
-            if ($value instanceof Iterator) {
+            if ($value instanceof IteratorAggregate) {
+                $propCollection = $value->getIterator();
+            } elseif ($value instanceof Iterator) {
                 $propCollection = $value;
             } else {
                 $propCollection = get_object_vars($value);

+ 36 - 1
tests/Zend/JsonTest.php

@@ -754,10 +754,30 @@ EOB;
 
     public function testEncodeObjectImplementingIterator()
     {
-        $this->markTestIncomplete('Test is not yet finished.');
+        $iterator = new ArrayIterator(array(
+            'foo' => 'bar',
+            'baz' => 5
+        ));
+        $target = '{"__className":"ArrayIterator","foo":"bar","baz":5}';
+
+        Zend_Json::$useBuiltinEncoderDecoder = true;
+        $this->assertEquals($target, Zend_Json::encode($iterator));
     }
 
     /**
+     * @group ZF-12347
+     */
+    public function testEncodeObjectImplementingIteratorAggregate()
+    {
+        $iterator = new ZF12347_IteratorAggregate();
+        $target = '{"__className":"ZF12347_IteratorAggregate","foo":"bar","baz":5}';
+
+        Zend_Json::$useBuiltinEncoderDecoder = true;
+        $this->assertEquals($target, Zend_Json::encode($iterator));
+    }
+
+
+    /**
      * @group ZF-8663
      */
     public function testNativeJsonEncoderWillProperlyEncodeSolidusInStringValues()
@@ -1012,3 +1032,18 @@ class Zend_Json_ToJsonWithExpr
         return Zend_Json::encode($data, false, array('enableJsonExprFinder' => true));
     }
 }
+
+/**
+ * @see ZF-12347
+ */
+class ZF12347_IteratorAggregate implements IteratorAggregate
+{
+    protected $array = array(
+        'foo' => 'bar',
+        'baz' => 5
+    );
+
+    public function getIterator() {
+        return new ArrayIterator($this->array);
+    }
+}