1<?php 2/* 3 * This file is part of the Comparator package. 4 * 5 * (c) Sebastian Bergmann <sebastian@phpunit.de> 6 * 7 * For the full copyright and license information, please view the LICENSE 8 * file that was distributed with this source code. 9 */ 10 11namespace SebastianBergmann\Comparator; 12 13/** 14 * Compares numerical values for equality. 15 */ 16class NumericComparator extends ScalarComparator 17{ 18 /** 19 * Returns whether the comparator can compare two values. 20 * 21 * @param mixed $expected The first value to compare 22 * @param mixed $actual The second value to compare 23 * @return bool 24 */ 25 public function accepts($expected, $actual) 26 { 27 // all numerical values, but not if one of them is a double 28 // or both of them are strings 29 return is_numeric($expected) && is_numeric($actual) && 30 !(is_double($expected) || is_double($actual)) && 31 !(is_string($expected) && is_string($actual)); 32 } 33 34 /** 35 * Asserts that two values are equal. 36 * 37 * @param mixed $expected First value to compare 38 * @param mixed $actual Second value to compare 39 * @param float $delta Allowed numerical distance between two values to consider them equal 40 * @param bool $canonicalize Arrays are sorted before comparison when set to true 41 * @param bool $ignoreCase Case is ignored when set to true 42 * 43 * @throws ComparisonFailure 44 */ 45 public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false) 46 { 47 if (is_infinite($actual) && is_infinite($expected)) { 48 return; 49 } 50 51 if ((is_infinite($actual) xor is_infinite($expected)) || 52 (is_nan($actual) or is_nan($expected)) || 53 abs($actual - $expected) > $delta) { 54 throw new ComparisonFailure( 55 $expected, 56 $actual, 57 '', 58 '', 59 false, 60 sprintf( 61 'Failed asserting that %s matches expected %s.', 62 $this->exporter->export($actual), 63 $this->exporter->export($expected) 64 ) 65 ); 66 } 67 } 68} 69