<?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/>.
**/


use PHPUnit\Framework\TestCase;

class function_calculateGraphScaleValuesTest extends TestCase {

	public static function dataProvider() {
		return [
			[
				['min' => 0, 'max' => 1, 'min_calculated' => true, 'max_calculated' => true, 'interval' => 0.25, 'units' => '', 'power' => 0, 'precision_max' => 15],
				[
					['relative_pos' => 0,		'value' => '0'],
					['relative_pos' => 0.25,	'value' => '0.25'],
					['relative_pos' => 0.5,		'value' => '0.50'],
					['relative_pos' => 0.75,	'value' => '0.75'],
					['relative_pos' => 1,		'value' => '1.00']
				]
			],
			[
				['min' => -1, 'max' => 0, 'min_calculated' => true, 'max_calculated' => true, 'interval' => 0.25, 'units' => '', 'power' => 0, 'precision_max' => 15],
				[
					['relative_pos' => 0,		'value' => '-1.00'],
					['relative_pos' => 0.25,	'value' => '-0.75'],
					['relative_pos' => 0.5,		'value' => '-0.50'],
					['relative_pos' => 0.75,	'value' => '-0.25'],
					['relative_pos' => 1,		'value' => '0']
				]
			],
			[
				['min' => -1, 'max' => 1, 'min_calculated' => true, 'max_calculated' => true, 'interval' => 0.5, 'units' => '', 'power' => 0, 'precision_max' => 15],
				[
					['relative_pos' => 0,		'value' => '-1.0'],
					['relative_pos' => 0.25,	'value' => '-0.5'],
					['relative_pos' => 0.5,		'value' => '0'],
					['relative_pos' => 0.75,	'value' => '0.5'],
					['relative_pos' => 1,		'value' => '1.0']
				]
			],
			[
				['min' => 0, 'max' => 5000, 'min_calculated' => true, 'max_calculated' => true, 'interval' => 1000, 'units' => '', 'power' => 0, 'precision_max' => 15],
				[
					['relative_pos' => 0,		'value' => '0'],
					['relative_pos' => 0.2,		'value' => '1000'],
					['relative_pos' => 0.4,		'value' => '2000'],
					['relative_pos' => 0.6,		'value' => '3000'],
					['relative_pos' => 0.8,		'value' => '4000'],
					['relative_pos' => 1,		'value' => '5000']
				]
			],
			[
				['min' => 0, 'max' => 5000, 'min_calculated' => true, 'max_calculated' => true, 'interval' => 1000, 'units' => '', 'power' => 1, 'precision_max' => 15],
				[
					['relative_pos' => 0,		'value' => '0'],
					['relative_pos' => 0.2,		'value' => '1 K'],
					['relative_pos' => 0.4,		'value' => '2 K'],
					['relative_pos' => 0.6,		'value' => '3 K'],
					['relative_pos' => 0.8,		'value' => '4 K'],
					['relative_pos' => 1,		'value' => '5 K']
				]
			],
			[
				['min' => 0, 'max' => 4096, 'min_calculated' => true, 'max_calculated' => true, 'interval' => 1024, 'units' => 'B', 'power' => 1, 'precision_max' => 15],
				[
					['relative_pos' => 0,		'value' => '0 B'],
					['relative_pos' => 0.25,	'value' => '1 KB'],
					['relative_pos' => 0.5,		'value' => '2 KB'],
					['relative_pos' => 0.75,	'value' => '3 KB'],
					['relative_pos' => 1,		'value' => '4 KB']
				]
			],
			[
				['min' => 0, 'max' => 4096*1024, 'min_calculated' => true, 'max_calculated' => true, 'interval' => 1024*1024/2, 'units' => 'B', 'power' => 2, 'precision_max' => 15],
				[
					['relative_pos' => 0,		'value' => '0 B'],
					['relative_pos' => 0.125,	'value' => '0.5 MB'],
					['relative_pos' => 0.25,	'value' => '1.0 MB'],
					['relative_pos' => 0.375,	'value' => '1.5 MB'],
					['relative_pos' => 0.5,		'value' => '2.0 MB'],
					['relative_pos' => 0.625,	'value' => '2.5 MB'],
					['relative_pos' => 0.75,	'value' => '3.0 MB'],
					['relative_pos' => 0.875,	'value' => '3.5 MB'],
					['relative_pos' => 1,		'value' => '4.0 MB']
				]
			],
			[
				['min' => 0, 'max' => 10, 'min_calculated' => true, 'max_calculated' => true, 'interval' => 5, 'units' => 's', 'power' => 0, 'precision_max' => 15],
				[
					['relative_pos' => 0,		'value' => '0'],
					['relative_pos' => 0.5,		'value' => '5s'],
					['relative_pos' => 1,		'value' => '10s']
				]
			],
			[
				['min' => 0, 'max' => 1, 'min_calculated' => true, 'max_calculated' => true, 'interval' => 0.5, 'units' => 's', 'power' => 0, 'precision_max' => 15],
				[
					['relative_pos' => 0,		'value' => '0'],
					['relative_pos' => 0.5,		'value' => '0.5s'],
					['relative_pos' => 1,		'value' => '1s']
				]
			],
			[
				['min' => 0, 'max' => 0.1, 'min_calculated' => true, 'max_calculated' => true, 'interval' => 0.05, 'units' => 's', 'power' => -1, 'precision_max' => 15],
				[
					['relative_pos' => 0,		'value' => '0'],
					['relative_pos' => 0.5,		'value' => '50ms'],
					['relative_pos' => 1,		'value' => '100ms']
				]
			],
			[
				['min' => 0, 'max' => 0.0001, 'min_calculated' => true, 'max_calculated' => true, 'interval' => 0.00005, 'units' => 's', 'power' => -1, 'precision_max' => 15],
				[
					['relative_pos' => 0,		'value' => '0'],
					['relative_pos' => 0.5,		'value' => '0.05ms'],
					['relative_pos' => 1,		'value' => '0.10ms']
				]
			],
			[
				['min' => 0, 'max' => SEC_PER_HOUR*10, 'min_calculated' => true, 'max_calculated' => true, 'interval' => SEC_PER_HOUR*5, 'units' => 's', 'power' => 2, 'precision_max' => 15],
				[
					['relative_pos' => 0,		'value' => '0'],
					['relative_pos' => 0.5,		'value' => '5h'],
					['relative_pos' => 1,		'value' => '10h']
				]
			]
		];
	}

	/**
	 * @dataProvider dataProvider
	 *
	 * @param array $args
	 * @param array $expected
	*/
	public function test(array $args, array $expected) {
		$this->assertSame($expected,
			calculateGraphScaleValues($args['min'], $args['max'], $args['min_calculated'],
				$args['max_calculated'], $args['interval'], $args['units'], $args['power'], $args['precision_max']
			)
		);
	}
}