|
304 | 304 | :message "Uncaught exception, not in assertion"})]
|
305 | 305 | (test/do-report (assoc report :var-elapsed-time @time-info))))))
|
306 | 306 |
|
| 307 | +(defn- current-test-run-failed? [] |
| 308 | + (or (some-> @current-report :summary :fail pos?) |
| 309 | + (some-> @current-report :summary :error pos?))) |
| 310 | + |
307 | 311 | (defn test-vars
|
308 | 312 | "Call `test-var` on each var, with the fixtures defined for namespace object
|
309 | 313 | `ns`."
|
310 |
| - [ns vars] |
311 |
| - (let [once-fixture-fn (test/join-fixtures (::test/once-fixtures (meta ns))) |
312 |
| - each-fixture-fn (test/join-fixtures (::test/each-fixtures (meta ns)))] |
313 |
| - (try (once-fixture-fn |
314 |
| - (fn [] |
315 |
| - (doseq [v vars] |
316 |
| - (each-fixture-fn (fn [] (test-var v)))))) |
317 |
| - (catch Throwable e |
318 |
| - (when (System/getProperty "cider.internal.testing") |
319 |
| - ;; print stacktrace, in case it didn't have anything to do with fixtures |
320 |
| - ;; (in which case, things would become very confusing) |
321 |
| - (.printStackTrace e)) |
322 |
| - (report-fixture-error ns e))))) |
| 314 | + ([ns vars] |
| 315 | + (test-vars ns vars false)) |
| 316 | + |
| 317 | + ([ns vars fail-fast?] |
| 318 | + (let [once-fixture-fn (test/join-fixtures (::test/once-fixtures (meta ns))) |
| 319 | + each-fixture-fn (test/join-fixtures (::test/each-fixtures (meta ns)))] |
| 320 | + (try |
| 321 | + (once-fixture-fn |
| 322 | + (fn [] |
| 323 | + (reduce (fn [_ v] |
| 324 | + (cond-> (each-fixture-fn (fn [] |
| 325 | + (test-var v))) |
| 326 | + (and fail-fast? (current-test-run-failed?)) |
| 327 | + reduced)) |
| 328 | + nil |
| 329 | + vars))) |
| 330 | + (catch Throwable e |
| 331 | + (when (System/getProperty "cider.internal.testing") |
| 332 | + ;; print stacktrace, in case it didn't have anything to do with fixtures |
| 333 | + ;; (in which case, things would become very confusing) |
| 334 | + (.printStackTrace e)) |
| 335 | + (report-fixture-error ns e)))))) |
323 | 336 |
|
324 | 337 | (defn test-ns
|
325 | 338 | "If the namespace object defines a function named `test-ns-hook`, call that.
|
326 | 339 | Otherwise, test the specified vars. On completion, return a map of test
|
327 | 340 | results."
|
328 |
| - [ns vars] |
329 |
| - (binding [test/report report] |
330 |
| - (test/do-report {:type :begin-test-ns, :ns ns}) |
331 |
| - (let [time-info (atom nil)] |
332 |
| - (timing time-info |
333 |
| - (if-let [test-hook (ns-resolve ns 'test-ns-hook)] |
334 |
| - (test-hook) |
335 |
| - (test-vars ns vars))) |
336 |
| - (test/do-report {:type :end-test-ns |
337 |
| - :ns ns |
338 |
| - :ns-elapsed-time @time-info}) |
339 |
| - @current-report))) |
| 341 | + ([ns vars] |
| 342 | + (test-ns ns vars false)) |
| 343 | + |
| 344 | + ([ns vars fail-fast?] |
| 345 | + (binding [test/report report] |
| 346 | + (test/do-report {:type :begin-test-ns, :ns ns}) |
| 347 | + (let [time-info (atom nil)] |
| 348 | + (timing time-info |
| 349 | + (if-let [test-hook (ns-resolve ns 'test-ns-hook)] |
| 350 | + (test-hook) |
| 351 | + (test-vars ns vars fail-fast?))) |
| 352 | + (test/do-report {:type :end-test-ns |
| 353 | + :ns ns |
| 354 | + :ns-elapsed-time @time-info}) |
| 355 | + @current-report)))) |
340 | 356 |
|
341 | 357 | (defn test-var-query
|
342 | 358 | "Call `test-ns` for each var found via var-query."
|
343 |
| - [var-query] |
344 |
| - (report-reset!) |
345 |
| - (let [elapsed-time (atom nil) |
346 |
| - corpus (group-by |
347 |
| - (comp :ns meta) |
348 |
| - (query/vars var-query))] |
349 |
| - (timing elapsed-time |
350 |
| - (doseq [[ns vars] corpus] |
351 |
| - (test-ns ns vars))) |
352 |
| - (assoc @current-report :elapsed-time @elapsed-time))) |
| 359 | + ([var-query] |
| 360 | + (test-var-query var-query false)) |
| 361 | + |
| 362 | + ([var-query fail-fast?] |
| 363 | + (report-reset!) |
| 364 | + (let [elapsed-time (atom nil) |
| 365 | + corpus (group-by |
| 366 | + (comp :ns meta) |
| 367 | + (query/vars var-query))] |
| 368 | + (timing elapsed-time |
| 369 | + (reduce (fn [_ [ns vars]] |
| 370 | + (cond-> (test-ns ns vars fail-fast?) |
| 371 | + (and fail-fast? (current-test-run-failed?)) |
| 372 | + reduced)) |
| 373 | + nil |
| 374 | + corpus)) |
| 375 | + (assoc @current-report :elapsed-time @elapsed-time)))) |
353 | 376 |
|
354 | 377 | (defn test-nss
|
355 | 378 | "Call `test-ns` for each entry in map `m`, in which keys are namespace
|
356 | 379 | symbols and values are var symbols to be tested in that namespace (or `nil`
|
357 | 380 | to test all vars). Symbols are first resolved to their corresponding
|
358 | 381 | objects."
|
359 |
| - [m] |
360 |
| - (report-reset!) |
361 |
| - (let [elapsed-time (atom nil) |
362 |
| - corpus (mapv (fn [[ns vars]] |
363 |
| - [(the-ns ns) |
364 |
| - (keep (partial ns-resolve ns) vars)]) |
365 |
| - m)] |
366 |
| - (timing elapsed-time |
367 |
| - (doseq [[ns vars] corpus] |
368 |
| - (test-ns ns vars))) |
369 |
| - (assoc @current-report :elapsed-time @elapsed-time))) |
| 382 | + ([m] |
| 383 | + (test-nss m false)) |
| 384 | + |
| 385 | + ([m fail-fast?] |
| 386 | + (report-reset!) |
| 387 | + (let [elapsed-time (atom nil) |
| 388 | + corpus (mapv (fn [[ns vars]] |
| 389 | + [(the-ns ns) |
| 390 | + (keep (partial ns-resolve ns) vars)]) |
| 391 | + m)] |
| 392 | + (timing elapsed-time |
| 393 | + (reduce (fn [_ [ns vars]] |
| 394 | + (cond-> (test-ns ns vars fail-fast?) |
| 395 | + (and fail-fast? (current-test-run-failed?)) |
| 396 | + reduced)) |
| 397 | + nil |
| 398 | + corpus)) |
| 399 | + (assoc @current-report :elapsed-time @elapsed-time)))) |
370 | 400 |
|
371 | 401 | ;;; ## Middleware
|
372 | 402 |
|
|
378 | 408 | (atom {}))
|
379 | 409 |
|
380 | 410 | (defn handle-test-var-query-op
|
381 |
| - [{:keys [var-query transport session id] :as msg}] |
382 |
| - (let [{:keys [exec]} (meta session)] |
| 411 | + [{:keys [fail-fast var-query transport session id] :as msg}] |
| 412 | + (let [fail-fast? (#{true "true"} fail-fast) |
| 413 | + {:keys [exec]} (meta session)] |
383 | 414 | (exec id
|
384 | 415 | (fn []
|
385 | 416 | (with-bindings (assoc @session #'ie/*msg* msg)
|
|
394 | 425 | (assoc-in [:ns-query :has-tests?] true)
|
395 | 426 | (assoc :test? true)
|
396 | 427 | (util.coerce/var-query)
|
397 |
| - test-var-query |
| 428 | + (test-var-query fail-fast?) |
398 | 429 | stringify-msg)]
|
399 | 430 | (reset! results (:results report))
|
400 | 431 | (t/send transport (response-for msg (util/transform-value report))))
|
|
424 | 455 | :exclude-meta-key exclude}})))
|
425 | 456 |
|
426 | 457 | (defn handle-retest-op
|
427 |
| - [{:keys [transport session id] :as msg}] |
| 458 | + [{:keys [transport session id fail-fast] :as msg}] |
428 | 459 | (let [{:keys [exec]} (meta session)]
|
429 | 460 | (exec id
|
430 | 461 | (fn []
|
|
433 | 464 | (let [problems (filter (comp #{:fail :error} :type)
|
434 | 465 | (mapcat val tests))
|
435 | 466 | vars (distinct (map :var problems))]
|
436 |
| - (if (seq vars) (assoc ret ns vars) ret))) |
| 467 | + (if (seq vars) |
| 468 | + (assoc ret ns vars) |
| 469 | + ret))) |
437 | 470 | {} @results)
|
438 |
| - report (test-nss nss)] |
| 471 | + report (test-nss nss (#{true "true"} fail-fast))] |
439 | 472 | (reset! results (:results report))
|
440 | 473 | (t/send transport (response-for msg (util/transform-value report))))))
|
441 | 474 | (fn []
|
|
0 commit comments