Chris@0
|
1 <?php
|
Chris@0
|
2 /*
|
Chris@14
|
3 * This file is part of sebastian/comparator.
|
Chris@0
|
4 *
|
Chris@0
|
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
|
Chris@0
|
6 *
|
Chris@0
|
7 * For the full copyright and license information, please view the LICENSE
|
Chris@0
|
8 * file that was distributed with this source code.
|
Chris@0
|
9 */
|
Chris@0
|
10
|
Chris@0
|
11 namespace SebastianBergmann\Comparator;
|
Chris@0
|
12
|
Chris@0
|
13 /**
|
Chris@0
|
14 * Factory for comparators which compare values for equality.
|
Chris@0
|
15 */
|
Chris@0
|
16 class Factory
|
Chris@0
|
17 {
|
Chris@0
|
18 /**
|
Chris@0
|
19 * @var Comparator[]
|
Chris@0
|
20 */
|
Chris@14
|
21 private $customComparators = [];
|
Chris@14
|
22
|
Chris@14
|
23 /**
|
Chris@14
|
24 * @var Comparator[]
|
Chris@14
|
25 */
|
Chris@14
|
26 private $defaultComparators = [];
|
Chris@0
|
27
|
Chris@0
|
28 /**
|
Chris@0
|
29 * @var Factory
|
Chris@0
|
30 */
|
Chris@0
|
31 private static $instance;
|
Chris@0
|
32
|
Chris@0
|
33 /**
|
Chris@0
|
34 * @return Factory
|
Chris@0
|
35 */
|
Chris@0
|
36 public static function getInstance()
|
Chris@0
|
37 {
|
Chris@0
|
38 if (self::$instance === null) {
|
Chris@0
|
39 self::$instance = new self;
|
Chris@0
|
40 }
|
Chris@0
|
41
|
Chris@0
|
42 return self::$instance;
|
Chris@0
|
43 }
|
Chris@0
|
44
|
Chris@0
|
45 /**
|
Chris@14
|
46 * Constructs a new factory.
|
Chris@14
|
47 */
|
Chris@14
|
48 public function __construct()
|
Chris@14
|
49 {
|
Chris@14
|
50 $this->registerDefaultComparators();
|
Chris@14
|
51 }
|
Chris@14
|
52
|
Chris@14
|
53 /**
|
Chris@0
|
54 * Returns the correct comparator for comparing two values.
|
Chris@0
|
55 *
|
Chris@14
|
56 * @param mixed $expected The first value to compare
|
Chris@14
|
57 * @param mixed $actual The second value to compare
|
Chris@14
|
58 *
|
Chris@0
|
59 * @return Comparator
|
Chris@0
|
60 */
|
Chris@0
|
61 public function getComparatorFor($expected, $actual)
|
Chris@0
|
62 {
|
Chris@14
|
63 foreach ($this->customComparators as $comparator) {
|
Chris@14
|
64 if ($comparator->accepts($expected, $actual)) {
|
Chris@14
|
65 return $comparator;
|
Chris@14
|
66 }
|
Chris@14
|
67 }
|
Chris@14
|
68
|
Chris@14
|
69 foreach ($this->defaultComparators as $comparator) {
|
Chris@0
|
70 if ($comparator->accepts($expected, $actual)) {
|
Chris@0
|
71 return $comparator;
|
Chris@0
|
72 }
|
Chris@0
|
73 }
|
Chris@0
|
74 }
|
Chris@0
|
75
|
Chris@0
|
76 /**
|
Chris@0
|
77 * Registers a new comparator.
|
Chris@0
|
78 *
|
Chris@14
|
79 * This comparator will be returned by getComparatorFor() if its accept() method
|
Chris@0
|
80 * returns TRUE for the compared values. It has higher priority than the
|
Chris@14
|
81 * existing comparators, meaning that its accept() method will be invoked
|
Chris@0
|
82 * before those of the other comparators.
|
Chris@0
|
83 *
|
Chris@14
|
84 * @param Comparator $comparator The comparator to be registered
|
Chris@0
|
85 */
|
Chris@0
|
86 public function register(Comparator $comparator)
|
Chris@0
|
87 {
|
Chris@14
|
88 \array_unshift($this->customComparators, $comparator);
|
Chris@0
|
89
|
Chris@0
|
90 $comparator->setFactory($this);
|
Chris@0
|
91 }
|
Chris@0
|
92
|
Chris@0
|
93 /**
|
Chris@0
|
94 * Unregisters a comparator.
|
Chris@0
|
95 *
|
Chris@14
|
96 * This comparator will no longer be considered by getComparatorFor().
|
Chris@0
|
97 *
|
Chris@14
|
98 * @param Comparator $comparator The comparator to be unregistered
|
Chris@0
|
99 */
|
Chris@0
|
100 public function unregister(Comparator $comparator)
|
Chris@0
|
101 {
|
Chris@14
|
102 foreach ($this->customComparators as $key => $_comparator) {
|
Chris@0
|
103 if ($comparator === $_comparator) {
|
Chris@14
|
104 unset($this->customComparators[$key]);
|
Chris@0
|
105 }
|
Chris@0
|
106 }
|
Chris@0
|
107 }
|
Chris@14
|
108
|
Chris@14
|
109 /**
|
Chris@14
|
110 * Unregisters all non-default comparators.
|
Chris@14
|
111 */
|
Chris@14
|
112 public function reset()
|
Chris@14
|
113 {
|
Chris@14
|
114 $this->customComparators = [];
|
Chris@14
|
115 }
|
Chris@14
|
116
|
Chris@14
|
117 private function registerDefaultComparators()
|
Chris@14
|
118 {
|
Chris@14
|
119 $this->registerDefaultComparator(new TypeComparator);
|
Chris@14
|
120 $this->registerDefaultComparator(new ScalarComparator);
|
Chris@14
|
121 $this->registerDefaultComparator(new NumericComparator);
|
Chris@14
|
122 $this->registerDefaultComparator(new DoubleComparator);
|
Chris@14
|
123 $this->registerDefaultComparator(new ArrayComparator);
|
Chris@14
|
124 $this->registerDefaultComparator(new ResourceComparator);
|
Chris@14
|
125 $this->registerDefaultComparator(new ObjectComparator);
|
Chris@14
|
126 $this->registerDefaultComparator(new ExceptionComparator);
|
Chris@14
|
127 $this->registerDefaultComparator(new SplObjectStorageComparator);
|
Chris@14
|
128 $this->registerDefaultComparator(new DOMNodeComparator);
|
Chris@14
|
129 $this->registerDefaultComparator(new MockObjectComparator);
|
Chris@14
|
130 $this->registerDefaultComparator(new DateTimeComparator);
|
Chris@14
|
131 }
|
Chris@14
|
132
|
Chris@14
|
133 private function registerDefaultComparator(Comparator $comparator)
|
Chris@14
|
134 {
|
Chris@14
|
135 \array_unshift($this->defaultComparators, $comparator);
|
Chris@14
|
136
|
Chris@14
|
137 $comparator->setFactory($this);
|
Chris@14
|
138 }
|
Chris@0
|
139 }
|