blob: 0a83449bca940e73ee059fec687152134db72f8d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
;;; test-coverage-elisp--detect.el --- Tests for cj/--coverage-elisp-detect -*- lexical-binding: t; -*-
;;; Commentary:
;; Unit tests for `cj/--coverage-elisp-detect', the heuristic that
;; decides whether a given project root is an Elisp project.
;;
;; Heuristic: requires BOTH a Makefile/Eask/Cask AND some .el files
;; (at root or under modules/).
;;; Code:
(require 'ert)
(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
(require 'coverage-elisp)
(defun test-coverage-elisp-detect--make-project (spec)
"Create a temp directory matching SPEC.
SPEC is a list of relative paths to create. Paths ending in `/' are
directories; others are files. Returns the temp directory path."
(let ((root (make-temp-file "test-elisp-project-" t)))
(dolist (path spec)
(let ((full (expand-file-name path root)))
(if (string-suffix-p "/" path)
(make-directory full t)
(make-directory (file-name-directory full) t)
(write-region "" nil full))))
root))
;;; Normal cases
(ert-deftest test-coverage-elisp-detect-with-makefile-and-modules ()
"Normal: Makefile plus modules/foo.el is detected as elisp."
(let ((root (test-coverage-elisp-detect--make-project
'("Makefile" "modules/foo.el"))))
(unwind-protect
(should (cj/--coverage-elisp-detect root))
(delete-directory root t))))
(ert-deftest test-coverage-elisp-detect-with-eask-and-root-el ()
"Normal: Eask plus root-level .el file is detected."
(let ((root (test-coverage-elisp-detect--make-project
'("Eask" "main.el"))))
(unwind-protect
(should (cj/--coverage-elisp-detect root))
(delete-directory root t))))
(ert-deftest test-coverage-elisp-detect-with-cask-and-modules ()
"Normal: Cask plus modules/ directory is detected."
(let ((root (test-coverage-elisp-detect--make-project
'("Cask" "modules/bar.el"))))
(unwind-protect
(should (cj/--coverage-elisp-detect root))
(delete-directory root t))))
;;; Boundary cases
(ert-deftest test-coverage-elisp-detect-no-build-file ()
"Boundary: .el files without a Makefile/Eask/Cask is NOT detected."
(let ((root (test-coverage-elisp-detect--make-project
'("main.el" "other.el"))))
(unwind-protect
(should-not (cj/--coverage-elisp-detect root))
(delete-directory root t))))
(ert-deftest test-coverage-elisp-detect-makefile-without-el ()
"Boundary: Makefile with no .el files is NOT detected."
(let ((root (test-coverage-elisp-detect--make-project
'("Makefile" "README.md"))))
(unwind-protect
(should-not (cj/--coverage-elisp-detect root))
(delete-directory root t))))
(ert-deftest test-coverage-elisp-detect-empty-directory ()
"Boundary: an empty directory is not an elisp project."
(let ((root (make-temp-file "test-empty-" t)))
(unwind-protect
(should-not (cj/--coverage-elisp-detect root))
(delete-directory root t))))
;;; Error cases
(ert-deftest test-coverage-elisp-detect-nonexistent-root ()
"Error: a nonexistent ROOT returns nil, not an error."
(should-not (cj/--coverage-elisp-detect "/nonexistent/path/for-test-12345")))
;;; Registry integration
(ert-deftest test-coverage-elisp-registered-on-load ()
"Normal: loading coverage-elisp registers the `elisp' backend."
(let ((backend (cj/--coverage-backend-by-name 'elisp)))
(should backend)
(should (eq 'elisp (plist-get backend :name)))
(should (functionp (plist-get backend :detect)))
(should (functionp (plist-get backend :run)))
(should (functionp (plist-get backend :report-path)))))
(provide 'test-coverage-elisp--detect)
;;; test-coverage-elisp--detect.el ends here
|