1<?php
2/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
3
4/**
5 * PHP Version 4
6 *
7 * Copyright (c) 2002-2005, Sebastian Bergmann <sb@sebastian-bergmann.de>.
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 *
14 *   * Redistributions of source code must retain the above copyright
15 *     notice, this list of conditions and the following disclaimer.
16 *
17 *   * Redistributions in binary form must reproduce the above copyright
18 *     notice, this list of conditions and the following disclaimer in
19 *     the documentation and/or other materials provided with the
20 *     distribution.
21 *
22 *   * Neither the name of Sebastian Bergmann nor the names of his
23 *     contributors may be used to endorse or promote products derived
24 *     from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
29 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
30 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
31 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
32 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
33 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
34 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
36 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 * POSSIBILITY OF SUCH DAMAGE.
38 *
39 * @category   Testing
40 * @package    PHPUnit
41 * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
42 * @copyright  2002-2005 Sebastian Bergmann <sb@sebastian-bergmann.de>
43 * @license    http://www.opensource.org/licenses/bsd-license.php  BSD License
44 * @version    CVS: $Id: Assert.php,v 1.29 2005/11/10 09:47:14 sebastian Exp $
45 * @link       http://pear.php.net/package/PHPUnit
46 * @since      File available since Release 1.0.0
47 */
48
49/**
50 * A set of assert methods.
51 *
52 * @category   Testing
53 * @package    PHPUnit
54 * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
55 * @copyright  2002-2005 Sebastian Bergmann <sb@sebastian-bergmann.de>
56 * @license    http://www.opensource.org/licenses/bsd-license.php  BSD License
57 * @version    Release: 1.3.2
58 * @link       http://pear.php.net/package/PHPUnit
59 * @since      Class available since Release 1.0.0
60 */
61class PHPUnit_Assert {
62    /**
63     * @var    boolean
64     * @access private
65     */
66    var $_looselyTyped = FALSE;
67
68    /**
69     * Asserts that a haystack contains a needle.
70     *
71     * @param  mixed
72     * @param  mixed
73     * @param  string
74     * @access public
75     * @since  Method available since Release 1.1.0
76     */
77    function assertContains($needle, $haystack, $message = '') {
78        if (is_string($needle) && is_string($haystack)) {
79            $this->assertTrue(strpos($haystack, $needle) !== FALSE, $message);
80        }
81
82        else if (is_array($haystack) && !is_object($needle)) {
83            $this->assertTrue(in_array($needle, $haystack), $message);
84        }
85
86        else {
87            $this->fail('Unsupported parameter passed to assertContains().');
88        }
89    }
90
91    /**
92     * Asserts that a haystack does not contain a needle.
93     *
94     * @param  mixed
95     * @param  mixed
96     * @param  string
97     * @access public
98     * @since  Method available since Release 1.1.0
99     */
100    function assertNotContains($needle, $haystack, $message = '') {
101        if (is_string($needle) && is_string($haystack)) {
102            $this->assertFalse(strpos($haystack, $needle) !== FALSE, $message);
103        }
104
105        else if (is_array($haystack) && !is_object($needle)) {
106            $this->assertFalse(in_array($needle, $haystack), $message);
107        }
108
109        else {
110            $this->fail('Unsupported parameter passed to assertNotContains().');
111        }
112    }
113
114    /**
115     * Asserts that two variables are equal.
116     *
117     * @param  mixed
118     * @param  mixed
119     * @param  string
120     * @param  mixed
121     * @access public
122     */
123    function assertEquals($expected, $actual, $message = '', $delta = 0) {
124        if ((is_array($actual)  && is_array($expected)) ||
125            (is_object($actual) && is_object($expected))) {
126            if (is_array($actual) && is_array($expected)) {
127                ksort($actual);
128                ksort($expected);
129            }
130
131            if ($this->_looselyTyped) {
132                $actual   = $this->_convertToString($actual);
133                $expected = $this->_convertToString($expected);
134            }
135
136            $actual   = serialize($actual);
137            $expected = serialize($expected);
138
139            $message = sprintf(
140              '%sexpected %s, actual %s',
141
142              !empty($message) ? $message . ' ' : '',
143              $expected,
144              $actual
145            );
146
147            if ($actual !== $expected) {
148                return $this->fail($message);
149            }
150        }
151
152        elseif (is_numeric($actual) && is_numeric($expected)) {
153            $message = sprintf(
154              '%sexpected %s%s, actual %s',
155
156              !empty($message) ? $message . ' ' : '',
157              $expected,
158              ($delta != 0) ? ('+/- ' . $delta) : '',
159              $actual
160            );
161
162            if (!($actual >= ($expected - $delta) && $actual <= ($expected + $delta))) {
163                return $this->fail($message);
164            }
165        }
166
167        else {
168            $message = sprintf(
169              '%sexpected %s, actual %s',
170
171              !empty($message) ? $message . ' ' : '',
172              $expected,
173              $actual
174            );
175
176            if ($actual !== $expected) {
177                return $this->fail($message);
178            }
179        }
180    }
181
182    /**
183     * Asserts that two variables reference the same object.
184     * This requires the Zend Engine 2 to work.
185     *
186     * @param  object
187     * @param  object
188     * @param  string
189     * @access public
190     * @deprecated
191     */
192    function assertSame($expected, $actual, $message = '') {
193        if (!version_compare(phpversion(), '5.0.0', '>=')) {
194            $this->fail('assertSame() only works with PHP >= 5.0.0.');
195        }
196
197        if ((is_object($expected) || is_null($expected)) &&
198            (is_object($actual)   || is_null($actual))) {
199            $message = sprintf(
200              '%sexpected two variables to reference the same object',
201
202              !empty($message) ? $message . ' ' : ''
203            );
204
205            if ($expected !== $actual) {
206                return $this->fail($message);
207            }
208        } else {
209            $this->fail('Unsupported parameter passed to assertSame().');
210        }
211    }
212
213    /**
214     * Asserts that two variables do not reference the same object.
215     * This requires the Zend Engine 2 to work.
216     *
217     * @param  object
218     * @param  object
219     * @param  string
220     * @access public
221     * @deprecated
222     */
223    function assertNotSame($expected, $actual, $message = '') {
224        if (!version_compare(phpversion(), '5.0.0', '>=')) {
225            $this->fail('assertNotSame() only works with PHP >= 5.0.0.');
226        }
227
228        if ((is_object($expected) || is_null($expected)) &&
229            (is_object($actual)   || is_null($actual))) {
230            $message = sprintf(
231              '%sexpected two variables to reference different objects',
232
233              !empty($message) ? $message . ' ' : ''
234            );
235
236            if ($expected === $actual) {
237                return $this->fail($message);
238            }
239        } else {
240            $this->fail('Unsupported parameter passed to assertNotSame().');
241        }
242    }
243
244    /**
245     * Asserts that a variable is not NULL.
246     *
247     * @param  mixed
248     * @param  string
249     * @access public
250     */
251    function assertNotNull($actual, $message = '') {
252        $message = sprintf(
253          '%sexpected NOT NULL, actual NULL',
254
255          !empty($message) ? $message . ' ' : ''
256        );
257
258        if (is_null($actual)) {
259            return $this->fail($message);
260        }
261    }
262
263    /**
264     * Asserts that a variable is NULL.
265     *
266     * @param  mixed
267     * @param  string
268     * @access public
269     */
270    function assertNull($actual, $message = '') {
271        $message = sprintf(
272          '%sexpected NULL, actual NOT NULL',
273
274          !empty($message) ? $message . ' ' : ''
275        );
276
277        if (!is_null($actual)) {
278            return $this->fail($message);
279        }
280    }
281
282    /**
283     * Asserts that a condition is true.
284     *
285     * @param  boolean
286     * @param  string
287     * @access public
288     */
289    function assertTrue($condition, $message = '') {
290        $message = sprintf(
291          '%sexpected TRUE, actual FALSE',
292
293          !empty($message) ? $message . ' ' : ''
294        );
295
296        if (!$condition) {
297            return $this->fail($message);
298        }
299    }
300
301    /**
302     * Asserts that a condition is false.
303     *
304     * @param  boolean
305     * @param  string
306     * @access public
307     */
308    function assertFalse($condition, $message = '') {
309        $message = sprintf(
310          '%sexpected FALSE, actual TRUE',
311
312          !empty($message) ? $message . ' ' : ''
313        );
314
315        if ($condition) {
316            return $this->fail($message);
317        }
318    }
319
320    /**
321     * Asserts that a string matches a given regular expression.
322     *
323     * @param  string
324     * @param  string
325     * @param  string
326     * @access public
327     */
328    function assertRegExp($pattern, $string, $message = '') {
329        $message = sprintf(
330          '%s"%s" does not match pattern "%s"',
331
332          !empty($message) ? $message . ' ' : '',
333          $string,
334          $pattern
335        );
336
337        if (!preg_match($pattern, $string)) {
338            return $this->fail($message);
339        }
340    }
341
342    /**
343     * Asserts that a string does not match a given regular expression.
344     *
345     * @param  string
346     * @param  string
347     * @param  string
348     * @access public
349     * @since  Method available since Release 1.1.0
350     */
351    function assertNotRegExp($pattern, $string, $message = '') {
352        $message = sprintf(
353          '%s"%s" matches pattern "%s"',
354
355          !empty($message) ? $message . ' ' : '',
356          $string,
357          $pattern
358        );
359
360        if (preg_match($pattern, $string)) {
361            return $this->fail($message);
362        }
363    }
364
365    /**
366     * Asserts that a variable is of a given type.
367     *
368     * @param  string          $expected
369     * @param  mixed           $actual
370     * @param  optional string $message
371     * @access public
372     */
373    function assertType($expected, $actual, $message = '') {
374        return $this->assertEquals(
375          $expected,
376          gettype($actual),
377          $message
378        );
379    }
380
381    /**
382     * Converts a value to a string.
383     *
384     * @param  mixed   $value
385     * @access private
386     */
387    function _convertToString($value) {
388        foreach ($value as $k => $v) {
389            if (is_array($v)) {
390                $value[$k] = $this->_convertToString($value[$k]);
391            } else {
392                settype($value[$k], 'string');
393            }
394        }
395
396        return $value;
397    }
398
399    /**
400     * @param  boolean $looselyTyped
401     * @access public
402     */
403    function setLooselyTyped($looselyTyped) {
404        if (is_bool($looselyTyped)) {
405            $this->_looselyTyped = $looselyTyped;
406        }
407    }
408
409    /**
410     * Fails a test with the given message.
411     *
412     * @param  string
413     * @access protected
414     * @abstract
415     */
416    function fail($message = '') { /* abstract */ }
417}
418
419/*
420 * Local variables:
421 * tab-width: 4
422 * c-basic-offset: 4
423 * c-hanging-comment-ender-p: nil
424 * End:
425 */
426?>
427