diff --git a/core/lib/Drupal/Component/Utility/Json.php b/core/lib/Drupal/Component/Utility/Json.php index 6af136e..54614b5 100644 --- a/core/lib/Drupal/Component/Utility/Json.php +++ b/core/lib/Drupal/Component/Utility/Json.php @@ -11,27 +11,40 @@ * Provides helpers for dealing with json. */ class Json { + /** * Converts a PHP variable into its JavaScript equivalent. * * We use HTML-safe strings, with several characters escaped. * + * @param mixed $variable + * The variable to encode. + * + * @return string + * Returns the encoded variable. + * * @see drupal_json_decode() * @ingroup php_wrappers */ - public static function encode($var) { + public static function encode($variable) { // Encode <, >, ', &, and " using the json_encode() options parameter. - return json_encode($var, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT); + return json_encode($variable, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT); } /** * Converts an HTML-safe JSON string into its PHP equivalent. * + * @param string $string + * The string to decode. + * + * @return mixed + * Returns the decoded string. + * * @see drupal_json_encode() * @ingroup php_wrappers */ - public static function decode($var) { - return json_decode($var, TRUE); + public static function decode($string) { + return json_decode($string, TRUE); } } diff --git a/core/tests/Drupal/Tests/Component/Utility/JsonTest.php b/core/tests/Drupal/Tests/Component/Utility/JsonTest.php index f781d47..e14fc7c 100644 --- a/core/tests/Drupal/Tests/Component/Utility/JsonTest.php +++ b/core/tests/Drupal/Tests/Component/Utility/JsonTest.php @@ -2,7 +2,7 @@ /** * @file - * Definition of Drupal\Tests\Component\Utility\JsonTest. + * Contains \Drupal\Tests\Component\Utility\JsonTest. */ namespace Drupal\Tests\Component\Utility; @@ -12,8 +12,33 @@ /** * Tests the Json::encode() and Json::decode() functions. + * + * @see \Drupal\Component\Utility\Json */ class JsonTest extends UnitTestCase { + + /** + * A test string with the full ASCII table. + * + * @var string + */ + protected $string; + + /** + * An array of unsafe html characters which has to be encoded. + * + * @var array + */ + protected $htmlUnsafe; + + /** + * An array of unsafe html characters which are already escaped. + * + * @var array + */ + protected $htmlUnsafeEscaped; + + public static function getInfo() { return array( 'name' => 'JSON', @@ -23,53 +48,84 @@ public static function getInfo() { } /** - * Tests converting PHP variables to JSON strings and back. + * {@inheritdoc} */ - function testJSON() { + protected function setUp() { + parent::setUp(); + // Setup a string with the full ASCII table. // @todo: Add tests for non-ASCII characters and Unicode. - $str = ''; + $this->string = ''; for ($i=0; $i < 128; $i++) { - $str .= chr($i); + $this->string .= chr($i); } + // Characters that must be escaped. // We check for unescaped " separately. - $html_unsafe = array('<', '>', '\'', '&'); + $this->htmlUnsafe = array('<', '>', '\'', '&'); // The following are the encoded forms of: < > ' & " - $html_unsafe_escaped = array('\u003C', '\u003E', '\u0027', '\u0026', '\u0022'); + $this->htmlUnsafeEscaped = array('\u003C', '\u003E', '\u0027', '\u0026', '\u0022'); + } + /** + * Tests encoding for every ASCII character. + */ + public function testEncodingAscii() { // Verify there aren't character encoding problems with the source string. - $this->assertSame(strlen($str), 128, 'A string with the full ASCII table has the correct length.'); - foreach ($html_unsafe as $char) { - $this->assertTrue(strpos($str, $char) > 0, sprintf('A string with the full ASCII table includes %s.', $char)); + $this->assertSame(strlen($this->string), 128, 'A string with the full ASCII table has the correct length.'); + foreach ($this->htmlUnsafe as $char) { + $this->assertTrue(strpos($this->string, $char) > 0, sprintf('A string with the full ASCII table includes %s.', $char)); } + } + /** + * Tests encoding length. + */ + public function testEncodingLength() { // Verify that JSON encoding produces a string with all of the characters. - $json = Json::encode($str); - $this->assertTrue(strlen($json) > strlen($str), 'A JSON encoded string is larger than the source string.'); + $json = Json::encode($this->string); + $this->assertTrue(strlen($json) > strlen($this->string), 'A JSON encoded string is larger than the source string.'); + } + /** + * Tests end and start of the encoded string. + */ + public function testEncodingStartEnd() { + $json = Json::encode($this->string); // The first and last characters should be ", and no others. $this->assertTrue($json[0] == '"', 'A JSON encoded string begins with ".'); $this->assertTrue($json[strlen($json) - 1] == '"', 'A JSON encoded string ends with ".'); $this->assertTrue(substr_count($json, '"') == 2, 'A JSON encoded string contains exactly two ".'); + } + /** + * Tests converting PHP variables to JSON strings and back. + */ + public function testReversibility() { + $json = Json::encode($this->string); // Verify that encoding/decoding is reversible. $json_decoded = Json::decode($json); - $this->assertSame($str, $json_decoded, 'Encoding a string to JSON and decoding back results in the original string.'); + $this->assertSame($this->string, $json_decoded, 'Encoding a string to JSON and decoding back results in the original string.'); + } + /** + * Test the reversibility of structured data + */ + public function testStructuredReversibility() { // Verify reversibility for structured data. Also verify that necessary // characters are escaped. - $source = array(TRUE, FALSE, 0, 1, '0', '1', $str, array('key1' => $str, 'key2' => array('nested' => TRUE))); + $source = array(TRUE, FALSE, 0, 1, '0', '1', $this->string, array('key1' => $this->string, 'key2' => array('nested' => TRUE))); $json = Json::encode($source); - foreach ($html_unsafe as $char) { + foreach ($this->htmlUnsafe as $char) { $this->assertTrue(strpos($json, $char) === FALSE, sprintf('A JSON encoded string does not contain %s.', $char)); } // Verify that JSON encoding escapes the HTML unsafe characters - foreach ($html_unsafe_escaped as $char) { + foreach ($this->htmlUnsafeEscaped as $char) { $this->assertTrue(strpos($json, $char) > 0, sprintf('A JSON encoded string contains %s.', $char)); } $json_decoded = Json::decode($json); - $this->assertNotSame($source, $json, 'An array encoded in JSON is not identical to the source.'); - $this->assertSame($source, $json_decoded, 'Encoding structured data to JSON and decoding back results in the original data.'); + $this->assertNotSame($source, $json, 'An array encoded in JSON is identical to the source.'); + $this->assertSame($source, $json_decoded, 'Encoding structured data to JSON and decoding back not results in the original data.'); } + }