summaryrefslogtreecommitdiff
path: root/tests/test-ui-cursor-color-integration.el
blob: 00b7f57b5944043ecadf6aa247506fdbfc037ee3 (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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
;;; test-ui-cursor-color-integration.el --- Integration tests for cursor color -*- lexical-binding: t; -*-

;;; Commentary:
;; Integration tests for cursor color hook behavior.
;; Tests that cursor color actually updates when switching buffers,
;; modifying files, etc.

;;; Code:

(require 'ert)
(require 'user-constants)
(require 'ui-config)

;;; Hook Integration Tests

(ert-deftest test-cursor-color-integration-post-command-hook-installed ()
  "Test that post-command-hook is installed."
  (should (member 'cj/set-cursor-color-according-to-mode post-command-hook)))

(ert-deftest test-cursor-color-integration-function-runs-without-error ()
  "Test that cursor color function runs without error in various buffers."
  (with-temp-buffer
    (should-not (condition-case err
                    (progn
                      (cj/set-cursor-color-according-to-mode)
                      nil)
                  (error err))))

  (with-temp-buffer
    (setq buffer-read-only t)
    (should-not (condition-case err
                    (progn
                      (cj/set-cursor-color-according-to-mode)
                      nil)
                  (error err)))))

(ert-deftest test-cursor-color-integration-internal-buffers-ignored ()
  "Test that internal buffers (starting with space) are ignored."
  (let ((internal-buf (get-buffer-create " *test-internal*"))
        (cj/-cursor-last-color nil)
        (cj/-cursor-last-buffer nil))
    (unwind-protect
        (with-current-buffer internal-buf
          (cj/set-cursor-color-according-to-mode)
          ;; Cursor state should not have been updated
          (should-not cj/-cursor-last-buffer))
      (kill-buffer internal-buf))))

(ert-deftest test-cursor-color-integration-normal-buffers-processed ()
  "Test that normal buffers (not starting with space) are processed."
  (let ((normal-buf (get-buffer-create "test-normal"))
        (cj/-cursor-last-color nil)
        (cj/-cursor-last-buffer nil))
    (unwind-protect
        (with-current-buffer normal-buf
          (cj/set-cursor-color-according-to-mode)
          ;; Cursor state should have been updated
          (should (equal cj/-cursor-last-buffer "test-normal")))
      (kill-buffer normal-buf))))

(ert-deftest test-cursor-color-integration-cache-prevents-redundant-updates ()
  "Test that cache prevents redundant cursor color updates."
  (let* ((normal-buf (generate-new-buffer "test-cache"))
         (call-count 0)
         (advice-fn (lambda (&rest _) (setq call-count (1+ call-count)))))
    (unwind-protect
        (progn
          (advice-add 'set-cursor-color :before advice-fn)
          (with-current-buffer normal-buf
            ;; First call - cache matches, no update
            (let ((cj/-cursor-last-color "#ffffff")
                  (cj/-cursor-last-buffer (buffer-name)))
              (cj/set-cursor-color-according-to-mode)
              (should (= call-count 0)))  ; Cached, no update needed

            ;; Modify buffer and clear cache - should update
            (insert "test")
            (let ((cj/-cursor-last-buffer nil))  ; Force update
              (cj/set-cursor-color-according-to-mode)
              (should (= call-count 1)))))  ; New state, should update
      (advice-remove 'set-cursor-color advice-fn)
      (kill-buffer normal-buf))))

(ert-deftest test-cursor-color-integration-different-buffers-different-colors ()
  "Test that switching between buffers with different states updates cursor."
  (let ((buf1 (generate-new-buffer "test1"))
        (buf2 (generate-new-buffer "test2"))
        (cj/-cursor-last-color nil)
        (cj/-cursor-last-buffer nil))
    (unwind-protect
        (progn
          ;; Set buf1 to read-only
          (with-current-buffer buf1
            (setq buffer-read-only t)
            (cj/set-cursor-color-according-to-mode)
            (should (equal cj/-cursor-last-color "#f06a3f")))  ; Red

          ;; Set buf2 to normal
          (with-current-buffer buf2
            (setq buffer-read-only nil)
            (set-buffer-modified-p nil)
            (cj/set-cursor-color-according-to-mode)
            (should (equal cj/-cursor-last-color "#ffffff"))))  ; White
      (kill-buffer buf1)
      (kill-buffer buf2))))

(ert-deftest test-cursor-color-integration-buffer-modification-changes-color ()
  "Test that modifying a buffer changes cursor from white to green."
  (let ((normal-buf (generate-new-buffer "test-mod"))
        (cj/-cursor-last-color nil)
        (cj/-cursor-last-buffer nil))
    (unwind-protect
        (with-current-buffer normal-buf
          ;; Start unmodified
          (set-buffer-modified-p nil)
          (cj/set-cursor-color-according-to-mode)
          (should (equal cj/-cursor-last-color "#ffffff"))  ; White

          ;; Modify buffer
          (insert "test")
          (should (buffer-modified-p))
          ;; Reset last buffer to force update
          (setq cj/-cursor-last-buffer nil)
          (cj/set-cursor-color-according-to-mode)
          (should (equal cj/-cursor-last-color "#64aa0f")))  ; Green
      (kill-buffer normal-buf))))

(ert-deftest test-cursor-color-integration-save-changes-color-back ()
  "Test that saving a modified buffer changes cursor from green to white."
  (let ((test-file (make-temp-file "test-cursor-"))
        (cj/-cursor-last-color nil)
        (cj/-cursor-last-buffer nil))
    (unwind-protect
        (progn
          ;; Create and modify file
          (with-current-buffer (find-file-noselect test-file)
            (insert "test")
            (should (buffer-modified-p))
            (cj/set-cursor-color-according-to-mode)
            (should (equal cj/-cursor-last-color "#64aa0f"))  ; Green

            ;; Save file
            (save-buffer)
            (should-not (buffer-modified-p))
            (cj/set-cursor-color-according-to-mode)
            (should (equal cj/-cursor-last-color "#ffffff"))  ; White
            (kill-buffer)))
      (delete-file test-file))))

;;; Performance Tests

(ert-deftest test-cursor-color-integration-multiple-calls-efficient ()
  "Test that multiple rapid calls don't cause performance issues."
  (with-temp-buffer
    (let ((start-time (current-time)))
      ;; Call 1000 times
      (dotimes (_ 1000)
        (cj/set-cursor-color-according-to-mode))
      (let ((elapsed (float-time (time-subtract (current-time) start-time))))
        ;; Should complete in less than 1 second (cache makes this very fast)
        (should (< elapsed 1.0))))))

(provide 'test-ui-cursor-color-integration)
;;; test-ui-cursor-color-integration.el ends here