|
233 | 233 | "} |
234 | 234 | clojure.test |
235 | 235 | (:require [clojure.template :as temp] |
236 | | - [clojure.stacktrace :as stack])) |
| 236 | + [clojure.stacktrace :as stack] |
| 237 | + [clojure.string :as str])) |
237 | 238 |
|
238 | 239 | ;; Nothing is marked "private" here, so you can rebind things to plug |
239 | 240 | ;; in your own testing or reporting frameworks. |
|
331 | 332 | :added "1.1"} |
332 | 333 | report :type) |
333 | 334 |
|
334 | | -(defn- file-and-line |
| 335 | +(defn- file-and-line |
| 336 | + {:deprecated "1.8"} |
335 | 337 | [^Throwable exception depth] |
336 | 338 | (let [stacktrace (.getStackTrace exception)] |
337 | 339 | (if (< depth (count stacktrace)) |
338 | 340 | (let [^StackTraceElement s (nth stacktrace depth)] |
339 | 341 | {:file (.getFileName s) :line (.getLineNumber s)}) |
340 | 342 | {:file nil :line nil}))) |
341 | 343 |
|
| 344 | +(defn- stacktrace-file-and-line |
| 345 | + [stacktrace] |
| 346 | + (if (seq stacktrace) |
| 347 | + (let [^StackTraceElement s (first stacktrace)] |
| 348 | + {:file (.getFileName s) :line (.getLineNumber s)}) |
| 349 | + {:file nil :line nil})) |
| 350 | + |
342 | 351 | (defn do-report |
343 | 352 | "Add file and line information to a test result and call report. |
344 | 353 | If you are writing a custom assert-expr method, call this function |
|
348 | 357 | (report |
349 | 358 | (case |
350 | 359 | (:type m) |
351 | | - :fail (merge (file-and-line (new java.lang.Throwable) 1) m) |
352 | | - :error (merge (file-and-line (:actual m) 0) m) |
| 360 | + :fail (merge (stacktrace-file-and-line (drop-while |
| 361 | + #(let [cl-name (.getClassName ^StackTraceElement %)] |
| 362 | + (or (str/starts-with? cl-name "java.lang.") |
| 363 | + (str/starts-with? cl-name "clojure.test$"))) |
| 364 | + (.getStackTrace (Thread/currentThread)))) m) |
| 365 | + :error (merge (stacktrace-file-and-line (.getStackTrace ^Throwable (:actual m))) m) |
353 | 366 | m))) |
354 | 367 |
|
355 | 368 | (defmethod report :default [m] |
|
0 commit comments