aboutsummaryrefslogtreecommitdiff
path: root/tests/test-chime-event-is-today.el
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-chime-event-is-today.el')
-rw-r--r--tests/test-chime-event-is-today.el139
1 files changed, 139 insertions, 0 deletions
diff --git a/tests/test-chime-event-is-today.el b/tests/test-chime-event-is-today.el
new file mode 100644
index 0000000..112512b
--- /dev/null
+++ b/tests/test-chime-event-is-today.el
@@ -0,0 +1,139 @@
+;;; test-chime-event-is-today.el --- Tests for chime-event-is-today -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2024-2026 Craig Jennings
+
+;; Author: Craig Jennings <c@cjennings.net>
+
+;; This program is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Unit tests for chime-event-is-today function.
+;; This function checks if an event has any timestamps specifically on today's
+;; date (not past days, not future days).
+;;
+;; NOTE: These tests use real dates (not with-test-time) because
+;; chime-event-is-today uses (decode-time) without arguments internally,
+;; which calls the C-level current_time and bypasses Lisp-level mocking.
+
+;;; Code:
+
+;; Initialize package system for batch mode
+(when noninteractive
+ (package-initialize))
+
+(require 'ert)
+
+;; Load dependencies required by chime
+(require 'dash)
+(require 'alert)
+(require 'async)
+(require 'org-agenda)
+
+;; Load chime from parent directory
+(load (expand-file-name "../chime.el") nil t)
+
+;; Load test utilities
+(require 'testutil-general (expand-file-name "testutil-general.el"))
+(require 'testutil-time (expand-file-name "testutil-time.el"))
+
+;;; Helpers — build events at real dates
+
+(defun test--real-today-at (hour minute)
+ "Return Emacs time for the real today at HOUR:MINUTE."
+ (let ((d (decode-time (current-time))))
+ (encode-time 0 minute hour
+ (decoded-time-day d)
+ (decoded-time-month d)
+ (decoded-time-year d))))
+
+(defun test--real-yesterday-at (hour minute)
+ "Return Emacs time for the real yesterday at HOUR:MINUTE."
+ (let ((d (decode-time (time-subtract (current-time) (days-to-time 1)))))
+ (encode-time 0 minute hour
+ (decoded-time-day d)
+ (decoded-time-month d)
+ (decoded-time-year d))))
+
+(defun test--real-tomorrow-at (hour minute)
+ "Return Emacs time for the real tomorrow at HOUR:MINUTE."
+ (let ((d (decode-time (time-add (current-time) (days-to-time 1)))))
+ (encode-time 0 minute hour
+ (decoded-time-day d)
+ (decoded-time-month d)
+ (decoded-time-year d))))
+
+(defun test--make-timed-event (time)
+ "Make an event alist with a single timed timestamp at TIME."
+ (let ((ts (test-timestamp-string time)))
+ `((times . ((,ts . ,time))))))
+
+(defun test--make-all-day-event (time)
+ "Make an event alist with a single all-day timestamp at TIME."
+ (let ((ts (test-timestamp-string time t)))
+ `((times . ((,ts . nil))))))
+
+;;; Normal Cases
+
+(ert-deftest test-chime-event-is-today-timed-event-today ()
+ "A timed event happening today should return truthy."
+ (let ((event (test--make-timed-event (test--real-today-at 14 30))))
+ (should (chime-event-is-today event))))
+
+(ert-deftest test-chime-event-is-today-all-day-event-today ()
+ "An all-day event for today should return truthy."
+ (let ((event (test--make-all-day-event (test--real-today-at 0 0))))
+ (should (chime-event-is-today event))))
+
+(ert-deftest test-chime-event-is-today-yesterday-returns-nil ()
+ "An event from yesterday should return nil."
+ (let ((event (test--make-timed-event (test--real-yesterday-at 14 30))))
+ (should-not (chime-event-is-today event))))
+
+(ert-deftest test-chime-event-is-today-tomorrow-returns-nil ()
+ "An event for tomorrow should return nil."
+ (let ((event (test--make-timed-event (test--real-tomorrow-at 14 30))))
+ (should-not (chime-event-is-today event))))
+
+(ert-deftest test-chime-event-is-today-past-timed-event-today ()
+ "A timed event earlier today (in the past) should return truthy."
+ (let ((event (test--make-timed-event (test--real-today-at 0 1))))
+ (should (chime-event-is-today event))))
+
+(ert-deftest test-chime-event-is-today-future-timed-event-today ()
+ "A timed event later today (in the future) should return truthy."
+ (let ((event (test--make-timed-event (test--real-today-at 23 58))))
+ (should (chime-event-is-today event))))
+
+;;; Boundary Cases
+
+(ert-deftest test-chime-event-is-today-event-at-2359-today ()
+ "An event at 23:59 today should return truthy."
+ (let ((event (test--make-timed-event (test--real-today-at 23 59))))
+ (should (chime-event-is-today event))))
+
+(ert-deftest test-chime-event-is-today-event-at-0000-today ()
+ "An event at 00:00 today should return truthy."
+ (let ((event (test--make-timed-event (test--real-today-at 0 0))))
+ (should (chime-event-is-today event))))
+
+;;; Error Cases
+
+(ert-deftest test-chime-event-is-today-empty-times-returns-nil ()
+ "An event with no times should return nil."
+ (let ((event '((times . ()))))
+ (should-not (chime-event-is-today event))))
+
+(provide 'test-chime-event-is-today)
+;;; test-chime-event-is-today.el ends here