ScalarComparator.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php declare(strict_types=1);
  2. /*
  3. * This file is part of sebastian/comparator.
  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. namespace SebastianBergmann\Comparator;
  11. use function is_bool;
  12. use function is_object;
  13. use function is_scalar;
  14. use function is_string;
  15. use function mb_strtolower;
  16. use function method_exists;
  17. use function sprintf;
  18. use SebastianBergmann\Exporter\Exporter;
  19. /**
  20. * Compares scalar or NULL values for equality.
  21. */
  22. class ScalarComparator extends Comparator
  23. {
  24. public function accepts(mixed $expected, mixed $actual): bool
  25. {
  26. return ((is_scalar($expected) xor null === $expected) &&
  27. (is_scalar($actual) xor null === $actual)) ||
  28. // allow comparison between strings and objects featuring __toString()
  29. (is_string($expected) && is_object($actual) && method_exists($actual, '__toString')) ||
  30. (is_object($expected) && method_exists($expected, '__toString') && is_string($actual));
  31. }
  32. /**
  33. * @throws ComparisonFailure
  34. */
  35. public function assertEquals(mixed $expected, mixed $actual, float $delta = 0.0, bool $canonicalize = false, bool $ignoreCase = false): void
  36. {
  37. $expectedToCompare = $expected;
  38. $actualToCompare = $actual;
  39. $exporter = new Exporter;
  40. // always compare as strings to avoid strange behaviour
  41. // otherwise 0 == 'Foobar'
  42. if ((is_string($expected) && !is_bool($actual)) || (is_string($actual) && !is_bool($expected))) {
  43. $expectedToCompare = (string) $expectedToCompare;
  44. $actualToCompare = (string) $actualToCompare;
  45. if ($ignoreCase) {
  46. $expectedToCompare = mb_strtolower($expectedToCompare, 'UTF-8');
  47. $actualToCompare = mb_strtolower($actualToCompare, 'UTF-8');
  48. }
  49. }
  50. if ($expectedToCompare !== $actualToCompare && is_string($expected) && is_string($actual)) {
  51. throw new ComparisonFailure(
  52. $expected,
  53. $actual,
  54. $exporter->export($expected),
  55. $exporter->export($actual),
  56. 'Failed asserting that two strings are equal.'
  57. );
  58. }
  59. if ($expectedToCompare != $actualToCompare) {
  60. throw new ComparisonFailure(
  61. $expected,
  62. $actual,
  63. // no diff is required
  64. '',
  65. '',
  66. sprintf(
  67. 'Failed asserting that %s matches expected %s.',
  68. $exporter->export($actual),
  69. $exporter->export($expected)
  70. )
  71. );
  72. }
  73. }
  74. }