<?php
/**
 *
 * This file is part of the phpBB Forum Software package.
 *
 * @copyright (c) phpBB Limited <https://www.phpbb.com>
 * @license GNU General Public License, version 2 (GPL-2.0)
 *
 * For full copyright and license information, please see
 * the docs/CREDITS.txt file.
 *
 */

class phpbb_installer_database_helper_test extends phpbb_test_case
{
	/**
	 * @var phpbb\install\helper\database
	 */
	private $database_helper;

	protected function setUp(): void
	{
		$filesystem = new \phpbb\filesystem\filesystem();
		$phpbb_root_path = '';
		$this->database_helper = new \phpbb\install\helper\database($filesystem, $phpbb_root_path);
	}

	/**
	 * @param string	$input
	 * @param string	$expected
	 *
	 * @dataProvider	comment_string_provider
	 */
	public function test_remove_comments($input, $expected)
	{
		$this->assertEquals($expected, $this->database_helper->remove_comments($input));
	}

	/**
	 * @param array		$expected
	 * @param string	$sql
	 * @param string	$delimiter
	 *
	 * @dataProvider	sql_file_string_provider
	 */
	public function test_split_sql($expected, $sql, $delimiter)
	{
		$this->assertEquals($expected, $this->database_helper->split_sql_file($sql, $delimiter));
	}

	/**
	 * @param bool|array	$expected
	 * @param string		$test_string
	 *
	 * @dataProvider	prefix_test_case_provider
	 */
	public function test_validate_table_prefix($expected, $test_string)
	{
		$db_helper_mock = $this->getMockBuilder('\phpbb\install\helper\database')
			->setMethods(array('get_available_dbms'))
			->disableOriginalConstructor()
			->getMock();

		$db_helper_mock->method('get_available_dbms')
			->willReturn(array('sqlite3' => array(
				'LABEL'			=> 'SQLite3',
				'SCHEMA'		=> 'sqlite',
				'MODULE'		=> 'sqlite3',
				'DELIM'			=> ';',
				'DRIVER'		=> 'phpbb\db\driver\sqlite3',
				'AVAILABLE'		=> true,
				'2.0.x'			=> false,
			)));

		$this->assertEquals($expected, $db_helper_mock->validate_table_prefix('sqlite3', $test_string));
	}

	// Data provider for the remove comments function
	public function comment_string_provider()
	{
		return array(
			array(
				'abc',
				'abc',
			),
			array(
				'abc /* asdf */',
				"abc \n",
			),
			array(
				'abc /* asdf */ f',
				"abc \n f",
			),
			array(
				'# abc',
				"\n",
			),
		);
	}

	// Data provider for the sql file splitter function
	public function sql_file_string_provider()
	{
		return array(
			array(
				array(
					'abcd "efgh"' . "\n" . 'qwerty',
					'SELECT * FROM table',
				),
				'abcd "efgh"' . "\n" .
				'qwerty;' . "\n" .
				'SELECT * FROM table',
				';',
			),
		);
	}

	// Test data for prefix test
	public function prefix_test_case_provider()
	{
		return array(
			array(
				true,
				'phpbb_',
			),
			array(
				true,
				'phpbb',
			),
			array(
				array(
					array('title' => 'INST_ERR_DB_INVALID_PREFIX'),
				),
				'1hpbb_',
			),
			array(
				array(
					array('title' => 'INST_ERR_DB_INVALID_PREFIX'),
				),
				'?hpbb_',
			),
			array(
				array(
					array('title' => array('INST_ERR_PREFIX_TOO_LONG', 200)),
				),
				'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
			),
			array(
				array(
					array('title' => 'INST_ERR_DB_INVALID_PREFIX'),
					array('title' => array('INST_ERR_PREFIX_TOO_LONG', 200)),
				),
				'_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
			),
		);
	}
}
