Json.decode().phpt 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <?php
  2. /**
  3. * Test: Nette\Utils\Json::decode()
  4. */
  5. declare(strict_types=1);
  6. use Nette\Utils\Json;
  7. use Tester\Assert;
  8. require __DIR__ . '/../bootstrap.php';
  9. Assert::same('ok', Json::decode('"ok"'));
  10. Assert::null(Json::decode('null'));
  11. Assert::null(Json::decode(' null'));
  12. Assert::equal((object) ['a' => 1], Json::decode('{"a":1}'));
  13. Assert::same(['a' => 1], Json::decode('{"a":1}', Json::FORCE_ARRAY));
  14. Assert::same(['a' => 1], Json::decode('{"a":1}', forceArrays: true));
  15. Assert::exception(
  16. fn() => Json::decode(''),
  17. Nette\Utils\JsonException::class,
  18. 'Syntax error',
  19. );
  20. Assert::exception(
  21. fn() => Json::decode('NULL'),
  22. Nette\Utils\JsonException::class,
  23. 'Syntax error',
  24. );
  25. Assert::exception(
  26. fn() => Json::decode('{'),
  27. Nette\Utils\JsonException::class,
  28. 'Syntax error',
  29. );
  30. Assert::exception(
  31. fn() => Json::decode('{}}'),
  32. Nette\Utils\JsonException::class,
  33. 'Syntax error',
  34. );
  35. Assert::exception(
  36. fn() => Json::decode("\x00"),
  37. Nette\Utils\JsonException::class,
  38. defined('JSON_C_VERSION') ? 'Syntax error' : 'Control character error, possibly incorrectly encoded',
  39. );
  40. Assert::exception(
  41. fn() => Json::decode('{"\u0000": 1}'),
  42. Nette\Utils\JsonException::class,
  43. 'The decoded property name is invalid',
  44. );
  45. Assert::same(["\x00" => 1], Json::decode('{"\u0000": 1}', Json::FORCE_ARRAY));
  46. Assert::equal((object) ['a' => "\x00"], Json::decode('{"a": "\u0000"}'));
  47. Assert::equal((object) ["\"\x00" => 1], Json::decode('{"\"\u0000": 1}'));
  48. Assert::exception(
  49. fn() => Json::decode("\"\xC1\xBF\""),
  50. Nette\Utils\JsonException::class,
  51. 'Malformed UTF-8 characters, possibly incorrectly encoded',
  52. );
  53. // default JSON_BIGINT_AS_STRING
  54. if (defined('JSON_C_VERSION')) {
  55. if (PHP_INT_SIZE > 4) {
  56. // 64-bit
  57. Assert::same([9_223_372_036_854_775_807], Json::decode('[12345678901234567890]')); // trimmed to max 64-bit integer
  58. } else {
  59. // 32-bit
  60. Assert::same(['9223372036854775807'], Json::decode('[12345678901234567890]')); // trimmed to max 64-bit integer
  61. }
  62. } else {
  63. Assert::same(['12345678901234567890'], Json::decode('[12345678901234567890]'));
  64. }
  65. // JSON_* constants support
  66. Assert::same('ab', Json::decode("\"a\x80b\"", JSON_INVALID_UTF8_IGNORE));