diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-05 12:16:37 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-05 12:16:37 -0500 |
| commit | 44831f8587947212f2df8c38e81a3c1b6fa588fc (patch) | |
| tree | af52e2ae3120977d0ac01a180f608f071b04cf50 /tests | |
| parent | 8db6357d2e2f912ca382b259ea2675cf9058511e (diff) | |
| download | chime-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.el | 53 |
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 |
