1: <?php
2:
3: /**
4: * This file is part of expect package.
5: *
6: * (c) Noritaka Horio <holy.shared.design@gmail.com>
7: *
8: * This source file is subject to the MIT license that is bundled
9: * with this source code in the file LICENSE.
10: */
11: namespace expect\matcher;
12:
13: use expect\FailedMessage;
14:
15: /**
16: * Verify whether the value is of a type that expect.
17: *
18: * <code>
19: * $matcher = new ToBeAn('string');
20: * $matcher->match('foo'); //return true
21: *
22: * $matcher->match(1); //return false
23: * </code>
24: *
25: * @author Noritaka Horio <holy.shared.design@gmail.com>
26: * @copyright Noritaka Horio <holy.shared.design@gmail.com>
27: */
28: final class ToBeAn implements ReportableMatcher
29: {
30: /**
31: * @var mixed
32: */
33: private $actual;
34:
35: /**
36: * @var string
37: */
38: private $expected;
39:
40: /**
41: * type of value.
42: *
43: * @var string
44: */
45: private $actualType;
46:
47: /**
48: * Create a new matcher.
49: *
50: * @param $expected expected value
51: */
52: public function __construct($expected)
53: {
54: $this->expected = $expected;
55: }
56:
57: /**
58: * {@inheritdoc}
59: */
60: public function match($actual)
61: {
62: $this->actual = $actual;
63: $this->actualType = $this->detectType($this->actual);
64:
65: return $this->actualType === $this->expected;
66: }
67:
68: /**
69: * {@inheritdoc}
70: */
71: public function reportFailed(FailedMessage $message)
72: {
73: $message->appendText('Expected ')
74: ->appendValue($this->actual)
75: ->appendText(' to be an ')
76: ->appendText($this->expected)
77: ->appendText("\n\n")
78: ->appendText(' expected: ')
79: ->appendText($this->expected)
80: ->appendText("\n")
81: ->appendText(' got: ')
82: ->appendText($this->actualType);
83: }
84:
85: /**
86: * {@inheritdoc}
87: */
88: public function reportNegativeFailed(FailedMessage $message)
89: {
90: $message->appendText('Expected ')
91: ->appendValue($this->actual)
92: ->appendText(' not to be an ')
93: ->appendText($this->expected)
94: ->appendText("\n\n")
95: ->appendText(' expected not: ')
96: ->appendText($this->expected)
97: ->appendText("\n")
98: ->appendText(' got: ')
99: ->appendText($this->actualType);
100: }
101:
102: /**
103: * @param mixed $value
104: *
105: * @return string type name
106: */
107: private function detectType($value)
108: {
109: $detectType = gettype($value);
110: $detectType = ($detectType === 'double') ? 'float' : $detectType;
111:
112: return $detectType;
113: }
114: }
115: