emacs/test/lisp
Richard Lawrence c685cf336a Add full support for iCalendar (RFC5545) data
This is a fix for Bug#74994 that replaces the existing support
in icalendar.el.  It implements a full parser, recurrence rule
and time zone calculations, diary import and export, and a
major mode with syntax highlighting for iCalendar data.  It
obsoletes most of the code in icalendar.el.

In addition to Bug#74994, the proposal to update Emacs' iCalendar
support was discussed on emacs-devel in this thread:
https://lists.gnu.org/archive/html/emacs-devel/2024-10/msg00425.html

icalendar.el pre-dates the current standard (RFC5545), contains numerous
bugs, is not well documented, and could not easily be updated or
extended; starting fresh was the simplest path to creating an iCalendar
library that other Emacs applications and packages can rely on.  It was
decided to leave icalendar.el's code in place for posterity, but declare
it obsolete.  Most of the changes in icalendar.el simply consist of such
declarations.  The old To Do list has also been deleted.

A few changes in icalendar.el, however, consist of new code for
library-wide functions and options, especially error handling.  In
particular:

* lisp/calendar/icalendar.el: Log iCalendar library errors in a single
buffer.
(icalendar-errors-mode): New mode for it.
(icalendar-uid-format): Change the default value to "%h", a hash
value (for privacy).
(icalendar-make-uid): New function, to replace 'icalendar--create-uid'.
(icalendar-debug-level, icalendar-vcalendar-prodid): New option.
(icalendar-vcalendar-version): New constant.
* lisp/calendar/icalendar.el (icalendar-import-format)
(icalendar-import-format-summary, icalendar-import-format-description)
(icalendar-import-format-location, icalendar-import-format-organizer)
(icalendar-import-format-url, icalendar-import-format-uid)
(icalendar-import-format-status, icalendar-import-format-class)
(icalendar-recurring-start-year, icalendar-export-hidden-diary-entries)
(icalendar-export-sexp-enumerate-all, icalendar-export-alarms,
icalendar-debug, icalendar--weekday-array, icalendar--dmsg)
(icalendar--get-unfolded-buffer icalendar--clean-up-line-endings)
(icalendar--rris, icalendar--read-element)
(icalendar--get-event-property, icalendar--get-event-properties)
(icalendar--get-event-property-attributes)
(icalendar--get-children, icalendar--all-events, icalendar--split-value)
(icalendar--convert-tz-offset, icalendar--parse-vtimezone)
(icalendar--get-most-recent-observance)
(icalendar--convert-all-timezones, icalendar--find-time-zone)
(icalendar--decode-isodatetime)
(icalendar--decode-isoduration, icalendar--add-decoded-times)
(icalendar--datetime-to-american-date)
(icalendar--datetime-to-european-date, icalendar--datetime-to-iso-date)
(icalendar--datetime-to-diary-date, icalendar--datetime-to-colontime)
(icalendar--get-month-number, icalendar--get-weekday-number)
(icalendar--get-weekday-numbers, icalendar--get-weekday-abbrev)
(icalendar--date-to-isodate, icalendar--datestring-to-isodate)
(icalendar--diarytime-to-isotime, icalendar--convert-string-for-export)
(icalendar--convert-string-for-import, icalendar-export-file)
(icalendar-export-region, icalendar--create-uid)
(icalendar--parse-summary-and-rest, icalendar--create-ical-alarm)
(icalendar--do-create-ical-alarm, icalendar--convert-ordinary-to-ical)
(icalendar-first-weekday-of-year, icalendar--convert-weekly-to-ical)
(icalendar--convert-yearly-to-ical, icalendar--convert-sexp-to-ical)
(icalendar--convert-block-to-ical, icalendar--convert-float-to-ical)
(icalendar--convert-date-to-ical, icalendar--convert-cyclic-to-ical)
(icalendar--convert-anniversary-to-ical, icalendar-import-file)
(icalendar-import-buffer, icalendar--format-ical-event)
(icalendar--convert-to-ical, icalendar--convert-ical-to-diary)
(icalendar--convert-recurring-to-diary)
(icalendar--convert-non-recurring-all-day-to-diary)
(icalendar--convert-non-recurring-not-all-day-to-diary)
(icalendar--add-diary-entry, icalendar-import-format-sample): Mark them
as obsolete.

In addition to the changes above, the new iCalendar library consists of
the following:

* lisp/calendar/diary-icalendar.el:
* lisp/calendar/icalendar-ast.el:
* lisp/calendar/icalendar-macs.el:
* lisp/calendar/icalendar-mode.el:
* lisp/calendar/icalendar-parser.el:
* lisp/calendar/icalendar-recur.el:
* lisp/calendar/icalendar-utils.el: New files

A few changes were made to existing files dealing with the calendar and
diary:

* lisp/calendar/calendar.el (calendar-date-from-day-of-year): New
function, extracted from calendar-goto-day-of-year.
* lisp/calendar/cal-move.el (calendar-goto-day-of-year): Use it.
* lisp/calendar/cal-dst.el (calendar-dst-find-data): Improve docstring.
* lisp/calendar/calendar.el (diary-date-insertion-form): New option.
(diary-american-date-insertion-form, diary-european-date-insertion-form)
(diary-iso-date-insertion-form): New constants.
* lisp/calendar/diary-lib.el (diary-insert-entry): Use the new
'diary-date-insertion-form' option.
(diary-time-regexp): Add FIXME to an existing comment.

The user-facing aspects of the above changes are documented in the Emacs
manual and the NEWS file:

* doc/emacs/calendar.texi (Diary Conversion): Update manual section to
describe the new importer and exporter.
* doc/emacs/emacs.texi (Detailed node listing): Update to include the
new nodes in docs/emacs/calendar.texi.
* etc/NEWS: Briefly describe the new library, major mode, and options.

The remainder of the changes apply to test files.

The following changes introduce new test files related to the new diary
importer and exporter:

* test/lisp/calendar/diary-icalendar-tests.el (Diary import and export):
Tests for diary-icalendar.  In addition to new tests for the exporter,
the existing import tests for icalendar.el have been ported here; these
use the existing iCalendar files in
test/lisp/calendar/icalendar-resources.  (A few new input .ics files
have also been added to this directory; see below.)
* test/lisp/calendar/diary-icalendar-resources: New directory containing
expected outputs for the import tests in diary-icalendar-tests.el.
(These have the same or similar names to the output files for the old
importer, in test/lisp/calendar/icalendar-resources, but different
contents.  Thus they live in a new directory.)
* test/lisp/calendar/icalendar-resources/import-legacy-function.ics: New
input file to test backward compatibility of the new importer with a
function as the value of 'icalendar-import-format', now obsolete.
* test/lisp/calendar/icalendar-resources/import-legacy-vars.ics: New
input file to test backward compatibility of the new importer with
values for options provided by icalendar.el which are now obsolete.
* test/lisp/calendar/icalendar-resources/import-with-attachment.ics: New
input file to test import of base64-encoded attachments.
* icalendar-resources/import-time-format-12hr-blank.ics: New input file
to test import with a custom value of 'diary-icalendar-time-format'.

Two other new test files provide unit tests for the main functions of
the library:

* test/lisp/calendar/icalendar-parser-tests.el (Parser): Tests for
icalendar-parser.  Most of these are derived from examples in RFC5545,
to ensure the parser implements the standard.
* test/lisp/calendar/icalendar-recur-tests.el (Recurrence rules): Tests
for icalendar-recur.  Most of these are derived from examples in RFC5545,
to ensure the recurrence rule interpreter implements the standard.

A few of the existing test files for icalendar.el have also been
modified.  Besides the specific changes mentioned below, the modified
.ics files also now use CR-LF line endings, as required by RFC5545:

* test/lisp/calendar/icalendar-tests.el (icalendar-deftest-obsolete):
New macro.
* test/lisp/calendar/icalendar-resources/import-non-recurring-all-day.ics:
Correct a malformed VALUE parameter.
* test/lisp/calendar/icalendar-resources/import-rrule-anniversary.ics:
Correct representation of a recurring event.
*
test/lisp/calendar/icalendar-resources/import-rrule-daily-with-exceptions.ics:
Add a required VALUE parameter.
* test/lisp/calendar/icalendar-resources/import-rrule-daily.ics:
* test/lisp/calendar/icalendar-resources/import-rrule-monthly-no-end.ics:
* test/lisp/calendar/icalendar-resources/import-rrule-monthly-with-end.ics:
* test/lisp/calendar/icalendar-resources/import-rrule-weekly.ics:
Correct a malformed RRULE property.
2025-12-20 13:38:02 -05:00
..
align-resources Support lua-ts-mode in align.el 2023-10-21 12:25:25 +02:00
auth-source-resources Move netrc tests to auth-source-tests.el 2022-08-04 17:33:34 +02:00
bookmark-resources
calc Add user option to inhibit Calc startup message (bug#79143) 2025-08-30 10:22:06 +03:00
calendar Add full support for iCalendar (RFC5545) data 2025-12-20 13:38:02 -05:00
cedet Fix semantic-utest-ia tests 2025-06-07 11:01:35 +03:00
custom-resources
dabbrev-resources ; Add missing lexical-binding cookies 2025-03-02 19:46:15 +01:00
dired-resources/insert-directory Change how Dired displays available space 2021-12-01 23:27:19 +01:00
emacs-lisp Add vtable buffer slot (bug#79982) 2025-12-20 18:23:25 +02:00
emulation Update copyright year to 2025 2025-01-02 18:39:42 +01:00
epg-resources Replace aging OpenPGP artifacts in the epg tests. 2022-10-06 14:53:39 +02:00
erc ; Tweak failing autojoin display-context test for ERC 2025-12-17 17:36:42 -08:00
eshell Fix some tests on OpenBSD 2025-08-07 17:43:58 +03:00
faces-resources Update copyright year to 2025 2025-01-02 18:39:42 +01:00
files-resources Ensure .dir-locals-2.el behavior as documented (bug#75890) 2025-03-22 16:47:27 -04:00
gnus * test/lisp/gnus/message-tests.el (message-default-buffer-type): New test. 2025-03-25 19:48:06 +01:00
hfy-cmap-resources
image Update copyright year to 2025 2025-01-02 18:39:42 +01:00
international Fix 'ucs-normalize' tests following Unciode 17.0 import 2025-09-14 07:34:41 +03:00
loadhist-resources Correctly unload variable aliases. 2025-03-16 12:52:40 -04:00
mail Update copyright year to 2025 2025-01-02 18:39:42 +01:00
mh-e Update copyright year to 2025 2025-01-02 18:39:42 +01:00
minibuffer-resources
net ; Fix last change in tramp-tests.el 2025-12-17 07:36:49 +01:00
nxml Update copyright year to 2025 2025-01-02 18:39:42 +01:00
obsolete Update copyright year to 2025 2025-01-02 18:39:42 +01:00
org Update copyright year to 2025 2025-01-02 18:39:42 +01:00
pcmpl-linux-resources
play Update copyright year to 2025 2025-01-02 18:39:42 +01:00
progmodes hideshow: Support nested comment block in 'hs-hide-level-recursive' 2025-12-20 20:09:41 +02:00
saveplace-resources
so-long-tests Update copyright year to 2025 2025-01-02 18:39:42 +01:00
term Update copyright year to 2025 2025-01-02 18:39:42 +01:00
textmodes Simplify fill-tests.el and add tests 2025-12-06 14:04:32 +02:00
time-resources
url Lookup cached basic-auth credentials with the correct key 2025-11-08 19:21:10 +02:00
use-package Fix use-package :custom-face to set face-defface-spec (bug#77928) 2025-04-27 10:48:55 +03:00
vc Update email in vc-tests and vc-git-tests 2025-12-09 16:09:18 +01:00
xdg-resources
abbrev-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
align-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
allout-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
allout-widgets-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
ansi-color-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
ansi-osc-tests.el ansi-osc.el: Use marker (bug#78184) 2025-05-31 15:21:21 +03:00
apropos-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
arc-mode-tests.el ; Fix previous arc-mode-test commit 2025-04-26 17:09:00 +03:00
auth-source-pass-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
auth-source-tests.el Add fallback backend in auth-sources 2025-10-05 17:14:59 +02:00
autoinsert-tests.el Autoinsert: Allow condition to be a function 2025-08-09 13:35:48 +03:00
autorevert-tests.el Fix failed tests on emba 2025-09-18 14:56:05 +02:00
battery-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
bookmark-tests.el Eliminate bookmark-maybe-historicize-string duplicates 2025-02-11 08:47:44 +01:00
buff-menu-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
button-tests.el Prevent button.el from clearing help-echo strings 2025-03-08 17:29:34 +01:00
calculator-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
char-fold-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
color-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
comint-tests.el Add support for su-rs and sudo-rs programs 2025-10-15 10:30:29 +02:00
completion-preview-tests.el Merge from savannah/emacs-30 2025-03-04 14:32:48 +08:00
completion-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
cus-edit-tests.el Fix comparison of current values for the key-sequence :type 2025-02-23 01:15:24 +01:00
custom-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
dabbrev-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
delim-col-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
descr-text-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
desktop-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
dired-aux-tests.el Prefer ert-with-temp-directory in tests 2025-02-23 03:46:57 +01:00
dired-tests.el Correct (debug body) edebug specs 2025-03-08 18:35:07 +01:00
dired-x-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
dnd-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
dom-tests.el ; * test/lisp/dom-tests.el: silence obsoletion warnings 2025-09-14 11:31:53 +02:00
edmacro-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
electric-tests.el Support strings for electric pairs (bug#78053) 2025-06-21 12:24:55 +03:00
elide-head-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
env-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
epg-config-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
epg-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
faces-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
ffap-tests.el Add option 'ffap-prefer-remote-file' (bug#78925) 2025-07-12 11:48:52 +03:00
filenotify-tests.el ; Instrument file-notify-test07-many-events 2025-09-23 11:23:11 +02:00
files-tests.el 'map-y-or-n-p' now uses the minibuffer to read a char (bug#79664) 2025-11-01 20:27:45 +02:00
files-x-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
find-cmd-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
follow-tests.el Fix loading follow.el 2025-03-13 08:14:36 +01:00
font-lock-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
format-spec-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
help-fns-tests.el ; Quote function symbols in help-fns-tests.el 2025-02-11 01:14:32 +01:00
help-mode-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
help-tests.el (help-function-arglist): Fix bug#79128 2025-08-07 13:49:48 -04:00
hfy-cmap-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
hi-lock-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
hl-line-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
htmlfontify-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
ibuffer-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
ido-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
image-file-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
image-tests.el ; Don't fail image tests if jpeg is supported via imagemagick 2025-02-21 13:02:58 +01:00
imenu-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
info-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
info-xref-tests.el Extend info-xref-test-emacs-manuals, fix info reference 2025-08-27 11:24:12 +02:00
isearch-tests.el Fix invalid search bound in 'search-within-boundaries'. 2025-04-29 19:41:44 +03:00
jit-lock-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
json-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
jsonrpc-tests.el test/eieio: Silence warnings about slots and obsolete name arg 2025-04-07 00:55:48 -04:00
kmacro-tests.el Use cl-with-gensyms in a few more cases 2025-02-25 01:23:33 +01:00
loadhist-tests.el Correctly unload variable aliases. 2025-03-16 12:52:40 -04:00
lpr-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
ls-lisp-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
man-tests.el New test for finding C header files 2025-01-06 20:04:20 +01:00
md4-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
minibuffer-tests.el Fix completion error in C-x RET f ut-8-d TAB 2025-11-26 09:53:19 -05:00
misc-tests.el Fix `string-pixel-width' with alternate text properties 2025-03-20 14:55:23 +02:00
mouse-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
mwheel-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
newcomment-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
obarray-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
paren-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
password-cache-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
pcmpl-linux-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
pcomplete-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
proced-tests.el ; Temporarily disable proced tests on macOS (Bug#76898) 2025-03-11 01:03:50 +01:00
ps-print-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
register-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
repeat-tests.el Fix repeat-echo-message-string for keys with hints (bug#78797). 2025-06-19 09:40:36 +03:00
replace-tests.el Fix query-replace-regexp for using '^' with calculated replacement '\,' 2025-11-24 20:14:15 +02:00
rot13-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
savehist-tests.el ; silence some compiler warnings in tests 2025-07-19 17:02:28 +02:00
saveplace-tests.el ; Fix saveplace-tests for MS-Windows 2025-02-22 11:49:25 +02:00
scroll-lock-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
server-tests.el Fix a number of ERT tests for execution on Android 2025-02-25 19:13:24 +08:00
ses-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
shadowfile-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
shell-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
simple-tests.el Move buffer related functions from ert-x.el to ert.el 2025-02-24 20:45:41 +01:00
sort-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
soundex-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
speedbar-tests.el Update copyright year to 2025 2025-01-01 07:39:17 +00:00
sqlite-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
startup-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
subr-tests.el Add test cases for 'dolist' 2025-11-27 11:02:10 +02:00
tab-bar-tests.el Disable one tab-bar-test case on macOS 2025-10-21 13:19:07 +02:00
tabify-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
tar-mode-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
tempo-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
term-tests.el ; Fix char encoding in term-tests.el 2025-06-12 11:38:01 +03:00
thingatpt-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
thread-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
time-stamp-tests.el ; time-stamp: Prefer 'string-match-p' over 'string-match' 2025-12-10 13:00:31 -08:00
time-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
timezone-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
uniquify-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
version-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
visual-wrap-tests.el Clean up text properties in 'visual-wrap-prefix-mode' 2025-06-10 22:09:26 -07:00
wdired-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
which-key-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
whitespace-tests.el Move buffer related functions from ert-x.el to ert.el 2025-02-24 20:45:41 +01:00
wid-edit-tests.el Strengthen widget-get/put tests 2025-03-03 10:49:09 +01:00
winner-tests.el Add :set attribute to winner-dont-bind-my-keys 2025-03-15 04:06:31 +01:00
x-dnd-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
xdg-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
xml-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
xt-mouse-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00
yank-media-tests.el Update copyright year to 2025 2025-01-02 18:39:42 +01:00