Browse Source

adds support for NAN and INF rendered as zero

thinkingmedia 9 years ago
parent
commit
4c8374d830
3 changed files with 30 additions and 7 deletions
  1. 3 1
      src/View/JsonView.php
  2. 2 0
      src/View/View.php
  3. 25 6
      tests/TestCase/View/JsonViewTest.php

+ 3 - 1
src/View/JsonView.php

@@ -135,7 +135,9 @@ class JsonView extends SerializedView
     {
         $data = $this->_dataToSerialize($serialize);
 
-        $jsonOptions = JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT;
+        $jsonOptions = JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT |
+            JSON_ERROR_INF_OR_NAN | JSON_PARTIAL_OUTPUT_ON_ERROR;
+
         if (isset($this->viewVars['_jsonOptions'])) {
             if ($this->viewVars['_jsonOptions'] === false) {
                 $jsonOptions = 0;

+ 2 - 0
src/View/View.php

@@ -67,6 +67,8 @@ use RuntimeException;
  * @property \Cake\View\Helper\TimeHelper $Time
  * @property \Cake\View\Helper\UrlHelper $Url
  * @property \Cake\View\ViewBlock $Blocks
+ * @property string $view
+ * @property string $viewPath
  */
 class View implements EventDispatcherInterface
 {

+ 25 - 6
tests/TestCase/View/JsonViewTest.php

@@ -39,7 +39,7 @@ class JsonViewTest extends TestCase
      *
      * Note: array($data, $serialize, expected)
      *
-     * @return void
+     * @return array
      */
     public static function renderWithoutViewProvider()
     {
@@ -203,14 +203,33 @@ class JsonViewTest extends TestCase
                 JSON_HEX_TAG | JSON_HEX_APOS,
                 json_encode('<tag> \'quote\' "double-quote" &', JSON_HEX_TAG | JSON_HEX_APOS)
             ],
+
+            // Test render of NAN
+            [
+                ['value' => NAN],
+                true,
+                null,
+                '{"value":0}'
+            ],
+
+            // Test render of INF
+            [
+                ['value' => INF],
+                true,
+                null,
+                '{"value":0}'
+            ],
         ];
     }
 
     /**
      * Test render with a valid string in _serialize.
      *
+     * @param array $data
+     * @param string|null $serialize
+     * @param int|bool|null $jsonOptions
+     * @param string $expected
      * @dataProvider renderWithoutViewProvider
-     * @return void
      */
     public function testRenderWithoutView($data, $serialize, $jsonOptions, $expected)
     {
@@ -221,7 +240,7 @@ class JsonViewTest extends TestCase
         $Controller->set($data);
         $Controller->set('_serialize', $serialize);
         $Controller->set('_jsonOptions', $jsonOptions);
-        $Controller->viewClass = 'Json';
+        $Controller->viewBuilder()->className('Json');
         $View = $Controller->createView();
         $output = $View->render(false);
 
@@ -244,7 +263,7 @@ class JsonViewTest extends TestCase
             'tags' => ['cakephp', 'framework'],
             '_serialize' => 'tags'
         ]);
-        $Controller->viewClass = 'Json';
+        $Controller->viewBuilder()->className('Json');
         $View = $Controller->createView();
         $View->render();
 
@@ -268,7 +287,7 @@ class JsonViewTest extends TestCase
             '_serialize' => 'data',
             '_jsonp' => true
         ]);
-        $Controller->viewClass = 'Json';
+        $Controller->viewBuilder()->className('Json');
         $View = $Controller->createView();
         $output = $View->render(false);
 
@@ -310,7 +329,7 @@ class JsonViewTest extends TestCase
             ]
         ];
         $Controller->set('user', $data);
-        $Controller->viewClass = 'Json';
+        $Controller->viewBuilder()->className('Json');
         $View = $Controller->createView();
         $View->viewPath = $Controller->name;
         $output = $View->render('index');