<?php
/**
*
* @package testing
* @copyright (c) 2011 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/

require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';

class phpbb_wrapper_version_compare_test extends phpbb_test_case
{
	public function test_two_parameters()
	{
		$this->assertEquals(-1, phpbb_version_compare('1.0.0', '1.0.1'));
		$this->assertEquals(0, phpbb_version_compare('1.0.0', '1.0.0'));
		$this->assertEquals(1, phpbb_version_compare('1.0.1', '1.0.0'));
	}
	
	public function test_three_parameters()
	{
		$this->assertEquals(true, phpbb_version_compare('1.0.0', '1.0.1', '<'));
		$this->assertEquals(true, phpbb_version_compare('1.0.0', '1.0.0', '<='));
		$this->assertEquals(true, phpbb_version_compare('1.0.0', '1.0.0', '='));
		$this->assertEquals(true, phpbb_version_compare('1.0.0', '1.0.0', '>='));
		$this->assertEquals(true, phpbb_version_compare('1.0.1', '1.0.0', '>'));
	}

	public function test_strict_order()
	{
		$releases = array(
			'2.0.0',
			'2.0.1',
			// Those are not version_compare() compatible
			//'2.0.6a',
			//'2.0.6b',
			//'2.0.6c',
			//'2.0.6d',
			'2.0.7',
			'2.0.23',
			'3.0.A1',
			'3.0.A2',
			'3.0.A3',
			'3.0.B1',
			'3.0.B2',
			'3.0.B4',
			'3.0.B5',
			'3.0.RC1',
			'3.0.RC5',
			'3.0.0',
			'3.0.1',
			'3.0.2',
			'3.0.7',
			'3.0.7-PL1',
			'3.0.8-RC1',
			'3.0.8',
			'3.0.9-dev',
			'3.0.9-RC1',
			'3.0.9-RC2',
			'3.0.9-RC4',
			'3.0.10-RC1',
			'3.1-dev',
			'3.2-A1',
		);

		for ($i = 0, $size = sizeof($releases); $i < $size - 1; ++$i)
		{
			$version1 = $releases[$i];
			$version2 = $releases[$i + 1];

			$this->assertEquals(
				true,
				phpbb_version_compare($version1, $version2, '<'),
				"Result of version comparison $version1 < $version2 is incorrect."
			);
		}
	}

	/**
	* @dataProvider equality_test_data
	*/
	public function test_equality($version1, $version2)
	{
		$this->assertEquals(
			0,
			phpbb_version_compare($version1, $version2),
			"Result of version comparison $version1 = $version2 is incorrect."
		);

		$this->assertEquals(
			true,
			phpbb_version_compare($version1, $version2, '='),
			"Result of version comparison $version1 = $version2 is incorrect."
		);
	}

	public function equality_test_data()
	{
		return array(
			array('1.1.0-A2', '1.1.0-a2'),
			array('1.1.0-B1', '1.1.0-b1'),
		);
	}

	/**
	* @dataProvider alpha_beta_test_data
	*/
	public function test_alpha_beta($expected, $version1, $version2)
	{
		$this->assertEquals(
			$expected,
			phpbb_version_compare($version1, $version2),
			"Result of version comparison ($version1, $version2) = $expected is incorrect."
		);
		
	}

	public function alpha_beta_test_data()
	{
		return array(
			array(-1, '1.1.0-A2', '1.1.0-B1'),
			array(-1, '1.1.0-a2', '1.1.0-b1'),

			array(-1, '1.1.0-a2', '1.1.0-B1'),
			array(-1, '1.1.0-A2', '1.1.0-b1'),
		);
	}

}