diff --git a/PHPUnit/Framework/Assert.php b/PHPUnit/Framework/Assert.php index c3c18176ab6..83a5b704154 100644 --- a/PHPUnit/Framework/Assert.php +++ b/PHPUnit/Framework/Assert.php @@ -2492,6 +2492,20 @@ public static function fail($message = '') throw new PHPUnit_Framework_AssertionFailedError($message); } + /** + * Fails a test with a synthetic error. + * + * @param string $message + * @param string $file + * @param integer $line + * @param array $trace + * @throws PHPUnit_Framework_SyntheticError + */ + public static function syntheticFail($message = '', $file = '', $line = 0, $trace = array()) + { + throw new PHPUnit_Framework_SyntheticError($message, 0, $file, $line, $trace); + } + /** * Returns the value of an attribute of a class or an object. * This also works for attributes that are declared protected or private. diff --git a/PHPUnit/Framework/SyntheticError.php b/PHPUnit/Framework/SyntheticError.php new file mode 100644 index 00000000000..b6dc0c59810 --- /dev/null +++ b/PHPUnit/Framework/SyntheticError.php @@ -0,0 +1,122 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @package PHPUnit + * @subpackage Framework + * @author Sebastian Bergmann + * @copyright 2002-2010 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://www.phpunit.de/ + * @since File available since Release 2.0.0 + */ + +/** + * Creates a synthetic failed assertion. + * + * @package PHPUnit + * @subpackage Framework + * @author Sebastian Bergmann + * @copyright 2002-2010 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://www.phpunit.de/ + * @since Class available since Release 2.0.0 + */ +class PHPUnit_Framework_SyntheticError extends PHPUnit_Framework_AssertionFailedError +{ + /** + * The synthetic file. + * + * @var string + */ + protected $syntheticFile = ''; + + /** + * The synthetic line number. + * + * @var integer + */ + protected $syntheticLine = 0; + + /** + * The synthetic trace. + * + * @var array + */ + protected $syntheticTrace = array(); + + /** + * Constructor. + * + * @param string $message + * @param integer $code + * @param string $file + * @param integer $line + * @param array $trace + */ + public function __construct($message, $code, $file, $line, $trace) + { + parent::__construct($message, $code); + + $this->syntheticFile = $file; + $this->syntheticLine = $line; + $this->syntheticTrace = $trace; + } + + /** + * @return string + */ + public function getSyntheticFile() + { + return $this->syntheticFile; + } + + /** + * @return integer + */ + public function getSyntheticLine() + { + return $this->syntheticLine; + } + + /** + * @return array + */ + public function getSyntheticTrace() + { + return $this->syntheticTrace; + } +} diff --git a/PHPUnit/Framework/TestCase.php b/PHPUnit/Framework/TestCase.php index c7b7e0108c2..f7b690bf2ef 100644 --- a/PHPUnit/Framework/TestCase.php +++ b/PHPUnit/Framework/TestCase.php @@ -191,6 +191,13 @@ abstract class PHPUnit_Framework_TestCase extends PHPUnit_Framework_Assert imple */ protected $expectedExceptionCode; + /** + * The stack trace to where the expected exception was set. + * + * @var array + */ + protected $expectedExceptionTrace = array(); + /** * The name of the test case. * @@ -352,6 +359,7 @@ public function setExpectedException($exceptionName, $exceptionMessage = '', $ex $this->expectedException = $exceptionName; $this->expectedExceptionMessage = $exceptionMessage; $this->expectedExceptionCode = $exceptionCode; + $this->expectedExceptionTrace = debug_backtrace(); } /** @@ -791,7 +799,7 @@ protected function runTest() if ($this->expectedException !== NULL) { $this->numAssertions++; - $this->fail('Expected exception ' . $this->expectedException); + $this->syntheticFail('Expected exception ' . $this->expectedException, '', 0, $this->expectedExceptionTrace); } return $testResult; diff --git a/PHPUnit/Util/Filter.php b/PHPUnit/Util/Filter.php index 417214f746b..786481dcccf 100644 --- a/PHPUnit/Util/Filter.php +++ b/PHPUnit/Util/Filter.php @@ -85,7 +85,11 @@ public static function getFilteredStacktrace(Exception $e, $filterTests = TRUE, $groups[] = 'TESTS'; } - $eTrace = $e->getTrace(); + if (method_exists($e, 'getSyntheticTrace')) { + $eTrace = $e->getSyntheticTrace(); + } else { + $eTrace = $e->getTrace(); + } if (!self::frameExists($eTrace, $e->getFile(), $e->getLine())) { array_unshift(