Json.encode().phpt 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <?php
  2. /**
  3. * Test: Nette\Utils\Json::encode()
  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::encode('ok'));
  10. Assert::exception(
  11. fn() => Json::encode(["bad utf\xFF"]),
  12. Nette\Utils\JsonException::class,
  13. 'Malformed UTF-8 characters, possibly incorrectly encoded',
  14. );
  15. Assert::exception(function () {
  16. $arr = ['recursive'];
  17. $arr[] = &$arr;
  18. Json::encode($arr);
  19. }, Nette\Utils\JsonException::class, '%a?%ecursion detected');
  20. // default JSON_UNESCAPED_UNICODE + JSON_UNESCAPED_SLASHES
  21. Assert::same("\"/I\u{F1}t\u{EB}rn\u{E2}ti\u{F4}n\u{E0}liz\u{E6}ti\u{F8}n\"", Json::encode("/I\u{F1}t\u{EB}rn\u{E2}ti\u{F4}n\u{E0}liz\u{E6}ti\u{F8}n"));
  22. Assert::same('"\u2028\u2029"', Json::encode("\u{2028}\u{2029}"));
  23. // ESCAPE_UNICODE
  24. Assert::same('"/I\u00f1t\u00ebrn\u00e2ti\u00f4n\u00e0liz\u00e6ti\u00f8n"', Json::encode("/I\u{F1}t\u{EB}rn\u{E2}ti\u{F4}n\u{E0}liz\u{E6}ti\u{F8}n", Json::ESCAPE_UNICODE));
  25. Assert::same('"\u2028\u2029"', Json::encode("\u{2028}\u{2029}", Json::ESCAPE_UNICODE));
  26. Assert::same('"\u2028\u2029"', Json::encode("\u{2028}\u{2029}", asciiSafe: true));
  27. // JSON_PRETTY_PRINT
  28. Assert::same("[\n 1,\n 2,\n 3\n]", Json::encode([1, 2, 3], Json::PRETTY));
  29. Assert::same("[\n 1,\n 2,\n 3\n]", Json::encode([1, 2, 3], pretty: true));
  30. // force objects
  31. Assert::same('{"0":1,"1":2,"2":3}', Json::encode([1, 2, 3], forceObjects: true));
  32. // HTML-safe
  33. Assert::same('"\u003C \u0022 \u0027 \u003E \u0026"', Json::encode("< \" ' > &", htmlSafe: true));
  34. Assert::exception(
  35. fn() => Json::encode(NAN),
  36. Nette\Utils\JsonException::class,
  37. 'Inf and NaN cannot be JSON encoded',
  38. );
  39. // JSON_PRESERVE_ZERO_FRACTION
  40. Assert::same(defined('JSON_PRESERVE_ZERO_FRACTION') ? '1.0' : '1', Json::encode(1.0));
  41. // JSON_* constants support
  42. Assert::same('"\u003Ca\u003E"', Json::encode('<a>', JSON_HEX_TAG));