Comments, tests, and tweaks for JSON decoding quirks
[lhc/web/wiklou.git] / tests / phpunit / includes / json / FormatJsonTest.php
index a4ab879..2760cb9 100644 (file)
@@ -172,7 +172,7 @@ class FormatJsonTest extends MediaWikiTestCase {
        /**
         * Test data for testParseTryFixing.
         *
-        * Some PHP interpreters use json-c rather than the JSON.org cannonical
+        * Some PHP interpreters use json-c rather than the JSON.org canonical
         * parser to avoid being encumbered by the "shall be used for Good, not
         * Evil" clause of the JSON.org parser's license. By default, json-c
         * parses in a non-strict mode which allows trailing commas for array and
@@ -372,4 +372,56 @@ class FormatJsonTest extends MediaWikiTestCase {
 
                return $cases;
        }
+
+       public function provideEmptyJsonKeyStrings() {
+               return [
+                       [
+                               '{"":"foo"}',
+                               '{"":"foo"}',
+                               ''
+                       ],
+                       [
+                               '{"_empty_":"foo"}',
+                               '{"_empty_":"foo"}',
+                               '_empty_' ],
+                       [
+                               '{"\u005F\u0065\u006D\u0070\u0074\u0079\u005F":"foo"}',
+                               '{"_empty_":"foo"}',
+                               '_empty_'
+                       ],
+                       [
+                               '{"_empty_":"bar","":"foo"}',
+                               '{"_empty_":"bar","":"foo"}',
+                               ''
+                       ],
+                       [
+                               '{"":"bar","_empty_":"foo"}',
+                               '{"":"bar","_empty_":"foo"}',
+                               '_empty_'
+                       ]
+               ];
+       }
+
+       /**
+        * @covers FormatJson::encode
+        * @covers FormatJson::decode
+        * @dataProvider provideEmptyJsonKeyStrings
+        * @param string $json
+        *
+        * Decoding behavior with empty keys can be surprising.
+        * See https://phabricator.wikimedia.org/T206411
+        */
+       public function testEmptyJsonKeyArray( $json, $expect, $php71Name ) {
+               // Decoding to array is consistent across supported PHP versions
+               $this->assertSame( $expect, FormatJson::encode(
+                       FormatJson::decode( $json, true ) ) );
+
+               // Decoding to object differs between supported PHP versions
+               $obj = FormatJson::decode( $json );
+               if ( version_compare( PHP_VERSION, '7.1', '<' ) ) {
+                       $this->assertEquals( 'foo', $obj->_empty_ );
+               } else {
+                       $this->assertEquals( 'foo', $obj->{$php71Name} );
+               }
+       }
 }