summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-01-26 01:18:09 -0600
committerCraig Jennings <c@cjennings.net>2026-01-26 01:18:09 -0600
commit75c01e5027c0304e80097239c59f978fce94e73d (patch)
treee87bd446a19511c8aeb2ddb619397fa6cf006642
parent51418d3b375f5223b98a3b7865ab428886e5acbc (diff)
test(theme): add comprehensive tests for dupre-theme
29 ERT tests covering: - Palette existence and color format validation - Semantic color resolution (dupre-get-color) - dupre-with-colors macro binding - Theme loading and face attributes - Org-mode, diff, UI, and error/warning faces Tests skip gracefully for optional packages (vertico, rainbow-delimiters).
-rw-r--r--tests/test-dupre-theme.el208
1 files changed, 208 insertions, 0 deletions
diff --git a/tests/test-dupre-theme.el b/tests/test-dupre-theme.el
new file mode 100644
index 00000000..d044cd80
--- /dev/null
+++ b/tests/test-dupre-theme.el
@@ -0,0 +1,208 @@
+;;; test-dupre-theme.el --- Tests for dupre-theme -*- lexical-binding: t -*-
+
+;;; Commentary:
+
+;; ERT tests for the dupre-theme.
+
+;;; Code:
+
+(require 'ert)
+
+;; Add themes directory to load-path and custom-theme-load-path
+(let ((themes-dir (expand-file-name "../themes" (file-name-directory (or load-file-name buffer-file-name)))))
+ (add-to-list 'load-path themes-dir)
+ (add-to-list 'custom-theme-load-path themes-dir))
+
+(require 'dupre-palette)
+
+;;; Palette tests
+
+(ert-deftest dupre-palette-exists ()
+ "Palette constant should be defined."
+ (should (boundp 'dupre-palette))
+ (should (listp dupre-palette)))
+
+(ert-deftest dupre-palette-has-base-colors ()
+ "Palette should contain essential base colors."
+ (should (assq 'bg dupre-palette))
+ (should (assq 'fg dupre-palette))
+ (should (assq 'bg+1 dupre-palette))
+ (should (assq 'bg+2 dupre-palette)))
+
+(ert-deftest dupre-palette-has-accent-colors ()
+ "Palette should contain accent colors."
+ (should (assq 'yellow dupre-palette))
+ (should (assq 'blue dupre-palette))
+ (should (assq 'green dupre-palette))
+ (should (assq 'red dupre-palette)))
+
+(ert-deftest dupre-palette-colors-are-hex ()
+ "All palette colors should be valid hex strings."
+ (dolist (entry dupre-palette)
+ (let ((color (cadr entry)))
+ (should (stringp color))
+ (should (string-match-p "^#[0-9a-fA-F]\\{6\\}$" color)))))
+
+(ert-deftest dupre-get-color-base ()
+ "dupre-get-color should retrieve base colors."
+ (should (string= (dupre-get-color 'bg) "#151311"))
+ (should (string= (dupre-get-color 'fg) "#f0fef0"))
+ (should (string= (dupre-get-color 'yellow) "#d7af5f")))
+
+(ert-deftest dupre-get-color-semantic ()
+ "dupre-get-color should resolve semantic mappings."
+ (should (string= (dupre-get-color 'accent) (dupre-get-color 'yellow)))
+ (should (string= (dupre-get-color 'err) (dupre-get-color 'intense-red)))
+ (should (string= (dupre-get-color 'success) (dupre-get-color 'green))))
+
+(ert-deftest dupre-get-color-unknown-errors ()
+ "dupre-get-color should error on unknown colors."
+ (should-error (dupre-get-color 'nonexistent-color)))
+
+(ert-deftest dupre-with-colors-binds-values ()
+ "dupre-with-colors should bind palette colors as variables."
+ (dupre-with-colors
+ (should (string= bg "#151311"))
+ (should (string= fg "#f0fef0"))
+ (should (string= yellow "#d7af5f"))
+ (should (string= blue "#67809c"))))
+
+(ert-deftest dupre-with-colors-binds-semantic ()
+ "dupre-with-colors should bind semantic colors resolved to values."
+ (dupre-with-colors
+ (should (string= accent "#d7af5f"))
+ (should (string= err "#ff2a00"))
+ (should (string= success "#a4ac64"))))
+
+;;; Theme loading tests
+
+(ert-deftest dupre-theme-loads ()
+ "Theme should load without errors."
+ (load-theme 'dupre t)
+ (should (memq 'dupre custom-enabled-themes)))
+
+(ert-deftest dupre-theme-default-face ()
+ "dupre-theme should set the default face correctly."
+ (load-theme 'dupre t)
+ (let ((bg (face-attribute 'default :background))
+ (fg (face-attribute 'default :foreground)))
+ (should (string= bg "#151311"))
+ (should (string= fg "#f0fef0"))))
+
+(ert-deftest dupre-theme-comment-face-italic ()
+ "Comments should be rendered in italic slant."
+ (load-theme 'dupre t)
+ (should (eq (face-attribute 'font-lock-comment-face :slant) 'italic)))
+
+(ert-deftest dupre-theme-keyword-face ()
+ "Keywords should use blue color."
+ (load-theme 'dupre t)
+ (should (string= (face-attribute 'font-lock-keyword-face :foreground) "#67809c")))
+
+(ert-deftest dupre-theme-string-face ()
+ "Strings should use green color."
+ (load-theme 'dupre t)
+ (should (string= (face-attribute 'font-lock-string-face :foreground) "#a4ac64")))
+
+(ert-deftest dupre-theme-function-face ()
+ "Functions should use terracotta color."
+ (load-theme 'dupre t)
+ (should (string= (face-attribute 'font-lock-function-name-face :foreground) "#a7502d")))
+
+;;; Org-mode face tests (require org to be loaded)
+;; Note: org-level-N faces use :inherit dupre-heading-N
+;; We verify inheritance is set up correctly by checking the inherit attribute
+
+(ert-deftest dupre-theme-org-level-1 ()
+ "Org level 1 should inherit from dupre-heading-1."
+ (require 'org)
+ (load-theme 'dupre t)
+ ;; Verify the inheritance relationship is set
+ (should (eq (face-attribute 'org-level-1 :inherit) 'dupre-heading-1)))
+
+(ert-deftest dupre-theme-org-level-2 ()
+ "Org level 2 should inherit from dupre-heading-2."
+ (require 'org)
+ (load-theme 'dupre t)
+ ;; Verify the inheritance relationship is set
+ (should (eq (face-attribute 'org-level-2 :inherit) 'dupre-heading-2)))
+
+(ert-deftest dupre-theme-org-todo ()
+ "Org TODO should use intense-red."
+ (require 'org)
+ (load-theme 'dupre t)
+ (should (string= (face-attribute 'org-todo :foreground) "#ff2a00")))
+
+(ert-deftest dupre-theme-org-done ()
+ "Org DONE should use green."
+ (require 'org)
+ (load-theme 'dupre t)
+ (should (string= (face-attribute 'org-done :foreground) "#a4ac64")))
+
+;;; Diff face tests (require diff-mode to be loaded)
+
+(ert-deftest dupre-theme-diff-added ()
+ "Diff added should use green foreground."
+ (require 'diff-mode)
+ (load-theme 'dupre t)
+ (should (string= (face-attribute 'diff-added :foreground) "#a4ac64")))
+
+(ert-deftest dupre-theme-diff-removed ()
+ "Diff removed should use red foreground."
+ (require 'diff-mode)
+ (load-theme 'dupre t)
+ (should (string= (face-attribute 'diff-removed :foreground) "#d47c59")))
+
+;;; UI face tests
+
+(ert-deftest dupre-theme-mode-line ()
+ "Mode line should have correct background."
+ (load-theme 'dupre t)
+ (should (string= (face-attribute 'mode-line :background) "#474544")))
+
+(ert-deftest dupre-theme-region ()
+ "Region should use bg+2 as background."
+ (load-theme 'dupre t)
+ (should (string= (face-attribute 'region :background) "#474544")))
+
+;;; Vertico face tests (skip if vertico not available)
+
+(ert-deftest dupre-theme-vertico-current ()
+ "Vertico current should use bg+2 background."
+ (skip-unless (require 'vertico nil t))
+ (load-theme 'dupre t)
+ (should (string= (face-attribute 'vertico-current :background) "#474544")))
+
+;;; Rainbow-delimiters tests (skip if package not available)
+
+(ert-deftest dupre-theme-rainbow-depth-1 ()
+ "Rainbow depth 1 should use yellow."
+ (skip-unless (require 'rainbow-delimiters nil t))
+ (load-theme 'dupre t)
+ (should (string= (face-attribute 'rainbow-delimiters-depth-1-face :foreground) "#d7af5f")))
+
+(ert-deftest dupre-theme-rainbow-depth-2 ()
+ "Rainbow depth 2 should use blue."
+ (skip-unless (require 'rainbow-delimiters nil t))
+ (load-theme 'dupre t)
+ (should (string= (face-attribute 'rainbow-delimiters-depth-2-face :foreground) "#67809c")))
+
+;;; Error/warning face tests
+
+(ert-deftest dupre-theme-error-face ()
+ "Error face should use intense-red."
+ (load-theme 'dupre t)
+ (should (string= (face-attribute 'error :foreground) "#ff2a00")))
+
+(ert-deftest dupre-theme-warning-face ()
+ "Warning face should use yellow+1."
+ (load-theme 'dupre t)
+ (should (string= (face-attribute 'warning :foreground) "#ffd75f")))
+
+(ert-deftest dupre-theme-success-face ()
+ "Success face should use green."
+ (load-theme 'dupre t)
+ (should (string= (face-attribute 'success :foreground) "#a4ac64")))
+
+(provide 'test-dupre-theme)
+;;; test-dupre-theme.el ends here