aboutsummaryrefslogtreecommitdiff
path: root/tests/rrule-serialization.scm
blob: 533656614efd12def3461667b9a4ba05f8b23590 (plain)
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)))))