aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-05-14 03:52:31 -0500
committerCraig Jennings <c@cjennings.net>2026-05-14 03:52:31 -0500
commit50921b82567cf266dcc95c686bad4e500b6eaba0 (patch)
tree8922eac8b2303a187034f763de526b33b9ad456c /tests
parent1edb297675bf141eac51e25c05082f8a75233318 (diff)
downloaddotemacs-50921b82567cf266dcc95c686bad4e500b6eaba0.tar.gz
dotemacs-50921b82567cf266dcc95c686bad4e500b6eaba0.zip
test(coverage-elisp): cover project-root resolution, report-path, run
Sibling `test-coverage-elisp--detect.el` covered the detect heuristic. This batch fills in the rest: - `cj/--coverage-elisp-project-root`: explicit arg wins, falls back to projectile, falls back to `default-directory`. - `cj/--coverage-elisp-report-path`: appends `.coverage/simplecov.json` to the resolved root. - `cj/--coverage-elisp-run`: launches `make coverage` via `compilation-start`, fires the callback with the report path on `finished` status, skips the callback on failure. projectile and compilation-start are stubbed; the compilation buffer is a real buffer the test creates and tears down.
Diffstat (limited to 'tests')
-rw-r--r--tests/test-coverage-elisp-helpers.el113
1 files changed, 113 insertions, 0 deletions
diff --git a/tests/test-coverage-elisp-helpers.el b/tests/test-coverage-elisp-helpers.el
new file mode 100644
index 00000000..275f2a0f
--- /dev/null
+++ b/tests/test-coverage-elisp-helpers.el
@@ -0,0 +1,113 @@
+;;; test-coverage-elisp-helpers.el --- Tests for coverage-elisp helpers + runner -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Sibling `test-coverage-elisp--detect.el` covers the detect heuristic.
+;; This file fills in the rest:
+;;
+;; cj/--coverage-elisp-project-root
+;; cj/--coverage-elisp-report-path
+;; cj/--coverage-elisp-run
+;;
+;; projectile / compilation-start are stubbed.
+
+;;; Code:
+
+(require 'ert)
+(require 'cl-lib)
+
+(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+(require 'coverage-elisp)
+
+;;; cj/--coverage-elisp-project-root
+
+(ert-deftest test-coverage-elisp-project-root-uses-explicit-arg ()
+ "Normal: an explicit ROOT argument wins over the fallbacks."
+ (should (equal (cj/--coverage-elisp-project-root "/proj/root/")
+ "/proj/root/")))
+
+(ert-deftest test-coverage-elisp-project-root-falls-back-to-projectile ()
+ "Normal: with no ROOT, projectile's root is returned."
+ (cl-letf (((symbol-function 'projectile-project-root)
+ (lambda () "/proj/from-projectile/")))
+ (should (equal (cj/--coverage-elisp-project-root)
+ "/proj/from-projectile/"))))
+
+(ert-deftest test-coverage-elisp-project-root-falls-back-to-default-directory ()
+ "Boundary: with neither arg nor projectile, falls back to `default-directory'."
+ (let ((default-directory "/proj/from-default/"))
+ (cl-letf (((symbol-function 'fboundp)
+ (lambda (sym) (not (eq sym 'projectile-project-root)))))
+ (should (equal (cj/--coverage-elisp-project-root)
+ "/proj/from-default/")))))
+
+;;; cj/--coverage-elisp-report-path
+
+(ert-deftest test-coverage-elisp-report-path-resolves-relative-to-root ()
+ "Normal: report path appends `.coverage/simplecov.json' to ROOT."
+ (should (equal (cj/--coverage-elisp-report-path "/proj/root/")
+ "/proj/root/.coverage/simplecov.json")))
+
+(ert-deftest test-coverage-elisp-report-path-no-root-uses-fallback ()
+ "Boundary: with no ROOT, expands against the fallback root."
+ (let ((default-directory "/proj/from-default/"))
+ (cl-letf (((symbol-function 'fboundp)
+ (lambda (sym) (not (eq sym 'projectile-project-root)))))
+ (should (equal (cj/--coverage-elisp-report-path)
+ "/proj/from-default/.coverage/simplecov.json")))))
+
+;;; cj/--coverage-elisp-run
+
+(ert-deftest test-coverage-elisp-run-starts-make-coverage-compilation ()
+ "Normal: run launches `make coverage' via `compilation-start' with a
+named buffer and registers a finish hook on the compilation buffer."
+ (let ((cmd nil)
+ (registered-hook nil)
+ (buf (generate-new-buffer "*coverage-run*")))
+ (unwind-protect
+ (cl-letf (((symbol-function 'compilation-start)
+ (lambda (c &rest _) (setq cmd c) buf))
+ ((symbol-function 'projectile-project-root)
+ (lambda () "/proj/root/")))
+ (cj/--coverage-elisp-run (lambda (_) nil))
+ (with-current-buffer buf
+ (setq registered-hook compilation-finish-functions)))
+ (when (buffer-live-p buf) (kill-buffer buf)))
+ (should (equal cmd "make coverage"))
+ (should registered-hook)))
+
+(ert-deftest test-coverage-elisp-run-callback-fires-on-success ()
+ "Normal: when the compilation finishes with `finished', the callback gets
+the report path."
+ (let ((reported nil)
+ (buf (generate-new-buffer "*coverage-run*")))
+ (unwind-protect
+ (cl-letf (((symbol-function 'compilation-start)
+ (lambda (&rest _) buf))
+ ((symbol-function 'projectile-project-root)
+ (lambda () "/proj/root/")))
+ (cj/--coverage-elisp-run (lambda (path) (setq reported path)))
+ ;; Fire the hook installed by run().
+ (with-current-buffer buf
+ (run-hook-with-args 'compilation-finish-functions
+ buf "finished\n")))
+ (when (buffer-live-p buf) (kill-buffer buf)))
+ (should (equal reported "/proj/root/.coverage/simplecov.json"))))
+
+(ert-deftest test-coverage-elisp-run-callback-skipped-on-failure ()
+ "Boundary: a non-`finished' status doesn't fire the callback."
+ (let ((reported nil)
+ (buf (generate-new-buffer "*coverage-run*")))
+ (unwind-protect
+ (cl-letf (((symbol-function 'compilation-start)
+ (lambda (&rest _) buf))
+ ((symbol-function 'projectile-project-root)
+ (lambda () "/proj/root/")))
+ (cj/--coverage-elisp-run (lambda (path) (setq reported path)))
+ (with-current-buffer buf
+ (run-hook-with-args 'compilation-finish-functions
+ buf "exited abnormally\n")))
+ (when (buffer-live-p buf) (kill-buffer buf)))
+ (should-not reported)))
+
+(provide 'test-coverage-elisp-helpers)
+;;; test-coverage-elisp-helpers.el ends here