<?php
/*
 * This file is part of the Comparator package.
 *
 * (c) Sebastian Bergmann <sebastian@phpunit.de>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SebastianBergmann\Comparator;

/**
 * Compares doubles for equality.
 *
 * @package    Comparator
 * @author     Bernhard Schussek <bschussek@2bepublished.at>
 * @copyright  Sebastian Bergmann <sebastian@phpunit.de>
 * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
 * @link       http://www.github.com/sebastianbergmann/comparator
 */
class DoubleComparator extends NumericComparator {
	/**
	 * Smallest value available in PHP.
	 *
	 * @var float
	 */
	const EPSILON = 0.0000000001;

	/**
	 * Returns whether the comparator can compare two values.
	 *
	 * @param  mixed $expected The first value to compare
	 * @param  mixed $actual   The second value to compare
	 *
	 * @return boolean
	 */
	public function accepts ( $expected, $actual ) {
		return ( is_double( $expected ) || is_double( $actual ) ) && is_numeric( $expected ) && is_numeric( $actual );
	}

	/**
	 * Asserts that two values are equal.
	 *
	 * @param  mixed $expected     The first value to compare
	 * @param  mixed $actual       The second value to compare
	 * @param  float $delta        The allowed numerical distance between two values to
	 *                             consider them equal
	 * @param  bool  $canonicalize If set to TRUE, arrays are sorted before
	 *                             comparison
	 * @param  bool  $ignoreCase   If set to TRUE, upper- and lowercasing is
	 *                             ignored when comparing string values
	 *
	 * @throws ComparisonFailure Thrown when the comparison
	 *                           fails. Contains information about the
	 *                           specific errors that lead to the failure.
	 */
	public function assertEquals ( $expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false ) {
		if ( $delta == 0 ) {
			$delta = self::EPSILON;
		}

		parent::assertEquals( $expected, $actual, $delta, $canonicalize, $ignoreCase );
	}
}
