ComplexAssert.php 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheetTests\Custom;
  3. use Complex\Complex;
  4. class ComplexAssert
  5. {
  6. /**
  7. * @var string
  8. */
  9. private $errorMessage = '';
  10. /**
  11. * @param mixed $expected
  12. * @param mixed $actual
  13. */
  14. private function testExpectedExceptions($expected, $actual): bool
  15. {
  16. // Expecting an error, so we do a straight string comparison
  17. if ($expected === $actual) {
  18. return true;
  19. } elseif ($expected === INF && $actual === 'INF') {
  20. return true;
  21. }
  22. $this->errorMessage = 'Expected Error: ' . $actual . ' !== ' . $expected;
  23. return false;
  24. }
  25. private function adjustDelta(float $expected, float $actual, float $delta): float
  26. {
  27. $adjustedDelta = $delta;
  28. if (abs($actual) > 10 && abs($expected) > 10) {
  29. $variance = floor(log10(abs($expected)));
  30. $adjustedDelta *= 10 ** $variance;
  31. }
  32. return $adjustedDelta > 1.0 ? 1.0 : $adjustedDelta;
  33. }
  34. /**
  35. * @param mixed $expected
  36. * @param mixed $actual
  37. */
  38. public function assertComplexEquals($expected, $actual, float $delta = 0): bool
  39. {
  40. if ($expected === INF || (is_string($expected) && $expected[0] === '#')) {
  41. return $this->testExpectedExceptions($expected, $actual);
  42. }
  43. $expectedComplex = new Complex($expected);
  44. $actualComplex = new Complex($actual);
  45. $adjustedDelta = $this->adjustDelta($expectedComplex->getReal(), $actualComplex->getReal(), $delta);
  46. if (abs($actualComplex->getReal() - $expectedComplex->getReal()) > $adjustedDelta) {
  47. $this->errorMessage = 'Mismatched Real part: ' . $actualComplex->getReal() . ' != ' . $expectedComplex->getReal();
  48. return false;
  49. }
  50. $adjustedDelta = $this->adjustDelta($expectedComplex->getImaginary(), $actualComplex->getImaginary(), $delta);
  51. if (abs($actualComplex->getImaginary() - $expectedComplex->getImaginary()) > $adjustedDelta) {
  52. $this->errorMessage = 'Mismatched Imaginary part: ' . $actualComplex->getImaginary() . ' != ' . $expectedComplex->getImaginary();
  53. return false;
  54. }
  55. if ($actualComplex->getSuffix() !== $actualComplex->getSuffix()) {
  56. $this->errorMessage = 'Mismatched Suffix: ' . $actualComplex->getSuffix() . ' != ' . $expectedComplex->getSuffix();
  57. return false;
  58. }
  59. return true;
  60. }
  61. public function getErrorMessage(): string
  62. {
  63. return $this->errorMessage;
  64. }
  65. }