<feed xmlns='http://www.w3.org/2005/Atom'>
<title>chime/tests, branch v0.7.0</title>
<subtitle>Emacs chimes, notifications, and modeline reminders so you don't miss events
</subtitle>
<id>https://git.cjennings.net/chime/atom?h=v0.7.0</id>
<link rel='self' href='https://git.cjennings.net/chime/atom?h=v0.7.0'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/'/>
<updated>2026-05-05T10:15:59+00:00</updated>
<entry>
<title>fix: skip declined events in tooltip, modeline, and notifications</title>
<updated>2026-05-05T10:15:59+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-05T10:15:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=e4a254453dedacafcca883a3b20302762c872280'/>
<id>urn:sha1:e4a254453dedacafcca883a3b20302762c872280</id>
<content type='text'>
org-gcal writes `:STATUS: declined' on calendar entries the user has declined,
and chime was happily showing them in the tooltip, modeline, and notification
stream — which defeats the whole point of declining a meeting.

I added `chime-declined-events-predicate', mirroring the shape of
`chime-done-keywords-predicate', and put it on the default
`chime-predicate-blacklist'. The match is on the literal lowercase value
because that's what real org-gcal exports use; uppercase or other values pass
through. Users who want declined events back can pop the predicate off the
blacklist.

Tests cover all four STATUS values seen in real org-gcal data (accepted,
declined, needs-action, tentative), plus the no-property, empty-property,
todo-keyword-still-attached, gibberish-value, case-sensitivity, and
default-blacklist-membership cases.
</content>
</entry>
<entry>
<title>test: tag integration suite :slow and unstick test-all</title>
<updated>2026-05-05T10:12:11+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-05T10:12:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=fda1e989e0c22433b0214ab537a61852d906fd4b'/>
<id>urn:sha1:fda1e989e0c22433b0214ab537a61852d906fd4b</id>
<content type='text'>
I tagged the 15 end-to-end tests across `test-integration-chime-mode.el`,
`test-integration-recurring-events-tooltip.el`, and
`test-integration-startup.el` with `:tags '(:slow)`. The default `make test`
now runs only the 652 fast unit tests; `make test-all` runs the full 667.

While verifying, I hit a pre-existing bug in `tests/Makefile` where
`test-all`'s `--eval '(ert-run-tests-batch-and-exit)'` came back from eask's
argv passthrough with its quotes stripped, which broke shell parsing. Passing
the explicit `t` selector dodges whatever eask does to no-arg single-quoted
forms. The bug only mattered once integration tests were `:slow` — before
that, `test-all` overlapped fully with `test-unit` plus `test-integration`,
so nothing actually depended on it working.
</content>
</entry>
<entry>
<title>build: add eask manifest and setup/compile/coverage targets</title>
<updated>2026-05-05T09:57:14+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-05T09:57:14+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=e54041ac630fe31a9968cf41c452feee317a4049'/>
<id>urn:sha1:e54041ac630fe31a9968cf41c452feee317a4049</id>
<content type='text'>
I switched the test runner from `~/.emacs.d/elpa`-grep to eask. With
this, `make setup` installs every dep into a project-local `.eask/`,
so test runs don't depend on whatever's in my global elpa. It also
lets us catch missing Package-Requires entries before MELPA submission.

New targets:

- `make setup` — runs `eask install-deps --dev`
- `make compile` — byte-compiles chime.el and surfaces warnings that
  checkdoc and elisp-lint don't catch
- `make coverage` — runs the unit suite under undercover and writes a
  simplecov JSON to `.coverage/simplecov.json`
- `make test-all` — runs every test, including `:slow` tagged
- `-include makefile-local` in both Makefiles, for per-machine knobs

I added `ERT_FAST_SELECTOR` so `make test`, `test-unit`,
`test-integration`, and `test-file` exclude tests tagged `:slow`. When
we tag end-to-end integration tests as `:slow`, they'll stay out of
the fast feedback loop until someone explicitly asks for them via
`make test-all`.

Eask treats CWD as its workspace. So all eask invocations now run
from project root, with `(cd "tests/")' as the first `--eval' to
restore Emacs's default-directory. That preserves the relative loads
the existing test files and test-bootstrap.el rely on, without
touching either.

I updated `.gitignore` for `.eask/`, `.coverage/`, and the optional
`makefile-local` files.
</content>
</entry>
<entry>
<title>refactor: move 12 internal helpers from chime- to chime-- prefix</title>
<updated>2026-04-22T14:43:02+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-22T14:43:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=74ca4e066bc41ce0a6e94e2d4bc0c838df45a838'/>
<id>urn:sha1:74ca4e066bc41ce0a6e94e2d4bc0c838df45a838</id>
<content type='text'>
Before MELPA submission, tighten the public API surface. Single-dash chime-foo is the convention for user-facing commands and predicates that external code can bind. Anything that is not meant to be bound externally should use the double-dash chime--foo prefix so byte-compile warnings, docstrings, and MELPA package inspection all point in the same direction.

Twelve helpers in chime.el had single-dash names but no user-facing role. They are not mentioned in README, they carry no interactive declaration, and their docstrings do not promise a behavior contract. Rename them: chime-get-minutes-into-day, chime-get-hours-minutes-from-time, chime-set-hours-minutes-for-time, chime-current-time-matches-time-of-day-string, chime-current-time-is-day-wide-time, chime-day-wide-notifications, chime-display-as-day-wide-event, chime-event-has-any-day-wide-timestamp, chime-event-within-advance-notice-window, chime-event-has-any-passed-time, chime-event-is-today, chime-environment-regex.

The public API surface is now intentional. It covers chime-mode, chime-validate-configuration, chime-refresh-modeline, chime-done-keywords-predicate, and the chime-debug-* interactive commands in chime-debug.el.

Breaking change. No alias shims because there are no downstream users yet.
</content>
</entry>
<entry>
<title>test: add unit tests for chime--day-label-for-event-time</title>
<updated>2026-04-22T12:19:41+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-22T12:19:41+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=8511cf43f2bf4ab2dc539fd28427e6c81c98b901'/>
<id>urn:sha1:8511cf43f2bf4ab2dc539fd28427e6c81c98b901</id>
<content type='text'>
Seven pure-function tests appended to the group-events-by-day file, covering Normal and Boundary cases.

Normal: event on the same calendar day as NOW returns "Today, ...". Event on the same calendar day as TOMORROW returns "Tomorrow, ...". Event three days out returns a weekday label and is neither Today nor Tomorrow.

Boundary: event at 00:00 on the NOW calendar day is Today. Event at 00:00 on the TOMORROW calendar day is Tomorrow. Event two calendar days out is not Tomorrow, gets a weekday label. Event on the previous calendar day is neither Today nor Tomorrow.

Since NOW and TOMORROW are function arguments, the tests use encode-time to build stable calendar values and skip the clock-mocking dance.
</content>
</entry>
<entry>
<title>test: pin group-events-by-day clock and add midnight edge cases</title>
<updated>2026-04-22T11:24:57+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-22T11:24:57+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=86a06eb53c7a07b4b5c7ca889edad09042384cb4'/>
<id>urn:sha1:86a06eb53c7a07b4b5c7ca889edad09042384cb4</id>
<content type='text'>
The Normal and Boundary tests built events as fixed-minute offsets from real current-time. On late-night runs the +60 minute event in single-day crossed midnight and the test failed because events 1-2 landed "Today" while event 3 landed "Tomorrow". The intent of these Normal tests is routine grouping, not midnight behavior, so they should be deterministic.

Pin the clock with with-test-time using the established let-bind pattern. with-test-time re-evaluates BASE-TIME inside the mocked current-time lambda, so passing test-time-today-at directly would recurse, because the helper itself calls current-time.

Add two new Boundary tests that explicitly exercise the day-crossing logic at 23:50. One event at +5 minutes stays in Today and one at +20 minutes crosses into Tomorrow. These are the first tests in the file that actually target midnight behavior.

Drop stale "REFACTORED: Uses dynamic timestamps" annotations from docstrings since the behavior is documented at the file level.
</content>
</entry>
<entry>
<title>test: add unit tests for async result helpers</title>
<updated>2026-04-22T11:24:57+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-22T11:24:57+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=77b5e8c80b56ffcccb2a44807e15d933f22edb05'/>
<id>urn:sha1:77b5e8c80b56ffcccb2a44807e15d933f22edb05</id>
<content type='text'>
Eight tests in a new file covering Normal and Boundary cases for both new helpers.

chime--record-async-failure increments the consecutive-failure counter, sets chime-modeline-string to the standard error tooltip, triggers the threshold warning when the counter hits chime-max-consecutive-failures, and leaves chime-modeline-string alone when chime-modeline-no-events-text is nil.

chime--handle-async-success resets the counter from non-zero to zero, invokes the callback with the events list, works with an empty events list, and is a no-op on the counter when it already starts at zero.
</content>
</entry>
<entry>
<title>test: add unit tests for chime--render-modeline-string</title>
<updated>2026-04-22T01:48:06+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-22T01:48:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=b19b0093ef23cbffa9de419313c64e72e35488b5'/>
<id>urn:sha1:b19b0093ef23cbffa9de419313c64e72e35488b5</id>
<content type='text'>
Five tests covering Normal and Boundary cases.

Normal: SOONEST branch applies chime-modeline-format to the event-text. Normal: no SOONEST plus UPCOMING binds mouse-1 (open calendar) and mouse-3 (jump to event). Normal: no SOONEST and no UPCOMING binds only mouse-1, and the tooltip is the no-events message.

Boundary: returns nil when no SOONEST and chime-modeline-no-events-text is nil. Boundary: SOONEST branch renders regardless of whether chime-modeline-no-events-text is set.

The orchestrator chime--update-modeline already exercises these paths via test-chime-update-modeline.el. These direct unit tests give the helper its own coverage.
</content>
</entry>
<entry>
<title>Consolidate Makefiles and update TESTING.org</title>
<updated>2026-04-04T22:05:49+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-04T22:05:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=b2b7f2468154435a28a174f5ec31e19e20fe44d2'/>
<id>urn:sha1:b2b7f2468154435a28a174f5ec31e19e20fe44d2</id>
<content type='text'>
Root Makefile now delegates to tests/Makefile. Fixed stale
UNIT_TESTS/INTEGRATION_TESTS definitions, added test-name target,
switched to per-file test execution for better isolation.
</content>
</entry>
<entry>
<title>Add tests for chime-environment-regex</title>
<updated>2026-04-04T20:30:30+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-04T20:30:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=1a788069b757c823012fc1135511a7af4b026437'/>
<id>urn:sha1:1a788069b757c823012fc1135511a7af4b026437</id>
<content type='text'>
Verify the regex matches all default variable names, picks up
additional user-configured regexes, and handles empty additional list.
</content>
</entry>
</feed>
