aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@lysator.liu.se>2023-10-02 19:26:40 +0200
committerHugo Hörnquist <hugo@lysator.liu.se>2023-10-02 19:28:44 +0200
commit712654d4c023a2ab13190c6905d313e0ba897965 (patch)
treeb8505b420d6621022fa6a46271340071d8881322
parentMade displayln into a library export. (diff)
downloadcalp-712654d4c023a2ab13190c6905d313e0ba897965.tar.gz
calp-712654d4c023a2ab13190c6905d313e0ba897965.tar.xz
Rewrite test running system.
-rw-r--r--.envrc4
-rw-r--r--.gitignore1
-rw-r--r--Makefile55
-rw-r--r--cpucount.c12
-rw-r--r--module/hnh/util/coverage.scm106
-rwxr-xr-xtestrunner.scm299
-rw-r--r--tests/html-components/caltable.scm (renamed from tests/test/html/caltable.scm)0
-rw-r--r--tests/html-components/component.scm (renamed from tests/test/html/component.scm)0
-rwxr-xr-xtests/run-tests.scm179
-rw-r--r--tests/test/data-stores/file.scm0
-rw-r--r--tests/test/data-stores/sqlite.scm0
-rw-r--r--tests/test/data-stores/vdir.scm0
-rw-r--r--tests/test/recurrence-advanced.scm1550
-rw-r--r--tests/test/timespec.scm88
-rw-r--r--tests/test/translation.scm15
-rw-r--r--tests/unit/c/cpp.scm (renamed from tests/test/cpp.scm)2
-rw-r--r--tests/unit/datetime/datetime.scm (renamed from tests/test/datetime.scm)212
-rw-r--r--tests/unit/datetime/timespec.scm98
-rw-r--r--tests/unit/datetime/tz.scm (renamed from tests/test/tz.scm)13
-rw-r--r--tests/unit/datetime/zic.scm (renamed from tests/test/zic.scm)134
-rw-r--r--tests/unit/termios/termios.scm (renamed from tests/test/termios.scm)1
-rw-r--r--tests/unit/util/base64.scm (renamed from tests/test/base64.scm)2
-rw-r--r--tests/unit/util/crypto.scm (renamed from tests/test/crypto.scm)2
-rw-r--r--tests/unit/util/hnh-util-env.scm (renamed from tests/test/hnh-util-env.scm)2
-rw-r--r--tests/unit/util/hnh-util-lens.scm (renamed from tests/test/hnh-util-lens.scm)2
-rw-r--r--tests/unit/util/hnh-util-path.scm (renamed from tests/test/hnh-util-path.scm)2
-rw-r--r--tests/unit/util/hnh-util-state-monad.scm (renamed from tests/test/hnh-util-state-monad.scm)1
-rw-r--r--tests/unit/util/hnh-util.scm (renamed from tests/test/hnh-util.scm)374
-rw-r--r--tests/unit/util/object.scm (renamed from tests/test/object.scm)2
-rw-r--r--tests/unit/util/srfi-41-util.scm (renamed from tests/test/srfi-41-util.scm)2
-rw-r--r--tests/unit/util/sxml-namespaced.scm (renamed from tests/test/sxml-namespaced.scm)2
-rw-r--r--tests/unit/util/uuid.scm (renamed from tests/test/uuid.scm)2
-rw-r--r--tests/unit/util/xdg-basedir.scm (renamed from tests/test/xdg-basedir.scm)1
-rw-r--r--tests/unit/util/xml-namespace.scm (renamed from tests/test/xml-namespace.scm)2
-rw-r--r--tests/unit/vcomponent/annoying-events.scm (renamed from tests/test/annoying-events.scm)19
-rw-r--r--tests/unit/vcomponent/create.scm (renamed from tests/test/create.scm)3
-rw-r--r--tests/unit/vcomponent/param.scm (renamed from tests/test/param.scm)3
-rw-r--r--tests/unit/vcomponent/recurrence-advanced.scm1555
-rw-r--r--tests/unit/vcomponent/recurrence-simple.scm (renamed from tests/test/recurrence-simple.scm)11
-rw-r--r--tests/unit/vcomponent/rrule-serialization.scm (renamed from tests/test/rrule-serialization.scm)2
-rw-r--r--tests/unit/vcomponent/vcomponent-control.scm (renamed from tests/test/vcomponent-control.scm)2
-rw-r--r--tests/unit/vcomponent/vcomponent-datetime.scm (renamed from tests/test/vcomponent-datetime.scm)17
-rw-r--r--tests/unit/vcomponent/vcomponent-formats-common-types.scm (renamed from tests/test/vcomponent-formats-common-types.scm)8
-rw-r--r--tests/unit/vcomponent/vcomponent.scm (renamed from tests/test/vcomponent.scm)4
-rw-r--r--tests/unit/web-util/server.scm (renamed from tests/test/server.scm)3
-rw-r--r--tests/unit/web-util/web-query.scm (renamed from tests/test/web-query.scm)3
-rw-r--r--tests/unit/webdav/webdav-file.scm (renamed from tests/test/webdav-file.scm)3
-rw-r--r--tests/unit/webdav/webdav-server.scm (renamed from tests/test/webdav-server.scm)2
-rw-r--r--tests/unit/webdav/webdav-tree.scm (renamed from tests/test/webdav-tree.scm)3
-rw-r--r--tests/unit/webdav/webdav-util.scm (renamed from tests/test/webdav-util.scm)2
-rw-r--r--tests/unit/webdav/webdav.scm (renamed from tests/test/webdav.scm)6
-rw-r--r--tests/web/web-server.scm (renamed from tests/test/web-server.scm)0
52 files changed, 2578 insertions, 2233 deletions
diff --git a/.envrc b/.envrc
index 0fccc035..de932784 100644
--- a/.envrc
+++ b/.envrc
@@ -7,9 +7,9 @@ else
fi
if [ "${GUILE_LOAD_COMPILED_PATH:-no}" = "no" ]; then
- export GUILE_LOAD_COMPILED_PATH="$PWD/obj-${guile_version}"
+ export GUILE_LOAD_COMPILED_PATH="$PWD/obj-${guile_version}/module"
else
- export GUILE_LOAD_COMPILED_PATH="$PWD/obj-${guile_version}:$GUILE_LOAD_COMPILED_PATH"
+ export GUILE_LOAD_COMPILED_PATH="$PWD/obj-${guile_version}/module:$GUILE_LOAD_COMPILED_PATH"
fi
unset guile_version
diff --git a/.gitignore b/.gitignore
index b7cea985..0ea19b1c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@ obj-*
localization
calp
calp-release
+cpucount
diff --git a/Makefile b/Makefile
index f662f8ea..a1809876 100644
--- a/Makefile
+++ b/Makefile
@@ -1,9 +1,12 @@
+COV_FILE=coverage.info
+
.PHONY: all clean test \
- check \
+ unit-test-with-cov \
litmus \
static \
- go_files \
- lcov.info
+ $(COV_FILE) \
+ lcov.info \
+ unit-test-deps
GUILE := guile
export GUILE
@@ -16,13 +19,17 @@ GUILE_SITE_DIR=$(shell $(GUILE) -c "(display (%site-dir))")
GUILE_CCACHE_DIR=$(shell $(GUILE) -c "(display (%site-ccache-dir))")
SCM_FILES = $(shell find module/ -type f -name \*.scm)
-GO_FILES = $(SCM_FILES:module/%.scm=obj-$(GUILE_VERSION)/%.go)
+GO_FILES = $(SCM_FILES:%.scm=obj-$(GUILE_VERSION)/%.go)
+SCM_UNIT_TESTS = $(shell find tests/unit/ -type f -name \*.scm)
+GO_UNIT_TESTS = $(SCM_UNIT_TESTS:%.scm=obj-$(GUILE_VERSION)/%.go)
+
+TEST_FILES = $(shell find tests/unit/util/ -type f -name \*.scm)
-GUILE_ENV = GUILE_LOAD_PATH=$(PWD)/module \
- GUILE_LOAD_COMPILED_PATH=$(PWD)/obj-$(GUILE_VERSION) \
- GUILE_AUTO_COMPILE=0
+GUILE_ENV = GUILE_LOAD_PATH=$(PWD)/module:$(PWD)/tests/unit \
+ GUILE_LOAD_COMPILED_PATH=$(PWD)/obj-$(GUILE_VERSION)/module:$(PWD)/obj-$(GUILE_VERSION)/obj-3.0.9/tests/util \
+ GUILE_AUTO_COMPILE=0
-GUILE_C_FLAGS = -Lmodule \
+GUILE_C_FLAGS = -Lmodule -Ltests/util \
-Wshadowed-toplevel -Wunbound-variable \
-Wmacro-use-before-definition -Warity-mismatch \
-Wduplicate-case-datum -Wbad-case-datum
@@ -41,7 +48,7 @@ LIMIT_FILES=$(LIMIT:%=--only %)
# Skip these files when testing
SKIP=--skip $(PWD)/tests/test/web-server.scm
-all: calp go_files static $(LOCALIZATIONS)
+all: calp $(GO_FILES) static $(LOCALIZATIONS)
$(MAKE) -C doc/ref
calp: calp.c
@@ -50,19 +57,18 @@ calp: calp.c
calp-release: calp.c
$(CC) -O2 $(CFLAGS) $(LDFLAGS) -o $@ $< $(LDLIBS)
+cpucount: cpucount.c
+ $(CC) -o $@ $<
+
XGETTEXT_FLAGS = --from-code=UTF-8 --add-comments --indent -kG_
static:
$(MAKE) -C static
-obj-$(GUILE_VERSION)/%.go: module/%.scm
+obj-$(GUILE_VERSION)/%.go: %.scm
@echo $(GUILD) $(GUILE_VERSION) compile $<
@env $(GUILE_ENV) $(GUILD) compile $(GUILE_C_FLAGS) -o $@ $< >/dev/null
-# Phony target used by test/run-tests.scm and main to
-# automatically compile everything before they run.
-go_files: $(GO_FILES)
-
po/%.po: $(SCM_FILES)
xgettext $(XGETTEXT_FLAGS) --output $@ -L scheme $^ --join-existing --omit-header --no-location
@@ -82,7 +88,7 @@ clean:
install: all calp-release
install -d $(DESTDIR)$(GUILE_SITE_DIR) $(DESTDIR)$(GUILE_CCACHE_DIR)
rsync -a module/ $(DESTDIR)$(GUILE_SITE_DIR)
- rsync -a obj-$(GUILE_VERSION)/ $(DESTDIR)$(GUILE_CCACHE_DIR)
+ rsync -a obj-$(GUILE_VERSION)/module $(DESTDIR)$(GUILE_CCACHE_DIR)
$(MAKE) -C static install
$(MAKE) -C system install
$(MAKE) -C doc/ref install
@@ -90,17 +96,23 @@ install: all calp-release
install -m 755 -D -t $(DESTDIR)/usr/lib/calp/ scripts/tzget
install -m755 -D calp-release $(DESTDIR)/usr/bin/calp
-lcov.info: $(GO_FILES)
- env DEBUG=0 tests/run-tests.scm --coverage=$@ $(if $(VERBOSE),--verbose) $(SKIP) $(LIMIT_FILES)
+# TODO a test completed with no errors should emit a .test-accepted
+# file, which make can then use as a target.
-test: coverage
+unit-test-deps: calp $(GO_UNIT_TESTS) $(GO_FILES) $(TEST_FILES)
+
+$(COV_FILE): cpucount unit-test-deps
+ ./testrunner.scm --threads $(shell ./cpucount) --coverage $@
+
+unit-test-with-cov: $(COV_FILE)
GENHTML_FLAGS=--show-details \
- --prefix $(shell pwd)/module \
+ --hierarchical \
+ --prefix $(shell pwd) \
--no-function-coverage \
--quiet
-coverage: lcov.info calp
+coverage: $(COV_FILE)
genhtml $(GENHTML_FLAGS) --output-directory $@ $<
@@ -109,8 +121,5 @@ CHECK_FLAGS = \
$(if $(VERBOSE),--verbose) \
$(SKIP) $(LIMIT_FILES)
-check: calp
- tests/run-tests.scm $(CHECK_FLAGS)
-
litmus:
tests/litmus.scm $(path)
diff --git a/cpucount.c b/cpucount.c
new file mode 100644
index 00000000..2049cad0
--- /dev/null
+++ b/cpucount.c
@@ -0,0 +1,12 @@
+/**
+ Basic script for checking number of available CPU cores.
+
+ Used by tests to spawn an appropriate number of threads.
+ */
+
+#include <unistd.h>
+#include <stdio.h>
+
+int main() {
+ printf("%i\n", sysconf(_SC_NPROCESSORS_ONLN));
+}
diff --git a/module/hnh/util/coverage.scm b/module/hnh/util/coverage.scm
new file mode 100644
index 00000000..9349c3a1
--- /dev/null
+++ b/module/hnh/util/coverage.scm
@@ -0,0 +1,106 @@
+(define-module (hnh util coverage)
+ :use-module ((hnh util) :select (group-by))
+ :use-module (hnh util type)
+ :use-module (hnh util lens)
+ :use-module (hnh util object)
+ :use-module (srfi srfi-1)
+ :use-module (srfi srfi-88)
+ :use-module (ice-9 match)
+ :use-module ((ice-9 regex) :select (string-match match:substring))
+ :export (coverage-info
+ coverage-info?
+ filename lines total-lines hit-lines
+ output-coverage
+ parse-coverage
+ merge-coverage))
+
+
+(define-type (coverage-info)
+ (filename type: string? default: "NO_FILE")
+ (lines type: (list-of (pair-of integer? integer?))
+ default: '())
+ (total-lines type: integer? default: 0)
+ (hit-lines type: integer? default: 0))
+
+(define* (output-coverage coverage optional: (port (current-output-port)))
+ (typecheck coverage coverage-info?)
+ (format port "SF:~a~%" (filename coverage))
+ (for-each (lambda (line)
+ (format port "DA:~a,~a~%" (car line) (cdr line)))
+ (lines coverage))
+ (format port "LH: ~a~%" (hit-lines coverage))
+ (format port "LF: ~a~%" (total-lines coverage))
+ (format port "end_of_record~%"))
+
+;;; Parses a single line from a coverage file
+(define (parse-coverage-line line)
+ (cond ((string-match "^DA:([0-9]+),([0-9]+)$" line)
+ => (lambda (m)
+ (let ((line (string->number (match:substring m 1)))
+ (hits (string->number (match:substring m 2))))
+ (list 'DA line hits))))
+ ((string-match "^SF:(.*)$" line)
+ => (lambda (m)
+ (let ((source-file (match:substring m 1)))
+ (list 'SF source-file))))
+ ((string-match "^LH: ([0-9]+)$" line)
+ => (lambda (m)
+ (let ((hit (string->number (match:substring m 1))))
+ (list 'LH hit))))
+ ((string-match "LF: ([0-9]+)$" line)
+ => (lambda (m)
+ (let ((lines (string->number (match:substring m 1))))
+ (list 'LF lines))))
+ ((string-match "^end_of_record$" line)
+ => (lambda (m) '(end-of-record)))
+ (else (scm-error 'no-match "parse-coverage-line"
+ "Got unknown when parsing coverage data: ~s"
+ (list line)
+ #f))))
+
+(define (parse-coverage string)
+ (cdr
+ (fold (lambda (line state)
+ (match (parse-coverage-line line)
+ (('DA line hits)
+ (modify state (compose-lenses car* lines)
+ (lambda (lines) (cons (cons line hits) lines))))
+ (('SF source)
+ (set state (compose-lenses car* filename) source))
+ (('LH hit)
+ (set state (compose-lenses car* hit-lines) hit))
+ (('LF lines)
+ (set state (compose-lenses car* total-lines) lines))
+ (('end-of-record)
+ (cons (coverage-info) state))))
+ (list (coverage-info))
+ ;; First line is simply "TN:", discard it
+ (remove string-null? (cdr (string-split string #\newline))))))
+
+
+(define (merge-coverage a b)
+ (typecheck a coverage-info?)
+ (typecheck b coverage-info?)
+ (unless (string=? (filename a) (filename b))
+ (scm-error 'misc-error "merge-coverage"
+ "Can only merge coverage data for the same file, got ~s and ~s"
+ (list (filename a) (filename b))
+ #f))
+ (unless (= (total-lines a) (total-lines b))
+ (scm-error 'misc-error "merge-coverage"
+ "Mismatch between found lines. Is it really the same file? File: ~s, got ~s and ~s"
+ (list (filename a) (total-lines a) (total-lines b))
+ #f))
+
+ (define merged-lines
+ (map (lambda (group)
+ (cons (car group)
+ (apply + (map cdr (cdr group)))))
+ (group-by car (append (lines a) (lines b)))))
+
+ (coverage-info
+ filename: (filename a)
+ lines: merged-lines
+ total-lines: (length merged-lines)
+ hit-lines: (length (remove (compose zero? cdr)
+ merged-lines))))
diff --git a/testrunner.scm b/testrunner.scm
new file mode 100755
index 00000000..c3fa0ae3
--- /dev/null
+++ b/testrunner.scm
@@ -0,0 +1,299 @@
+#!/usr/bin/env bash
+# -*- mode: scheme; geiser-scheme-implementation: guile -*-
+
+make calp unit-test-deps
+
+root=$(dirname "$(realpath "$0")")
+eval "$(env __PRINT_ENVIRONMENT=1 ${root}/calp)"
+
+
+exec "$GUILE" --debug --no-auto-compile -e main -s "$0" "$@"
+!#
+
+;;; Commentary:
+;;; Code:
+
+(use-modules (glob)
+ (system vm coverage)
+ (srfi srfi-1)
+ (srfi srfi-18)
+ (srfi srfi-64)
+ (srfi srfi-71)
+ ((hnh util) :select (->> for group-by))
+ (hnh util path)
+ (hnh util type)
+ ((hnh util lens) :select (modify cdr* car* compose-lenses))
+ (hnh util object)
+ (hnh util coverage)
+ (ice-9 getopt-long)
+ (ice-9 control)
+ (ice-9 format))
+
+
+
+(define-syntax with-mutex
+ (syntax-rules ()
+ ((_ mutex body ...)
+ (dynamic-wind
+ (lambda () (mutex-lock! mutex))
+ (lambda () body ...)
+ (lambda () (mutex-unlock! mutex))))))
+
+(define-syntax-rule (begin-thread forms ...)
+ (let ((thread (make-thread (lambda () forms ...))))
+ (thread-start! thread)
+ thread))
+
+
+
+(define print
+ (let ((lock (make-mutex)))
+ (lambda (string)
+ (with-mutex lock
+ (display string)))))
+
+(define (println x) (print (format #f "~a~%" x)))
+
+(define (module->source-file module-name)
+ ;; Guile has `module-filepath` built in, but that returns paths relative
+ ;; to ONE of the items in %load-path, and we wont know which one.
+ (realpath
+ (string-append
+ (path-join
+ (cons "module"
+ (map symbol->string module-name)))
+ ".scm")))
+
+(define current-filename (make-parameter #f))
+
+(define (construct-test-runner)
+ (define runner (test-runner-null))
+ (test-runner-aux-value!
+ runner
+ `((thread-name . ,(thread-name (current-thread)))))
+ #;
+ (test-runner-on-test-begin! runner
+ (lambda (runner)
+ (test-runner-aux-value! runner #t)))
+ (test-runner-on-test-end! runner
+ (lambda (runner)
+ (case (test-result-kind runner)
+ ((pass)
+ (if (getenv "VERBOSE")
+ (println (format #f "~a SUCCEED ~a"
+ (current-filename)
+ (test-runner-test-name runner)))
+ (display #\#)))
+ ((fail)
+ (println (format #f "~a FAIL ~a"
+ (current-filename)
+ (test-runner-test-name runner))))
+ ((xpass xfail skip)
+ (println (format #f "~a ~a ~a"
+ (current-filename)
+ (test-result-kind runner)
+ (test-runner-test-name runner)))))))
+ runner)
+
+
+(define (test-runner-processed runner)
+ (+ (test-runner-pass-count runner)
+ (test-runner-fail-count runner)
+ (test-runner-xfail-count runner)
+ (test-runner-skip-count runner)))
+
+
+;;; TODO this procedure is also present (albeit embedded) in (hnh test testrunner). Make it a procedure
+(define (test-runner-test-description runner)
+ (format #f
+ "~a (~a) ~a"
+ (assoc-ref (test-runner-aux-value runner) 'thread-name)
+ (test-runner-processed runner)
+ (cond ((test-runner-test-name runner)
+ (negate string-null?) => identity)
+ (else
+ (string-join (test-runner-group-path runner) " → ")))))
+
+(define runners '())
+(define runner-mutex (make-mutex))
+(sigaction SIGINT
+(lambda _
+ (display
+ (string-join (map test-runner-test-description runners) "\n"))))
+
+
+(define-type (job)
+ (jobname type: string?)
+ (job-thunk type: thunk?))
+
+
+(define* (maybe-with-code-coverage thunk key: (coverage? #f))
+ (if coverage?
+ (with-code-coverage
+ (lambda () (catch #t thunk (lambda _ #f))))
+ (values #f (catch #t thunk (lambda _ #f)))))
+
+(define* (prepare-jobs test-files key: (coverage? #f))
+ (for entry in test-files
+ (job
+ jobname: (basename entry)
+ job-thunk:
+ (lambda ()
+ (parameterize ((current-filename (basename entry)))
+ (test-begin entry)
+ (with-mutex runner-mutex
+ (set! runners (cons (test-runner-get) runners)))
+ (let ((coverage module-names
+ (maybe-with-code-coverage
+ (lambda () (load entry))
+ coverage?: coverage?)))
+ (let ((tested-files (map module->source-file module-names)))
+ (test-end entry)
+ (println (format #f "Completed ~a" entry))
+ (if coverage
+ (let ((lcov-data
+ (call-with-output-string
+ (lambda (port) (coverage-data->lcov coverage port)))))
+ (filter (lambda (coverage)
+ (member (filename coverage)
+ tested-files))
+ (parse-coverage lcov-data)))
+ '()))))))))
+
+
+(define* (make-work-pool jobs key: (thread-count 1))
+ (define job-pool jobs)
+ (define pool-mutex (make-mutex))
+
+ (define results (list))
+ (define results-mutex (make-mutex))
+
+ (define (pool-worker)
+ (call/ec
+ (lambda (return)
+ (while #t
+ (let ((job (with-mutex pool-mutex
+ (if (null? job-pool)
+ (return #f)
+ (let ((job (car job-pool)))
+ (set! job-pool (cdr job-pool))
+ job)))))
+ (catch #t
+ (lambda ()
+ (let ((result ((job-thunk job))))
+ (with-mutex results-mutex
+ (set! results (cons result results)))))
+ (lambda args
+ (println (format #f "Job [~a] failed: ~s"
+ (jobname job)
+ ;; TODO better error formatting
+ args)))))))))
+
+ (define threads (map (lambda (i) (make-thread pool-worker (format #f "Worker ~a" i)))
+ (iota thread-count)))
+
+ (for-each thread-start! threads)
+
+ (begin-thread (for-each thread-join! threads)
+ results))
+
+
+;;; Checks if the given argument is truthy.
+;;; Raises 'wrong-number-of-args otherwise.
+(define-syntax-rule (assert-arg name)
+ (unless name
+ (scm-error 'wrong-number-of-args "run-tests"
+ "Missing required argument ~a"
+ '(name) #f)))
+
+
+
+
+(define option-spec
+ '((help (single-char #\h))
+ (verbose (single-char #\v))
+ (suite (value #t))
+ (file (value #t))
+ (list (single-char #\l))
+ (nice (value #t))
+ (threads (value #t))
+ (coverage (value optional))
+ ))
+
+(define help "
+run-unit-tests [flags ...]
+
+Run calp's unit tests. While running, Ctrl-C prints the current
+status of each file's tests.
+
+Flags:
+--help|-h
+ print this help
+--verbose|-v
+ Enables verbose output. This can also be done by setting the
+ environment variable VERBOSE.
+--suite
+ Limit execution to a single test suite. Should be given as a
+ directory, and that directory should contain a number of test
+ files. See files in tests/unit for available suites.
+ Mutualy exclusive with --file.
+--file
+ Only runs tests from the given file.
+ Mutually exlusive with --suite.
+--list|-l
+ Don't run test, but list all files which would have been ran.
+--nice
+ How much do incrument the nice value
+--threads
+ How many threads to spawn for running tests.
+--coverage [output-filename]
+ Generate code coverage data, this causes the tests to be quite
+ a bit slower.
+")
+
+
+(define (main args)
+ (define options (getopt-long args option-spec))
+
+ (when (option-ref options 'help #f)
+ (display help)
+ (exit 0))
+
+ (when (option-ref options 'verbose #f)
+ (setenv "VERBOSE" "1"))
+
+ (define test-files
+ (cond ((option-ref options 'suite #f)
+ => (lambda (suite)
+ (glob (path-append suite "*"))))
+ ((option-ref options 'file #f) => list)
+ (else (glob "tests/unit/**/*.scm"))))
+
+ (nice (string->number (option-ref options 'nice "10")))
+
+ (test-runner-factory construct-test-runner)
+
+ (define coverage
+ (let ((cov (option-ref options 'coverage #f)))
+ (cond ((string? cov) cov)
+ (cov "coverage.info")
+ (else #f))))
+
+ ((@ (hnh util exceptions) warnings-are-errors) #t)
+
+ (if (option-ref options 'list #f)
+ (format #t "Gathered the following tests:~%~y~%" test-files)
+ (let ((results (thread-join!
+ (make-work-pool
+ (prepare-jobs test-files coverage?: coverage)
+ thread-count: (string->number
+ (option-ref options 'threads "1"))))))
+ (define merged-coverages
+ (map (lambda (group) (reduce merge-coverage #f (cdr group)))
+ (group-by filename (concatenate results))))
+
+ (unless (null? merged-coverages)
+ (with-output-to-file coverage
+ (lambda ()
+ (display "TN:") (newline)
+ (for-each output-coverage merged-coverages)))))))
diff --git a/tests/test/html/caltable.scm b/tests/html-components/caltable.scm
index fec1ace4..fec1ace4 100644
--- a/tests/test/html/caltable.scm
+++ b/tests/html-components/caltable.scm
diff --git a/tests/test/html/component.scm b/tests/html-components/component.scm
index a1fbdfbc..a1fbdfbc 100644
--- a/tests/test/html/component.scm
+++ b/tests/html-components/component.scm
diff --git a/tests/run-tests.scm b/tests/run-tests.scm
deleted file mode 100755
index 83006035..00000000
--- a/tests/run-tests.scm
+++ /dev/null
@@ -1,179 +0,0 @@
-#!/usr/bin/env bash
-# -*- mode: scheme; geiser-scheme-implementation: guile -*-
-
-root=$(dirname "$(dirname "$(realpath "$0")")")
-eval "$(env __PRINT_ENVIRONMENT=1 ${root}/calp)"
-
-if [ "$DEBUG" = '' ]; then
- exec $GUILE -s "$0" "$@"
-else
- exec $GUILE --debug -s "$0" "$@"
-fi
-!#
-
-(unless (getenv "CALP_TEST_ENVIRONMENT")
- (format (current-error-port) "Not running in test environment, abandoning~%")
- (exit 1))
-
-(format #t "current-filename = ~s~%" (current-filename))
-
-(define here (dirname (current-filename)))
-(use-modules (hnh util path))
-
-(use-modules (srfi srfi-1)
- (srfi srfi-64)
- (srfi srfi-88)
- ((hnh util io) :select (call-with-tmpfile))
- (ice-9 format)
- (ice-9 getopt-long)
- (ice-9 match)
- (ice-9 regex)
- ((ice-9 popen)
- :select (open-pipe*
- close-pipe))
- ((ice-9 rdelim) :select (read-string))
- (system vm coverage)
- ((hnh module-introspection all-modules) :select (fs-find))
-
- (hnh test testrunner)
- )
-
-
-
-(test-runner-factory construct-test-runner)
-
-
-
-(define (rework-coverage data)
- (define-values (module-files module-names)
- ((@ (all-modules) all-modules-under-directory)
- (path-append (dirname here) "module")))
-
- (define to-drop
- (1+ (length
- (take-while (lambda (p) (not (string=? p "module")))
- (path-split (car module-files))))))
-
- (define (drop-components path-list)
- (drop path-list to-drop))
-
- (define target-ht (make-hash-table))
- (define source-ht ((@@ (system vm coverage) data-file->line-counts) data))
- (for-each (lambda (path)
- (cond ((hash-ref source-ht path #f)
- => (lambda (value) (hash-set! target-ht path value)))))
- (map (compose path-join drop-components path-split) module-files))
-
- ((@@ (system vm coverage) %make-coverage-data)
- ((@@ (system vm coverage) data-ip-counts) data)
- ((@@ (system vm coverage) data-sources) data)
- ((@@ (system vm coverage) data-file->procedures) data)
- target-ht))
-
-
-
-
-(define option-spec
- '((skip (value #t))
- (only (value #t))
- (verbose (single-char #\v))
- (coverage (value optional))
- (catch)))
-
-(define options (getopt-long (command-line) option-spec))
-
-(define coverage-dest (option-ref options 'coverage #f))
-
-(when (option-ref options 'verbose #f)
- (verbose? #t))
-
-
-
-(define re (make-regexp "\\.scm$"))
-(define files (map car
- (filter (match-lambda ((filename _ 'regular)
- (regexp-exec re filename))
- (_ #f))
- (fs-find (path-append here "test")))))
-
-;; (format #t "Running on:~%~y~%" files)
-
-
-((@ (hnh util exceptions) warnings-are-errors) #t)
-
-(define finalizer
- (if coverage-dest
- (lambda (thunk)
- (define-values (coverage _) (with-code-coverage thunk))
-
- (let ((limited-coverage (rework-coverage coverage)))
- (call-with-output-file coverage-dest
- (lambda (port) (coverage-data->lcov limited-coverage port))))
-
- (format #t "Wrote coverage data to ~a~%" coverage-dest))
- (lambda (thunk) (thunk))
- ))
-
-;;; Catch/print-trace should intercept thrown exceptions, print them prettily with a stack trace, and then continue
-
-
-
-(define catch/print-trace
- (if (option-ref options 'catch #f)
- (lambda (proc)
- (catch #t proc
- (case-lambda
- ((err from msg args data)
- (test-assert (format #f "~a in ~a: ~?" err from msg args)
- #f))
- (args
- (test-assert (format #f "~s" args)
- #f)))))
- (lambda (proc) (proc))))
-
-#;
-(define (catch/print-trace proc)
- (proc))
-
-(test-begin "suite")
-
-
-(define onlies
- (let %loop ((args (command-line)) (onlies '()))
- (define* (loop args key: only)
- (if only
- (%loop args (cons only onlies))
- (%loop args onlies)))
- (if (null? args)
- onlies
- (cond ((string-match "^--skip(=(.*))?$" (car args))
- => (lambda (m)
- (cond ((match:substring m 2)
- => (lambda (s)
- (format #t "Skipping ~s~%" s)
- (test-skip s)
- (loop (cdr args))))
- (else (format #t "Skipping ~s~%" (cadr args))
- (test-skip (cadr args))
- (loop (cddr args))))))
- ((string-match "^--only(=(.*))?$" (car args))
- => (lambda (m)
- (cond ((match:substring m 2)
- => (lambda (s)
- (loop (cdr args) only: s)))
- (else (loop (cddr args) only: (cadr args))))))
- (else (loop (cdr args)))))))
-
-(unless (null? onlies)
- (set! files
- (map (lambda (x) (path-append "test" x))
- ;; reverse only until I have built a dependency graph for tests
- (reverse onlies))))
-
-(finalizer (lambda () (for-each (lambda (f) (catch/print-trace (lambda () (test-group f (load f)))))
- files)))
-
-(test-end "suite")
-
-(newline)
-
diff --git a/tests/test/data-stores/file.scm b/tests/test/data-stores/file.scm
deleted file mode 100644
index e69de29b..00000000
--- a/tests/test/data-stores/file.scm
+++ /dev/null
diff --git a/tests/test/data-stores/sqlite.scm b/tests/test/data-stores/sqlite.scm
deleted file mode 100644
index e69de29b..00000000
--- a/tests/test/data-stores/sqlite.scm
+++ /dev/null
diff --git a/tests/test/data-stores/vdir.scm b/tests/test/data-stores/vdir.scm
deleted file mode 100644
index e69de29b..00000000
--- a/tests/test/data-stores/vdir.scm
+++ /dev/null
diff --git a/tests/test/recurrence-advanced.scm b/tests/test/recurrence-advanced.scm
deleted file mode 100644
index c2d71e61..00000000
--- a/tests/test/recurrence-advanced.scm
+++ /dev/null
@@ -1,1550 +0,0 @@
-;;; Commentary:
-;; Tests of recurrence rule generation with focus on correct instances
-;; being generated. For tests of basic recurrence functionallity, see
-;; recurrence-simple.scm.
-;;
-;; This file also tests format-recurrence-rule, which checks that human
-;; readable representations of the RRULES work.
-;;
-;; Also contains the tests for EXDATE.
-;;
-;; Most examples copied from RFC5545, some home written.
-;;; Code:
-
-(define-module (test recurrence-advanced)
- :use-module (srfi srfi-64)
- :use-module (srfi srfi-88)
- :use-module ((vcomponent recurrence)
- :select (make-recur-rule))
- :use-module ((vcomponent recurrence generate)
- :select (generate-recurrence-set))
- :use-module ((vcomponent recurrence display)
- :select (format-recurrence-rule))
- :use-module ((vcomponent recurrence internal)
- :select (count until))
- :use-module ((vcomponent base)
- :select (prop prop* extract))
- :use-module (vcomponent create)
- :use-module ((datetime)
- :select (parse-ics-datetime
- datetime
- datetime-date
- time
- date
- jan feb mar apr may jun jul aug sep oct nov dec
- mon tue wed thu fri sat sun
- datetime->string))
- :use-module ((hnh util) :select (-> set!))
- :use-module ((srfi srfi-41) :select (stream->list))
- :use-module ((srfi srfi-88) :select (keyword->string)))
-
-(test-expect-fail "REC: The third instance into the month of one of Tuesday, Wednesday, or Thursday, for the next 3 months")
-
-(test-expect-fail "STR: The third instance into the month of one of Tuesday, Wednesday, or Thursday, for the next 3 months")
-
-(test-expect-fail "REC: The second-to-last weekday of the month")
-
-(test-expect-fail "STR: The second-to-last weekday of the month")
-
-;; TODO this test is really slow, figure out why (takes approx. 25s to run)
-(test-skip "REC: Every day in January, for 3 years (alt 2)")
-
-(define (run-test comp)
- (test-equal
- (string-append "REC: " (prop comp 'SUMMARY))
- (prop comp 'X-SET)
- (let ((r (generate-recurrence-set comp)))
- (map (extract 'DTSTART)
- (if (or (until (prop comp 'RRULE))
- (count (prop comp 'RRULE)))
- (stream->list r)
- (stream->list 20 r)))))
- (test-equal
- (string-append "STR: " (prop comp 'SUMMARY))
- (prop comp 'X-SUMMARY)
- ;; TODO setting language='en causes messages to be in english, but date
- ;; strings still format LC_TIME (which I have set to swedish)...
- ;; TODO possibly test with other languages
- (format-recurrence-rule (prop comp 'RRULE) 'sv)))
-
-(map run-test
- (list (vevent
- summary:
- "Daily for 10 occurrences"
- dtstart:
- #1997-09-02T09:00:00
- rrule:
- (make-recur-rule
- freq: 'DAILY
- count: 10)
- x-summary:
- "dagligen, totalt 10 gånger"
- x-set:
- (list #1997-09-02T09:00:00
- #1997-09-03T09:00:00
- #1997-09-04T09:00:00
- #1997-09-05T09:00:00
- #1997-09-06T09:00:00
- #1997-09-07T09:00:00
- #1997-09-08T09:00:00
- #1997-09-09T09:00:00
- #1997-09-10T09:00:00
- #1997-09-11T09:00:00))
- (vevent
- summary:
- "Daily until December 24, 1997"
- dtstart:
- #1997-09-02T09:00:00
- rrule:
- (make-recur-rule
- freq: 'DAILY
- until: #1997-12-24T00:00:00Z)
- x-summary:
- "dagligen, till och med den 24 december, 1997 kl. 0:00"
- x-set:
- (list #1997-09-02T09:00:00
- #1997-09-03T09:00:00
- #1997-09-04T09:00:00
- #1997-09-05T09:00:00
- #1997-09-06T09:00:00
- #1997-09-07T09:00:00
- #1997-09-08T09:00:00
- #1997-09-09T09:00:00
- #1997-09-10T09:00:00
- #1997-09-11T09:00:00
- #1997-09-12T09:00:00
- #1997-09-13T09:00:00
- #1997-09-14T09:00:00
- #1997-09-15T09:00:00
- #1997-09-16T09:00:00
- #1997-09-17T09:00:00
- #1997-09-18T09:00:00
- #1997-09-19T09:00:00
- #1997-09-20T09:00:00
- #1997-09-21T09:00:00
- #1997-09-22T09:00:00
- #1997-09-23T09:00:00
- #1997-09-24T09:00:00
- #1997-09-25T09:00:00
- #1997-09-26T09:00:00
- #1997-09-27T09:00:00
- #1997-09-28T09:00:00
- #1997-09-29T09:00:00
- #1997-09-30T09:00:00
- #1997-10-01T09:00:00
- #1997-10-02T09:00:00
- #1997-10-03T09:00:00
- #1997-10-04T09:00:00
- #1997-10-05T09:00:00
- #1997-10-06T09:00:00
- #1997-10-07T09:00:00
- #1997-10-08T09:00:00
- #1997-10-09T09:00:00
- #1997-10-10T09:00:00
- #1997-10-11T09:00:00
- #1997-10-12T09:00:00
- #1997-10-13T09:00:00
- #1997-10-14T09:00:00
- #1997-10-15T09:00:00
- #1997-10-16T09:00:00
- #1997-10-17T09:00:00
- #1997-10-18T09:00:00
- #1997-10-19T09:00:00
- #1997-10-20T09:00:00
- #1997-10-21T09:00:00
- #1997-10-22T09:00:00
- #1997-10-23T09:00:00
- #1997-10-24T09:00:00
- #1997-10-25T09:00:00
- #1997-10-26T09:00:00
- #1997-10-27T09:00:00
- #1997-10-28T09:00:00
- #1997-10-29T09:00:00
- #1997-10-30T09:00:00
- #1997-10-31T09:00:00
- #1997-11-01T09:00:00
- #1997-11-02T09:00:00
- #1997-11-03T09:00:00
- #1997-11-04T09:00:00
- #1997-11-05T09:00:00
- #1997-11-06T09:00:00
- #1997-11-07T09:00:00
- #1997-11-08T09:00:00
- #1997-11-09T09:00:00
- #1997-11-10T09:00:00
- #1997-11-11T09:00:00
- #1997-11-12T09:00:00
- #1997-11-13T09:00:00
- #1997-11-14T09:00:00
- #1997-11-15T09:00:00
- #1997-11-16T09:00:00
- #1997-11-17T09:00:00
- #1997-11-18T09:00:00
- #1997-11-19T09:00:00
- #1997-11-20T09:00:00
- #1997-11-21T09:00:00
- #1997-11-22T09:00:00
- #1997-11-23T09:00:00
- #1997-11-24T09:00:00
- #1997-11-25T09:00:00
- #1997-11-26T09:00:00
- #1997-11-27T09:00:00
- #1997-11-28T09:00:00
- #1997-11-29T09:00:00
- #1997-11-30T09:00:00
- #1997-12-01T09:00:00
- #1997-12-02T09:00:00
- #1997-12-03T09:00:00
- #1997-12-04T09:00:00
- #1997-12-05T09:00:00
- #1997-12-06T09:00:00
- #1997-12-07T09:00:00
- #1997-12-08T09:00:00
- #1997-12-09T09:00:00
- #1997-12-10T09:00:00
- #1997-12-11T09:00:00
- #1997-12-12T09:00:00
- #1997-12-13T09:00:00
- #1997-12-14T09:00:00
- #1997-12-15T09:00:00
- #1997-12-16T09:00:00
- #1997-12-17T09:00:00
- #1997-12-18T09:00:00
- #1997-12-19T09:00:00
- #1997-12-20T09:00:00
- #1997-12-21T09:00:00
- #1997-12-22T09:00:00
- #1997-12-23T09:00:00))
- (vevent
- summary:
- "Every other day - forever"
- dtstart:
- #1997-09-02T09:00:00
- rrule:
- (make-recur-rule
- freq: 'DAILY
- interval: 2)
- x-summary:
- "varannan dag"
- x-set:
- (list #1997-09-02T09:00:00
- #1997-09-04T09:00:00
- #1997-09-06T09:00:00
- #1997-09-08T09:00:00
- #1997-09-10T09:00:00
- #1997-09-12T09:00:00
- #1997-09-14T09:00:00
- #1997-09-16T09:00:00
- #1997-09-18T09:00:00
- #1997-09-20T09:00:00
- #1997-09-22T09:00:00
- #1997-09-24T09:00:00
- #1997-09-26T09:00:00
- #1997-09-28T09:00:00
- #1997-09-30T09:00:00
- #1997-10-02T09:00:00
- #1997-10-04T09:00:00
- #1997-10-06T09:00:00
- #1997-10-08T09:00:00
- #1997-10-10T09:00:00))
- (vevent
- summary:
- "Every 10 days, 5 occurrences"
- dtstart:
- #1997-09-02T09:00:00
- rrule:
- (make-recur-rule
- freq: 'DAILY
- interval: 10
- count: 5)
- x-summary:
- "var tionde dag, totalt 5 gånger"
- x-set:
- (list #1997-09-02T09:00:00
- #1997-09-12T09:00:00
- #1997-09-22T09:00:00
- #1997-10-02T09:00:00
- #1997-10-12T09:00:00))
- (vevent
- summary:
- "Every day in January, for 3 years (alt 1)"
- dtstart:
- #1998-01-01T09:00:00
- rrule:
- (make-recur-rule
- freq: 'YEARLY
- until: #2000-01-31T14:00:00Z
- bymonth: (list jan)
- byday: (list sun mon tue wed thu fri sat))
- x-summary:
- "varje lördag, fredag, torsdag, onsdag, tisdag, måndag & söndag i januari, årligen, till och med den 31 januari, 2000 kl. 14:00"
- x-set:
- (list #1998-01-01T09:00:00
- #1998-01-02T09:00:00
- #1998-01-03T09:00:00
- #1998-01-04T09:00:00
- #1998-01-05T09:00:00
- #1998-01-06T09:00:00
- #1998-01-07T09:00:00
- #1998-01-08T09:00:00
- #1998-01-09T09:00:00
- #1998-01-10T09:00:00
- #1998-01-11T09:00:00
- #1998-01-12T09:00:00
- #1998-01-13T09:00:00
- #1998-01-14T09:00:00
- #1998-01-15T09:00:00
- #1998-01-16T09:00:00
- #1998-01-17T09:00:00
- #1998-01-18T09:00:00
- #1998-01-19T09:00:00
- #1998-01-20T09:00:00
- #1998-01-21T09:00:00
- #1998-01-22T09:00:00
- #1998-01-23T09:00:00
- #1998-01-24T09:00:00
- #1998-01-25T09:00:00
- #1998-01-26T09:00:00
- #1998-01-27T09:00:00
- #1998-01-28T09:00:00
- #1998-01-29T09:00:00
- #1998-01-30T09:00:00
- #1998-01-31T09:00:00
- #1999-01-01T09:00:00
- #1999-01-02T09:00:00
- #1999-01-03T09:00:00
- #1999-01-04T09:00:00
- #1999-01-05T09:00:00
- #1999-01-06T09:00:00
- #1999-01-07T09:00:00
- #1999-01-08T09:00:00
- #1999-01-09T09:00:00
- #1999-01-10T09:00:00
- #1999-01-11T09:00:00
- #1999-01-12T09:00:00
- #1999-01-13T09:00:00
- #1999-01-14T09:00:00
- #1999-01-15T09:00:00
- #1999-01-16T09:00:00
- #1999-01-17T09:00:00
- #1999-01-18T09:00:00
- #1999-01-19T09:00:00
- #1999-01-20T09:00:00
- #1999-01-21T09:00:00
- #1999-01-22T09:00:00
- #1999-01-23T09:00:00
- #1999-01-24T09:00:00
- #1999-01-25T09:00:00
- #1999-01-26T09:00:00
- #1999-01-27T09:00:00
- #1999-01-28T09:00:00
- #1999-01-29T09:00:00
- #1999-01-30T09:00:00
- #1999-01-31T09:00:00
- #2000-01-01T09:00:00
- #2000-01-02T09:00:00
- #2000-01-03T09:00:00
- #2000-01-04T09:00:00
- #2000-01-05T09:00:00
- #2000-01-06T09:00:00
- #2000-01-07T09:00:00
- #2000-01-08T09:00:00
- #2000-01-09T09:00:00
- #2000-01-10T09:00:00
- #2000-01-11T09:00:00
- #2000-01-12T09:00:00
- #2000-01-13T09:00:00
- #2000-01-14T09:00:00
- #2000-01-15T09:00:00
- #2000-01-16T09:00:00
- #2000-01-17T09:00:00
- #2000-01-18T09:00:00
- #2000-01-19T09:00:00
- #2000-01-20T09:00:00
- #2000-01-21T09:00:00
- #2000-01-22T09:00:00
- #2000-01-23T09:00:00
- #2000-01-24T09:00:00
- #2000-01-25T09:00:00
- #2000-01-26T09:00:00
- #2000-01-27T09:00:00
- #2000-01-28T09:00:00
- #2000-01-29T09:00:00
- #2000-01-30T09:00:00
- #2000-01-31T09:00:00))
- (vevent
- summary:
- "Every day in January, for 3 years (alt 2)"
- dtstart:
- #1998-01-01T09:00:00
- rrule:
- (make-recur-rule
- freq: 'DAILY
- until: #2000-01-31T14:00:00Z
- bymonth: 1)
- x-summary:
- "dagligen, till och med den 31 januari, 2000 kl. 14:00"
- x-set:
- (list #1998-01-01T09:00:00
- #1998-01-02T09:00:00
- #1998-01-03T09:00:00
- #1998-01-04T09:00:00
- #1998-01-05T09:00:00
- #1998-01-06T09:00:00
- #1998-01-07T09:00:00
- #1998-01-08T09:00:00
- #1998-01-09T09:00:00
- #1998-01-10T09:00:00
- #1998-01-11T09:00:00
- #1998-01-12T09:00:00
- #1998-01-13T09:00:00
- #1998-01-14T09:00:00
- #1998-01-15T09:00:00
- #1998-01-16T09:00:00
- #1998-01-17T09:00:00
- #1998-01-18T09:00:00
- #1998-01-19T09:00:00
- #1998-01-20T09:00:00
- #1998-01-21T09:00:00
- #1998-01-22T09:00:00
- #1998-01-23T09:00:00
- #1998-01-24T09:00:00
- #1998-01-25T09:00:00
- #1998-01-26T09:00:00
- #1998-01-27T09:00:00
- #1998-01-28T09:00:00
- #1998-01-29T09:00:00
- #1998-01-30T09:00:00
- #1998-01-31T09:00:00
- #1999-01-01T09:00:00
- #1999-01-02T09:00:00
- #1999-01-03T09:00:00
- #1999-01-04T09:00:00
- #1999-01-05T09:00:00
- #1999-01-06T09:00:00
- #1999-01-07T09:00:00
- #1999-01-08T09:00:00
- #1999-01-09T09:00:00
- #1999-01-10T09:00:00
- #1999-01-11T09:00:00
- #1999-01-12T09:00:00
- #1999-01-13T09:00:00
- #1999-01-14T09:00:00
- #1999-01-15T09:00:00
- #1999-01-16T09:00:00
- #1999-01-17T09:00:00
- #1999-01-18T09:00:00
- #1999-01-19T09:00:00
- #1999-01-20T09:00:00
- #1999-01-21T09:00:00
- #1999-01-22T09:00:00
- #1999-01-23T09:00:00
- #1999-01-24T09:00:00
- #1999-01-25T09:00:00
- #1999-01-26T09:00:00
- #1999-01-27T09:00:00
- #1999-01-28T09:00:00
- #1999-01-29T09:00:00
- #1999-01-30T09:00:00
- #1999-01-31T09:00:00
- #2000-01-01T09:00:00
- #2000-01-02T09:00:00
- #2000-01-03T09:00:00
- #2000-01-04T09:00:00
- #2000-01-05T09:00:00
- #2000-01-06T09:00:00
- #2000-01-07T09:00:00
- #2000-01-08T09:00:00
- #2000-01-09T09:00:00
- #2000-01-10T09:00:00
- #2000-01-11T09:00:00
- #2000-01-12T09:00:00
- #2000-01-13T09:00:00
- #2000-01-14T09:00:00
- #2000-01-15T09:00:00
- #2000-01-16T09:00:00
- #2000-01-17T09:00:00
- #2000-01-18T09:00:00
- #2000-01-19T09:00:00
- #2000-01-20T09:00:00
- #2000-01-21T09:00:00
- #2000-01-22T09:00:00
- #2000-01-23T09:00:00
- #2000-01-24T09:00:00
- #2000-01-25T09:00:00
- #2000-01-26T09:00:00
- #2000-01-27T09:00:00
- #2000-01-28T09:00:00
- #2000-01-29T09:00:00
- #2000-01-30T09:00:00
- #2000-01-31T09:00:00))
- (vevent
- summary:
- "Weekly for 10 occurrences"
- dtstart:
- #1997-09-02T09:00:00
- rrule:
- (make-recur-rule
- freq: 'WEEKLY
- count: 10)
- x-summary:
- "varje vecka, totalt 10 gånger"
- x-set:
- (list #1997-09-02T09:00:00
- #1997-09-09T09:00:00
- #1997-09-16T09:00:00
- #1997-09-23T09:00:00
- #1997-09-30T09:00:00
- #1997-10-07T09:00:00
- #1997-10-14T09:00:00
- #1997-10-21T09:00:00
- #1997-10-28T09:00:00
- #1997-11-04T09:00:00))
- (vevent
- summary:
- "Weekly until December 24, 1997"
- dtstart:
- #1997-09-02T09:00:00
- rrule:
- (make-recur-rule
- freq: 'WEEKLY
- until: #1997-12-24T00:00:00Z)
- x-summary:
- "varje vecka, till och med den 24 december, 1997 kl. 0:00"
- x-set:
- (list #1997-09-02T09:00:00
- #1997-09-09T09:00:00
- #1997-09-16T09:00:00
- #1997-09-23T09:00:00
- #1997-09-30T09:00:00
- #1997-10-07T09:00:00
- #1997-10-14T09:00:00
- #1997-10-21T09:00:00
- #1997-10-28T09:00:00
- #1997-11-04T09:00:00
- #1997-11-11T09:00:00
- #1997-11-18T09:00:00
- #1997-11-25T09:00:00
- #1997-12-02T09:00:00
- #1997-12-09T09:00:00
- #1997-12-16T09:00:00
- #1997-12-23T09:00:00))
- (vevent
- summary:
- "Every other week - forever"
- dtstart:
- #1997-09-02T09:00:00
- rrule:
- (make-recur-rule
- freq: 'WEEKLY
- interval: 2
- wkst: sun)
- x-summary:
- "varannan vecka"
- x-set:
- (list #1997-09-02T09:00:00
- #1997-09-16T09:00:00
- #1997-09-30T09:00:00
- #1997-10-14T09:00:00
- #1997-10-28T09:00:00
- #1997-11-11T09:00:00
- #1997-11-25T09:00:00
- #1997-12-09T09:00:00
- #1997-12-23T09:00:00
- #1998-01-06T09:00:00
- #1998-01-20T09:00:00
- #1998-02-03T09:00:00
- #1998-02-17T09:00:00
- #1998-03-03T09:00:00
- #1998-03-17T09:00:00
- #1998-03-31T09:00:00
- #1998-04-14T09:00:00
- #1998-04-28T09:00:00
- #1998-05-12T09:00:00
- #1998-05-26T09:00:00))
- (vevent
- summary:
- "Weekly on Tuesday and Thursday for five weeks (alt 1)"
- dtstart:
- #1997-09-02T09:00:00
- rrule:
- (make-recur-rule
- freq: 'WEEKLY
- until: #1997-10-07T00:00:00Z
- wkst: sun
- byday: (list tue thu))
- x-summary:
- "varje tisdag & torsdag, till och med den 07 oktober, 1997 kl. 0:00"
- x-set:
- (list #1997-09-02T09:00:00
- #1997-09-04T09:00:00
- #1997-09-09T09:00:00
- #1997-09-11T09:00:00
- #1997-09-16T09:00:00
- #1997-09-18T09:00:00
- #1997-09-23T09:00:00
- #1997-09-25T09:00:00
- #1997-09-30T09:00:00
- #1997-10-02T09:00:00))
- (vevent
- summary:
- "Weekly on Tuesday and Thursday for five weeks (alt 2)"
- dtstart:
- #1997-09-02T09:00:00
- rrule:
- (make-recur-rule
- freq: 'WEEKLY
- count: 10
- wkst: sun
- byday: (list tue thu))
- x-summary:
- "varje tisdag & torsdag, totalt 10 gånger"
- x-set:
- (list #1997-09-02T09:00:00
- #1997-09-04T09:00:00
- #1997-09-09T09:00:00
- #1997-09-11T09:00:00
- #1997-09-16T09:00:00
- #1997-09-18T09:00:00
- #1997-09-23T09:00:00
- #1997-09-25T09:00:00
- #1997-09-30T09:00:00
- #1997-10-02T09:00:00))
- (vevent
- summary:
- "Every other week on Monday, Wednesday, and Friday until December 24, 1997, starting on Monday, September 1, 1997:"
- dtstart:
- #1997-09-01T09:00:00
- rrule:
- (make-recur-rule
- freq: 'WEEKLY
- interval: 2
- until: #1997-12-24T00:00:00Z
- wkst: sun
- byday: (list mon wed fri))
- x-summary:
- "varannan måndag, onsdag & fredag, till och med den 24 december, 1997 kl. 0:00"
- x-set:
- (list #1997-09-01T09:00:00
- #1997-09-03T09:00:00
- #1997-09-05T09:00:00
- #1997-09-15T09:00:00
- #1997-09-17T09:00:00
- #1997-09-19T09:00:00
- #1997-09-29T09:00:00
- #1997-10-01T09:00:00
- #1997-10-03T09:00:00
- #1997-10-13T09:00:00
- #1997-10-15T09:00:00
- #1997-10-17T09:00:00
- #1997-10-27T09:00:00
- #1997-10-29T09:00:00
- #1997-10-31T09:00:00
- #1997-11-10T09:00:00
- #1997-11-12T09:00:00
- #1997-11-14T09:00:00
- #1997-11-24T09:00:00
- #1997-11-26T09:00:00
- #1997-11-28T09:00:00
- #1997-12-08T09:00:00
- #1997-12-10T09:00:00
- #1997-12-12T09:00:00
- #1997-12-22T09:00:00))
- (vevent
- summary:
- "Every other week on Tuesday and Thursday, for 8 occurrences"
- dtstart:
- #1997-09-02T09:00:00
- rrule:
- (make-recur-rule
- freq: 'WEEKLY
- interval: 2
- count: 8
- wkst: sun
- byday: (list tue thu))
- x-summary:
- "varannan tisdag & torsdag, totalt 8 gånger"
- x-set:
- (list #1997-09-02T09:00:00
- #1997-09-04T09:00:00
- #1997-09-16T09:00:00
- #1997-09-18T09:00:00
- #1997-09-30T09:00:00
- #1997-10-02T09:00:00
- #1997-10-14T09:00:00
- #1997-10-16T09:00:00))
- (vevent
- summary:
- "Monthly on the first Friday for 10 occurrences"
- dtstart:
- #1997-09-05T09:00:00
- rrule:
- (make-recur-rule
- freq: 'MONTHLY
- count: 10
- byday: (list (cons 1 fri)))
- x-summary:
- "första fredagen varje månad, totalt 10 gånger"
- x-set:
- (list #1997-09-05T09:00:00
- #1997-10-03T09:00:00
- #1997-11-07T09:00:00
- #1997-12-05T09:00:00
- #1998-01-02T09:00:00
- #1998-02-06T09:00:00
- #1998-03-06T09:00:00
- #1998-04-03T09:00:00
- #1998-05-01T09:00:00
- #1998-06-05T09:00:00))
- (vevent
- summary:
- "Monthly on the first Friday until December 24, 1997"
- dtstart:
- #1997-09-05T09:00:00
- rrule:
- (make-recur-rule
- freq: 'MONTHLY
- until: #1997-12-24T00:00:00Z
- byday: (list (cons 1 fri)))
- x-summary:
- "första fredagen varje månad, till och med den 24 december, 1997 kl. 0:00"
- x-set:
- (list #1997-09-05T09:00:00
- #1997-10-03T09:00:00
- #1997-11-07T09:00:00
- #1997-12-05T09:00:00))
- (vevent
- summary:
- "Every other month on the first and last Sunday of the month for 10 occurrences"
- dtstart:
- #1997-09-07T09:00:00
- rrule:
- (make-recur-rule
- freq: 'MONTHLY
- interval: 2
- count: 10
- byday: (list (cons 1 sun)
- (cons -1 sun)))
- x-summary:
- "första söndagen samt sista söndagen varannan månad, totalt 10 gånger"
- x-set:
- (list #1997-09-07T09:00:00
- #1997-09-28T09:00:00
- #1997-11-02T09:00:00
- #1997-11-30T09:00:00
- #1998-01-04T09:00:00
- #1998-01-25T09:00:00
- #1998-03-01T09:00:00
- #1998-03-29T09:00:00
- #1998-05-03T09:00:00
- #1998-05-31T09:00:00))
- (vevent
- summary:
- "Monthly on the second-to-last Monday of the month for 6 months"
- dtstart:
- #1997-09-22T09:00:00
- rrule:
- (make-recur-rule
- freq: 'MONTHLY
- count: 6
- byday: (list (cons -2 mon)))
- x-summary:
- "näst sista måndagen varje månad, totalt 6 gånger"
- x-set:
- (list #1997-09-22T09:00:00
- #1997-10-20T09:00:00
- #1997-11-17T09:00:00
- #1997-12-22T09:00:00
- #1998-01-19T09:00:00
- #1998-02-16T09:00:00))
- (vevent
- summary:
- "Monthly on the third-to-the-last day of the month, forever"
- dtstart:
- #1997-09-28T09:00:00
- rrule:
- (make-recur-rule
- freq: 'MONTHLY
- bymonthday: (list -3))
- x-summary:
- "den tredje sista varje månad"
- x-set:
- (list #1997-09-28T09:00:00
- #1997-10-29T09:00:00
- #1997-11-28T09:00:00
- #1997-12-29T09:00:00
- #1998-01-29T09:00:00
- #1998-02-26T09:00:00
- #1998-03-29T09:00:00
- #1998-04-28T09:00:00
- #1998-05-29T09:00:00
- #1998-06-28T09:00:00
- #1998-07-29T09:00:00
- #1998-08-29T09:00:00
- #1998-09-28T09:00:00
- #1998-10-29T09:00:00
- #1998-11-28T09:00:00
- #1998-12-29T09:00:00
- #1999-01-29T09:00:00
- #1999-02-26T09:00:00
- #1999-03-29T09:00:00
- #1999-04-28T09:00:00))
- (vevent
- summary:
- "Monthly on the 2nd and 15th of the month for 10 occurrences"
- dtstart:
- #1997-09-02T09:00:00
- rrule:
- (make-recur-rule
- freq: 'MONTHLY
- count: 10
- bymonthday: (list 2 15))
- x-summary:
- "den andre & femtonde varje månad, totalt 10 gånger"
- x-set:
- (list #1997-09-02T09:00:00
- #1997-09-15T09:00:00
- #1997-10-02T09:00:00
- #1997-10-15T09:00:00
- #1997-11-02T09:00:00
- #1997-11-15T09:00:00
- #1997-12-02T09:00:00
- #1997-12-15T09:00:00
- #1998-01-02T09:00:00
- #1998-01-15T09:00:00))
- (vevent
- summary:
- "Monthly on the first and last day of the month for 10 occurrences"
- dtstart:
- #1997-09-30T09:00:00
- rrule:
- (make-recur-rule
- freq: 'MONTHLY
- count: 10
- bymonthday: (list 1 -1))
- x-summary:
- "den förste & sista varje månad, totalt 10 gånger"
- x-set:
- (list #1997-09-30T09:00:00
- #1997-10-01T09:00:00
- #1997-10-31T09:00:00
- #1997-11-01T09:00:00
- #1997-11-30T09:00:00
- #1997-12-01T09:00:00
- #1997-12-31T09:00:00
- #1998-01-01T09:00:00
- #1998-01-31T09:00:00
- #1998-03-01T09:00:00))
- (vevent
- summary:
- "Every 18 months on the 10th thru 15th of the month for 10 occurrences"
- dtstart:
- #1997-09-10T09:00:00
- rrule:
- (make-recur-rule
- freq: 'MONTHLY
- interval: 18
- count: 10
- bymonthday: (list 10 11 12 13 14 15))
- x-summary:
- "den tionde, elfte, tolfte, trettonde, fjortonde & femtonde var artonde månad, totalt 10 gånger"
- x-set:
- (list #1997-09-10T09:00:00
- #1997-09-11T09:00:00
- #1997-09-12T09:00:00
- #1997-09-13T09:00:00
- #1997-09-14T09:00:00
- #1997-09-15T09:00:00
- #1999-03-10T09:00:00
- #1999-03-11T09:00:00
- #1999-03-12T09:00:00
- #1999-03-13T09:00:00))
- (vevent
- summary:
- "Every Tuesday, every other month"
- dtstart:
- #1997-09-02T09:00:00
- rrule:
- (make-recur-rule
- freq: 'MONTHLY
- interval: 2
- byday: (list tue))
- x-summary:
- "varje tisdag varannan månad"
- x-set:
- (list #1997-09-02T09:00:00
- #1997-09-09T09:00:00
- #1997-09-16T09:00:00
- #1997-09-23T09:00:00
- #1997-09-30T09:00:00
- #1997-11-04T09:00:00
- #1997-11-11T09:00:00
- #1997-11-18T09:00:00
- #1997-11-25T09:00:00
- #1998-01-06T09:00:00
- #1998-01-13T09:00:00
- #1998-01-20T09:00:00
- #1998-01-27T09:00:00
- #1998-03-03T09:00:00
- #1998-03-10T09:00:00
- #1998-03-17T09:00:00
- #1998-03-24T09:00:00
- #1998-03-31T09:00:00
- #1998-05-05T09:00:00
- #1998-05-12T09:00:00))
- (vevent
- summary:
- "Yearly in June and July for 10 occurrences:\n: Since none of the BYDAY, BYMONTHDAY, or BYYEARDAY\nonents are specified, the day is gotten from \"DTSTART\""
- dtstart:
- #1997-06-10T09:00:00
- rrule:
- (make-recur-rule
- freq: 'YEARLY
- count: 10
- bymonth: (list 6 7))
- x-summary:
- "juni & juli, årligen, totalt 10 gånger"
- x-set:
- (list #1997-06-10T09:00:00
- #1997-07-10T09:00:00
- #1998-06-10T09:00:00
- #1998-07-10T09:00:00
- #1999-06-10T09:00:00
- #1999-07-10T09:00:00
- #2000-06-10T09:00:00
- #2000-07-10T09:00:00
- #2001-06-10T09:00:00
- #2001-07-10T09:00:00))
- (vevent
- summary:
- "Every other year on January, February, and March for 10 occurrences"
- dtstart:
- #1997-03-10T09:00:00
- rrule:
- (make-recur-rule
- freq: 'YEARLY
- interval: 2
- count: 10
- bymonth: (list jan feb mar))
- x-summary:
- "januari, februari & mars vartannat år, totalt 10 gånger"
- x-set:
- (list #1997-03-10T09:00:00
- #1999-01-10T09:00:00
- #1999-02-10T09:00:00
- #1999-03-10T09:00:00
- #2001-01-10T09:00:00
- #2001-02-10T09:00:00
- #2001-03-10T09:00:00
- #2003-01-10T09:00:00
- #2003-02-10T09:00:00
- #2003-03-10T09:00:00))
- (vevent
- summary:
- "Every third year on the 1st, 100th, and 200th day for 10 occurrences"
- dtstart:
- #1997-01-01T09:00:00
- rrule:
- (make-recur-rule
- freq: 'YEARLY
- interval: 3
- count: 10
- byyearday: (list 1 100 200))
- x-summary:
- "dag 1, 100 & 200 vart tredje år, totalt 10 gånger"
- x-set:
- (list #1997-01-01T09:00:00
- #1997-04-10T09:00:00
- #1997-07-19T09:00:00
- #2000-01-01T09:00:00
- #2000-04-09T09:00:00
- #2000-07-18T09:00:00
- #2003-01-01T09:00:00
- #2003-04-10T09:00:00
- #2003-07-19T09:00:00
- #2006-01-01T09:00:00))
- (vevent
- summary:
- "Every 20th Monday of the year, forever"
- dtstart:
- #1997-05-19T09:00:00
- rrule:
- (make-recur-rule
- freq: 'YEARLY
- byday: (list (cons 20 mon)))
- x-summary:
- "tjugonde måndagen, årligen"
- x-set:
- (list #1997-05-19T09:00:00
- #1998-05-18T09:00:00
- #1999-05-17T09:00:00
- #2000-05-15T09:00:00
- #2001-05-14T09:00:00
- #2002-05-20T09:00:00
- #2003-05-19T09:00:00
- #2004-05-17T09:00:00
- #2005-05-16T09:00:00
- #2006-05-15T09:00:00
- #2007-05-14T09:00:00
- #2008-05-19T09:00:00
- #2009-05-18T09:00:00
- #2010-05-17T09:00:00
- #2011-05-16T09:00:00
- #2012-05-14T09:00:00
- #2013-05-20T09:00:00
- #2014-05-19T09:00:00
- #2015-05-18T09:00:00
- #2016-05-16T09:00:00))
- (vevent
- summary:
- "Monday of week number 20 (where the default start of the week is Monday), forever"
- dtstart:
- #1997-05-12T09:00:00
- rrule:
- (make-recur-rule
- freq: 'YEARLY
- byweekno: (list 20)
- byday: (list mon))
- x-summary:
- "varje måndag v.20, årligen"
- x-set:
- (list #1997-05-12T09:00:00
- #1998-05-11T09:00:00
- #1999-05-17T09:00:00
- #2000-05-15T09:00:00
- #2001-05-14T09:00:00
- #2002-05-13T09:00:00
- #2003-05-12T09:00:00
- #2004-05-10T09:00:00
- #2005-05-16T09:00:00
- #2006-05-15T09:00:00
- #2007-05-14T09:00:00
- #2008-05-12T09:00:00
- #2009-05-11T09:00:00
- #2010-05-17T09:00:00
- #2011-05-16T09:00:00
- #2012-05-14T09:00:00
- #2013-05-13T09:00:00
- #2014-05-12T09:00:00
- #2015-05-11T09:00:00
- #2016-05-16T09:00:00))
- (vevent
- summary:
- "Every Thursday in March, forever"
- dtstart:
- #1997-03-13T09:00:00
- rrule:
- (make-recur-rule
- freq: 'YEARLY
- bymonth: (list mar)
- byday: (list thu))
- x-summary:
- "varje torsdag i mars, årligen"
- x-set:
- (list #1997-03-13T09:00:00
- #1997-03-20T09:00:00
- #1997-03-27T09:00:00
- #1998-03-05T09:00:00
- #1998-03-12T09:00:00
- #1998-03-19T09:00:00
- #1998-03-26T09:00:00
- #1999-03-04T09:00:00
- #1999-03-11T09:00:00
- #1999-03-18T09:00:00
- #1999-03-25T09:00:00
- #2000-03-02T09:00:00
- #2000-03-09T09:00:00
- #2000-03-16T09:00:00
- #2000-03-23T09:00:00
- #2000-03-30T09:00:00
- #2001-03-01T09:00:00
- #2001-03-08T09:00:00
- #2001-03-15T09:00:00
- #2001-03-22T09:00:00))
- (vevent
- summary:
- "Every Thursday, but only during June, July, and August, forever"
- dtstart:
- #1997-06-05T09:00:00
- rrule:
- (make-recur-rule
- freq: 'YEARLY
- byday: (list thu)
- bymonth: (list 6 7 8))
- x-summary:
- "varje torsdag i juni, juli & augusti, årligen"
- x-set:
- (list #1997-06-05T09:00:00
- #1997-06-12T09:00:00
- #1997-06-19T09:00:00
- #1997-06-26T09:00:00
- #1997-07-03T09:00:00
- #1997-07-10T09:00:00
- #1997-07-17T09:00:00
- #1997-07-24T09:00:00
- #1997-07-31T09:00:00
- #1997-08-07T09:00:00
- #1997-08-14T09:00:00
- #1997-08-21T09:00:00
- #1997-08-28T09:00:00
- #1998-06-04T09:00:00
- #1998-06-11T09:00:00
- #1998-06-18T09:00:00
- #1998-06-25T09:00:00
- #1998-07-02T09:00:00
- #1998-07-09T09:00:00
- #1998-07-16T09:00:00))
- (vevent
- summary:
- "Every Friday the 13th, forever"
- dtstart:
- #1997-09-02T09:00:00
- exdate:
- (as-list
- (list #1997-09-02T09:00:00))
- rrule:
- (make-recur-rule
- freq: 'MONTHLY
- byday: (list fri)
- bymonthday: (list 13))
- x-summary:
- "varje fredag den trettonde varje månad"
- x-set:
- (list #1998-02-13T09:00:00
- #1998-03-13T09:00:00
- #1998-11-13T09:00:00
- #1999-08-13T09:00:00
- #2000-10-13T09:00:00
- #2001-04-13T09:00:00
- #2001-07-13T09:00:00
- #2002-09-13T09:00:00
- #2002-12-13T09:00:00
- #2003-06-13T09:00:00
- #2004-02-13T09:00:00
- #2004-08-13T09:00:00
- #2005-05-13T09:00:00
- #2006-01-13T09:00:00
- #2006-10-13T09:00:00
- #2007-04-13T09:00:00
- #2007-07-13T09:00:00
- #2008-06-13T09:00:00
- #2009-02-13T09:00:00
- #2009-03-13T09:00:00))
- (vevent
- summary:
- "The first Saturday that follows the first Sunday of the month, forever"
- dtstart:
- #1997-09-13T09:00:00
- rrule:
- (make-recur-rule
- freq: 'MONTHLY
- byday: (list sat)
- bymonthday: (list 7 8 9 10 11 12 13))
- x-summary:
- "varje lördag den sjunde, åttonde, nionde, tionde, elfte, tolfte & trettonde varje månad"
- x-set:
- (list #1997-09-13T09:00:00
- #1997-10-11T09:00:00
- #1997-11-08T09:00:00
- #1997-12-13T09:00:00
- #1998-01-10T09:00:00
- #1998-02-07T09:00:00
- #1998-03-07T09:00:00
- #1998-04-11T09:00:00
- #1998-05-09T09:00:00
- #1998-06-13T09:00:00
- #1998-07-11T09:00:00
- #1998-08-08T09:00:00
- #1998-09-12T09:00:00
- #1998-10-10T09:00:00
- #1998-11-07T09:00:00
- #1998-12-12T09:00:00
- #1999-01-09T09:00:00
- #1999-02-13T09:00:00
- #1999-03-13T09:00:00
- #1999-04-10T09:00:00))
- (vevent
- summary:
- "Every 4 years, the first Tuesday after a Monday in November,\nver (U.S. Presidential Election day)"
- dtstart:
- #1996-11-05T09:00:00
- rrule:
- (make-recur-rule
- freq: 'YEARLY
- interval: 4
- bymonth: (list nov)
- byday: (list tue)
- bymonthday: (list 2 3 4 5 6 7 8))
- x-summary:
- "varje tisdag den andre, tredje, fjärde, femte, sjätte, sjunde eller åttonde i november vart fjärde år"
- x-set:
- (list #1996-11-05T09:00:00
- #2000-11-07T09:00:00
- #2004-11-02T09:00:00
- #2008-11-04T09:00:00
- #2012-11-06T09:00:00
- #2016-11-08T09:00:00
- #2020-11-03T09:00:00
- #2024-11-05T09:00:00
- #2028-11-07T09:00:00
- #2032-11-02T09:00:00
- #2036-11-04T09:00:00
- #2040-11-06T09:00:00
- #2044-11-08T09:00:00
- #2048-11-03T09:00:00
- #2052-11-05T09:00:00
- #2056-11-07T09:00:00
- #2060-11-02T09:00:00
- #2064-11-04T09:00:00
- #2068-11-06T09:00:00
- #2072-11-08T09:00:00))
- (vevent
- summary:
- "The third instance into the month of one of Tuesday, Wednesday, or Thursday, for the next 3 months"
- dtstart:
- #1997-09-04T09:00:00
- rrule:
- (make-recur-rule
- freq: 'MONTHLY
- count: 3
- byday: (list tue wed thu)
- bysetpos: (list 3))
- x-summary:
- "NOT YET IMPLEMENTED"
- x-set:
- (list #1997-09-04T09:00:00
- #1997-10-07T09:00:00
- #1997-11-06T09:00:00))
- (vevent
- summary:
- "The second-to-last weekday of the month"
- dtstart:
- #1997-09-29T09:00:00
- rrule:
- (make-recur-rule
- freq: 'MONTHLY
- byday: (list mon tue wed thu fri)
- bysetpos: (list -2))
- x-summary:
- "NOT YET IMPLEMENTED"
- x-set:
- (list #1997-09-29T09:00:00
- #1997-10-30T09:00:00
- #1997-11-27T09:00:00
- #1997-12-30T09:00:00
- #1998-01-29T09:00:00))
- (vevent
- summary:
- "Every 3 hours from 9:00 AM to 5:00 PM on a specific day"
- dtstart:
- #1997-09-02T09:00:00
- rrule:
- (make-recur-rule
- freq: 'HOURLY
- interval: 3
- until: #1997-09-02T17:00:00Z)
- x-summary:
- "var tredje timme, till och med den 02 september, 1997 kl. 17:00"
- x-set:
- (list #1997-09-02T09:00:00
- #1997-09-02T12:00:00
- #1997-09-02T15:00:00))
- (vevent
- summary:
- "Every 15 minutes for 6 occurrences"
- dtstart:
- #1997-09-02T09:00:00
- rrule:
- (make-recur-rule
- freq: 'MINUTELY
- interval: 15
- count: 6)
- x-summary:
- "varje kvart, totalt 6 gånger"
- x-set:
- (list #1997-09-02T09:00:00
- #1997-09-02T09:15:00
- #1997-09-02T09:30:00
- #1997-09-02T09:45:00
- #1997-09-02T10:00:00
- #1997-09-02T10:15:00))
- (vevent
- summary:
- "Every hour and a half for 4 occurrences"
- dtstart:
- #1997-09-02T09:00:00
- rrule:
- (make-recur-rule
- freq: 'MINUTELY
- interval: 90
- count: 4)
- x-summary:
- "var sjätte kvart, totalt 4 gånger"
- x-set:
- (list #1997-09-02T09:00:00
- #1997-09-02T10:30:00
- #1997-09-02T12:00:00
- #1997-09-02T13:30:00))
- (vevent
- summary:
- "Every 20 minutes from 9:00 AM to 4:40 PM every day (alt 1)"
- dtstart:
- #1997-09-02T09:00:00
- rrule:
- (make-recur-rule
- freq: 'DAILY
- byhour: (list 9 10 11 12 13 14 15 16)
- byminute: (list 0 20 40))
- x-summary:
- "dagligen kl. 09:00, 09:20, 09:40, 10:00, 10:20, 10:40, 11:00, 11:20, 11:40, 12:00, 12:20, 12:40, 13:00, 13:20, 13:40, 14:00, 14:20, 14:40, 15:00, 15:20, 15:40, 16:00, 16:20 & 16:40"
- x-set:
- (list #1997-09-02T09:00:00
- #1997-09-02T09:20:00
- #1997-09-02T09:40:00
- #1997-09-02T10:00:00
- #1997-09-02T10:20:00
- #1997-09-02T10:40:00
- #1997-09-02T11:00:00
- #1997-09-02T11:20:00
- #1997-09-02T11:40:00
- #1997-09-02T12:00:00
- #1997-09-02T12:20:00
- #1997-09-02T12:40:00
- #1997-09-02T13:00:00
- #1997-09-02T13:20:00
- #1997-09-02T13:40:00
- #1997-09-02T14:00:00
- #1997-09-02T14:20:00
- #1997-09-02T14:40:00
- #1997-09-02T15:00:00
- #1997-09-02T15:20:00))
- (vevent
- summary:
- "Every 20 minutes from 9:00 AM to 4:40 PM every day (alt 2)"
- dtstart:
- #1997-09-02T09:00:00
- rrule:
- (make-recur-rule
- freq: 'MINUTELY
- interval: 20
- byhour: (list 9 10 11 12 13 14 15 16))
- x-summary:
- "var tjugonde minut kl. 9, 10, 11, 12, 13, 14, 15 & 16"
- x-set:
- (list #1997-09-02T09:00:00
- #1997-09-02T09:20:00
- #1997-09-02T09:40:00
- #1997-09-02T10:00:00
- #1997-09-02T10:20:00
- #1997-09-02T10:40:00
- #1997-09-02T11:00:00
- #1997-09-02T11:20:00
- #1997-09-02T11:40:00
- #1997-09-02T12:00:00
- #1997-09-02T12:20:00
- #1997-09-02T12:40:00
- #1997-09-02T13:00:00
- #1997-09-02T13:20:00
- #1997-09-02T13:40:00
- #1997-09-02T14:00:00
- #1997-09-02T14:20:00
- #1997-09-02T14:40:00
- #1997-09-02T15:00:00
- #1997-09-02T15:20:00))
- (vevent
- summary:
- "An example where the days generated makes a difference because of WKST"
- dtstart:
- #1997-08-05T09:00:00
- rrule:
- (make-recur-rule
- freq: 'WEEKLY
- interval: 2
- count: 4
- byday: (list tue sun)
- wkst: mon)
- x-summary:
- "varannan tisdag & söndag, totalt 4 gånger"
- x-set:
- (list #1997-08-05T09:00:00
- #1997-08-10T09:00:00
- #1997-08-19T09:00:00
- #1997-08-24T09:00:00))
- (vevent
- summary:
- "changing only WKST from MO to SU, yields different results.."
- dtstart:
- #1997-08-05T09:00:00
- rrule:
- (make-recur-rule
- freq: 'WEEKLY
- interval: 2
- count: 4
- byday: (list tue sun)
- wkst: sun)
- x-summary:
- "varannan tisdag & söndag, totalt 4 gånger"
- x-set:
- (list #1997-08-05T09:00:00
- #1997-08-17T09:00:00
- #1997-08-19T09:00:00
- #1997-08-31T09:00:00))
- (vevent
- summary:
- "An example where an invalid date (i.e., February 30) is ignored"
- dtstart:
- #2007-01-15T09:00:00
- rrule:
- (make-recur-rule
- freq: 'MONTHLY
- bymonthday: (list 15 30)
- count: 5)
- x-summary:
- "den femtonde & tretionde varje månad, totalt 5 gånger"
- x-set:
- (list #2007-01-15T09:00:00
- #2007-01-30T09:00:00
- #2007-02-15T09:00:00
- #2007-03-15T09:00:00
- #2007-03-30T09:00:00))
- (vevent
- summary:
- "Every Friday & Wednesday the 13th, forever"
- dtstart:
- #1997-09-02T09:00:00
- exdate:
- (as-list
- (list #1997-09-02T09:00:00))
- rrule:
- (make-recur-rule
- freq: 'MONTHLY
- byday: (list fri wed)
- bymonthday: (list 13))
- x-summary:
- "varje onsdag & fredag den trettonde varje månad"
- x-set:
- (list #1998-02-13T09:00:00
- #1998-03-13T09:00:00
- #1998-05-13T09:00:00
- #1998-11-13T09:00:00
- #1999-01-13T09:00:00
- #1999-08-13T09:00:00
- #1999-10-13T09:00:00
- #2000-09-13T09:00:00
- #2000-10-13T09:00:00
- #2000-12-13T09:00:00
- #2001-04-13T09:00:00
- #2001-06-13T09:00:00
- #2001-07-13T09:00:00
- #2002-02-13T09:00:00
- #2002-03-13T09:00:00
- #2002-09-13T09:00:00
- #2002-11-13T09:00:00
- #2002-12-13T09:00:00
- #2003-06-13T09:00:00
- #2003-08-13T09:00:00))
- (vevent
- summary:
- "Monday & Wednesday of week number 20 (where the default start of the week is Monday), forever"
- dtstart:
- #1997-05-12T09:00:00
- rrule:
- (make-recur-rule
- freq: 'YEARLY
- byweekno: (list 20)
- byday: (list mon wed))
- x-summary:
- "varje onsdag & måndag v.20, årligen"
- x-set:
- (list #1997-05-12T09:00:00
- #1997-05-14T09:00:00
- #1998-05-11T09:00:00
- #1998-05-13T09:00:00
- #1999-05-17T09:00:00
- #1999-05-19T09:00:00
- #2000-05-15T09:00:00
- #2000-05-17T09:00:00
- #2001-05-14T09:00:00
- #2001-05-16T09:00:00
- #2002-05-13T09:00:00
- #2002-05-15T09:00:00
- #2003-05-12T09:00:00
- #2003-05-14T09:00:00
- #2004-05-10T09:00:00
- #2004-05-12T09:00:00
- #2005-05-16T09:00:00
- #2005-05-18T09:00:00
- #2006-05-15T09:00:00
- #2006-05-17T09:00:00))
- (vevent
- summary: "Each second, for ever"
- dtstart: #2020-10-10T10:00:00
- rrule: (make-recur-rule freq: 'SECONDLY)
- x-summary: "varje sekund"
- x-set: (list #2020-10-10T10:00:00
- #2020-10-10T10:00:01
- #2020-10-10T10:00:02
- #2020-10-10T10:00:03
- #2020-10-10T10:00:04
- #2020-10-10T10:00:05
- #2020-10-10T10:00:06
- #2020-10-10T10:00:07
- #2020-10-10T10:00:08
- #2020-10-10T10:00:09
- #2020-10-10T10:00:10
- #2020-10-10T10:00:11
- #2020-10-10T10:00:12
- #2020-10-10T10:00:13
- #2020-10-10T10:00:14
- #2020-10-10T10:00:15
- #2020-10-10T10:00:16
- #2020-10-10T10:00:17
- #2020-10-10T10:00:18
- #2020-10-10T10:00:19))
- ;; Exdates are applied after rrule's, meaning that less than count
- ;; instances may be present.
- (vevent
- summary: "Exdates are applied AFTER rrule's"
- dtstart: #2022-06-10T10:00:00
- rrule: (make-recur-rule freq: 'DAILY count: 5)
- exdate: (as-list (list #2022-06-12T10:00:00))
- x-summary: "dagligen, totalt 5 gånger"
- x-set: (list #2022-06-10T10:00:00
- #2022-06-11T10:00:00
- ;; #2022-06-12T10:00:00 ; skipped by exdate
- #2022-06-13T10:00:00
- #2022-06-14T10:00:00
- ))
- (vevent
- summary: "RDATE:s add to the recurrence rule"
- dtstart: #2022-06-10T10:00:00
- rrule: (make-recur-rule freq: 'DAILY count: 5)
- rdate: (as-list (list #2022-06-20T10:00:00))
- x-summary: "dagligen, totalt 5 gånger"
- x-set: (list #2022-06-10T10:00:00
- #2022-06-11T10:00:00
- #2022-06-12T10:00:00
- #2022-06-13T10:00:00
- #2022-06-14T10:00:00
- #2022-06-20T10:00:00 ; added by rdate
- )
- )
- (vevent
- summary: "RDATE:s add to the recurrence rule"
- dtstart: #2022-06-10T10:00:00
- rrule: (make-recur-rule freq: 'DAILY count: 5)
- exdate: (as-list (list #2022-06-20T10:00:00))
- rdate: (as-list (list #2022-06-20T10:00:00))
- x-summary: "dagligen, totalt 5 gånger"
- x-set: (list #2022-06-10T10:00:00
- #2022-06-11T10:00:00
- #2022-06-12T10:00:00
- #2022-06-13T10:00:00
- #2022-06-14T10:00:00
- ;; #2022-06-20T10:00:00 ; added by rdate, removed by exdate
- ))
- ;; TODO rdate with different timezone than dtstart
- ;; TODO rdate with period
- ))
-
-
diff --git a/tests/test/timespec.scm b/tests/test/timespec.scm
deleted file mode 100644
index 256c01bf..00000000
--- a/tests/test/timespec.scm
+++ /dev/null
@@ -1,88 +0,0 @@
-(define-module (test timespec)
- :use-module (srfi srfi-64)
- :use-module (srfi srfi-88)
- :use-module (datetime)
- :use-module (datetime timespec))
-
-(test-equal "The empty string parses to the empty timespec"
- (timespec-zero) (parse-time-spec ""))
-
-(test-group "timespec-add"
-
- (test-equal "Zero operands gives 0"
- (timespec-zero) (timespec-add))
-
- (let ((ts (make-timespec #10:20:30 '- #\z)))
- (test-equal "Single operand gives that operand"
- ts (timespec-add ts)))
-
- (test-equal "0 + 0 = 0"
- (timespec-zero) (timespec-add (timespec-zero) (timespec-zero)))
-
- (test-group
- "+ -"
- (test-equal "Remove a number less than the base"
- (make-timespec #10:00:00 '+ #\w)
- (timespec-add (make-timespec #10:20:30 '+ #\w)
- (make-timespec #00:20:30 '- #\w)))
-
- (test-equal "Remove a number greater than the base"
- (make-timespec #01:00:00 '- #\w)
- (timespec-add (make-timespec #10:00:00 '+ #\w)
- (make-timespec #11:00:00 '- #\w)))
-
- (test-equal "x + -x = 0"
- (timespec-zero) (timespec-add (make-timespec #10:20:30 '+ #\w)
- (make-timespec #10:20:30 '- #\w))))
-
- (test-group "- +"
- (test-equal "Add a number less than the (negative) base"
- (make-timespec #10:00:00 '+ #\w)
- (timespec-add (make-timespec #10:20:30 '- #\w)
- (make-timespec #00:20:30 '+ #\w)))
-
- (test-equal "Add a number greater than the (negative) base"
- (make-timespec #01:00:00 '- #\w)
- (timespec-add (make-timespec #10:00:00 '- #\w)
- (make-timespec #11:00:00 '+ #\w)))
-
- (test-equal "-x + x = 0"
- (timespec-zero) (timespec-add (make-timespec #10:20:30 '- #\w)
- (make-timespec #10:20:30 '+ #\w))))
-
- (test-group "+ +"
- (test-equal "x + x = 2x"
- (make-timespec #20:41:00 '+ #\w)
- (timespec-add (make-timespec #10:20:30 '+ #\w)
- (make-timespec #10:20:30 '+ #\w))))
-
- (test-group "- -"
- (test-equal "-x + -x = -2x"
- (make-timespec #20:41:00 '- #\w)
- (timespec-add (make-timespec #10:20:30 '- #\w)
- (make-timespec #10:20:30 '- #\w))))
-
- ;; add more than two timespecs
-
- ;; add timespecs of differing types
- )
-
-(test-group "parse-time-spec"
- ;; TODO what even is this case?
- (test-equal (make-timespec (time) '+ #\g) (parse-time-spec "-g"))
-
- (test-equal "Parse direct date, with hour minute and second"
- (make-timespec #20:00:00 '+ #\w) (parse-time-spec "20:00:00"))
- (test-equal "Parse direct date, with hour and minute"
- (make-timespec #20:00:00 '+ #\w) (parse-time-spec "20:00"))
- (test-equal "Parse direct date, with just hour"
- (make-timespec #20:00:00 '+ #\w) (parse-time-spec "20"))
-
- (test-equal "Parse timespec with letter at end"
- (make-timespec #20:00:00 '+ #\g) (parse-time-spec "20:00g"))
-
- (test-equal "Parse negative timespec"
- (make-timespec #20:00:00 '- #\w) (parse-time-spec "-20"))
-
- (test-equal "Parse negative timespec with letter at end"
- (make-timespec #20:00:00 '- #\z) (parse-time-spec "-20z")))
diff --git a/tests/test/translation.scm b/tests/test/translation.scm
deleted file mode 100644
index 5fb32ab0..00000000
--- a/tests/test/translation.scm
+++ /dev/null
@@ -1,15 +0,0 @@
-(define-module (test translation)
- :use-module (srfi srfi-64)
- :use-module (srfi srfi-88)
- :use-module (calp translation)
- :use-module (ice-9 i18n))
-
-(define sv (make-locale (list LC_CTYPE LC_MESSAGES) "sv_SE.UTF-8"))
-
-;; empty key should give us translation header
-;; this also tests that translations are properly loaded
-(test-assert "translations" (string? (translate "")))
-
-(test-equal "yes-no yes" 'yes (yes-no-check "y" sv))
-(test-equal "yes-no no" 'no (yes-no-check "n" sv))
-(test-equal "yes-no invalid" #f (yes-no-check "other" sv))
diff --git a/tests/test/cpp.scm b/tests/unit/c/cpp.scm
index 9c720fde..43ad0144 100644
--- a/tests/test/cpp.scm
+++ b/tests/unit/c/cpp.scm
@@ -37,3 +37,5 @@
(test-equal '(+ 2 2 2) (run "2+2+2"))
+'((c lex)
+ (c parse))
diff --git a/tests/test/datetime.scm b/tests/unit/datetime/datetime.scm
index f73a0ad2..9f32d4a1 100644
--- a/tests/test/datetime.scm
+++ b/tests/unit/datetime/datetime.scm
@@ -362,22 +362,22 @@
(test-equal "Datetime->unix-time"
- 1656005146 (datetime->unix-time #2022-06-23T17:25:46Z))
+ 1656005146 (datetime->unix-time (datetime year: 2022 month: 06 day: 23 hour: 17 minute: 25 second: 46 tz: "UTC")))
(test-equal "Datetime->unix-time before epoch"
-62167219200
- (datetime->unix-time #0000-01-01T00:00:00Z))
+ (datetime->unix-time (datetime year: 0000 month: 01 day: 01 hour: 00 minute: 00 second: 00 tz: "UTC")))
-(test-equal "unix-time->datetime" #2020-09-13T12:26:40Z
+(test-equal "unix-time->datetime" (datetime year: 2020 month: 09 day: 13 hour: 12 minute: 26 second: 40 tz: "UTC")
(unix-time->datetime 1600000000))
-(test-equal "unix-time->datetime on epoch" #1970-01-01T00:00:00Z
+(test-equal "unix-time->datetime on epoch" (datetime year: 1970 month: 01 day: 01 hour: 00 minute: 00 second: 00 tz: "UTC")
(unix-time->datetime 0))
-(test-equal "unix-time->datetime before epoch" #1919-04-20T11:33:20Z
+(test-equal "unix-time->datetime before epoch" (datetime year: 1919 month: 04 day: 20 hour: 11 minute: 33 second: 20 tz: "UTC")
(unix-time->datetime -1600000000))
-;; (unix-time->datetime (expt 2 31)) ; => #2038-01-19T03:14:08Z
-;; (unix-time->datetime (1+ (expt 2 31))) ; => #2038-01-19T03:14:09Z
-;; (unix-time->datetime (- (expt 2 31))) ; => #1901-12-13T20:45:52Z
+;; (unix-time->datetime (expt 2 31)) ; => (datetime year: 2038 month: 01 day: 19 hour: 03 minute: 14 second: 08 tz: "UTC")
+;; (unix-time->datetime (1+ (expt 2 31))) ; => (datetime year: 2038 month: 01 day: 19 hour: 03 minute: 14 second: 09 tz: "UTC")
+;; (unix-time->datetime (- (expt 2 31))) ; => (datetime year: 1901 month: 12 day: 13 hour: 20 minute: 45 second: 52 tz: "UTC")
(test-assert "Current datetime returns a datetime"
@@ -412,50 +412,50 @@ as-datetime
(test-equal "365 days in regular year" 365 (days-in-year (date year: 2022)))
(test-equal "366 days in leap year" 366 (days-in-year (date year: 2000)))
-(test-equal "Start of month" #2020-01-01 (start-of-month #2020-01-15))
-(test-equal "End of month" #2000-02-29 (end-of-month #2000-02-01))
+(test-equal "Start of month" (date year: 2020 month: 01 day: 01) (start-of-month (date year: 2020 month: 01 day: 15)))
+(test-equal "End of month" (date year: 2000 month: 02 day: 29) (end-of-month (date year: 2000 month: 02 day: 01)))
-(test-equal "Start of year" #2020-01-01 (start-of-year #2020-12-31))
+(test-equal "Start of year" (date year: 2020 month: 01 day: 01) (start-of-year (date year: 2020 month: 12 day: 31)))
;; Note that end-of-year (apparently) doesn't exist
(test-group "Date streams"
(test-equal "Day stream"
- (list #2020-01-01 #2020-01-02 #2020-01-03 #2020-01-04 #2020-01-05)
- (stream->list 5 (day-stream #2020-01-01)))
+ (list (date year: 2020 month: 01 day: 01) (date year: 2020 month: 01 day: 02) (date year: 2020 month: 01 day: 03) (date year: 2020 month: 01 day: 04) (date year: 2020 month: 01 day: 05))
+ (stream->list 5 (day-stream (date year: 2020 month: 01 day: 01))))
(test-equal "Week stream"
- (list #2020-01-01 #2020-02-01 #2020-03-01 #2020-04-01 #2020-05-01)
- (stream->list 5 (month-stream #2020-01-01)))
+ (list (date year: 2020 month: 01 day: 01) (date year: 2020 month: 02 day: 01) (date year: 2020 month: 03 day: 01) (date year: 2020 month: 04 day: 01) (date year: 2020 month: 05 day: 01))
+ (stream->list 5 (month-stream (date year: 2020 month: 01 day: 01))))
(test-equal "Month stream"
- (list #2020-01-01 #2020-01-08 #2020-01-15 #2020-01-22 #2020-01-29)
- (stream->list 5 (week-stream #2020-01-01))))
+ (list (date year: 2020 month: 01 day: 01) (date year: 2020 month: 01 day: 08) (date year: 2020 month: 01 day: 15) (date year: 2020 month: 01 day: 22) (date year: 2020 month: 01 day: 29))
+ (stream->list 5 (week-stream (date year: 2020 month: 01 day: 01)))))
;; See time< tests for more context
(test-group "Min/max"
(test-equal "Time min"
- #07:40:50 (time-min #10:20:30 #07:40:50))
+ (time hour: 07 minute: 40 second: 50) (time-min (time hour: 10 minute: 20 second: 30) (time hour: 07 minute: 40 second: 50)))
(test-equal "Time max"
- #10:20:30 (time-max #10:20:30 #07:40:50))
+ (time hour: 10 minute: 20 second: 30) (time-max (time hour: 10 minute: 20 second: 30) (time hour: 07 minute: 40 second: 50)))
(test-equal "Date min"
- #2020-02-02 (date-min #2020-02-02 #2020-03-01))
+ (date year: 2020 month: 02 day: 02) (date-min (date year: 2020 month: 02 day: 02) (date year: 2020 month: 03 day: 01)))
(test-equal "Date max"
- #2020-03-01 (date-max #2020-02-02 #2020-03-01))
+ (date year: 2020 month: 03 day: 01) (date-max (date year: 2020 month: 02 day: 02) (date year: 2020 month: 03 day: 01)))
(test-equal "Datetime min"
- #2020-02-02T10:20:30 (datetime-min #2020-02-02T10:20:30 #2020-03-01T07:40:50))
+ (datetime year: 2020 month: 02 day: 02 hour: 10 minute: 20 second: 30) (datetime-min (datetime year: 2020 month: 02 day: 02 hour: 10 minute: 20 second: 30) (datetime year: 2020 month: 03 day: 01 hour: 07 minute: 40 second: 50)))
(test-equal "Datetime max"
- #2020-03-01T07:40:50 (datetime-max #2020-02-02T10:20:30 #2020-03-01T07:40:50)))
+ (datetime year: 2020 month: 03 day: 01 hour: 07 minute: 40 second: 50) (datetime-max (datetime year: 2020 month: 02 day: 02 hour: 10 minute: 20 second: 30) (datetime year: 2020 month: 03 day: 01 hour: 07 minute: 40 second: 50))))
-(test-equal "Week day" thu (week-day #2022-06-23))
+(test-equal "Week day" thu (week-day (date year: 2022 month: 06 day: 23)))
-(test-equal "week-1-start" #2019-12-30 (week-1-start #2020-01-01 mon))
+(test-equal "week-1-start" (date year: 2019 month: 12 day: 30) (week-1-start (date year: 2020 month: 01 day: 01) mon))
;; Possibly add case where the end of the year uses next years week numbers
-(test-equal "Week number at end of year" 53 (week-number #2008-12-31 sun))
-(test-equal "Week number at start of year" 53 (week-number #2009-01-01 sun))
+(test-equal "Week number at end of year" 53 (week-number (date year: 2008 month: 12 day: 31) sun))
+(test-equal "Week number at start of year" 53 (week-number (date year: 2009 month: 01 day: 01) sun))
-(test-equal #2008-12-28 (date-starting-week 53 (date year: 2008) sun))
-(test-equal #2007-12-30 (date-starting-week 1 (date year: 2008) sun))
+(test-equal (date year: 2008 month: 12 day: 28) (date-starting-week 53 (date year: 2008) sun))
+(test-equal (date year: 2007 month: 12 day: 30) (date-starting-week 1 (date year: 2008) sun))
(test-group "Week day name"
(test-equal "Simple" "Saturday" (week-day-name sat locale: en_US))
@@ -473,68 +473,68 @@ as-datetime
;; | | : | | : | || | : | || | : | || | : |s2|
;; | | : | | : | | : | | : : | |
(test-assert "End of S1 overlaps start of S2"
- (timespan-overlaps? #10:00:00 #12:00:00
- #11:00:00 #13:00:00))
+ (timespan-overlaps? (time hour: 10 minute: 00 second: 00) (time hour: 12 minute: 00 second: 00)
+ (time hour: 11 minute: 00 second: 00) (time hour: 13 minute: 00 second: 00)))
(test-assert "Start of S1 overlaps end of S2"
- (timespan-overlaps? #11:00:00 #13:00:00
- #10:00:00 #12:00:00))
+ (timespan-overlaps? (time hour: 11 minute: 00 second: 00) (time hour: 13 minute: 00 second: 00)
+ (time hour: 10 minute: 00 second: 00) (time hour: 12 minute: 00 second: 00)))
(test-assert "S1 complete encompasses S2"
- (timespan-overlaps? #10:00:00 #13:00:00
- #11:00:00 #12:00:00))
+ (timespan-overlaps? (time hour: 10 minute: 00 second: 00) (time hour: 13 minute: 00 second: 00)
+ (time hour: 11 minute: 00 second: 00) (time hour: 12 minute: 00 second: 00)))
(test-assert "S2 complete encompasses S1"
- (timespan-overlaps? #11:00:00 #12:00:00
- #10:00:00 #13:00:00))
+ (timespan-overlaps? (time hour: 11 minute: 00 second: 00) (time hour: 12 minute: 00 second: 00)
+ (time hour: 10 minute: 00 second: 00) (time hour: 13 minute: 00 second: 00)))
(test-assert "S1 is equal to S2"
- (timespan-overlaps? #11:00:00 #12:00:00
- #11:00:00 #12:00:00))
+ (timespan-overlaps? (time hour: 11 minute: 00 second: 00) (time hour: 12 minute: 00 second: 00)
+ (time hour: 11 minute: 00 second: 00) (time hour: 12 minute: 00 second: 00)))
(test-assert "S1 dosesn't overlap S2"
(not
- (timespan-overlaps? #10:00:00 #11:00:00
- #12:00:00 #13:00:00)))
+ (timespan-overlaps? (time hour: 10 minute: 00 second: 00) (time hour: 11 minute: 00 second: 00)
+ (time hour: 12 minute: 00 second: 00) (time hour: 13 minute: 00 second: 00))))
(test-assert "If the events only share an instant they don't overlap"
(not
- (timespan-overlaps? #10:00:00 #12:00:00
- #12:00:00 #14:00:00))))
+ (timespan-overlaps? (time hour: 10 minute: 00 second: 00) (time hour: 12 minute: 00 second: 00)
+ (time hour: 12 minute: 00 second: 00) (time hour: 14 minute: 00 second: 00)))))
-(test-equal #2022-06-25 (find-first-week-day sat #2022-06-23))
+(test-equal (date year: 2022 month: 06 day: 25) (find-first-week-day sat (date year: 2022 month: 06 day: 23)))
(test-group "All weekdays in <>"
(test-equal "month, if starting from beginning of month"
- (list #2022-06-03 #2022-06-10 #2022-06-17 #2022-06-24)
- (all-wday-in-month fri #2022-06-01))
+ (list (date year: 2022 month: 06 day: 03) (date year: 2022 month: 06 day: 10) (date year: 2022 month: 06 day: 17) (date year: 2022 month: 06 day: 24))
+ (all-wday-in-month fri (date year: 2022 month: 06 day: 01)))
(test-equal "month, if starting from the middle"
- (list #2022-06-24)
- (all-wday-in-month fri #2022-06-23))
+ (list (date year: 2022 month: 06 day: 24))
+ (all-wday-in-month fri (date year: 2022 month: 06 day: 23)))
(test-equal "year, if starting from the beggining"
- (list #2022-01-07 #2022-01-14 #2022-01-21 #2022-01-28 #2022-02-04 #2022-02-11 #2022-02-18 #2022-02-25 #2022-03-04 #2022-03-11 #2022-03-18 #2022-03-25 #2022-04-01 #2022-04-08 #2022-04-15 #2022-04-22 #2022-04-29 #2022-05-06 #2022-05-13 #2022-05-20 #2022-05-27 #2022-06-03 #2022-06-10 #2022-06-17 #2022-06-24 #2022-07-01 #2022-07-08 #2022-07-15 #2022-07-22 #2022-07-29 #2022-08-05 #2022-08-12 #2022-08-19 #2022-08-26 #2022-09-02 #2022-09-09 #2022-09-16 #2022-09-23 #2022-09-30 #2022-10-07 #2022-10-14 #2022-10-21 #2022-10-28 #2022-11-04 #2022-11-11 #2022-11-18 #2022-11-25 #2022-12-02 #2022-12-09 #2022-12-16 #2022-12-23 #2022-12-30)
- (all-wday-in-year fri #2022-01-01))
+ (list (date year: 2022 month: 01 day: 07) (date year: 2022 month: 01 day: 14) (date year: 2022 month: 01 day: 21) (date year: 2022 month: 01 day: 28) (date year: 2022 month: 02 day: 04) (date year: 2022 month: 02 day: 11) (date year: 2022 month: 02 day: 18) (date year: 2022 month: 02 day: 25) (date year: 2022 month: 03 day: 04) (date year: 2022 month: 03 day: 11) (date year: 2022 month: 03 day: 18) (date year: 2022 month: 03 day: 25) (date year: 2022 month: 04 day: 01) (date year: 2022 month: 04 day: 08) (date year: 2022 month: 04 day: 15) (date year: 2022 month: 04 day: 22) (date year: 2022 month: 04 day: 29) (date year: 2022 month: 05 day: 06) (date year: 2022 month: 05 day: 13) (date year: 2022 month: 05 day: 20) (date year: 2022 month: 05 day: 27) (date year: 2022 month: 06 day: 03) (date year: 2022 month: 06 day: 10) (date year: 2022 month: 06 day: 17) (date year: 2022 month: 06 day: 24) (date year: 2022 month: 07 day: 01) (date year: 2022 month: 07 day: 08) (date year: 2022 month: 07 day: 15) (date year: 2022 month: 07 day: 22) (date year: 2022 month: 07 day: 29) (date year: 2022 month: 08 day: 05) (date year: 2022 month: 08 day: 12) (date year: 2022 month: 08 day: 19) (date year: 2022 month: 08 day: 26) (date year: 2022 month: 09 day: 02) (date year: 2022 month: 09 day: 09) (date year: 2022 month: 09 day: 16) (date year: 2022 month: 09 day: 23) (date year: 2022 month: 09 day: 30) (date year: 2022 month: 10 day: 07) (date year: 2022 month: 10 day: 14) (date year: 2022 month: 10 day: 21) (date year: 2022 month: 10 day: 28) (date year: 2022 month: 11 day: 04) (date year: 2022 month: 11 day: 11) (date year: 2022 month: 11 day: 18) (date year: 2022 month: 11 day: 25) (date year: 2022 month: 12 day: 02) (date year: 2022 month: 12 day: 09) (date year: 2022 month: 12 day: 16) (date year: 2022 month: 12 day: 23) (date year: 2022 month: 12 day: 30))
+ (all-wday-in-year fri (date year: 2022 month: 01 day: 01)))
(test-equal "year, if starting from the middle"
- (list #2022-06-03 #2022-06-10 #2022-06-17 #2022-06-24 #2022-07-01 #2022-07-08 #2022-07-15 #2022-07-22 #2022-07-29 #2022-08-05 #2022-08-12 #2022-08-19 #2022-08-26 #2022-09-02 #2022-09-09 #2022-09-16 #2022-09-23 #2022-09-30 #2022-10-07 #2022-10-14 #2022-10-21 #2022-10-28 #2022-11-04 #2022-11-11 #2022-11-18 #2022-11-25 #2022-12-02 #2022-12-09 #2022-12-16 #2022-12-23 #2022-12-30)
- (all-wday-in-year fri #2022-06-01)))
+ (list (date year: 2022 month: 06 day: 03) (date year: 2022 month: 06 day: 10) (date year: 2022 month: 06 day: 17) (date year: 2022 month: 06 day: 24) (date year: 2022 month: 07 day: 01) (date year: 2022 month: 07 day: 08) (date year: 2022 month: 07 day: 15) (date year: 2022 month: 07 day: 22) (date year: 2022 month: 07 day: 29) (date year: 2022 month: 08 day: 05) (date year: 2022 month: 08 day: 12) (date year: 2022 month: 08 day: 19) (date year: 2022 month: 08 day: 26) (date year: 2022 month: 09 day: 02) (date year: 2022 month: 09 day: 09) (date year: 2022 month: 09 day: 16) (date year: 2022 month: 09 day: 23) (date year: 2022 month: 09 day: 30) (date year: 2022 month: 10 day: 07) (date year: 2022 month: 10 day: 14) (date year: 2022 month: 10 day: 21) (date year: 2022 month: 10 day: 28) (date year: 2022 month: 11 day: 04) (date year: 2022 month: 11 day: 11) (date year: 2022 month: 11 day: 18) (date year: 2022 month: 11 day: 25) (date year: 2022 month: 12 day: 02) (date year: 2022 month: 12 day: 09) (date year: 2022 month: 12 day: 16) (date year: 2022 month: 12 day: 23) (date year: 2022 month: 12 day: 30))
+ (all-wday-in-year fri (date year: 2022 month: 06 day: 01))))
;; TODO
in-date-range?
(test-equal "weekday-list" (list wed thu fri sat sun mon tue) (weekday-list wed))
-(test-equal "start of week" #2022-06-20 (start-of-week #2022-06-23 mon))
-(test-equal "end of week" #2022-06-26 (end-of-week #2022-06-23 mon))
+(test-equal "start of week" (date year: 2022 month: 06 day: 20) (start-of-week (date year: 2022 month: 06 day: 23) mon))
+(test-equal "end of week" (date year: 2022 month: 06 day: 26) (end-of-week (date year: 2022 month: 06 day: 23) mon))
(test-group "month-days"
- (call-with-values (lambda () (month-days #2022-06-01 mon))
+ (call-with-values (lambda () (month-days (date year: 2022 month: 06 day: 01) mon))
(lambda (before actual after)
- (test-equal "before" (list #2022-05-30 #2022-05-31) before)
- (test-equal "actual" (stream->list 30 (day-stream #2022-06-01)) actual)
- (test-equal "after" (list #2022-07-01 #2022-07-02 #2022-07-03) after))))
+ (test-equal "before" (list (date year: 2022 month: 05 day: 30) (date year: 2022 month: 05 day: 31)) before)
+ (test-equal "actual" (stream->list 30 (day-stream (date year: 2022 month: 06 day: 01))) actual)
+ (test-equal "after" (list (date year: 2022 month: 07 day: 01) (date year: 2022 month: 07 day: 02) (date year: 2022 month: 07 day: 03)) after))))
(test-group "Days in interval"
- (test-equal "Steps from start to end of month" 31 (days-in-interval #2022-01-01 #2022-01-31))
- (test-error "Negative intervals should fail" 'misc-error (days-in-interval #2022-01-01 #2020-01-31)))
+ (test-equal "Steps from start to end of month" 31 (days-in-interval (date year: 2022 month: 01 day: 01) (date year: 2022 month: 01 day: 31)))
+ (test-error "Negative intervals should fail" 'misc-error (days-in-interval (date year: 2022 month: 01 day: 01) (date year: 2020 month: 01 day: 31))))
-(test-equal "Year day" 191 (year-day #2020-07-09))
+(test-equal "Year day" 191 (year-day (date year: 2020 month: 07 day: 09)))
(test-group "Convertions to decimal time"
(test-group "Time->decimal-hour"
@@ -550,7 +550,7 @@ in-date-range?
(test-error "Can't get length of month without information about which month"
'misc-error (datetime->decimal-hour (datetime month: 1)))
(test-equal "Can get length of month if we have a month"
- (* 31 24.0) (datetime->decimal-hour (datetime month: 1) #2020-01-01))))
+ (* 31 24.0) (datetime->decimal-hour (datetime month: 1) (date year: 2020 month: 01 day: 01)))))
;; TODO
date-range
@@ -569,20 +569,20 @@ date-range
(test-equal "02" (datetime->string (datetime month: 2) "~m"))
(test-equal "04" (datetime->string (datetime day: 4) "~d"))
(test-equal " 4" (datetime->string (datetime day: 4) "~e"))
- (test-equal "1600000000" (datetime->string #2020-09-13T12:26:40Z "~s"))
+ (test-equal "1600000000" (datetime->string (datetime year: 2020 month: 09 day: 13 hour: 12 minute: 26 second: 40 tz: "UTC") "~s"))
- (test-equal "2022-10-20" (datetime->string (datetime date: #2022-10-20) "~1"))
- (test-equal "10:20:30" (datetime->string (datetime time: #10:20:30) "~3"))
+ (test-equal "2022-10-20" (datetime->string (datetime date: (date year: 2022 month: 10 day: 20)) "~1"))
+ (test-equal "10:20:30" (datetime->string (datetime time: (time hour: 10 minute: 20 second: 30)) "~3"))
(test-group "Locale dependant (en_US)"
- (test-equal "Saturday" (datetime->string (datetime date: (find-first-week-day sat #2020-01-01)) "~A" en_US))
- (test-equal "Sat" (datetime->string (datetime date: (find-first-week-day sat #2020-01-01)) "~a" en_US))
+ (test-equal "Saturday" (datetime->string (datetime date: (find-first-week-day sat (date year: 2020 month: 01 day: 01))) "~A" en_US))
+ (test-equal "Sat" (datetime->string (datetime date: (find-first-week-day sat (date year: 2020 month: 01 day: 01))) "~a" en_US))
(test-equal "January" (datetime->string (datetime date: (date month: 1)) "~B" en_US))
(test-equal "Jan" (datetime->string (datetime date: (date month: 1)) "~b" en_US)))
(test-group "Locale dependant (sv_SE)"
- (test-equal "lördag" (datetime->string (datetime date: (find-first-week-day sat #2020-01-01)) "~A" sv_SE))
- (test-equal "lör" (datetime->string (datetime date: (find-first-week-day sat #2020-01-01)) "~a" sv_SE))
+ (test-equal "lördag" (datetime->string (datetime date: (find-first-week-day sat (date year: 2020 month: 01 day: 01))) "~A" sv_SE))
+ (test-equal "lör" (datetime->string (datetime date: (find-first-week-day sat (date year: 2020 month: 01 day: 01))) "~a" sv_SE))
(test-equal "januari" (datetime->string (datetime date: (date month: 1)) "~B" sv_SE))
(test-equal "jan" (datetime->string (datetime date: (date month: 1)) "~b" sv_SE)))
@@ -593,17 +593,17 @@ date-range
(test-equal "Default fomat specifier gives ISO-formatted date"
- "2006-01-02T15:04:05" (datetime->string #2006-01-02T15:04:05))
+ "2006-01-02T15:04:05" (datetime->string (datetime year: 2006 month: 01 day: 02 hour: 15 minute: 04 second: 05)))
(test-group "Invalid specifiers"
(test-equal "" (datetime->string (datetime) "~x" allow-unknown?: #t))
(test-error 'misc-error (datetime->string (datetime) "~x")))
(test-group "Print syntax for datatypes"
- (test-equal "Date writer" "#2020-01-02" (with-output-to-string (lambda () (write #2020-01-02))))
- (test-equal "Time writer" "#20:30:40" (with-output-to-string (lambda () (write #20:30:40))))
- (test-equal "Datetime writer" "#2020-01-02T20:30:40" (with-output-to-string (lambda () (write #2020-01-02T20:30:40))))
- (test-equal "Datetime writer (with tz)" "#2020-01-02T20:30:40Z" (with-output-to-string (lambda () (write #2020-01-02T20:30:40Z))))))
+ (test-equal "Date writer" "#2020-01-02" (with-output-to-string (lambda () (write (date year: 2020 month: 01 day: 02)))))
+ (test-equal "Time writer" "#20:30:40" (with-output-to-string (lambda () (write (time hour: 20 minute: 30 second: 40)))))
+ (test-equal "Datetime writer" "#2020-01-02T20:30:40" (with-output-to-string (lambda () (write (datetime year: 2020 month: 01 day: 02 hour: 20 minute: 30 second: 40)))))
+ (test-equal "Datetime writer (with tz)" "#2020-01-02T20:30:40Z" (with-output-to-string (lambda () (write (datetime year: 2020 month: 01 day: 02 hour: 20 minute: 30 second: 40 tz: "UTC")))))))
;; Really basic tests, since these are rather thin wrappers
(test-equal "date->string" "0000-00-00" (date->string (date)))
@@ -616,25 +616,25 @@ date-range
(test-assert "Zero dates are all equal"
(date=))
(test-assert "A single date is equal to itself"
- (date=? #2020-10-20))
+ (date=? (date year: 2020 month: 10 day: 20)))
(test-assert "Two dates are equal to each other"
- (date= #2020-10-20 #2020-10-20))
+ (date= (date year: 2020 month: 10 day: 20) (date year: 2020 month: 10 day: 20)))
(test-assert "Two dates which are NOT equal to each other"
- (not (date= #2020-10-20 #2020-10-21)))
+ (not (date= (date year: 2020 month: 10 day: 20) (date year: 2020 month: 10 day: 21))))
(test-assert "More than two dates which are all equal"
- (date=? #2020-10-20 #2020-10-20 #2020-10-20)))
+ (date=? (date year: 2020 month: 10 day: 20) (date year: 2020 month: 10 day: 20) (date year: 2020 month: 10 day: 20))))
(test-group "time"
(test-assert "Zero times are all equal"
(time=))
(test-assert "A single time is equal to itself"
- (time=? #20:30:40))
+ (time=? (time hour: 20 minute: 30 second: 40)))
(test-assert "Two times are equal to each other"
- (time= #20:30:40 #20:30:40))
+ (time= (time hour: 20 minute: 30 second: 40) (time hour: 20 minute: 30 second: 40)))
(test-assert "Two times which are NOT equal to each other"
- (not (time= #20:30:40 #10:30:40)))
+ (not (time= (time hour: 20 minute: 30 second: 40) (time hour: 10 minute: 30 second: 40))))
(test-assert "More than two times which are all equal"
- (time=? #20:30:40 #20:30:40 #20:30:40)))
+ (time=? (time hour: 20 minute: 30 second: 40) (time hour: 20 minute: 30 second: 40) (time hour: 20 minute: 30 second: 40))))
(test-group "Datetime"
(test-assert "Zero datetimes \"all\" are equal"
@@ -722,30 +722,30 @@ date/-time> date/-time>? date/-time>= date/-time>=?
(test-group "Simple cases"
(test-group "Days"
- (test-equal "Add" #2020-01-06 (date+ #2020-01-01 (date day: 5)))
- (test-equal "Remove" #2020-01-01 (date- #2020-01-06 (date day: 5))))
+ (test-equal "Add" (date year: 2020 month: 01 day: 06) (date+ (date year: 2020 month: 01 day: 01) (date day: 5)))
+ (test-equal "Remove" (date year: 2020 month: 01 day: 01) (date- (date year: 2020 month: 01 day: 06) (date day: 5))))
(test-group "Months"
- (test-equal "Add" #2020-06-01 (date+ #2020-01-01 (date month: 5)))
- (test-equal "Remove" #2020-01-01 (date- #2020-06-01 (date month: 5))))
+ (test-equal "Add" (date year: 2020 month: 06 day: 01) (date+ (date year: 2020 month: 01 day: 01) (date month: 5)))
+ (test-equal "Remove" (date year: 2020 month: 01 day: 01) (date- (date year: 2020 month: 06 day: 01) (date month: 5))))
(test-group "Years"
- (test-equal "Add" #2022-01-01 (date+ #2020-01-01 (date year: 2)))
- (test-equal "Remove" #2020-01-01 (date- #2022-01-01 (date year: 2)))))
+ (test-equal "Add" (date year: 2022 month: 01 day: 01) (date+ (date year: 2020 month: 01 day: 01) (date year: 2)))
+ (test-equal "Remove" (date year: 2020 month: 01 day: 01) (date- (date year: 2022 month: 01 day: 01) (date year: 2)))))
(test-group "Many operands"
- (test-equal #2021-02-02
- (date+ #2020-01-01
+ (test-equal (date year: 2021 month: 02 day: 02)
+ (date+ (date year: 2020 month: 01 day: 01)
(date day: 1)
(date month: 1)
(date year: 1))))
(test-group "Overflow"
;; Years don't overflow, so no need to test
- (test-equal "Day overflow" #2022-02-01 (date+ #2022-01-31 (date day: 1)))
- (test-equal "Month overflow" #2023-01-01 (date+ #2022-12-01 (date month: 1)))
- (test-equal "Date+Month overflow" #2023-01-01 (date+ #2022-12-31 (date day: 1))))
+ (test-equal "Day overflow" (date year: 2022 month: 02 day: 01) (date+ (date year: 2022 month: 01 day: 31) (date day: 1)))
+ (test-equal "Month overflow" (date year: 2023 month: 01 day: 01) (date+ (date year: 2022 month: 12 day: 01) (date month: 1)))
+ (test-equal "Date+Month overflow" (date year: 2023 month: 01 day: 01) (date+ (date year: 2022 month: 12 day: 31) (date day: 1))))
;; NOTE
- (test-equal #2020-02-31 (date+ #2020-01-31 (date month: 1)))
+ (test-equal (date year: 2020 month: 02 day: 31) (date+ (date year: 2020 month: 01 day: 31) (date month: 1)))
)
(test-group "Time"
@@ -755,31 +755,31 @@ date/-time> date/-time>? date/-time>= date/-time>=?
(test-group "Simple cases"
(test-group "Seconds"
- (test-equal "Add" #20:00:40 (time+ #20:00:00 (time second: 40)))
- (test-equal "Remove" #20:00:00 (time- #20:00:40 (time second: 40))))
+ (test-equal "Add" (time hour: 20 minute: 00 second: 40) (time+ (time hour: 20 minute: 00 second: 00) (time second: 40)))
+ (test-equal "Remove" (time hour: 20 minute: 00 second: 00) (time- (time hour: 20 minute: 00 second: 40) (time second: 40))))
(test-group "Minutes"
- (test-equal "Add" #20:10:00 (time+ #20:00:00 (time minute: 10)))
- (test-equal "Remove" #20:00:00 (time- #20:10:00 (time minute: 10))))
+ (test-equal "Add" (time hour: 20 minute: 10 second: 00) (time+ (time hour: 20 minute: 00 second: 00) (time minute: 10)))
+ (test-equal "Remove" (time hour: 20 minute: 00 second: 00) (time- (time hour: 20 minute: 10 second: 00) (time minute: 10))))
(test-group "Hours"
- (test-equal "Add" #22:00:00 (time+ #20:00:00 (time hour: 2)))
- (test-equal "Remove" #20:00:00 (time- #22:00:00 (time hour: 2)))))
+ (test-equal "Add" (time hour: 22 minute: 00 second: 00) (time+ (time hour: 20 minute: 00 second: 00) (time hour: 2)))
+ (test-equal "Remove" (time hour: 20 minute: 00 second: 00) (time- (time hour: 22 minute: 00 second: 00) (time hour: 2)))))
(test-group "Overflowing cases"
(test-group "Addition"
(test-group "Single overflow"
- (call-with-values (lambda () (time+ #20:00:00 (time hour: 5)))
+ (call-with-values (lambda () (time+ (time hour: 20 minute: 00 second: 00) (time hour: 5)))
(lambda (result overflow)
(test-equal "Time" (time hour: 1) result)
(test-equal "Overflow" 1 overflow))))
(test-group "Mulitple overflows"
- (call-with-values (lambda () (time+ #20:00:00 (time hour: 5) (time hour: 24)))
+ (call-with-values (lambda () (time+ (time hour: 20 minute: 00 second: 00) (time hour: 5) (time hour: 24)))
(lambda (result overflow)
(test-equal "Time" (time hour: 1) result)
(test-equal "Overflow" 2 overflow)))))
(test-group "Subtraction"
(test-group "Single overflow"
- (call-with-values (lambda () (time- #20:00:00 (time hour: 25)))
+ (call-with-values (lambda () (time- (time hour: 20 minute: 00 second: 00) (time hour: 25)))
(lambda (result overflow)
(test-equal "Time" (time hour: 19) result)
(test-equal "Overflow" 1 overflow))))
@@ -794,10 +794,10 @@ datetime+ datetime-
(test-group "Date difference"
(test-assert "The differente between a date and itself is zero"
- (date-zero? (date-difference #2022-02-02 #2022-02-02)))
+ (date-zero? (date-difference (date year: 2022 month: 02 day: 02) (date year: 2022 month: 02 day: 02))))
(test-error "Later date must be first" 'misc-error
- (date-difference #2020-01-01 #2021-01-01))
+ (date-difference (date year: 2020 month: 01 day: 01) (date year: 2021 month: 01 day: 01)))
(test-error "Negative months are invalid" 'misc-error
(date-difference (date) (date month: -1)))
@@ -808,3 +808,5 @@ datetime+ datetime-
;; TODO
datetime-difference
+
+'((datetime))
diff --git a/tests/unit/datetime/timespec.scm b/tests/unit/datetime/timespec.scm
new file mode 100644
index 00000000..76fdd572
--- /dev/null
+++ b/tests/unit/datetime/timespec.scm
@@ -0,0 +1,98 @@
+(define-module (test timespec)
+ :use-module (srfi srfi-64)
+ :use-module (srfi srfi-88)
+ :use-module (datetime)
+ :use-module (datetime timespec))
+
+(test-equal "The empty string parses to the empty timespec"
+ (timespec-zero) (parse-time-spec ""))
+
+(test-group "timespec-add"
+
+ (test-equal "Zero operands gives 0"
+ (timespec-zero) (timespec-add))
+
+ (let ((ts (make-timespec (time hour: 10 minute: 20 second: 30) '- #\z)))
+ (test-equal "Single operand gives that operand"
+ ts (timespec-add ts)))
+
+ (test-equal "0 + 0 = 0"
+ (timespec-zero) (timespec-add (timespec-zero) (timespec-zero)))
+
+ (test-group
+ "+ -"
+ (test-equal "Remove a number less than the base"
+ (make-timespec (time hour: 10 minute: 00 second: 00) '+ #\w)
+ (timespec-add (make-timespec (time hour: 10 minute: 20 second: 30)
+ '+ #\w)
+ (make-timespec (time minute: 20 second: 30)
+ '- #\w)))
+
+ (test-equal "Remove a number greater than the base"
+ (make-timespec (time hour: 01 minute: 00 second: 00) '- #\w)
+ (timespec-add (make-timespec (time hour: 10 minute: 00 second: 00) '+ #\w)
+ (make-timespec (time hour: 11 minute: 00 second: 00) '- #\w)))
+
+ (test-equal "x + -x = 0"
+ (timespec-zero) (timespec-add (make-timespec (time hour: 10 minute: 20 second: 30) '+ #\w)
+ (make-timespec (time hour: 10 minute: 20 second: 30) '- #\w))))
+
+ (test-group "- +"
+ (test-equal "Add a number less than the (negative) base"
+ (make-timespec (time hour: 10 minute: 00 second: 00) '+ #\w)
+ (timespec-add (make-timespec (time hour: 10 minute: 20 second: 30) '- #\w)
+ (make-timespec (time hour: 00 minute: 20 second: 30) '+ #\w)))
+
+ (test-equal "Add a number greater than the (negative) base"
+ (make-timespec (time hour: 01 minute: 00 second: 00) '- #\w)
+ (timespec-add (make-timespec (time hour: 10 minute: 00 second: 00) '- #\w)
+ (make-timespec (time hour: 11 minute: 00 second: 00) '+ #\w)))
+
+ (test-equal "-x + x = 0"
+ (timespec-zero) (timespec-add (make-timespec (time hour: 10 minute: 20 second: 30) '- #\w)
+ (make-timespec (time hour: 10 minute: 20 second: 30) '+ #\w))))
+
+ (test-group "+ +"
+ (test-equal "x + x = 2x"
+ (make-timespec (time hour: 20 minute: 41 second: 00) '+ #\w)
+ (timespec-add (make-timespec (time hour: 10 minute: 20 second: 30) '+ #\w)
+ (make-timespec (time hour: 10 minute: 20 second: 30) '+ #\w))))
+
+ (test-group "- -"
+ (test-equal "-x + -x = -2x"
+ (make-timespec (time hour: 20 minute: 41 second: 00) '- #\w)
+ (timespec-add (make-timespec (time hour: 10 minute: 20 second: 30) '- #\w)
+ (make-timespec (time hour: 10 minute: 20 second: 30) '- #\w))))
+
+ ;; add more than two timespecs
+
+ ;; add timespecs of differing types
+ )
+
+(test-group "parse-time-spec"
+ ;; TODO what even is this case?
+ (test-equal (make-timespec (time) '+ #\g) (parse-time-spec "-g"))
+
+ (test-equal "Parse direct date, with hour minute and second"
+ (make-timespec (time hour: 20 minute: 00 second: 00) '+ #\w)
+ (parse-time-spec "20:00:00"))
+ (test-equal "Parse direct date, with hour and minute"
+ (make-timespec (time hour: 20 minute: 00 second: 00) '+ #\w)
+ (parse-time-spec "20:00"))
+ (test-equal "Parse direct date, with just hour"
+ (make-timespec (time hour: 20 minute: 00 second: 00) '+ #\w)
+ (parse-time-spec "20"))
+
+ (test-equal "Parse timespec with letter at end"
+ (make-timespec (time hour: 20 minute: 00 second: 00) '+ #\g)
+ (parse-time-spec "20:00g"))
+
+ (test-equal "Parse negative timespec"
+ (make-timespec (time hour: 20 minute: 00 second: 00) '- #\w)
+ (parse-time-spec "-20"))
+
+ (test-equal "Parse negative timespec with letter at end"
+ (make-timespec (time hour: 20 minute: 00 second: 00) '- #\z)
+ (parse-time-spec "-20z")))
+
+'((datetime timespec))
diff --git a/tests/test/tz.scm b/tests/unit/datetime/tz.scm
index 00a611b3..d335ced3 100644
--- a/tests/test/tz.scm
+++ b/tests/unit/datetime/tz.scm
@@ -24,12 +24,12 @@
((TZ "Europe/London"))
(test-equal
"London winter"
- #2020-01-12T13:30:00
+ (datetime year: 2020 month: 01 day: 12 hour: 13 minute: 30 second: 00)
(get-datetime
(parse-ics-datetime "20200112T133000Z")))
(test-equal
"London summer"
- #2020-06-12T14:30:00
+ (datetime year: 2020 month: 06 day: 12 hour: 14 minute: 30 second: 00)
(get-datetime
(parse-ics-datetime "20200612T133000Z"))))
@@ -38,12 +38,12 @@
((TZ "Europe/Stockholm"))
(test-equal
"Stockholm winter"
- #2020-01-12T14:30:00
+ (datetime year: 2020 month: 01 day: 12 hour: 14 minute: 30 second: 00)
(get-datetime
(parse-ics-datetime "20200112T133000Z")))
(test-equal
"Stockholm summer"
- #2020-06-12T15:30:00
+ (datetime year: 2020 month: 06 day: 12 hour: 15 minute: 30 second: 00)
(get-datetime
(parse-ics-datetime "20200612T133000Z"))))
@@ -77,11 +77,12 @@
(test-equal
(datetime
date:
- #1970-01-01
+ (date year: 1970 month: 01 day: 01)
time:
- #00:00:00
+ (time hour: 00 minute: 00 second: 00)
tz:
"UTC")
(unix-time->datetime 0))
+'((datetime))
diff --git a/tests/test/zic.scm b/tests/unit/datetime/zic.scm
index 99247cf1..19af169c 100644
--- a/tests/test/zic.scm
+++ b/tests/unit/datetime/zic.scm
@@ -37,8 +37,8 @@ Link Europe/Zurich Europe/Vaduz
(test-equal "Basic Rule"
(list ((@@ (datetime zic) make-rule)
'US 1967 1973 4 '(last 0)
- ((@ (datetime zic) make-timespec) #02:00:00 '+ #\w)
- ((@ (datetime zic) make-timespec) #01:00:00 '+ #\d)
+ ((@ (datetime zic) make-timespec) (time hour: 02 minute: 00 second: 00) '+ #\w)
+ ((@ (datetime zic) make-timespec) (time hour: 01 minute: 00 second: 00) '+ #\d)
"D"))
(call-with-input-string "Rule US 1967 1973 - Apr lastSun 2:00w 1:00d D"
parse-zic-file))
@@ -47,7 +47,7 @@ Link Europe/Zurich Europe/Vaduz
(test-equal "Basic Zone"
(list ((@@ (datetime zic) make-zone) "Asia/Amman"
(list ((@@ (datetime zic) make-zone-entry)
- (make-timespec #02:00:00 '+ #\w)
+ (make-timespec (time hour: 02 minute: 00 second: 00) '+ #\w)
'Jordan "EE%sT" #f))))
(call-with-input-string
@@ -58,10 +58,10 @@ Link Europe/Zurich Europe/Vaduz
(test-equal "Basic Zone with continuation"
(list ((@@ (datetime zic) make-zone) "America/Menominee"
(list ((@@ (datetime zic) make-zone-entry)
- (make-timespec #05:00:00 '- #\w)
- #f "EST" #1973-04-29T02:00:00)
+ (make-timespec (time hour: 05 minute: 00 second: 00) '- #\w)
+ #f "EST" (datetime year: 1973 month: 04 day: 29 hour: 02 minute: 00 second: 00))
((@@ (datetime zic) make-zone-entry)
- (make-timespec #06:00:00 '- #\w)
+ (make-timespec (time hour: 06 minute: 00 second: 00) '- #\w)
'US "C%sT" #f))))
;; Why can't I single read a zone with an until field?
(call-with-input-string
@@ -73,20 +73,20 @@ Link Europe/Zurich Europe/Vaduz
(test-equal "Rules and Zone"
(list ((@@ (datetime zic) make-zone) "America/Menominee"
(list ((@@ (datetime zic) make-zone-entry)
- (make-timespec #05:00:00 '- #\w)
- #f "EST" #1973-04-29T02:00:00)
+ (make-timespec (time hour: 05 minute: 00 second: 00) '- #\w)
+ #f "EST" (datetime year: 1973 month: 04 day: 29 hour: 02 minute: 00 second: 00))
((@@ (datetime zic) make-zone-entry)
- (make-timespec #06:00:00 '- #\w)
+ (make-timespec (time hour: 06 minute: 00 second: 00) '- #\w)
'US "C%sT" #f)))
((@@ (datetime zic) make-rule)
'US 1967 1973 dec '(last 0)
- (make-timespec #02:00:00 '+ #\w)
- (make-timespec #01:00:00 '+ #\w)
+ (make-timespec (time hour: 02 minute: 00 second: 00) '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\w)
"D")
((@@ (datetime zic) make-rule)
'US 1967 2006 nov '(last 0)
- (make-timespec #02:00:00 '+ #\w)
- (make-timespec #00:00:00 '+ #\w)
+ (make-timespec (time hour: 02 minute: 00 second: 00) '+ #\w)
+ (make-timespec (time hour: 00 minute: 00 second: 00) '+ #\w)
"S"))
(call-with-input-string
"# Rule NAME FROM TO - IN ON AT SAVE LETTER/S
@@ -119,79 +119,79 @@ Zone America/Menominee -5:00 - EST 1973 Apr 29 2:00
(list ((@@ (datetime zic) make-link) "Europe/Vaduz" "Europe/Zurich")
((@@ (datetime zic) make-zone) "Europe/Zurich"
(list ((@@ (datetime zic) make-zone-entry)
- (make-timespec #00:34:08 '+ #\w)
- #f "LMT" #1853-07-16T00:00:00)
+ (make-timespec (time hour: 00 minute: 34 second: 08) '+ #\w)
+ #f "LMT" (datetime year: 1853 month: 07 day: 16 hour: 00 minute: 00 second: 00))
((@@ (datetime zic) make-zone-entry)
- (make-timespec #00:29:45 '+ #\w) ; NOTE that the .50 is discarded
- #f "BMT" #1894-06-01T00:00:00)
+ (make-timespec (time hour: 00 minute: 29 second: 45) '+ #\w) ; NOTE that the .50 is discarded
+ #f "BMT" (datetime year: 1894 month: 06 day: 01 hour: 00 minute: 00 second: 00))
((@@ (datetime zic) make-zone-entry)
- (make-timespec #01:00:00 '+ #\w)
- 'Swiss "CE%sT" #1981-01-01T00:00:00)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\w)
+ 'Swiss "CE%sT" (datetime year: 1981 month: 01 day: 01 hour: 00 minute: 00 second: 00))
((@@ (datetime zic) make-zone-entry)
- (make-timespec #01:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\w)
'EU "CE%sT" #f)))
((@@ (datetime zic) make-rule) 'EU 1996 'maximum 10 '(last 0)
- (make-timespec #01:00:00 '+ #\u)
- (make-timespec #00:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\u)
+ (make-timespec (time hour: 00 minute: 00 second: 00) '+ #\w)
"")
((@@ (datetime zic) make-rule) 'EU 1981 'maximum 3 '(last 0)
- (make-timespec #01:00:00 '+ #\u)
- (make-timespec #01:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\u)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\w)
"S")
((@@ (datetime zic) make-rule) 'EU 1979 1995 9 `(last ,sun)
- (make-timespec #01:00:00 '+ #\u)
- (make-timespec #00:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\u)
+ (make-timespec (time hour: 00 minute: 00 second: 00) '+ #\w)
"")
((@@ (datetime zic) make-rule) 'EU 1978 'only 10 1
- (make-timespec #01:00:00 '+ #\u)
- (make-timespec #00:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\u)
+ (make-timespec (time hour: 00 minute: 00 second: 00) '+ #\w)
"")
((@@ (datetime zic) make-rule) 'EU 1977 'only 9 `(last ,sun)
- (make-timespec #01:00:00 '+ #\u)
- (make-timespec #00:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\u)
+ (make-timespec (time hour: 00 minute: 00 second: 00) '+ #\w)
"")
((@@ (datetime zic) make-rule) 'EU 1977 1980 4 `(> ,sun 1)
- (make-timespec #01:00:00 '+ #\u)
- (make-timespec #01:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\u)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\w)
"S")
((@@ (datetime zic) make-rule) 'Swiss 1941 1942 10 `(> ,mon 1)
- (make-timespec #02:00:00 '+ #\w)
- (make-timespec #00:00:00 '+ #\w)
+ (make-timespec (time hour: 02 minute: 00 second: 00) '+ #\w)
+ (make-timespec (time hour: 00 minute: 00 second: 00) '+ #\w)
"")
((@@ (datetime zic) make-rule) 'Swiss 1941 1942 5 `(> ,mon 1)
- (make-timespec #01:00:00 '+ #\w)
- (make-timespec #01:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\w)
"S"))
(call-with-input-string big-sample
parse-zic-file)))
(test-group "rule->dtstart"
(test-equal "last sunday"
- #1967-04-30T02:00:00
+ (datetime year: 1967 month: 04 day: 30 hour: 02 minute: 00 second: 00)
(rule->dtstart
((@@ (datetime zic) make-rule)
'US 1967 1973 4 '(last 0)
- ((@ (datetime zic) make-timespec) #02:00:00 '+ #\w)
- ((@ (datetime zic) make-timespec) #01:00:00 '+ #\d)
+ ((@ (datetime zic) make-timespec) (time hour: 02 minute: 00 second: 00) '+ #\w)
+ ((@ (datetime zic) make-timespec) (time hour: 01 minute: 00 second: 00) '+ #\d)
"D")))
(test-equal "sunday >= 1"
- #1977-04-03T01:00:00Z
+ (datetime year: 1977 month: 04 day: 03 hour: 01 minute: 00 second: 00 tz: "UTC")
(rule->dtstart
((@@ (datetime zic) make-rule) 'EU 1977 1980 4 `(> ,sun 1)
- (make-timespec #01:00:00 '+ #\u)
- (make-timespec #01:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\u)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\w)
"S")))
;; Max and min uses dummy dates, which is slightly wrong
;; but shouldn't cause any real problems
(test-equal "Minimum time"
- #0000-10-30T01:00:00Z
+ (datetime year: 0000 month: 10 day: 30 hour: 01 minute: 00 second: 00 tz: "UTC")
(rule->dtstart
((@@ (datetime zic) make-rule) 'EU 'minimum 2000 10 '(last 0)
- (make-timespec #01:00:00 '+ #\u)
- (make-timespec #00:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\u)
+ (make-timespec (time hour: 00 minute: 00 second: 00) '+ #\w)
"")))
(test-equal "Maximum time"
@@ -199,8 +199,8 @@ Zone America/Menominee -5:00 - EST 1973 Apr 29 2:00
hour: 1 tz: "UTC")
(rule->dtstart
((@@ (datetime zic) make-rule) 'EU 'maximum 2000 10 '(last 0)
- (make-timespec #01:00:00 '+ #\u)
- (make-timespec #00:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\u)
+ (make-timespec (time hour: 00 minute: 00 second: 00) '+ #\w)
""))))
(test-group "zone-format"
@@ -228,12 +228,12 @@ Zone America/Menominee -5:00 - EST 1973 Apr 29 2:00
(test-equal "Get rules returns correctly, and in order"
;; Rules are sorted
(list ((@@ (datetime zic) make-rule) 'Swiss 1941 1942 5 `(> ,mon 1)
- (make-timespec #01:00:00 '+ #\w)
- (make-timespec #01:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\w)
"S")
((@@ (datetime zic) make-rule) 'Swiss 1941 1942 10 `(> ,mon 1)
- (make-timespec #02:00:00 '+ #\w)
- (make-timespec #00:00:00 '+ #\w)
+ (make-timespec (time hour: 02 minute: 00 second: 00) '+ #\w)
+ (make-timespec (time hour: 00 minute: 00 second: 00) '+ #\w)
""))
(get-rule zoneinfo 'Swiss))))
@@ -246,8 +246,8 @@ Zone America/Menominee -5:00 - EST 1973 Apr 29 2:00
bymonth: (list oct))
(rule->rrule
((@@ (datetime zic) make-rule) 'EU 1996 'maximum 10 '(last 0)
- (make-timespec #01:00:00 '+ #\u)
- (make-timespec #00:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\u)
+ (make-timespec (time hour: 00 minute: 00 second: 00) '+ #\w)
"")
))
@@ -255,8 +255,8 @@ Zone America/Menominee -5:00 - EST 1973 Apr 29 2:00
#f
(rule->rrule
((@@ (datetime zic) make-rule) 'EU 1996 'only 10 '(last 2)
- (make-timespec #01:00:00 '+ #\u)
- (make-timespec #00:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\u)
+ (make-timespec (time hour: 00 minute: 00 second: 00) '+ #\w)
"")))
(test-equal "with definitive to year"
@@ -264,11 +264,11 @@ Zone America/Menominee -5:00 - EST 1973 Apr 29 2:00
freq: 'YEARLY interval: 1 wkst: mon
byday: (list (cons -1 tue))
bymonth: (list oct)
- until: #2000-01-01T00:00:00)
+ until: (datetime year: 2000 month: 01 day: 01 hour: 00 minute: 00 second: 00))
(rule->rrule
((@@ (datetime zic) make-rule) 'EU 1996 2000 10 '(last 2)
- (make-timespec #01:00:00 '+ #\u)
- (make-timespec #00:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\u)
+ (make-timespec (time hour: 00 minute: 00 second: 00) '+ #\w)
"")))
(test-equal "on being a month day"
@@ -278,8 +278,8 @@ Zone America/Menominee -5:00 - EST 1973 Apr 29 2:00
bymonth: (list oct))
(rule->rrule
((@@ (datetime zic) make-rule) 'EU 1996 'maximum 10 2
- (make-timespec #01:00:00 '+ #\u)
- (make-timespec #00:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\u)
+ (make-timespec (time hour: 00 minute: 00 second: 00) '+ #\w)
"")))
(test-equal "on being first day after date"
@@ -289,8 +289,8 @@ Zone America/Menominee -5:00 - EST 1973 Apr 29 2:00
bymonth: (list oct))
(rule->rrule
((@@ (datetime zic) make-rule) 'EU 1996 'maximum 10 `(> ,mon 2)
- (make-timespec #01:00:00 '+ #\u)
- (make-timespec #00:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\u)
+ (make-timespec (time hour: 00 minute: 00 second: 00) '+ #\w)
"")))
(test-equal "Crash on counting backwards from date"
@@ -299,8 +299,8 @@ Zone America/Menominee -5:00 - EST 1973 Apr 29 2:00
(lambda ()
(rule->rrule
((@@ (datetime zic) make-rule) 'EU 1996 'maximum 10 `(< ,mon 2)
- (make-timespec #01:00:00 '+ #\u)
- (make-timespec #00:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\u)
+ (make-timespec (time hour: 00 minute: 00 second: 00) '+ #\w)
"")))
list))
@@ -310,8 +310,10 @@ Zone America/Menominee -5:00 - EST 1973 Apr 29 2:00
(lambda ()
(rule->rrule
((@@ (datetime zic) make-rule) 'EU 1996 'minimum 10 `(< ,mon 2)
- (make-timespec #01:00:00 '+ #\u)
- (make-timespec #00:00:00 '+ #\w)
+ (make-timespec (time hour: 01 minute: 00 second: 00) '+ #\u)
+ (make-timespec (time hour: 00 minute: 00 second: 00) '+ #\w)
"")))
list))
)
+
+'((datetime zic))
diff --git a/tests/test/termios.scm b/tests/unit/termios/termios.scm
index 7f607cc4..3e472d81 100644
--- a/tests/test/termios.scm
+++ b/tests/unit/termios/termios.scm
@@ -46,3 +46,4 @@
(test-equal 0 (tcsetattr! copy tty))
+'((vulgar termios))
diff --git a/tests/test/base64.scm b/tests/unit/util/base64.scm
index b24d2e8b..7fac883c 100644
--- a/tests/test/base64.scm
+++ b/tests/unit/util/base64.scm
@@ -41,3 +41,5 @@
(test-equal "AAECAw==" (bytevector->base64-string #vu8(0 1 2 3)))
(test-equal #vu8(0 1 2 3) (base64-string->bytevector "AAECAw=="))
+
+'((base64))
diff --git a/tests/test/crypto.scm b/tests/unit/util/crypto.scm
index 0dbf8867..7be301a0 100644
--- a/tests/test/crypto.scm
+++ b/tests/unit/util/crypto.scm
@@ -20,3 +20,5 @@
(test-error 'wrong-type-arg
(sha256 'something-which-is-not-a-string-or-bytevector))
+
+'((crypto))
diff --git a/tests/test/hnh-util-env.scm b/tests/unit/util/hnh-util-env.scm
index c1e0161f..74ab3b79 100644
--- a/tests/test/hnh-util-env.scm
+++ b/tests/unit/util/hnh-util-env.scm
@@ -45,3 +45,5 @@
(let-env ((TEST #f))
(test-assert (not (getenv "TEST"))))
(test-equal "A" (getenv "TEST")))
+
+'((hnh util env))
diff --git a/tests/test/hnh-util-lens.scm b/tests/unit/util/hnh-util-lens.scm
index 0508553a..0f4af6cb 100644
--- a/tests/test/hnh-util-lens.scm
+++ b/tests/unit/util/hnh-util-lens.scm
@@ -57,3 +57,5 @@
;; ref car* cdr*
;; each
+
+'((hnh util lens))
diff --git a/tests/test/hnh-util-path.scm b/tests/unit/util/hnh-util-path.scm
index de4bf8e3..e5f65505 100644
--- a/tests/test/hnh-util-path.scm
+++ b/tests/unit/util/hnh-util-path.scm
@@ -122,3 +122,5 @@
(test-equal "Extension of hidden file without extension"
"bashrc" (filename-extension ".bashrc"))
+
+'((hnh util path))
diff --git a/tests/test/hnh-util-state-monad.scm b/tests/unit/util/hnh-util-state-monad.scm
index 353c47e9..4180a53f 100644
--- a/tests/test/hnh-util-state-monad.scm
+++ b/tests/unit/util/hnh-util-state-monad.scm
@@ -118,3 +118,4 @@
0 1))
+'((hnh util state-monad))
diff --git a/tests/test/hnh-util.scm b/tests/unit/util/hnh-util.scm
index c4a20443..8586b6d9 100644
--- a/tests/test/hnh-util.scm
+++ b/tests/unit/util/hnh-util.scm
@@ -8,7 +8,6 @@
:use-module (srfi srfi-88)
:use-module (srfi srfi-1)
:use-module (hnh util)
- :use-module (hnh util env)
)
(define (unreachable)
@@ -45,18 +44,19 @@
;; (test-group "define-syntax"
;; )
-(test-group "Conditionals"
+(test-group "when"
(test-equal "when"
1 (when #t 1))
(test-equal "'() when #f"
- '() (when #f 1))
+ '() (when #f 1)))
+(test-group "unless"
(test-equal "unless"
1 (unless #f 1))
(test-equal "'() unless #t"
- '() (unless #t 1))
+ '() (unless #t 1)))
@@ -71,6 +71,7 @@
(unreachable)
(test-assert #t)))
+(test-group "awhen"
(test-equal "awhen it"
'(3 4 5)
(awhen (memv 2 '(1 2 3 4 5))
@@ -100,26 +101,21 @@
(test-equal "for with longer improper list elements"
'(1 2 4)
(for (a b . c) in '((1 -1 . 1) (2 -2 . 2) (4 -4 . 4))
- (* c (+ 1 a b))))
-
- (test-equal "for break"
- 'x
- (for x in (iota 10)
- (break 'x)
- (test-assert "This should never happen" #f)))
-
- (test-equal "for continue"
- '(x #f 2)
- (for x in (iota 3)
- (case x
- ((0)
- (continue 'x)
- (test-assert "Continue with value failed" #f))
- ((1)
- (continue)
- (test-assert "Continue without value failed" #f))
- (else x)))))
-
+ (* c (+ 1 a b)))))
+
+(test-group "begin1"
+ (let ((value #f))
+ (test-equal
+ "begin1 return value"
+ "Hello"
+ (begin1 "Hello" (set! value "World")))
+ (test-equal "begin1 side effects" "World" value))
+
+ (let ((x 1))
+ (test-eqv "begin1 set! after return"
+ 1 (begin1 x (set! x 10)))
+ (test-eqv "Updates value"
+ 10 x)))
(test-group "print-and-return"
(let ((p (open-output-string)))
@@ -135,31 +131,82 @@
'(3 2 1)
((swap list) 1 2 3)))
+(test-group "set/r!"
+ (test-equal
+ "set/r! = single"
+ #f
+ (let ((x #t)) (set/r! x = not)))
+
+ (test-error
+ 'syntax-error
+ (test-read-eval-string "(set/r! x err not)")))
+
+(test-group "label"
+ (test-equal "procedure label"
+ 120
+ ((label factorial (lambda (n)
+ (if (zero? n)
+ 1 (* n (factorial (1- n))))))
+ 5)))
+
+(test-group "sort*"
+ ;; we can't test if sort*! destroys the list, since its only /allowed/ to do it,
+ ;; not required.
+ (test-equal "sort*!"
+ '("a" "Hello" "Assparagus")
+ (sort*! '("Hello" "a" "Assparagus")
+ < string-length)))
+
+
+(test-group "find-extreme"
+ (test-error 'wrong-type-arg (find-extreme '()))
-(test-equal "procedure label"
- 120
- ((label factorial (lambda (n)
- (if (zero? n)
- 1 (* n (factorial (1- n))))))
- 5))
-
-;; we can't test if sort*! destroys the list, since its only /allowed/ to do it,
-;; not required.
-(test-equal "sort*!"
- '("a" "Hello" "Assparagus")
- (sort*! '("Hello" "a" "Assparagus")
- < string-length))
-
+ (test-group "find-min"
+ (call-with-values
+ (lambda () (find-min (iota 10)))
+ (lambda (extreme rest)
+ (test-equal "Found correct minimum" 0 extreme)
+ (test-equal
+ "Removed \"something\" from the set"
+ 9
+ (length rest)))))
+ (test-group "find-max"
+ (call-with-values
+ (lambda ()
+ (find-max
+ '("Hello" "Test" "Something long")
+ string-length))
+ (lambda (extreme rest)
+ (test-equal
+ "Found the longest string"
+ "Something long"
+ extreme)
+ (test-equal "Removed the string" 2 (length rest))
+ (test-assert
+ "Other members left 1"
+ (member "Hello" rest))
+ (test-assert
+ "Other members left 2"
+ (member "Test" rest))))))
+(test-group "filter-sorted"
+ (test-equal
+ "Filter sorted"
+ '(3 4 5)
+ (filter-sorted (lambda (x) (<= 3 x 5)) (iota 10))))
+(test-group "!="
+ (test-assert "not equal"
+ (!= 1 2)))
-(test-assert "not equal"
- (!= 1 2))
+(test-group "init+last"
+ 'TODO)
-(test-equal "Take to"
- '() (take-to '() 5))
+(test-group "take-to"
+ (test-equal "Take to"
+ '() (take-to '() 5)))
(test-group "string-take-to"
(test-equal "Hello"
@@ -178,20 +225,24 @@
'() (as-symb '())))
-(test-equal "Enumerate"
- '((0 #\H) (1 #\e) (2 #\l) (3 #\l) (4 #\o) (5 #\,) (6 #\space) (7 #\W) (8 #\o) (9 #\r) (10 #\l) (11 #\d) (12 #\!))
- (enumerate (string->list "Hello, World!")))
+(test-group "enumerate"
+ (test-equal "Enumerate"
+ '((0 #\H) (1 #\e) (2 #\l) (3 #\l) (4 #\o) (5 #\,) (6 #\space) (7 #\W) (8 #\o) (9 #\r) (10 #\l) (11 #\d) (12 #\!))
+ (enumerate (string->list "Hello, World!"))))
+
+
+(test-group "unval"
+ (test-equal "unval first"
+ 1
+ ((unval (lambda () (values 1 2 3)))))
-(test-equal "unval first"
- 1
- ((unval (lambda () (values 1 2 3)))))
+ (test-equal "unval other"
+ 2
+ ((unval car+cdr 1)
+ (cons 1 2))))
-(test-equal "unval other"
- 2
- ((unval car+cdr 1)
- (cons 1 2)))
-(test-group "Flatten"
+(test-group "flatten"
(test-equal "flatten already flat"
(iota 10)
(flatten (iota 10)))
@@ -204,20 +255,38 @@
'(1 2 3 4 5)
(flatten '((((((1(((((2((((3))))))4))))))))5))))
-;; TODO test let-lazy
+(test-group "let-lazy"
+ 'TODO)
(test-group "map/dotted"
- (test-equal "map/dotted without dot"
- '(1 2 3 4)
- (map/dotted 1+ '(0 1 2 3)))
+ (test-equal "map/dotted without dot"
+ '(1 2 3 4)
+ (map/dotted 1+ '(0 1 2 3)))
+
+ (test-equal "map/dotted with dot"
+ '(1 2 3 . 4)
+ (map/dotted 1+ '(0 1 2 . 3)))
+
+ (test-equal "map/dotted direct value"
+ 1 (map/dotted 1+ 0)))
- (test-equal "map/dotted with dot"
- '(1 2 3 . 4)
- (map/dotted 1+ '(0 1 2 . 3)))
+(test-group "assq-merge"
+ (test-equal "assq merge"
+ '((k 2 1) (v 2))
+ (assq-merge '((k 1) (v 2)) '((k 2)))))
- (test-equal "map/dotted direct value"
- 1 (map/dotted 1+ 0)))
+(test-group "kvlist->assq"
+ (test-equal "kvlist->assq"
+ '((a . 1) (b . 2))
+ (kvlist->assq '(a: 1 b: 2)))
+
+ (test-equal "kvlist->assq repeated key"
+ '((a . 1) (b . 2) (a . 3))
+ (kvlist->assq '(a: 1 b: 2 a: 3))))
+
+(test-group "assq-limit"
+ 'TODO)
(test-group "group-by"
@@ -243,6 +312,28 @@
'TODO)
+(test-group "span-upto"
+ (test-group "Case 1"
+ (call-with-values
+ (lambda ()
+ (span-upto
+ 2
+ char-numeric?
+ (string->list "123456")))
+ (lambda (head tail)
+ (test-equal '(#\1 #\2) head)
+ (test-equal '(#\3 #\4 #\5 #\6) tail))))
+
+ (test-group "Case 2"
+ (call-with-values
+ (lambda ()
+ (span-upto
+ 2
+ char-numeric?
+ (string->list "H123456")))
+ (lambda (head tail)
+ (test-equal '() head)
+ (test-equal '(#\H #\1 #\2 #\3 #\4 #\5 #\6) tail)))))
(test-group "cross-product"
(test-equal "Basic case"
@@ -273,136 +364,65 @@
'(3 4)
'(5 6))))
-(test-group "Arrows"
- (test-equal "->" 9 (-> 1 (+ 2) (* 3)))
- (test-equal "-> order dependant" -1 (-> 1 (- 2)))
- (test-equal "->> order dependant" 1 (->> 1 (- 2))))
-
-;; TODO set and set->
-
-;; TODO and=>>
-
-;; downcase-symbol
-
-
-
-;; TODO test failure when grouping isn't possible?
-(test-equal "Group"
- '((0 1) (2 3) (4 5) (6 7) (8 9))
- (group (iota 10) 2))
-
-;; TODO test failure when grouping isn't possible?
-
-(test-group "Associations"
- (test-equal "assoc-ref-all" '(1 3) (assoc-ref-all '((a . 1) (b . 2) (a . 3)) 'a))
- (test-equal "assq-ref-all" '(1 3) (assq-ref-all '((a . 1) (b . 2) (a . 3)) 'a))
- (test-equal "assv-ref-all" '(1 3) (assv-ref-all '((a . 1) (b . 2) (a . 3)) 'a))
-
- ;; TODO assq-limit ?
+(test-group "string-flatten"
+ 'TODO)
- (test-equal "assq merge"
- '((k 2 1) (v 2))
- (assq-merge '((k 1) (v 2)) '((k 2))))
+(test-group "intersperse"
+ 'TODO)
- (test-equal "kvlist->assq"
- '((a . 1) (b . 2))
- (kvlist->assq '(a: 1 b: 2)))
+(test-group "insert-ordered"
+ 'TODO)
+(test-group "-> (arrows)"
+ (test-equal "->" 9 (-> 1 (+ 2) (* 3)))
+ (test-equal "-> order dependant" -1 (-> 1 (- 2)))
+ (test-equal "->> order dependant" 1 (->> 1 (- 2))))
- (test-equal "kvlist->assq repeated key"
- '((a . 1) (b . 2) (a . 3))
- (kvlist->assq '(a: 1 b: 2 a: 3))))
+(test-group "set"
+ 'TODO)
-(test-equal "vector-last"
- 1 (vector-last #(0 2 3 1)))
+(test-group "set->"
+ 'TODO)
-;; TODO test catch*
+(test-group "and=>"
+ 'TODO)
-(test-equal
- "Filter sorted"
- '(3 4 5)
- (filter-sorted (lambda (x) (<= 3 x 5)) (iota 10)))
+(test-group "downcase-symbol"
+ 'TODO)
-(test-equal
- "set/r! = single"
- #f
- (let ((x #t)) (set/r! x = not)))
-(test-error
- 'syntax-error
- (test-read-eval-string "(set/r! x err not)"))
+(test-group "group"
+ ;; TODO test failure when grouping isn't possible?
+ (test-equal "Group"
+ '((0 1) (2 3) (4 5) (6 7) (8 9))
+ (group (iota 10) 2)))
-(test-group "Find extremes"
- (test-error 'wrong-type-arg (find-extreme '()))
+(test-group "iterate"
+ (test-equal 0 (iterate 1- zero? 10)))
- (test-group "find-min"
- (call-with-values
- (lambda () (find-min (iota 10)))
- (lambda (extreme rest)
- (test-equal "Found correct minimum" 0 extreme)
- (test-equal
- "Removed \"something\" from the set"
- 9
- (length rest)))))
-
- (test-group "find-max"
- (call-with-values
- (lambda ()
- (find-max
- '("Hello" "Test" "Something long")
- string-length))
- (lambda (extreme rest)
- (test-equal
- "Found the longest string"
- "Something long"
- extreme)
- (test-equal "Removed the string" 2 (length rest))
- (test-assert
- "Other members left 1"
- (member "Hello" rest))
- (test-assert
- "Other members left 2"
- (member "Test" rest))))))
-
-(test-group "Span upto"
- (test-group "Case 1"
- (call-with-values
- (lambda ()
- (span-upto
- 2
- char-numeric?
- (string->list "123456")))
- (lambda (head tail)
- (test-equal '(#\1 #\2) head)
- (test-equal '(#\3 #\4 #\5 #\6) tail))))
-
- (test-group "Case 2"
- (call-with-values
- (lambda ()
- (span-upto
- 2
- char-numeric?
- (string->list "H123456")))
- (lambda (head tail)
- (test-equal '() head)
- (test-equal '(#\H #\1 #\2 #\3 #\4 #\5 #\6) tail)))))
+(test-group "valued-map"
+ 'TODO)
-(test-group "Begin1"
- (let ((value #f))
- (test-equal
- "begin1 return value"
- "Hello"
- (begin1 "Hello" (set! value "World")))
- (test-equal "begin1 side effects" "World" value))
+(test-group "assoc-ref-all"
+ (test-equal "assoc-ref-all"
+ '(1 3) (assoc-ref-all '((a . 1) (b . 2) (a . 3)) 'a))
+ (test-equal "assq-ref-all"
+ '(1 3) (assq-ref-all '((a . 1) (b . 2) (a . 3)) 'a))
+ (test-equal "assv-ref-all"
+ '(1 3) (assv-ref-all '((a . 1) (b . 2) (a . 3)) 'a)))
- (let ((x 1))
- (test-eqv "begin1 set! after return"
- 1 (begin1 x (set! x 10)))
- (test-eqv "Updates value"
- 10 x)))
+(test-group "unique"
+ 'TODO)
-(test-equal 0 (iterate 1- zero? 10))
+(test-group "vector-last"
+ (test-equal "vector-last"
+ 1 (vector-last #(0 2 3 1))))
(test-group "->string"
(test-equal "5" (->string 5))
(test-equal "5" (->string "5")))
+
+(test-group "catch*"
+ 'TODO)
+
+'((hnh util))
diff --git a/tests/test/object.scm b/tests/unit/util/object.scm
index 701c45c0..4f3aeb4f 100644
--- a/tests/test/object.scm
+++ b/tests/unit/util/object.scm
@@ -78,3 +78,5 @@
;; - printer:
(define-type (f4 printer: (lambda (r p) (display "something" p))))
(test-equal "something" (with-output-to-string (lambda () (write (f4)))))
+
+'((hnh util object))
diff --git a/tests/test/srfi-41-util.scm b/tests/unit/util/srfi-41-util.scm
index 9a753b03..79c607c5 100644
--- a/tests/test/srfi-41-util.scm
+++ b/tests/unit/util/srfi-41-util.scm
@@ -106,3 +106,5 @@
(stream-map list->string
(stream-split-by (lambda (c) (char=? c #\space))
hello-chars-stream))))))
+
+'((srfi srfi-41 util))
diff --git a/tests/test/sxml-namespaced.scm b/tests/unit/util/sxml-namespaced.scm
index 55d52798..b2d55028 100644
--- a/tests/test/sxml-namespaced.scm
+++ b/tests/unit/util/sxml-namespaced.scm
@@ -168,3 +168,5 @@
(xml->namespaced-sxml "<x:a xmlns:y=\"http://example.com/1\"><x:b/></x:a>"
; `((x . ,(ns 1)))
))
+
+'((sxml namespaced))
diff --git a/tests/test/uuid.scm b/tests/unit/util/uuid.scm
index 1cedb59e..7d68e38e 100644
--- a/tests/test/uuid.scm
+++ b/tests/unit/util/uuid.scm
@@ -9,3 +9,5 @@
"d19c9347-9a85-4432-a876-5fb9c0d24d2b"
(parameterize ((seed (seed->random-state 0)))
(uuid-v4)))
+
+'((hnh util uuid))
diff --git a/tests/test/xdg-basedir.scm b/tests/unit/util/xdg-basedir.scm
index 682c1347..5731b581 100644
--- a/tests/test/xdg-basedir.scm
+++ b/tests/unit/util/xdg-basedir.scm
@@ -56,3 +56,4 @@
(test-assert "No error was emitted"
(string-null? warning)))))
+'((xdg basedir))
diff --git a/tests/test/xml-namespace.scm b/tests/unit/util/xml-namespace.scm
index 09402ceb..2b6ea174 100644
--- a/tests/test/xml-namespace.scm
+++ b/tests/unit/util/xml-namespace.scm
@@ -34,3 +34,5 @@
"Remove specific namespace"
'(a:a (b))
(move-to-namespace '(a:a (b:b)) '((b . #f))))
+
+'((sxml namespace))
diff --git a/tests/test/annoying-events.scm b/tests/unit/vcomponent/annoying-events.scm
index a6f5e946..0fa81adb 100644
--- a/tests/test/annoying-events.scm
+++ b/tests/unit/vcomponent/annoying-events.scm
@@ -8,8 +8,6 @@
stream->list
stream-filter
stream-take-while))
- :use-module ((vcomponent base)
- :select (extract prop))
:use-module ((vcomponent datetime) :select (event-overlaps?))
:use-module ((datetime) :select (date date+ date<))
:use-module ((hnh util) :select (set!))
@@ -17,7 +15,7 @@
:use-module (vcomponent base))
-(define start #2021-11-01)
+(define start (date year: 2021 month: 11 day: 01))
(define end (date+ start (date day: 8)))
@@ -25,16 +23,16 @@
(stream
(vevent ; should be part of the result
summary: "A"
- dtstart: #2021-10-01
- dtend: #2021-12-01)
+ dtstart: (date year: 2021 month: 10 day: 01)
+ dtend: (date year: 2021 month: 12 day: 01))
(vevent ; should NOT be part of the result
summary: "B"
- dtstart: #2021-10-10
- dtend: #2021-10-11)
+ dtstart: (date year: 2021 month: 10 day: 10)
+ dtend: (date year: 2021 month: 10 day: 11))
(vevent ; should also be part of the result
summary: "C"
- dtstart: #2021-11-02
- dtend: #2021-11-03)))
+ dtstart: (date year: 2021 month: 11 day: 02)
+ dtend: (date year: 2021 month: 11 day: 03))))
;; (if (and (date< (prop ev 'DTSTART) start-date)
;; (date<= (prop ev 'DTEND) end-date))
@@ -65,3 +63,6 @@
ev-set)))))
+
+'((vcomponent base)
+ (vcomponent datetime))
diff --git a/tests/test/create.scm b/tests/unit/vcomponent/create.scm
index 7cc00419..caf2d33c 100644
--- a/tests/test/create.scm
+++ b/tests/unit/vcomponent/create.scm
@@ -64,3 +64,6 @@
(test-assert (every vline? (prop* ev 'PROP)))))
;; (test-group "Parameters and lists" )
+
+
+'((vcomponent create))
diff --git a/tests/test/param.scm b/tests/unit/vcomponent/param.scm
index 431a8f46..9611fd8a 100644
--- a/tests/test/param.scm
+++ b/tests/unit/vcomponent/param.scm
@@ -64,3 +64,6 @@ END:DUMMY"
(test-error
'warning
(vcomponent->sxcal component)))
+
+'((vcomponent base)
+ (vcomponent formats xcal output))
diff --git a/tests/unit/vcomponent/recurrence-advanced.scm b/tests/unit/vcomponent/recurrence-advanced.scm
new file mode 100644
index 00000000..1bd4311a
--- /dev/null
+++ b/tests/unit/vcomponent/recurrence-advanced.scm
@@ -0,0 +1,1555 @@
+;;; Commentary:
+;; Tests of recurrence rule generation with focus on correct instances
+;; being generated. For tests of basic recurrence functionallity, see
+;; recurrence-simple.scm.
+;;
+;; This file also tests format-recurrence-rule, which checks that human
+;; readable representations of the RRULES work.
+;;
+;; Also contains the tests for EXDATE.
+;;
+;; Most examples copied from RFC5545, some home written.
+;;; Code:
+
+(define-module (test recurrence-advanced)
+ :use-module (srfi srfi-64)
+ :use-module (srfi srfi-88)
+ :use-module ((vcomponent recurrence)
+ :select (make-recur-rule))
+ :use-module ((vcomponent recurrence generate)
+ :select (generate-recurrence-set))
+ :use-module ((vcomponent recurrence display)
+ :select (format-recurrence-rule))
+ :use-module ((vcomponent recurrence internal)
+ :select (count until))
+ :use-module ((vcomponent base)
+ :select (prop prop* extract))
+ :use-module (vcomponent create)
+ :use-module ((datetime)
+ :select (parse-ics-datetime
+ datetime
+ datetime-date
+ time
+ date
+ jan feb mar apr may jun jul aug sep oct nov dec
+ mon tue wed thu fri sat sun
+ datetime->string))
+ :use-module ((hnh util) :select (-> set!))
+ :use-module ((srfi srfi-41) :select (stream->list))
+ :use-module ((srfi srfi-88) :select (keyword->string)))
+
+(test-expect-fail "REC: The third instance into the month of one of Tuesday, Wednesday, or Thursday, for the next 3 months")
+
+(test-expect-fail "STR: The third instance into the month of one of Tuesday, Wednesday, or Thursday, for the next 3 months")
+
+(test-expect-fail "REC: The second-to-last weekday of the month")
+
+(test-expect-fail "STR: The second-to-last weekday of the month")
+
+;; TODO this test is really slow, figure out why (takes approx. 25s to run)
+(test-skip "REC: Every day in January, for 3 years (alt 2)")
+
+(define (run-test comp)
+ (test-equal
+ (string-append "REC: " (prop comp 'SUMMARY))
+ (prop comp 'X-SET)
+ (let ((r (generate-recurrence-set comp)))
+ (map (extract 'DTSTART)
+ (if (or (until (prop comp 'RRULE))
+ (count (prop comp 'RRULE)))
+ (stream->list r)
+ (stream->list 20 r)))))
+ (test-equal
+ (string-append "STR: " (prop comp 'SUMMARY))
+ (prop comp 'X-SUMMARY)
+ ;; TODO setting language='en causes messages to be in english, but date
+ ;; strings still format LC_TIME (which I have set to swedish)...
+ ;; TODO possibly test with other languages
+ (format-recurrence-rule (prop comp 'RRULE) 'sv)))
+
+(map run-test
+ (list (vevent
+ summary:
+ "Daily for 10 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'DAILY
+ count: 10)
+ x-summary:
+ "dagligen, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 11 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Daily until December 24, 1997"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'DAILY
+ until: (datetime year: 1997 month: 12 day: 24 hour: 00 minute: 00 second: 00 tz: "UTC"))
+ x-summary:
+ "dagligen, till och med den 24 december, 1997 kl. 0:00"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 23 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every other day - forever"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'DAILY
+ interval: 2)
+ x-summary:
+ "varannan dag"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 10 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every 10 days, 5 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'DAILY
+ interval: 10
+ count: 5)
+ x-summary:
+ "var tionde dag, totalt 5 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 12 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every day in January, for 3 years (alt 1)"
+ dtstart:
+ (datetime year: 1998 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ until: (datetime year: 2000 month: 01 day: 31 hour: 14 minute: 00 second: 00 tz: "UTC")
+ bymonth: (list jan)
+ byday: (list sun mon tue wed thu fri sat))
+ x-summary:
+ "varje lördag, fredag, torsdag, onsdag, tisdag, måndag & söndag i januari, årligen, till och med den 31 januari, 2000 kl. 14:00"
+ x-set:
+ (list (datetime year: 1998 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 31 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every day in January, for 3 years (alt 2)"
+ dtstart:
+ (datetime year: 1998 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'DAILY
+ until: (datetime year: 2000 month: 01 day: 31 hour: 14 minute: 00 second: 00 tz: "UTC")
+ bymonth: 1)
+ x-summary:
+ "dagligen, till och med den 31 januari, 2000 kl. 14:00"
+ x-set:
+ (list (datetime year: 1998 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 31 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Weekly for 10 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'WEEKLY
+ count: 10)
+ x-summary:
+ "varje vecka, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 04 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Weekly until December 24, 1997"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'WEEKLY
+ until: (datetime year: 1997 month: 12 day: 24 hour: 00 minute: 00 second: 00 tz: "UTC"))
+ x-summary:
+ "varje vecka, till och med den 24 december, 1997 kl. 0:00"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 23 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every other week - forever"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'WEEKLY
+ interval: 2
+ wkst: sun)
+ x-summary:
+ "varannan vecka"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 02 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 02 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 04 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 04 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 26 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Weekly on Tuesday and Thursday for five weeks (alt 1)"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'WEEKLY
+ until: (datetime year: 1997 month: 10 day: 07 hour: 00 minute: 00 second: 00 tz: "UTC")
+ wkst: sun
+ byday: (list tue thu))
+ x-summary:
+ "varje tisdag & torsdag, till och med den 07 oktober, 1997 kl. 0:00"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 02 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Weekly on Tuesday and Thursday for five weeks (alt 2)"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'WEEKLY
+ count: 10
+ wkst: sun
+ byday: (list tue thu))
+ x-summary:
+ "varje tisdag & torsdag, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 02 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every other week on Monday, Wednesday, and Friday until December 24, 1997, starting on Monday, September 1, 1997:"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 01 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'WEEKLY
+ interval: 2
+ until: (datetime year: 1997 month: 12 day: 24 hour: 00 minute: 00 second: 00 tz: "UTC")
+ wkst: sun
+ byday: (list mon wed fri))
+ x-summary:
+ "varannan måndag, onsdag & fredag, till och med den 24 december, 1997 kl. 0:00"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 22 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every other week on Tuesday and Thursday, for 8 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'WEEKLY
+ interval: 2
+ count: 8
+ wkst: sun
+ byday: (list tue thu))
+ x-summary:
+ "varannan tisdag & torsdag, totalt 8 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 16 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Monthly on the first Friday for 10 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 05 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ count: 10
+ byday: (list (cons 1 fri)))
+ x-summary:
+ "första fredagen varje månad, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 02 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 04 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 06 day: 05 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Monthly on the first Friday until December 24, 1997"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 05 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ until: (datetime year: 1997 month: 12 day: 24 hour: 00 minute: 00 second: 00 tz: "UTC")
+ byday: (list (cons 1 fri)))
+ x-summary:
+ "första fredagen varje månad, till och med den 24 december, 1997 kl. 0:00"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 05 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every other month on the first and last Sunday of the month for 10 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 07 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ interval: 2
+ count: 10
+ byday: (list (cons 1 sun)
+ (cons -1 sun)))
+ x-summary:
+ "första söndagen samt sista söndagen varannan månad, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 31 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Monthly on the second-to-last Monday of the month for 6 months"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 22 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ count: 6
+ byday: (list (cons -2 mon)))
+ x-summary:
+ "näst sista måndagen varje månad, totalt 6 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 02 day: 16 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Monthly on the third-to-the-last day of the month, forever"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 28 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ bymonthday: (list -3))
+ x-summary:
+ "den tredje sista varje månad"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 02 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 04 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 06 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 07 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 08 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 09 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 10 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 11 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 12 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 02 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 04 day: 28 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Monthly on the 2nd and 15th of the month for 10 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ count: 10
+ bymonthday: (list 2 15))
+ x-summary:
+ "den andre & femtonde varje månad, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 15 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Monthly on the first and last day of the month for 10 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ count: 10
+ bymonthday: (list 1 -1))
+ x-summary:
+ "den förste & sista varje månad, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 01 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every 18 months on the 10th thru 15th of the month for 10 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 10 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ interval: 18
+ count: 10
+ bymonthday: (list 10 11 12 13 14 15))
+ x-summary:
+ "den tionde, elfte, tolfte, trettonde, fjortonde & femtonde var artonde månad, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 13 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every Tuesday, every other month"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ interval: 2
+ byday: (list tue))
+ x-summary:
+ "varje tisdag varannan månad"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 12 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Yearly in June and July for 10 occurrences:\n: Since none of the BYDAY, BYMONTHDAY, or BYYEARDAY\nonents are specified, the day is gotten from \"DTSTART\""
+ dtstart:
+ (datetime year: 1997 month: 06 day: 10 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ count: 10
+ bymonth: (list 6 7))
+ x-summary:
+ "juni & juli, årligen, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 06 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 07 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 06 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 07 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 06 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 07 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 06 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 07 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 06 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 07 day: 10 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every other year on January, February, and March for 10 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 03 day: 10 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ interval: 2
+ count: 10
+ bymonth: (list jan feb mar))
+ x-summary:
+ "januari, februari & mars vartannat år, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 03 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 02 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 02 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 03 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 02 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 03 day: 10 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every third year on the 1st, 100th, and 200th day for 10 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ interval: 3
+ count: 10
+ byyearday: (list 1 100 200))
+ x-summary:
+ "dag 1, 100 & 200 vart tredje år, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 04 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 07 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 04 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 07 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 04 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 07 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 2006 month: 01 day: 01 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every 20th Monday of the year, forever"
+ dtstart:
+ (datetime year: 1997 month: 05 day: 19 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ byday: (list (cons 20 mon)))
+ x-summary:
+ "tjugonde måndagen, årligen"
+ x-set:
+ (list (datetime year: 1997 month: 05 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 05 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 05 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 05 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 05 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 05 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 2004 month: 05 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 2005 month: 05 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 2006 month: 05 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2007 month: 05 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2008 month: 05 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 2009 month: 05 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 2010 month: 05 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 2011 month: 05 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 2012 month: 05 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2013 month: 05 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 2014 month: 05 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 2015 month: 05 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 2016 month: 05 day: 16 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Monday of week number 20 (where the default start of the week is Monday), forever"
+ dtstart:
+ (datetime year: 1997 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ byweekno: (list 20)
+ byday: (list mon))
+ x-summary:
+ "varje måndag v.20, årligen"
+ x-set:
+ (list (datetime year: 1997 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 05 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 05 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 05 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 05 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 2004 month: 05 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2005 month: 05 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 2006 month: 05 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2007 month: 05 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2008 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 2009 month: 05 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 2010 month: 05 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 2011 month: 05 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 2012 month: 05 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2013 month: 05 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2014 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 2015 month: 05 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 2016 month: 05 day: 16 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every Thursday in March, forever"
+ dtstart:
+ (datetime year: 1997 month: 03 day: 13 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ bymonth: (list mar)
+ byday: (list thu))
+ x-summary:
+ "varje torsdag i mars, årligen"
+ x-set:
+ (list (datetime year: 1997 month: 03 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 03 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 03 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 03 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 03 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 03 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 03 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 03 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 03 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 03 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 03 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 03 day: 22 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every Thursday, but only during June, July, and August, forever"
+ dtstart:
+ (datetime year: 1997 month: 06 day: 05 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ byday: (list thu)
+ bymonth: (list 6 7 8))
+ x-summary:
+ "varje torsdag i juni, juli & augusti, årligen"
+ x-set:
+ (list (datetime year: 1997 month: 06 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 06 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 06 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 06 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 07 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 07 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 07 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 07 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 07 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 06 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 06 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 06 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 06 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 07 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 07 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 07 day: 16 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every Friday the 13th, forever"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ exdate:
+ (as-list
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)))
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ byday: (list fri)
+ bymonthday: (list 13))
+ x-summary:
+ "varje fredag den trettonde varje månad"
+ x-set:
+ (list (datetime year: 1998 month: 02 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 11 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 08 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 10 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 04 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 07 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 09 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 12 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 06 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2004 month: 02 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2004 month: 08 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2005 month: 05 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2006 month: 01 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2006 month: 10 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2007 month: 04 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2007 month: 07 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2008 month: 06 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2009 month: 02 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2009 month: 03 day: 13 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "The first Saturday that follows the first Sunday of the month, forever"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 13 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ byday: (list sat)
+ bymonthday: (list 7 8 9 10 11 12 13))
+ x-summary:
+ "varje lördag den sjunde, åttonde, nionde, tionde, elfte, tolfte & trettonde varje månad"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 02 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 04 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 06 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 07 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 08 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 09 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 10 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 11 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 12 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 02 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 04 day: 10 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every 4 years, the first Tuesday after a Monday in November,\nver (U.S. Presidential Election day)"
+ dtstart:
+ (datetime year: 1996 month: 11 day: 05 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ interval: 4
+ bymonth: (list nov)
+ byday: (list tue)
+ bymonthday: (list 2 3 4 5 6 7 8))
+ x-summary:
+ "varje tisdag den andre, tredje, fjärde, femte, sjätte, sjunde eller åttonde i november vart fjärde år"
+ x-set:
+ (list (datetime year: 1996 month: 11 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 11 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 2004 month: 11 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 2008 month: 11 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 2012 month: 11 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 2016 month: 11 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 2020 month: 11 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 2024 month: 11 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 2028 month: 11 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 2032 month: 11 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 2036 month: 11 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 2040 month: 11 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 2044 month: 11 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 2048 month: 11 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 2052 month: 11 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 2056 month: 11 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 2060 month: 11 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 2064 month: 11 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 2068 month: 11 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 2072 month: 11 day: 08 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "The third instance into the month of one of Tuesday, Wednesday, or Thursday, for the next 3 months"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 04 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ count: 3
+ byday: (list tue wed thu)
+ bysetpos: (list 3))
+ x-summary:
+ "NOT YET IMPLEMENTED"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 06 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "The second-to-last weekday of the month"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 29 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ byday: (list mon tue wed thu fri)
+ bysetpos: (list -2))
+ x-summary:
+ "NOT YET IMPLEMENTED"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 29 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every 3 hours from 9:00 AM to 5:00 PM on a specific day"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'HOURLY
+ interval: 3
+ until: (datetime year: 1997 month: 09 day: 02 hour: 17 minute: 00 second: 00 tz: "UTC"))
+ x-summary:
+ "var tredje timme, till och med den 02 september, 1997 kl. 17:00"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 12 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 15 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every 15 minutes for 6 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MINUTELY
+ interval: 15
+ count: 6)
+ x-summary:
+ "varje kvart, totalt 6 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 15 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 30 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 45 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 10 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 10 minute: 15 second: 00)))
+ (vevent
+ summary:
+ "Every hour and a half for 4 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MINUTELY
+ interval: 90
+ count: 4)
+ x-summary:
+ "var sjätte kvart, totalt 4 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 10 minute: 30 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 12 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 13 minute: 30 second: 00)))
+ (vevent
+ summary:
+ "Every 20 minutes from 9:00 AM to 4:40 PM every day (alt 1)"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'DAILY
+ byhour: (list 9 10 11 12 13 14 15 16)
+ byminute: (list 0 20 40))
+ x-summary:
+ "dagligen kl. 09:00, 09:20, 09:40, 10:00, 10:20, 10:40, 11:00, 11:20, 11:40, 12:00, 12:20, 12:40, 13:00, 13:20, 13:40, 14:00, 14:20, 14:40, 15:00, 15:20, 15:40, 16:00, 16:20 & 16:40"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 10 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 10 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 10 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 11 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 11 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 11 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 12 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 12 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 12 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 13 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 13 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 13 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 14 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 14 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 14 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 15 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 15 minute: 20 second: 00)))
+ (vevent
+ summary:
+ "Every 20 minutes from 9:00 AM to 4:40 PM every day (alt 2)"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MINUTELY
+ interval: 20
+ byhour: (list 9 10 11 12 13 14 15 16))
+ x-summary:
+ "var tjugonde minut kl. 9, 10, 11, 12, 13, 14, 15 & 16"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 10 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 10 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 10 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 11 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 11 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 11 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 12 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 12 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 12 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 13 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 13 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 13 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 14 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 14 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 14 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 15 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 15 minute: 20 second: 00)))
+ (vevent
+ summary:
+ "An example where the days generated makes a difference because of WKST"
+ dtstart:
+ (datetime year: 1997 month: 08 day: 05 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'WEEKLY
+ interval: 2
+ count: 4
+ byday: (list tue sun)
+ wkst: mon)
+ x-summary:
+ "varannan tisdag & söndag, totalt 4 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 08 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 24 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "changing only WKST from MO to SU, yields different results.."
+ dtstart:
+ (datetime year: 1997 month: 08 day: 05 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'WEEKLY
+ interval: 2
+ count: 4
+ byday: (list tue sun)
+ wkst: sun)
+ x-summary:
+ "varannan tisdag & söndag, totalt 4 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 08 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 31 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "An example where an invalid date (i.e., February 30) is ignored"
+ dtstart:
+ (datetime year: 2007 month: 01 day: 15 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ bymonthday: (list 15 30)
+ count: 5)
+ x-summary:
+ "den femtonde & tretionde varje månad, totalt 5 gånger"
+ x-set:
+ (list (datetime year: 2007 month: 01 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2007 month: 01 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 2007 month: 02 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2007 month: 03 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2007 month: 03 day: 30 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every Friday & Wednesday the 13th, forever"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ exdate:
+ (as-list
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)))
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ byday: (list fri wed)
+ bymonthday: (list 13))
+ x-summary:
+ "varje onsdag & fredag den trettonde varje månad"
+ x-set:
+ (list (datetime year: 1998 month: 02 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 11 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 08 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 10 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 09 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 10 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 12 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 04 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 06 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 07 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 02 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 03 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 09 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 11 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 12 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 06 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 08 day: 13 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Monday & Wednesday of week number 20 (where the default start of the week is Monday), forever"
+ dtstart:
+ (datetime year: 1997 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ byweekno: (list 20)
+ byday: (list mon wed))
+ x-summary:
+ "varje onsdag & måndag v.20, årligen"
+ x-set:
+ (list (datetime year: 1997 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 05 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 05 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 05 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 05 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 05 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 05 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 05 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 05 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 05 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 05 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2004 month: 05 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2004 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 2005 month: 05 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 2005 month: 05 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 2006 month: 05 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2006 month: 05 day: 17 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary: "Each second, for ever"
+ dtstart: (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 00)
+ rrule: (make-recur-rule freq: 'SECONDLY)
+ x-summary: "varje sekund"
+ x-set: (list (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 00)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 01)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 02)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 03)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 04)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 05)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 06)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 07)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 08)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 09)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 10)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 11)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 12)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 13)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 14)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 15)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 16)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 17)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 18)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 19)))
+ ;; Exdates are applied after rrule's, meaning that less than count
+ ;; instances may be present.
+ (vevent
+ summary: "Exdates are applied AFTER rrule's"
+ dtstart: (datetime year: 2022 month: 06 day: 10 hour: 10 minute: 00 second: 00)
+ rrule: (make-recur-rule freq: 'DAILY count: 5)
+ exdate: (as-list (list (datetime year: 2022 month: 06 day: 12 hour: 10 minute: 00 second: 00)))
+ x-summary: "dagligen, totalt 5 gånger"
+ x-set: (list (datetime year: 2022 month: 06 day: 10 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 11 hour: 10 minute: 00 second: 00)
+ ;; (datetime year: 2022 month: 06 day: 12 hour: 10 minute: 00 second: 00) ; skipped by exdate
+ (datetime year: 2022 month: 06 day: 13 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 14 hour: 10 minute: 00 second: 00)
+ ))
+ (vevent
+ summary: "RDATE:s add to the recurrence rule"
+ dtstart: (datetime year: 2022 month: 06 day: 10 hour: 10 minute: 00 second: 00)
+ rrule: (make-recur-rule freq: 'DAILY count: 5)
+ rdate: (as-list (list (datetime year: 2022 month: 06 day: 20 hour: 10 minute: 00 second: 00)))
+ x-summary: "dagligen, totalt 5 gånger"
+ x-set: (list (datetime year: 2022 month: 06 day: 10 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 11 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 12 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 13 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 14 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 20 hour: 10 minute: 00 second: 00) ; added by rdate
+ )
+ )
+ (vevent
+ summary: "RDATE:s add to the recurrence rule"
+ dtstart: (datetime year: 2022 month: 06 day: 10 hour: 10 minute: 00 second: 00)
+ rrule: (make-recur-rule freq: 'DAILY count: 5)
+ exdate: (as-list (list (datetime year: 2022 month: 06 day: 20 hour: 10 minute: 00 second: 00)))
+ rdate: (as-list (list (datetime year: 2022 month: 06 day: 20 hour: 10 minute: 00 second: 00)))
+ x-summary: "dagligen, totalt 5 gånger"
+ x-set: (list (datetime year: 2022 month: 06 day: 10 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 11 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 12 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 13 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 14 hour: 10 minute: 00 second: 00)
+ ;; (datetime year: 2022 month: 06 day: 20 hour: 10 minute: 00 second: 00) ; added by rdate, removed by exdate
+ ))
+ ;; TODO rdate with different timezone than dtstart
+ ;; TODO rdate with period
+ ))
+
+
+
+'((vcomponent recurrence)
+ (vcomponent recurrence generate)
+ (vcomponent recurrence display)
+ (vcomponent recurrence internal))
diff --git a/tests/test/recurrence-simple.scm b/tests/unit/vcomponent/recurrence-simple.scm
index b0c3bdea..31a74989 100644
--- a/tests/test/recurrence-simple.scm
+++ b/tests/unit/vcomponent/recurrence-simple.scm
@@ -90,6 +90,8 @@ END:VEVENT"
(stream->list
(stream-take 5 (day-stream (prop ev 'DTSTART)))))
+(test-assert "Test 1" #t)
+
(define ev
(car
(call-with-input-string
@@ -99,6 +101,8 @@ RRULE:FREQ=DAILY
END:VEVENT"
parse-calendar)))
+(test-assert "Test 2" #t)
+
(test-assert "daily 10:00"
(stream-car (generate-recurrence-set ev)))
@@ -311,3 +315,10 @@ END:VCALENDAR"
;; RRULE:FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR
;; END:VEVENT
;; END:VCALENDAR
+
+;; TODO add remaining rules
+
+
+'((vcomponent recurrence)
+ (vcomponent formats ical parse)
+ (vcomponent formats xcal parse))
diff --git a/tests/test/rrule-serialization.scm b/tests/unit/vcomponent/rrule-serialization.scm
index e616c5a2..540c5bd2 100644
--- a/tests/test/rrule-serialization.scm
+++ b/tests/unit/vcomponent/rrule-serialization.scm
@@ -73,3 +73,5 @@
(recur-rule->rrule-sxml rule)))))
+'((vcomponent recurrence internal)
+ (vcomponent recurrence parse))
diff --git a/tests/test/vcomponent-control.scm b/tests/unit/vcomponent/vcomponent-control.scm
index cf6995bf..7ebafa3d 100644
--- a/tests/test/vcomponent-control.scm
+++ b/tests/unit/vcomponent/vcomponent-control.scm
@@ -33,4 +33,4 @@
(throw 'any)))
(lambda _ (test-equal "value" (prop ev 'X-KEY)))))
-
+'((vcomponent util control))
diff --git a/tests/test/vcomponent-datetime.scm b/tests/unit/vcomponent/vcomponent-datetime.scm
index 49d1711f..80fee259 100644
--- a/tests/test/vcomponent-datetime.scm
+++ b/tests/unit/vcomponent/vcomponent-datetime.scm
@@ -12,8 +12,8 @@
(define ev
(vevent
- dtstart: #2020-03-29T17:00:00
- dtend: #2020-04-01T10:00:00))
+ dtstart: (datetime year: 2020 month: 03 day: 29 hour: 17 minute: 00 second: 00)
+ dtend: (datetime year: 2020 month: 04 day: 01 hour: 10 minute: 00 second: 00)))
;; |-----------------| test interval
@@ -23,21 +23,22 @@
"Correct clamping"
(datetime time: (time hour: 7)) ; 2020-03-29T17:00 - 2020-03-30T00:00
(event-length/clamped
- #2020-03-23 ; a time way before the start of the event
- #2020-03-29 ; a time slightly after the end of the event
+ (date year: 2020 month: 03 day: 23) ; a time way before the start of the event
+ (date year: 2020 month: 03 day: 29) ; a time slightly after the end of the event
ev))
(define utc-ev
(vevent
- dtstart: #2020-03-29T15:00:00Z
- dtend: #2020-04-01T08:00:00Z))
+ dtstart: (datetime year: 2020 month: 03 day: 29 hour: 15 minute: 00 second: 00 tz: "UTC")
+ dtend: (datetime year: 2020 month: 04 day: 01 hour: 08 minute: 00 second: 00 tz: "UTC")))
(test-equal
"Correct clamping UTC"
(datetime time: (time hour: 7))
(event-length/clamped
- #2020-03-23
- #2020-03-29
+ (date year: 2020 month: 03 day: 23)
+ (date year: 2020 month: 03 day: 29)
ev))
+'((vcomponent datetime))
diff --git a/tests/test/vcomponent-formats-common-types.scm b/tests/unit/vcomponent/vcomponent-formats-common-types.scm
index 4c442461..1d7c77cf 100644
--- a/tests/test/vcomponent-formats-common-types.scm
+++ b/tests/unit/vcomponent/vcomponent-formats-common-types.scm
@@ -33,14 +33,14 @@
(define parse-date (get-parser 'DATE))
(test-equal
- #2021-12-02
+ (date year: 2021 month: 12 day: 02)
(parse-date #f "20211202"))
;; TODO negative test here
(define parse-datetime (get-parser 'DATE-TIME))
(test-equal
- #2021-12-02T10:20:30
+ (datetime year: 2021 month: 12 day: 02 hour: 10 minute: 20 second: 30)
(parse-datetime
(make-hash-table)
"20211202T102030"))
@@ -120,7 +120,7 @@
(define parse-time (get-parser 'TIME))
(test-equal
- #10:20:30
+ (time hour: 10 minute: 20 second: 30)
(parse-time #f "102030"))
;; TODO negative test here
@@ -136,3 +136,5 @@
(get-parser 'UTC-OFFSET))
;; TODO
+
+'((vcomponent formats common types))
diff --git a/tests/test/vcomponent.scm b/tests/unit/vcomponent/vcomponent.scm
index bdaefa95..ebd0b1ff 100644
--- a/tests/test/vcomponent.scm
+++ b/tests/unit/vcomponent/vcomponent.scm
@@ -40,7 +40,7 @@
(define vline*
(vline
key: 'DTSTART
- vline-value: #2020-01-02
+ vline-value: (date year: 2020 month: 01 day: 02)
vline-parameters: (alist->table
'((VALUE . "DATE")))
vline-source: "DTSTART;VALUE=DATE:2020-01-02"))
@@ -101,3 +101,5 @@
;; x-property?
;; internal-field?
+
+'((vcomponent base))
diff --git a/tests/test/server.scm b/tests/unit/web-util/server.scm
index a6200cb8..c81abba3 100644
--- a/tests/test/server.scm
+++ b/tests/unit/web-util/server.scm
@@ -26,3 +26,6 @@
(let ((path args (parse-endpoint-string "/static/:filename{.*}.:ext")))
(test-equal "Path" "/static/(.*)\\.([^/.]+)" path)
(test-equal "Parameters" '(filename ext) args)))
+
+
+'((web http make-routes))
diff --git a/tests/test/web-query.scm b/tests/unit/web-util/web-query.scm
index 0555258b..ec20b0c1 100644
--- a/tests/test/web-query.scm
+++ b/tests/unit/web-util/web-query.scm
@@ -32,3 +32,6 @@
;; I don't know if HTTP allows this, but my code works like this
(test-equal "Value with equal in it"
'(key: "=") (parse-query "key=="))
+
+
+'((web query))
diff --git a/tests/test/webdav-file.scm b/tests/unit/webdav/webdav-file.scm
index 4096016b..85f4738d 100644
--- a/tests/test/webdav-file.scm
+++ b/tests/unit/webdav/webdav-file.scm
@@ -51,3 +51,6 @@
(test-group "Copy file"
'TODO)
+
+'((calp webdav resource)
+ (calp webdav resource file))
diff --git a/tests/test/webdav-server.scm b/tests/unit/webdav/webdav-server.scm
index 67747de7..d5fa0e93 100644
--- a/tests/test/webdav-server.scm
+++ b/tests/unit/webdav/webdav-server.scm
@@ -349,3 +349,5 @@
;;; Run REPORT
+
+'((calp server webdav))
diff --git a/tests/test/webdav-tree.scm b/tests/unit/webdav/webdav-tree.scm
index 5c2a6a9b..da6073eb 100644
--- a/tests/test/webdav-tree.scm
+++ b/tests/unit/webdav/webdav-tree.scm
@@ -87,3 +87,6 @@
(test-equal "Hello, World!\n" (bytevector->string (content resource) (native-transcoder)))
)
+'((calp webdav resource)
+ (calp webdav resource virtual)
+ (calp webdav resource file))
diff --git a/tests/test/webdav-util.scm b/tests/unit/webdav/webdav-util.scm
index 5c89cf6c..c4e16536 100644
--- a/tests/test/webdav-util.scm
+++ b/tests/unit/webdav/webdav-util.scm
@@ -27,3 +27,5 @@
(test-error 'misc-error
(href-relative '("c") '())))
+
+'((calp webdav resource base))
diff --git a/tests/test/webdav.scm b/tests/unit/webdav/webdav.scm
index 0962a89e..e86b5342 100644
--- a/tests/test/webdav.scm
+++ b/tests/unit/webdav/webdav.scm
@@ -351,3 +351,9 @@
(let ((root (make <virtual-resource> name: "*root*")))
(add-collection! root "child")
(test-eqv "Child got added" 1 (length (children root)))))
+
+
+'((calp webdav property)
+ (calp webdav propfind)
+ (calp webdav resource)
+ (calp webdav resource virtual))
diff --git a/tests/test/web-server.scm b/tests/web/web-server.scm
index 69d18536..69d18536 100644
--- a/tests/test/web-server.scm
+++ b/tests/web/web-server.scm