summaryrefslogtreecommitdiff
path: root/tests/test-calendar-sync--parse-exdate.el
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-calendar-sync--parse-exdate.el')
-rw-r--r--tests/test-calendar-sync--parse-exdate.el80
1 files changed, 80 insertions, 0 deletions
diff --git a/tests/test-calendar-sync--parse-exdate.el b/tests/test-calendar-sync--parse-exdate.el
new file mode 100644
index 00000000..2be3d3a1
--- /dev/null
+++ b/tests/test-calendar-sync--parse-exdate.el
@@ -0,0 +1,80 @@
+;;; test-calendar-sync--parse-exdate.el --- Tests for EXDATE parsing -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Unit tests for calendar-sync--parse-exdate function.
+;; Tests parsing EXDATE values into (year month day hour minute) lists.
+;; Following quality-engineer.org guidelines: one function per file.
+
+;;; Code:
+
+(require 'ert)
+(add-to-list 'load-path (expand-file-name "." (file-name-directory load-file-name)))
+(add-to-list 'load-path (expand-file-name "../modules" (file-name-directory load-file-name)))
+(require 'testutil-calendar-sync)
+(require 'calendar-sync)
+
+;;; Normal Cases
+
+(ert-deftest test-calendar-sync--parse-exdate-normal-datetime-returns-list ()
+ "Test parsing standard datetime format returns correct list."
+ (let ((result (calendar-sync--parse-exdate "20260203T130000")))
+ (should (equal '(2026 2 3 13 0) result))))
+
+(ert-deftest test-calendar-sync--parse-exdate-normal-with-z-returns-list ()
+ "Test parsing UTC datetime with Z suffix returns correct list."
+ (let ((result (calendar-sync--parse-exdate "20260203T180000Z")))
+ (should (equal '(2026 2 3 18 0) result))))
+
+(ert-deftest test-calendar-sync--parse-exdate-normal-date-only-returns-list ()
+ "Test parsing date-only format returns list with nil for time."
+ (let ((result (calendar-sync--parse-exdate "20260203")))
+ (should (equal '(2026 2 3 nil nil) result))))
+
+(ert-deftest test-calendar-sync--parse-exdate-normal-with-seconds-returns-list ()
+ "Test parsing datetime ignores seconds."
+ (let ((result (calendar-sync--parse-exdate "20260203T130045")))
+ (should (equal '(2026 2 3 13 0) result))))
+
+;;; Boundary Cases
+
+(ert-deftest test-calendar-sync--parse-exdate-boundary-midnight-returns-zero-hour ()
+ "Test parsing midnight time returns hour=0."
+ (let ((result (calendar-sync--parse-exdate "20260203T000000")))
+ (should (equal '(2026 2 3 0 0) result))))
+
+(ert-deftest test-calendar-sync--parse-exdate-boundary-end-of-day-returns-23 ()
+ "Test parsing end-of-day time returns hour=23."
+ (let ((result (calendar-sync--parse-exdate "20260203T235900")))
+ (should (equal '(2026 2 3 23 59) result))))
+
+(ert-deftest test-calendar-sync--parse-exdate-boundary-leap-year-feb29-returns-correct ()
+ "Test parsing Feb 29 on leap year."
+ (let ((result (calendar-sync--parse-exdate "20280229T120000")))
+ (should (equal '(2028 2 29 12 0) result))))
+
+(ert-deftest test-calendar-sync--parse-exdate-boundary-new-years-eve-returns-correct ()
+ "Test parsing Dec 31."
+ (let ((result (calendar-sync--parse-exdate "20261231T235900")))
+ (should (equal '(2026 12 31 23 59) result))))
+
+(ert-deftest test-calendar-sync--parse-exdate-boundary-jan-1-returns-correct ()
+ "Test parsing Jan 1."
+ (let ((result (calendar-sync--parse-exdate "20260101T000000")))
+ (should (equal '(2026 1 1 0 0) result))))
+
+;;; Error Cases
+
+(ert-deftest test-calendar-sync--parse-exdate-error-empty-returns-nil ()
+ "Test that empty string returns nil."
+ (should (null (calendar-sync--parse-exdate ""))))
+
+(ert-deftest test-calendar-sync--parse-exdate-error-nil-returns-nil ()
+ "Test that nil input returns nil."
+ (should (null (calendar-sync--parse-exdate nil))))
+
+(ert-deftest test-calendar-sync--parse-exdate-error-invalid-format-returns-nil ()
+ "Test that invalid format returns nil."
+ (should (null (calendar-sync--parse-exdate "not-a-date"))))
+
+(provide 'test-calendar-sync--parse-exdate)
+;;; test-calendar-sync--parse-exdate.el ends here