aboutsummaryrefslogtreecommitdiff
path: root/tests/test-coverage-elisp--detect.el
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