aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-05-05 12:16:37 -0500
committerCraig Jennings <c@cjennings.net>2026-05-05 12:16:37 -0500
commit44831f8587947212f2df8c38e81a3c1b6fa588fc (patch)
treeaf52e2ae3120977d0ac01a180f608f071b04cf50 /tests
parent8db6357d2e2f912ca382b259ea2675cf9058511e (diff)
downloadchime-44831f8587947212f2df8c38e81a3c1b6fa588fc.tar.gz
chime-44831f8587947212f2df8c38e81a3c1b6fa588fc.zip
fix: stop tooltip dedup from hiding distinct events sharing a title
`chime--deduplicate-events-by-title' was keying off the user-facing title alone, so two real "1:1" entries on different days collapsed to one and the second one disappeared from the tooltip. I changed the key to `(marker-file . marker-pos)' — the source heading identity — so distinct headings keep both copies and recurring expansions of one heading still fold to the soonest. When marker info is missing (synthesized test events, edge cases) the key falls back to title, which preserves the older fixtures the function was originally tested against. Three new tests cover the regression paths: two distinct headings sharing a title both survive, one heading expanded into multiple instances still collapses to the soonest, and a mix of sourced and unsourced events behaves correctly under both code paths.
Diffstat (limited to 'tests')
-rw-r--r--tests/test-chime--deduplicate-events-by-title.el53
1 files changed, 53 insertions, 0 deletions
diff --git a/tests/test-chime--deduplicate-events-by-title.el b/tests/test-chime--deduplicate-events-by-title.el
index 69bb632..66ec37a 100644
--- a/tests/test-chime--deduplicate-events-by-title.el
+++ b/tests/test-chime--deduplicate-events-by-title.el
@@ -47,6 +47,15 @@ Returns format: (EVENT TIME-INFO MINUTES)"
'("dummy-time-string" . nil) ; TIME-INFO (not used in deduplication)
minutes))
+(defun test-make-upcoming-item-with-source (title minutes file pos)
+ "Build an upcoming-events item carrying source-heading identity.
+TITLE / MINUTES match `test-make-upcoming-item'; FILE and POS attach
+`marker-file' and `marker-pos' to the event alist so the dedup key
+can use heading identity instead of title."
+ (list `((title . ,title) (marker-file . ,file) (marker-pos . ,pos))
+ '("dummy-time-string" . nil)
+ minutes))
+
;;; Normal Cases
(ert-deftest test-chime--deduplicate-events-by-title-normal-recurring-daily-keeps-soonest ()
@@ -183,5 +192,49 @@ One instance should be kept."
(let ((result (chime--deduplicate-events-by-title nil)))
(should (null result))))
+;;; Source-heading Cases (distinct headings with shared title)
+
+(ert-deftest test-chime--deduplicate-events-by-title-distinct-headings-same-title-both-kept ()
+ "Two events that share a title but live at different markers must both
+survive the dedup pass. Recurring-event collapse keys off the source
+heading (file + position), not the user-facing title."
+ (let* ((events (list
+ (test-make-upcoming-item-with-source
+ "1:1" 30 "/work.org" 100)
+ (test-make-upcoming-item-with-source
+ "1:1" 60 "/work.org" 500)))
+ (result (chime--deduplicate-events-by-title events)))
+ (should (= 2 (length result)))))
+
+(ert-deftest test-chime--deduplicate-events-by-title-recurring-same-marker-collapsed ()
+ "Multiple expansions of one recurring entry share the same marker
+and should still collapse to the soonest occurrence."
+ (let* ((events (list
+ (test-make-upcoming-item-with-source
+ "Standup" 60 "/work.org" 100)
+ (test-make-upcoming-item-with-source
+ "Standup" 1500 "/work.org" 100)
+ (test-make-upcoming-item-with-source
+ "Standup" 2940 "/work.org" 100)))
+ (result (chime--deduplicate-events-by-title events)))
+ (should (= 1 (length result)))
+ (should (= 60 (caddr (car result))))))
+
+(ert-deftest test-chime--deduplicate-events-by-title-mixed-source-and-title-fallback ()
+ "Sourced and unsourced events coexist: sourced ones key off the marker,
+unsourced ones still collapse by title."
+ (let* ((events (list
+ ;; Two distinct headings sharing a title
+ (test-make-upcoming-item-with-source
+ "Sync" 30 "/a.org" 100)
+ (test-make-upcoming-item-with-source
+ "Sync" 90 "/b.org" 200)
+ ;; Test event without marker info — fallback to title
+ (test-make-upcoming-item "Standalone" 45)
+ (test-make-upcoming-item "Standalone" 600)))
+ (result (chime--deduplicate-events-by-title events)))
+ ;; Two Syncs (distinct headings) plus one Standalone (title-collapsed)
+ (should (= 3 (length result)))))
+
(provide 'test-chime--deduplicate-events-by-title)
;;; test-chime--deduplicate-events-by-title.el ends here