<?php declare(strict_types = 0);
/*
** Copyright (C) 2001-2025 Zabbix SIA
**
** This program is free software: you can redistribute it and/or modify it under the terms of
** the GNU Affero General Public License as published by the Free Software Foundation, version 3.
**
** This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
** without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
** See the GNU Affero General Public License for more details.
**
** You should have received a copy of the GNU Affero General Public License along with this program.
** If not, see <https://www.gnu.org/licenses/>.
**/


require_once __DIR__.'/../../../include/js.inc.php';

use PHPUnit\Framework\TestCase;

class zbxjsvalueTest extends TestCase {

	public static function dataProvider() {
		$return_as_object = true;

		return [
			[
				$return_as_object,
				true,
				'true'
			],
			[
				!$return_as_object,
				true,
				'true'
			],
			[
				$return_as_object,
				null,
				'null'
			],
			[
				!$return_as_object,
				null,
				'null'
			],
			[
				$return_as_object,
				-10,
				'-10'
			],
			[
				!$return_as_object,
				-10,
				'-10'
			],
			[
				$return_as_object,
				100,
				'100'
			],
			[
				!$return_as_object,
				100,
				'100'
			],
			[
				$return_as_object,
				[],
				'{}'
			],
			[
				!$return_as_object,
				[],
				'[]'
			],
			[
				$return_as_object,
				'',
				"''"
			],
			[
				!$return_as_object,
				'',
				"''"
			],
			[
				$return_as_object,
				['key-with-dash' => 'value'],
				'{"key-with-dash":\'value\'}'
			],
			[
				!$return_as_object,
				['key-with-dash' => 'value'],
				'{"key-with-dash":\'value\'}'
			],
			[
				$return_as_object,
				['key-with-quotes-\'"' => 'value'],
				'{"key-with-quotes-\\\'\\"":\'value\'}'
			],
			[
				!$return_as_object,
				['key-with-quotes-\'"' => 'value'],
				'{"key-with-quotes-\\\'\\"":\'value\'}'
			],
			[
				$return_as_object,
				[-1 => ['agent_string', 'another_string']],
				'{"-1":{"0":\'agent_string\',"1":\'another_string\'}}'
			],
			[
				!$return_as_object,
				// JSON implementation will return slightly different result :
				// 		{"-1":[\'agent_string\',\'another_string\']}
				[-1 => ['agent_string', 'another_string']],
				'[[\'agent_string\',\'another_string\']]'
			]
		];
	}

	/**
	 * @dataProvider dataProvider
	 *
	 * @param bool                  $as_object
	 * @param array|string|int|bool $source
	 * @param string                $expected
	*/
	public function testZbxJsvalue($as_object, $source, $expected) {
		$encoded = zbx_jsvalue($source, $as_object);

		$this->assertSame($expected, $encoded);
	}
}