1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
(
;; Yes, this is ugly. But how else would I test a private procedure?
((guile) @@)
((vcomponent recurrence internal)
recur-rule->rrule-string
recur-rule->rrule-sxml
byday
)
((vcomponent recurrence parse) parse-recurrence-rule)
((ice-9 peg)
keyword-flatten
)
)
(test-equal
"Parse of week day"
'(#f . 3)
((@@ (vcomponent recurrence parse) parse-day-spec) "WE"))
(test-equal
"Parse of week day with positive offset"
'(1 . 3)
((@@ (vcomponent recurrence parse) parse-day-spec) "1WE"))
(test-equal
"Parse of week day with positive offset (and plus)"
'(2 . 3)
((@@ (vcomponent recurrence parse) parse-day-spec) "+2WE"))
(test-equal
"Parse of week day with negative offset"
'(-3 . 3)
((@@ (vcomponent recurrence parse) parse-day-spec) "-3WE"))
;; numeric prefixes in the BYDAY list is only valid when
;; FREQ={MONTHLY,YEARLY}, but that should be handled in a
;; later stage since we are just testing the parser here.
;; (p. 41)
(define field->string
(@@ (vcomponent recurrence internal) field->string))
(let ((rule (parse-recurrence-rule "BYDAY=MO,TU,WE")))
(test-equal "Direct return of parsed value"
"MO,TU,WE"
(field->string 'byday (byday rule)))
(test-equal "Direct return, but as SXML"
'((byday "MO")
(byday "TU")
(byday "WE"))
(filter (lambda (pair)
(eq? 'byday (car pair)))
(keyword-flatten '(interval byday wkst)
(recur-rule->rrule-sxml rule)))))
(let ((rule (parse-recurrence-rule "BYDAY=+1MO,1TU,-2FR")))
(test-equal "Direct return of parsed value"
"1MO,1TU,-2FR"
(field->string 'byday (byday rule)))
(test-equal "Direct return, but as SXML"
'((byday "1MO")
(byday "1TU")
(byday "-2FR"))
(filter (lambda (pair)
(eq? 'byday (car pair)))
(keyword-flatten '(interval byday wkst)
(recur-rule->rrule-sxml rule)))))
|