aboutsummaryrefslogtreecommitdiff
path: root/languages/elisp
diff options
context:
space:
mode:
Diffstat (limited to 'languages/elisp')
-rwxr-xr-xlanguages/elisp/claude/hooks/validate-el.sh1
-rw-r--r--languages/elisp/claude/scripts/coverage-summary.el10
-rw-r--r--languages/elisp/tests/test-coverage-summary.el45
3 files changed, 53 insertions, 3 deletions
diff --git a/languages/elisp/claude/hooks/validate-el.sh b/languages/elisp/claude/hooks/validate-el.sh
index 2529fcc..8e46457 100755
--- a/languages/elisp/claude/hooks/validate-el.sh
+++ b/languages/elisp/claude/hooks/validate-el.sh
@@ -104,6 +104,7 @@ if [ "$count" -ge 1 ] && [ "$count" -le "$MAX_AUTO_TEST_FILES" ]; then
-L "$PROJECT_ROOT/tests" \
-L "$PROJECT_ROOT/themes" \
--eval '(package-initialize)' \
+ --eval "(cd \"$PROJECT_ROOT/tests\")" \
-l ert "${load_args[@]}" \
--eval "(ert-run-tests-batch-and-exit '(not (tag :slow)))" 2>&1)"; then
# Terminal gets a compact summary (the run tally + the failing test names);
diff --git a/languages/elisp/claude/scripts/coverage-summary.el b/languages/elisp/claude/scripts/coverage-summary.el
index eb30c66..4b7f5c9 100644
--- a/languages/elisp/claude/scripts/coverage-summary.el
+++ b/languages/elisp/claude/scripts/coverage-summary.el
@@ -91,11 +91,15 @@ missing or malformed."
(defun cj/coverage-summary--source-files (source-dir project-root)
"Return *.el files directly under SOURCE-DIR, relative to PROJECT-ROOT.
-Sorted; compiled files and subdirectories are out of scope."
+Sorted. Compiled files and subdirectories are out of scope, as are generated
+package files (`*-autoloads.el', `*-pkg.el') -- a build tool writes those, no
+test covers them, and counting them as untested source skews the number."
(let ((source-dir (file-name-as-directory (expand-file-name source-dir)))
(project-root (file-name-as-directory (expand-file-name project-root))))
- (sort (mapcar (lambda (p) (file-relative-name p project-root))
- (directory-files source-dir t "\\.el\\'"))
+ (sort (seq-remove
+ (lambda (p) (string-match-p "\\(?:-autoloads\\|-pkg\\)\\.el\\'" p))
+ (mapcar (lambda (p) (file-relative-name p project-root))
+ (directory-files source-dir t "\\.el\\'")))
#'string<)))
(defun cj/coverage-summary--missing (tracked source-dir project-root)
diff --git a/languages/elisp/tests/test-coverage-summary.el b/languages/elisp/tests/test-coverage-summary.el
index 5be03b3..a4525db 100644
--- a/languages/elisp/tests/test-coverage-summary.el
+++ b/languages/elisp/tests/test-coverage-summary.el
@@ -109,6 +109,33 @@ is a JSON array string like \"[1, 0, null]\"."
(ert-deftest cs-file-pct-fully-covered ()
(should (= 100.0 (cj/coverage-summary--file-pct 4 4))))
+;; --- source-file scan and under-dir filtering ------------------------------
+
+(ert-deftest cs-source-files-is-non-recursive ()
+ "Only top-level *.el under SOURCE-DIR are source; files in subdirectories
+are out of scope."
+ (cs-test--with-project
+ (list :sources '(("top.el" . ";; t") ("sub/nested.el" . ";; n"))
+ :report (cs-test--report '(("top.el" . "[1]"))))
+ (let ((sources (mapcar #'file-name-nondirectory
+ (cj/coverage-summary--source-files src root))))
+ (should (member "top.el" sources))
+ (should-not (member "nested.el" sources)))))
+
+(ert-deftest cs-under-dir-filters-outside-source-and-rekeys ()
+ "Report entries outside SOURCE-DIR are dropped; survivors are keyed
+relative to PROJECT-ROOT."
+ (cs-test--with-project
+ (list :sources '(("in.el" . ";; i"))
+ :report (cs-test--report '(("in.el" . "[1, 1]")
+ ("../out.el" . "[1, 0]"))))
+ (let* ((table (cj/coverage-summary--under-dir
+ (cj/coverage-summary--parse-file report) src root))
+ (keys (let (ks) (maphash (lambda (k _v) (push k ks)) table) ks)))
+ (should (equal keys (list (file-relative-name
+ (expand-file-name "src/in.el" root) root))))
+ (should (= 1 (hash-table-count table))))))
+
;; --- missing-file detection (the kernel) -----------------------------------
(ert-deftest cs-missing-finds-ondisk-file-absent-from-report ()
@@ -135,6 +162,24 @@ is a JSON array string like \"[1, 0, null]\"."
(missing (cj/coverage-summary--missing tracked src root)))
(should (null missing)))))
+(ert-deftest cs-missing-excludes-generated-package-files ()
+ "Generated -autoloads.el / -pkg.el are not source, so a build tool writing
+them does not drag the number down; a genuinely untested source is still
+flagged (the filter is not over-broad)."
+ (cs-test--with-project
+ (list :sources '(("real.el" . ";; r") ("untested.el" . ";; u")
+ ("proj-autoloads.el" . ";; gen")
+ ("proj-pkg.el" . ";; gen"))
+ :report (cs-test--report '(("real.el" . "[1, 1]"))))
+ (let* ((table (cj/coverage-summary--under-dir
+ (cj/coverage-summary--parse-file report) src root))
+ (tracked (let (ks) (maphash (lambda (k _v) (push k ks)) table) ks))
+ (missing (mapcar #'file-name-nondirectory
+ (cj/coverage-summary--missing tracked src root))))
+ (should (member "untested.el" missing))
+ (should-not (member "proj-autoloads.el" missing))
+ (should-not (member "proj-pkg.el" missing)))))
+
;; --- project number (unit-weighted, missing as 0%) -------------------------
(ert-deftest cs-project-pct-unit-weighted-with-missing-as-zero ()