<?php

/**
 * Test: Nette\Utils\Json::encode()
 */

declare(strict_types=1);

use Nette\Utils\Json;
use Tester\Assert;


require __DIR__ . '/../bootstrap.php';


Assert::same('"ok"', Json::encode('ok'));


Assert::exception(
	fn() => Json::encode(["bad utf\xFF"]),
	Nette\Utils\JsonException::class,
	'Malformed UTF-8 characters, possibly incorrectly encoded',
);


Assert::exception(function () {
	$arr = ['recursive'];
	$arr[] = &$arr;
	Json::encode($arr);
}, Nette\Utils\JsonException::class, '%a?%ecursion detected');


// default JSON_UNESCAPED_UNICODE + JSON_UNESCAPED_SLASHES
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"));
Assert::same('"\u2028\u2029"', Json::encode("\u{2028}\u{2029}"));


// ESCAPE_UNICODE
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));
Assert::same('"\u2028\u2029"', Json::encode("\u{2028}\u{2029}", Json::ESCAPE_UNICODE));
Assert::same('"\u2028\u2029"', Json::encode("\u{2028}\u{2029}", asciiSafe: true));


// JSON_PRETTY_PRINT
Assert::same("[\n    1,\n    2,\n    3\n]", Json::encode([1, 2, 3], Json::PRETTY));
Assert::same("[\n    1,\n    2,\n    3\n]", Json::encode([1, 2, 3], pretty: true));


// force objects
Assert::same('{"0":1,"1":2,"2":3}', Json::encode([1, 2, 3], forceObjects: true));


// HTML-safe
Assert::same('"\u003C \u0022 \u0027 \u003E \u0026"', Json::encode("< \" ' > &", htmlSafe: true));


Assert::exception(
	fn() => Json::encode(NAN),
	Nette\Utils\JsonException::class,
	'Inf and NaN cannot be JSON encoded',
);


// JSON_PRESERVE_ZERO_FRACTION
Assert::same(defined('JSON_PRESERVE_ZERO_FRACTION') ? '1.0' : '1', Json::encode(1.0));


// JSON_* constants support
Assert::same('"\u003Ca\u003E"', Json::encode('<a>', JSON_HEX_TAG));
