<?php

/**
 * Test: Nette\Utils\Json::decode()
 */

declare(strict_types=1);

use Nette\Utils\Json;
use Tester\Assert;


require __DIR__ . '/../bootstrap.php';


Assert::same('ok', Json::decode('"ok"'));
Assert::null(Json::decode('null'));
Assert::null(Json::decode(' null'));


Assert::equal((object) ['a' => 1], Json::decode('{"a":1}'));
Assert::same(['a' => 1], Json::decode('{"a":1}', Json::FORCE_ARRAY));
Assert::same(['a' => 1], Json::decode('{"a":1}', forceArrays: true));


Assert::exception(
	fn() => Json::decode(''),
	Nette\Utils\JsonException::class,
	'Syntax error',
);


Assert::exception(
	fn() => Json::decode('NULL'),
	Nette\Utils\JsonException::class,
	'Syntax error',
);


Assert::exception(
	fn() => Json::decode('{'),
	Nette\Utils\JsonException::class,
	'Syntax error',
);


Assert::exception(
	fn() => Json::decode('{}}'),
	Nette\Utils\JsonException::class,
	'Syntax error',
);


Assert::exception(
	fn() => Json::decode("\x00"),
	Nette\Utils\JsonException::class,
	defined('JSON_C_VERSION') ? 'Syntax error' : 'Control character error, possibly incorrectly encoded',
);


Assert::exception(
	fn() => Json::decode('{"\u0000": 1}'),
	Nette\Utils\JsonException::class,
	'The decoded property name is invalid',
);


Assert::same(["\x00" => 1], Json::decode('{"\u0000": 1}', Json::FORCE_ARRAY));
Assert::equal((object) ['a' => "\x00"], Json::decode('{"a": "\u0000"}'));
Assert::equal((object) ["\"\x00" => 1], Json::decode('{"\"\u0000": 1}'));


Assert::exception(
	fn() => Json::decode("\"\xC1\xBF\""),
	Nette\Utils\JsonException::class,
	'Malformed UTF-8 characters, possibly incorrectly encoded',
);


// default JSON_BIGINT_AS_STRING
if (defined('JSON_C_VERSION')) {
	if (PHP_INT_SIZE > 4) {
		// 64-bit
		Assert::same([9_223_372_036_854_775_807], Json::decode('[12345678901234567890]'));   // trimmed to max 64-bit integer
	} else {
		// 32-bit
		Assert::same(['9223372036854775807'], Json::decode('[12345678901234567890]'));  // trimmed to max 64-bit integer
	}

} else {
	Assert::same(['12345678901234567890'], Json::decode('[12345678901234567890]'));
}


// JSON_* constants support
Assert::same('ab', Json::decode("\"a\x80b\"", JSON_INVALID_UTF8_IGNORE));
