From 2abfd0864d98b4d1c104cc8ad275998ae43cd953 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Anne?= Date: Thu, 14 Apr 2022 15:24:49 +0200 Subject: [PATCH] Fix error location --- classes/asserter/exception.php | 35 +++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/classes/asserter/exception.php b/classes/asserter/exception.php index a121704ff..3905a015c 100644 --- a/classes/asserter/exception.php +++ b/classes/asserter/exception.php @@ -19,14 +19,15 @@ public function __construct(atoum\asserter $asserter, $message) $line = null; $function = null; - foreach (array_filter(debug_backtrace(false), function ($backtrace) use ($file) { - return isset($backtrace['file']) === true && $backtrace['file'] === $file; - }) as $backtrace) { - if ($line === null && isset($backtrace['line']) === true) { + $backtrace = $this->getBacktrace($test); + if ($backtrace !== null) { + $file = $backtrace['file'] ?? $file; + + if (isset($backtrace['line']) === true) { $line = $backtrace['line']; } - if ($function === null && isset($backtrace['object']) === true && isset($backtrace['function']) === true && $backtrace['object'] === $asserter && $backtrace['function'] !== '__call') { + if (isset($backtrace['object']) === true && isset($backtrace['function']) === true && $backtrace['object'] === $asserter && $backtrace['function'] !== '__call') { $function = $backtrace['function']; } } @@ -45,4 +46,28 @@ public function __construct(atoum\asserter $asserter, $message) parent::__construct($message, $code); } + + + protected function getBacktrace(atoum\test $test) + { + $debugBacktrace = debug_backtrace(false); + foreach ($debugBacktrace as $key => $value) { + if (isset($value['class']) === false) { + continue; + } + + if ( + $value['class'] === $test->getClass() + || is_subclass_of($test->getClass(), $value['class'], true) + ) { + if (isset($debugBacktrace[$key - 1]) === true) { + $key -= 1; + } + + return $debugBacktrace[$key]; + } + } + + return null; + } }