-
Notifications
You must be signed in to change notification settings - Fork 0
/
test-scheduler.r3
138 lines (125 loc) · 7.03 KB
/
test-scheduler.r3
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
REBOL []
scheduler: import %scheduler.reb
;------------------
;--- Unit tests ---
;------------------
;; Using fake `get-now` function for the test
original-now: :scheduler/get-now
scheduler/get-now: 02-Jan-2009/01:00:01
c: 0
tests: [
; -RULE- -1st Event- -2nd Event-
[at 18:30] 02-Jan-2009/18:30 -
[at 03-03-2009/18:30] 03-Mar-2009/18:30 -
[every day] 03-Jan-2009/01:00:01 04-Jan-2009/01:00:01
[every day at 18:30] 03-Jan-2009/18:30 04-Jan-2009/18:30
[every day at 01:00:01] 03-Jan-2009/01:00:01 04-Jan-2009/01:00:01
[every 3 days] 05-Jan-2009/01:00:01 08-Jan-2009/01:00:01
[every monday] 05-Jan-2009/01:00:01 12-Jan-2009/01:00:01
[every monday at 18:30] 05-Jan-2009/18:30 12-Jan-2009/18:30
[every #2] 02-Feb-2009/01:00:01 02-Mar-2009/01:00:01
[every #2 at 00:00] 02-Feb-2009/00:00 02-Mar-2009/00:00
[every [#3 #4]] 03-Jan-2009/01:00:01 04-Jan-2009/01:00:01
[every [#3 #4] not sat] 04-Jan-2009/01:00:01 03-Feb-2009/01:00:01
[every [#3 #4] not [sat sun]] 03-Feb-2009/01:00:01 04-Feb-2009/01:00:01
[every [#3 - #15] not [sat sun]] 05-Jan-2009/01:00:01 06-Jan-2009/01:00:01
[every [sat sun]] 03-Jan-2009/01:00:01 04-Jan-2009/01:00:01
[every [wed]] 07-Jan-2009/01:00:01 14-Jan-2009/01:00:01
[every wed] 07-Jan-2009/01:00:01 14-Jan-2009/01:00:01
[every monday not #5] 12-Jan-2009/01:00:01 19-Jan-2009/01:00:01
[every monday not [#5]] 12-Jan-2009/01:00:01 19-Jan-2009/01:00:01
[every [monday] not #5] 12-Jan-2009/01:00:01 19-Jan-2009/01:00:01
[every [sat sun] not #3] 04-Jan-2009/01:00:01 10-Jan-2009/01:00:01
[every [sat sun] not [#3 #4]] 10-Jan-2009/01:00:01 11-Jan-2009/01:00:01
[every [sat sun] not [#1 - #5]] 10-Jan-2009/01:00:01 11-Jan-2009/01:00:01
[every [sat sun] not [#3 - #4 #5 - #8 #10]] 11-Jan-2009/01:00:01 17-Jan-2009/01:00:01
[every #3 not saturday] 03-Feb-2009/01:00:01 03-Mar-2009/01:00:01
[every #4 not [sat sun]] 04-Feb-2009/01:00:01 04-Mar-2009/01:00:01
[every 12 hours] 02-Jan-2009/13:00:01 03-Jan-2009/01:00:01
[every 15 mn] 02-Jan-2009/01:15:01 02-Jan-2009/01:30:01
[every 30 sec] 02-Jan-2009/01:00:31 02-Jan-2009/01:01:01
[every week] 09-Jan-2009/01:00:01 16-Jan-2009/01:00:01
[every week not #9] 16-Jan-2009/01:00:01 23-Jan-2009/01:00:01
[every month] 01-Feb-2009/01:00:01 01-Mar-2009/01:00:01
[every month on #17] 17-Jan-2009/01:00:01 17-Feb-2009/01:00:01
[every 3 month] 01-Apr-2009/01:00:01 01-Jul-2009/01:00:01
[every 3 month on #17] 17-Jan-2009/01:00:01 17-Apr-2009/01:00:01
[every march] 01-Mar-2009/01:00:01 01-Mar-2010/01:00:01
[every march on #15] 15-Mar-2009/01:00:01 15-Mar-2010/01:00:01
[every [march may] on #15] 15-Mar-2009/01:00:01 15-May-2009/01:00:01
[every january] 01-Jan-2010/01:00:01 01-Jan-2011/01:00:01
[every january on #2] 02-Jan-2010/01:00:01 02-Jan-2011/01:00:01
[every january on #3] 03-Jan-2009/01:00:01 03-Jan-2010/01:00:01
[every january at 00:00:00] 01-Jan-2010/00:00:00 01-Jan-2011/00:00:00
[every month not [jan feb]] 01-Mar-2009/01:00:01 01-Apr-2009/01:00:01
[every month on #15 not [jan feb]] 15-Mar-2009/01:00:01 15-Apr-2009/01:00:01
[every 2 months not [jan feb]] 01-Mar-2009/01:00:01 01-May-2009/01:00:01
[every hour [8:00 - 12:00]] 02-Jan-2009/08:00:01 02-Jan-2009/09:00:01
[every hour not [00:00 - 5:00]] 02-Jan-2009/05:00:01 02-Jan-2009/06:00:01
[every 15 mn [8:00 - 8:20 12:00 - 20:00]] 02-Jan-2009/08:00:01 02-Jan-2009/08:15:01
[every 15 mn [8:00 - 8:20 12:00 - 20:00] from 00:03] 02-Jan-2009/08:03 02-Jan-2009/08:18
[every 15 mn [8:00 - 8:20 12:00 - 20:00] from 00:10] 02-Jan-2009/08:10 02-Jan-2009/12:10
[every hour not [2:0 3:0] from 1:0] 02-Jan-2009/04:00 02-Jan-2009/05:00
{every month on 1st} 01-Feb-2009/01:00:01 01-Mar-2009/01:00:01
{every month not [1st 2nd 3rd 5th]} 04-Jan-2009/01:00:01 06-Jan-2009/01:00:01
{every 12h} 02-Jan-2009/13:00:01 03-Jan-2009/01:00:01
{every 15mn not [00:00 - 05:00]} 02-Jan-2009/05:00:01 02-Jan-2009/05:15:01
]
foreach [rule evt1 evt2] tests [
rule: append rule either string? rule [{ do %test.r}][[do %test.r]]
scheduler/plan/new copy/deep rule
either any [
err1: evt1 <> scheduler/jobs/1
all [
evt2 <> '-
scheduler/jobs/2/last: scheduler/jobs/1
err2: evt2 <> scheduler/next-event? scheduler/jobs/2
]
][
print [
"^/##Error" c: c + 1 ", rule" mold rule "failed =>^/"
"result:" mold scheduler/jobs/1 newline
"expected:" mold any [all [err1 evt1] all [err2 evt2]]
]
][
print ["OK test:" mold rule]
]
]
print "^/-- unit tests done --"
print [c "error(s)"]
;; Restore the original function
scheduler/get-now: :original-now
print "^/---- Ticking tests ---"
data: make block! 60
emit: func [v][append data probe reduce [v round difference now/precise started]]
validate-results: func[data id step /local tm][
tm: 0:0:0
foreach [i t] data [
if i = id [
if step <> (t - tm) [return false]
tm: tm + step
]
]
true
]
scheduler/reset
scheduler/plan compose [
at (now/precise + 00:00:12) do [emit 0]
in 9 sec do [emit 9]
every 1 sec 25 times do [emit 1]
every 2 sec 12 times do [emit 2]
every 5 sec 5 times do [emit 5]
]
started: now/precise
scheduler/wait
;; Validate if all actions were evaluated in expected time steps
print ""
print either ok: all [
validate-results data 0 0:0:12
validate-results data 1 0:0:01
validate-results data 2 0:0:02
validate-results data 5 0:0:05
validate-results data 9 0:0:09
][as-green "OK tick tests"][as-red "##not matching!!"]
if any [c > 0 not ok][ quit/return 1 ]
()