aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-05-14 03:39:56 -0500
committerCraig Jennings <c@cjennings.net>2026-05-14 03:39:56 -0500
commite546f00daac8e716c5a747d7013c908c0e9ef526 (patch)
tree7e0400f1045c204b0c54513c91075d1545e81031
parent34f5f0d946d1e394f9cda52d5cd5c0e2cf0243f0 (diff)
downloaddotemacs-e546f00daac8e716c5a747d7013c908c0e9ef526.tar.gz
dotemacs-e546f00daac8e716c5a747d7013c908c0e9ef526.zip
test(prog-go): cover go-setup, staticcheck, debug, keybindings
Same shape as the prog-python and prog-webdev setup tests: company-mode + electric-pair-mode + LSP gating + buffer-local preferences. New tests cover: - `cj/go-setup`: tab-width 4, standard-indent 4, indent-tabs-mode t (Go convention); company-mode + electric-pair-mode both fire; LSP starts when gopls is on PATH, skips otherwise. - `cj/go-staticcheck`: runs `compile` with `./...` when staticcheck is on disk; messages and skips compile otherwise. - `cj/go-debug`: starts `gud-gdb` with `dlv debug` when delve is on PATH; messages otherwise. - `cj/go-mode-keybindings`: wires `C-; f` -> gofmt, `S-<f5>` -> staticcheck, `S-<f6>` -> debug. External modes and process primitives are stubbed.
-rw-r--r--tests/test-prog-go-commands.el144
1 files changed, 144 insertions, 0 deletions
diff --git a/tests/test-prog-go-commands.el b/tests/test-prog-go-commands.el
new file mode 100644
index 00000000..6947f358
--- /dev/null
+++ b/tests/test-prog-go-commands.el
@@ -0,0 +1,144 @@
+;;; test-prog-go-commands.el --- Tests for prog-go setup + commands -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Covers the four functions in prog-go.el:
+;;
+;; cj/go-setup
+;; cj/go-staticcheck
+;; cj/go-debug
+;; cj/go-mode-keybindings
+;;
+;; External modes and process primitives are stubbed.
+
+;;; Code:
+
+(require 'ert)
+(require 'cl-lib)
+
+(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+(add-to-list 'load-path (expand-file-name "tests" user-emacs-directory))
+(require 'testutil-format-wiring)
+(format-test--ensure-packages-init)
+(require 'prog-go)
+
+;;; cj/go-setup
+
+(ert-deftest test-prog-go-setup-sets-buffer-local-preferences ()
+ "Normal: tab-width 4, standard-indent 4, indent-tabs-mode t (Go convention)."
+ (with-temp-buffer
+ (cl-letf (((symbol-function 'company-mode) #'ignore)
+ ((symbol-function 'electric-pair-mode) #'ignore))
+ (cj/go-setup)
+ (should (= tab-width 4))
+ (should (= standard-indent 4))
+ (should indent-tabs-mode))))
+
+(ert-deftest test-prog-go-setup-enables-mode-helpers ()
+ "Normal: company-mode and electric-pair-mode are both called."
+ (with-temp-buffer
+ (let ((called nil))
+ (cl-letf (((symbol-function 'company-mode)
+ (lambda (&rest _) (push 'company called)))
+ ((symbol-function 'electric-pair-mode)
+ (lambda (arg) (push (cons 'pair arg) called))))
+ (cj/go-setup))
+ (should (memq 'company called))
+ (should (assq 'pair called)))))
+
+(ert-deftest test-prog-go-setup-starts-lsp-when-gopls-on-path ()
+ "Normal: with gopls on PATH, `lsp-deferred' is called."
+ (with-temp-buffer
+ (let ((started nil))
+ (cl-letf (((symbol-function 'company-mode) #'ignore)
+ ((symbol-function 'electric-pair-mode) #'ignore)
+ ((symbol-function 'lsp-deferred)
+ (lambda (&rest _) (setq started t)))
+ ((symbol-function 'executable-find)
+ (lambda (path) (when (equal path gopls-path) "/usr/bin/gopls"))))
+ (cj/go-setup))
+ (should started))))
+
+(ert-deftest test-prog-go-setup-skips-lsp-without-gopls ()
+ "Boundary: without gopls on PATH, `lsp-deferred' is NOT called."
+ (with-temp-buffer
+ (let ((started nil))
+ (cl-letf (((symbol-function 'company-mode) #'ignore)
+ ((symbol-function 'electric-pair-mode) #'ignore)
+ ((symbol-function 'lsp-deferred)
+ (lambda (&rest _) (setq started t)))
+ ((symbol-function 'executable-find) (lambda (_) nil)))
+ (cj/go-setup))
+ (should-not started))))
+
+;;; cj/go-staticcheck
+
+(ert-deftest test-prog-go-staticcheck-runs-compile-when-binary-present ()
+ "Normal: with staticcheck on disk, `compile' is called with `./...'."
+ (let (compiled)
+ (cl-letf (((symbol-function 'file-executable-p) (lambda (_) t))
+ ((symbol-function 'compile)
+ (lambda (cmd &rest _) (setq compiled cmd))))
+ (with-temp-buffer
+ (cj/go-staticcheck)))
+ (should (stringp compiled))
+ (should (string-match-p "./\\.\\.\\." compiled))))
+
+(ert-deftest test-prog-go-staticcheck-messages-when-missing ()
+ "Error: missing staticcheck -> message + no compile."
+ (let ((compiled nil)
+ (msg nil))
+ (cl-letf (((symbol-function 'file-executable-p) (lambda (_) nil))
+ ((symbol-function 'compile)
+ (lambda (&rest _) (setq compiled t)))
+ ((symbol-function 'message)
+ (lambda (fmt &rest args)
+ (setq msg (apply #'format fmt args)))))
+ (with-temp-buffer
+ (cj/go-staticcheck)))
+ (should-not compiled)
+ (should (string-match-p "staticcheck not found" msg))))
+
+;;; cj/go-debug
+
+(ert-deftest test-prog-go-debug-runs-gud-gdb-when-delve-on-path ()
+ "Normal: with delve on PATH, `gud-gdb' is called with `dlv debug'."
+ (let (started)
+ (cl-letf (((symbol-function 'executable-find)
+ (lambda (path) (when (equal path dlv-path) "/usr/bin/dlv")))
+ ((symbol-function 'file-executable-p) (lambda (_) nil))
+ ((symbol-function 'gud-gdb)
+ (lambda (cmd &rest _) (setq started cmd))))
+ (with-temp-buffer
+ (cj/go-debug)))
+ (should (stringp started))
+ (should (string-match-p "dlv debug" started))))
+
+(ert-deftest test-prog-go-debug-messages-when-delve-missing ()
+ "Error: delve missing -> message + no gud-gdb call."
+ (let ((started nil)
+ (msg nil))
+ (cl-letf (((symbol-function 'executable-find) (lambda (_) nil))
+ ((symbol-function 'file-executable-p) (lambda (_) nil))
+ ((symbol-function 'gud-gdb)
+ (lambda (&rest _) (setq started t)))
+ ((symbol-function 'message)
+ (lambda (fmt &rest args)
+ (setq msg (apply #'format fmt args)))))
+ (with-temp-buffer
+ (cj/go-debug)))
+ (should-not started)
+ (should (string-match-p "Delve not found" msg))))
+
+;;; cj/go-mode-keybindings
+
+(ert-deftest test-prog-go-mode-keybindings-binds-the-keys ()
+ "Normal: C-; f -> gofmt, S-<f5> -> staticcheck, S-<f6> -> debug."
+ (with-temp-buffer
+ (use-local-map (make-sparse-keymap))
+ (cj/go-mode-keybindings)
+ (should (eq #'gofmt (local-key-binding (kbd "C-; f"))))
+ (should (eq #'cj/go-staticcheck (local-key-binding (kbd "S-<f5>"))))
+ (should (eq #'cj/go-debug (local-key-binding (kbd "S-<f6>"))))))
+
+(provide 'test-prog-go-commands)
+;;; test-prog-go-commands.el ends here