FactoryTest.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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 tmpfile;
  12. use DateTime;
  13. use DOMDocument;
  14. use Exception;
  15. use PHPUnit\Framework\TestCase;
  16. use SplObjectStorage;
  17. use stdClass;
  18. /**
  19. * @covers \SebastianBergmann\Comparator\Factory
  20. *
  21. * @uses \SebastianBergmann\Comparator\Comparator
  22. * @uses \SebastianBergmann\Comparator\Factory
  23. * @uses \SebastianBergmann\Comparator\ComparisonFailure
  24. */
  25. final class FactoryTest extends TestCase
  26. {
  27. public function instanceProvider()
  28. {
  29. $tmpfile = tmpfile();
  30. return [
  31. [null, null, ScalarComparator::class],
  32. [null, true, ScalarComparator::class],
  33. [true, null, ScalarComparator::class],
  34. [true, true, ScalarComparator::class],
  35. [false, false, ScalarComparator::class],
  36. [true, false, ScalarComparator::class],
  37. [false, true, ScalarComparator::class],
  38. ['', '', ScalarComparator::class],
  39. ['0', '0', ScalarComparator::class],
  40. ['0', 0, NumericComparator::class],
  41. [0, '0', NumericComparator::class],
  42. [0, 0, NumericComparator::class],
  43. [1.0, 0, NumericComparator::class],
  44. [0, 1.0, NumericComparator::class],
  45. [1.0, 1.0, NumericComparator::class],
  46. [[1], [1], ArrayComparator::class],
  47. [$tmpfile, $tmpfile, ResourceComparator::class],
  48. [new stdClass, new stdClass, ObjectComparator::class],
  49. [new DateTime, new DateTime, DateTimeComparator::class],
  50. [new SplObjectStorage, new SplObjectStorage, SplObjectStorageComparator::class],
  51. [new Exception, new Exception, ExceptionComparator::class],
  52. [new DOMDocument, new DOMDocument, DOMNodeComparator::class],
  53. // mixed types
  54. [$tmpfile, [1], TypeComparator::class],
  55. [[1], $tmpfile, TypeComparator::class],
  56. [$tmpfile, '1', TypeComparator::class],
  57. ['1', $tmpfile, TypeComparator::class],
  58. [$tmpfile, new stdClass, TypeComparator::class],
  59. [new stdClass, $tmpfile, TypeComparator::class],
  60. [new stdClass, [1], TypeComparator::class],
  61. [[1], new stdClass, TypeComparator::class],
  62. [new stdClass, '1', TypeComparator::class],
  63. ['1', new stdClass, TypeComparator::class],
  64. [new ClassWithToString, '1', ScalarComparator::class],
  65. ['1', new ClassWithToString, ScalarComparator::class],
  66. [1.0, new stdClass, TypeComparator::class],
  67. [new stdClass, 1.0, TypeComparator::class],
  68. [1.0, [1], TypeComparator::class],
  69. [[1], 1.0, TypeComparator::class],
  70. ];
  71. }
  72. /**
  73. * @dataProvider instanceProvider
  74. */
  75. public function testGetComparatorFor($a, $b, $expected): void
  76. {
  77. $factory = new Factory;
  78. $actual = $factory->getComparatorFor($a, $b);
  79. $this->assertInstanceOf($expected, $actual);
  80. }
  81. public function testCustomComparatorCanBeRegistered(): void
  82. {
  83. $comparator = new TestClassComparator;
  84. $factory = new Factory;
  85. $factory->register($comparator);
  86. $a = new TestClass;
  87. $b = new TestClass;
  88. $expected = TestClassComparator::class;
  89. $actual = $factory->getComparatorFor($a, $b);
  90. $factory->unregister($comparator);
  91. $this->assertInstanceOf($expected, $actual);
  92. }
  93. public function testCustomComparatorCanBeUnregistered(): void
  94. {
  95. $comparator = new TestClassComparator;
  96. $factory = new Factory;
  97. $factory->register($comparator);
  98. $factory->unregister($comparator);
  99. $a = new TestClass;
  100. $b = new TestClass;
  101. $expected = ObjectComparator::class;
  102. $actual = $factory->getComparatorFor($a, $b);
  103. $this->assertInstanceOf($expected, $actual);
  104. }
  105. public function testCustomComparatorsCanBeReset(): void
  106. {
  107. $comparator = new TestClassComparator;
  108. $factory = new Factory;
  109. $factory->register($comparator);
  110. $factory->reset();
  111. $a = new TestClass;
  112. $b = new TestClass;
  113. $expected = ObjectComparator::class;
  114. $actual = $factory->getComparatorFor($a, $b);
  115. $this->assertInstanceOf($expected, $actual);
  116. }
  117. public function testIsSingleton(): void
  118. {
  119. $f = Factory::getInstance();
  120. $this->assertSame($f, Factory::getInstance());
  121. }
  122. }