build: Fix out-of-tree build with json ext
[jimtcl.git] / tests / timer.test
bloba4930048018a7a26db6adf8dd09f9b02003a8304
1 # This file contains a collection of tests for the procedures in the
2 # file tclTimer.c, which includes the "after" Tcl command.  Sourcing
3 # this file into Tcl runs the tests and generates output for errors.
4 # No output means no errors were found.
6 # This file contains a collection of tests for one or more of the Tcl
7 # built-in commands.  Sourcing this file into Tcl runs the tests and
8 # generates output for errors.  No output means no errors were found.
10 # Copyright (c) 1997 by Sun Microsystems, Inc.
11 # Copyright (c) 1998-1999 by Scriptics Corporation.
13 # See the file "license.terms" for information on usage and redistribution
14 # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
16 # RCS: @(#) $Id: timer.test,v 1.7.2.1 2001/10/13 01:14:19 hobbs Exp $
18 source [file dirname [info script]]/testing.tcl
19 needs cmd after eventloop
21 test timer-1.1 {Tcl_CreateTimerHandler procedure} {
22     foreach i [after info] {
23         after cancel $i
24     }
25     set x ""
26     foreach i {20 40 200 10 30} {
27         after $i lappend x $i
28     }
29     after 50
30     update
31     set x
32 } {10 20 30 40}
34 test timer-2.1 {Tcl_DeleteTimerHandler procedure} {
35     foreach i [after info] {
36         after cancel $i
37     }
38     set x ""
39     foreach i {20 40 60 10 30} {
40         after $i lappend x $i
41     }
42     after cancel lappend x 60
43     after cancel lappend x 10
44     after 50
45     update
46     set x
47 } {20 30 40}
49 # No tests for Tcl_ServiceTimer or ResetTimer, since it is already tested
50 # above.
52 test timer-3.1 {TimerHandlerEventProc procedure: event masks} {
53     set x start
54     after 20 { set x fired }
55     update idletasks
56     set result $x
57     after 40
58     update
59     lappend result $x
60 } {start fired}
61 test timer-3.2 {TimerHandlerEventProc procedure: multiple timers} {
62     foreach i [after info] {
63         after cancel $i
64     }
65     foreach i {40 120 200} {
66         after $i lappend x $i
67     }
68     after 50
69     set result ""
70     set x ""
71     update
72     lappend result $x
73     after 80
74     update
75     lappend result $x
76     after 80
77     update
78     lappend result $x
79 } {40 {40 120} {40 120 200}}
80 test timer-3.3 {TimerHandlerEventProc procedure: reentrant timer deletion} {
81     foreach i [after info] {
82         after cancel $i
83     }
84     set x {}
85     after 20 lappend x 20
86     set i [after 60 lappend x 60]
87     after 40 after cancel $i
88     after 80
89     update
90     set x
91 } 20
92 test timer-3.4 {TimerHandlerEventProc procedure: all expired timers fire} {
93     foreach i [after info] {
94         after cancel $i
95     }
96     set x {}
97     after 20 lappend x a
98     after 40 lappend x b
99     after 60 lappend x c
100     after 70
101     vwait x
102     set x
103 } {a b c}
104 test timer-3.5 {TimerHandlerEventProc procedure: reentrantly added timers don't fire} {
105     foreach i [after info] {
106         after cancel $i
107     }
108     set x {}
109     after 20 {lappend x a; after 0 lappend x b}
110     after 20
111     vwait x
112     set x
113 } a
114 test timer-3.6 {TimerHandlerEventProc procedure: reentrantly added timers don't fire} {
115     foreach i [after info] {
116         after cancel $i
117     }
118     set x {}
119     after 20 {lappend x a; after 20 lappend x b; after 20}
120     after 20
121     vwait x
122     set result $x
123     vwait x
124     lappend result $x
125 } {a {a b}}
127 # No tests for Tcl_DoWhenIdle:  it's already tested by other tests
128 # below.
130 test timer-4.1 {Tcl_CancelIdleCall procedure} {
131     foreach i [after info] {
132         after cancel $i
133     }
134     set x before
135     set y before
136     set z before
137     after idle set x after1
138     after idle set y after2
139     after idle set z after3
140     after cancel set y after2
141     update idletasks
142     concat $x $y $z
143 } {after1 before after3}
144 test timer-4.2 {Tcl_CancelIdleCall procedure} {
145     foreach i [after info] {
146         after cancel $i
147     }
148     set x before
149     set y before
150     set z before
151     after idle set x after1
152     after idle set y after2
153     after idle set z after3
154     after cancel set x after1
155     update idletasks
156     concat $x $y $z
157 } {before after2 after3}
159 test timer-5.1 {Tcl_ServiceIdle, self-rescheduling handlers} {
160     foreach i [after info] {
161         after cancel $i
162     }
163     set x 1
164     set y 23
165     after idle {incr x; after idle {incr x; after idle {incr x}}}
166     after idle {incr y}
167     vwait x
168     set result "$x $y"
169     update idletasks
170     lappend result $x
171 } {2 24 4}
173 test timer-6.1 {Tcl_AfterCmd procedure, basics} {
174     list [catch {after} msg] $msg
175 } {1 {wrong # args: should be "after option ?arg ...?"}}
176 test timer-6.2 {Tcl_AfterCmd procedure, basics} jim {
177     list [catch {after 2x} msg] $msg
178 } {1 {bad argument "2x": must be cancel, idle, or info}}
179 test timer-6.3 {Tcl_AfterCmd procedure, basics} jim {
180     list [catch {after gorp} msg] $msg
181 } {1 {bad argument "gorp": must be cancel, idle, or info}}
182 test timer-6.4 {Tcl_AfterCmd procedure, ms argument} {
183     set x before
184     after 80 {set x after}
185     after 40
186     update
187     set y $x
188     after 80
189     update
190     list $y $x
191 } {before after}
193 test timer-6.6 {Tcl_AfterCmd procedure, cancel option} {
194     list [catch {after cancel} msg] $msg
195 } {1 {wrong # args: should be "after cancel id|command"}}
196 test timer-6.7 {Tcl_AfterCmd procedure, cancel option} {
197     after cancel after#1
198 } {}
199 test timer-6.8 {Tcl_AfterCmd procedure, cancel option} {
200     after cancel {foo bar}
201 } {}
202 test timer-6.9 {Tcl_AfterCmd procedure, cancel option} {
203     foreach i [after info] {
204         after cancel $i
205     }
206     set x before
207     set y [after 20 set x after]
208     after cancel $y
209     after 40
210     update
211     set x
212 } {before}
213 test timer-6.10 {Tcl_AfterCmd procedure, cancel option} {
214     foreach i [after info] {
215         after cancel $i
216     }
217     set x before
218     after 20 set x after
219     after cancel set x after
220     after 40
221     update
222     set x
223 } {before}
224 test timer-6.11 {Tcl_AfterCmd procedure, cancel option} {
225     foreach i [after info] {
226         after cancel $i
227     }
228     set x before
229     after 20 set x after
230     set id [after 60 set x after]
231     after cancel $id
232     after 40
233     update
234     set y $x
235     set x cleared
236     after 40
237     update
238     list $y $x
239 } {after cleared}
240 test timer-6.12 {Tcl_AfterCmd procedure, cancel option} {
241     foreach i [after info] {
242         after cancel $i
243     }
244     set x first
245     after idle lappend x second
246     after idle lappend x third
247     set i [after idle lappend x fourth]
248     after cancel {lappend x second}
249     after cancel $i
250     update idletasks
251     set x
252 } {first third}
253 test timer-6.13 {Tcl_AfterCmd procedure, cancel option, multiple arguments for command} {
254     foreach i [after info] {
255         after cancel $i
256     }
257     set x first
258     after idle lappend x second
259     after idle lappend x third
260     set i [after idle lappend x fourth]
261     after cancel lappend x second
262     after cancel $i
263     update idletasks
264     set x
265 } {first third}
266 test timer-6.14 {Tcl_AfterCmd procedure, cancel option, cancel during handler, used to dump core} {
267     foreach i [after info] {
268         after cancel $i
269     }
270     set id [
271         after 20 {
272             set x done
273             after cancel $id
274         }
275     ]
276     vwait x
277 } {}
278 test timer-6.16 {Tcl_AfterCmd procedure, idle option} {
279     list [catch {after idle} msg] $msg
280 } {1 {wrong # args: should be "after idle script ?script ...?"}}
281 test timer-6.17 {Tcl_AfterCmd procedure, idle option} {
282     set x before
283     after idle {set x after}
284     set y $x
285     update idletasks
286     list $y $x
287 } {before after}
288 test timer-6.18 {Tcl_AfterCmd procedure, idle option} {
289     set x before
290     after idle set x after
291     set y $x
292     update idletasks
293     list $y $x
294 } {before after}
296 test timer-6.23 {Tcl_AfterCmd procedure, no option, script with NULL} {
297     foreach i [after info] {
298         after cancel $i
299     }
300     set x "hello world"
301     after 1 "set x ab\0cd"
302     after 10
303     update
304     string length $x
305 } {5}
306 test timer-6.24 {Tcl_AfterCmd procedure, no option, script with NULL} {
307     foreach i [after info] {
308         after cancel $i
309     }
310     set x "hello world"
311     after 1 set x ab\0cd
312     after 10
313     update
314     string length $x
315 } {5}
316 test timer-6.25 {Tcl_AfterCmd procedure, cancel option, script with NULL} {
317     foreach i [after info] {
318         after cancel $i
319     }
320     set x "hello world"
321     after 1 set x ab\0cd
322     after cancel "set x ab\0ef"
323     set x [llength [after info]]
324     foreach i [after info] {
325         after cancel $i
326     }
327     set x
328 } {1}
329 test timer-6.26 {Tcl_AfterCmd procedure, cancel option, script with NULL} {
330     foreach i [after info] {
331         after cancel $i
332     }
333     set x "hello world"
334     after 1 set x ab\0cd
335     after cancel set x ab\0ef
336     set y [llength [after info]]
337     foreach i [after info] {
338         after cancel $i
339     }
340     set y
341 } {1}
342 test timer-6.27 {Tcl_AfterCmd procedure, idle option, script with NULL} {
343     foreach i [after info] {
344         after cancel $i
345     }
346     set x "hello world"
347     after idle "set x ab\0cd"
348     update
349     string length $x
350 } {5}
351 test timer-6.28 {Tcl_AfterCmd procedure, idle option, script with NULL} {
352     foreach i [after info] {
353         after cancel $i
354     }
355     set x "hello world"
356     after idle set x ab\0cd
357     update
358     string length $x
359 } {5}
360 test timer-6.29 {Tcl_AfterCmd procedure, info option, script with NULL} {
361     foreach i [after info] {
362         after cancel $i
363     }
364     set x "hello world"
365     set id junk
366     set id [after 10 set x ab\0cd]
367     update
368     set y [string length [lindex [lindex [after info $id] 0] 2]]
369     foreach i [after info] {
370         after cancel $i
371     }
372     set y
373 } {5}
375 set event [after idle foo bar]
376 scan $event after#%d id
378 test timer-7.1 {GetAfterEvent procedure} {
379     list [catch {after info xfter#$id} msg] $msg
380 } "1 {event \"xfter#$id\" doesn't exist}"
381 test timer-7.2 {GetAfterEvent procedure} {
382     list [catch {after info afterx$id} msg] $msg
383 } "1 {event \"afterx$id\" doesn't exist}"
384 test timer-7.3 {GetAfterEvent procedure} {
385     list [catch {after info after#ab} msg] $msg
386 } {1 {event "after#ab" doesn't exist}}
387 test timer-7.4 {GetAfterEvent procedure} {
388     list [catch {after info after#} msg] $msg
389 } {1 {event "after#" doesn't exist}}
390 test timer-7.5 {GetAfterEvent procedure} {
391     list [catch {after info after#${id}x} msg] $msg
392 } "1 {event \"after#${id}x\" doesn't exist}"
393 test timer-7.6 {GetAfterEvent procedure} {
394     list [catch {after info afterx[expr $id+1]} msg] $msg
395 } "1 {event \"afterx[expr $id+1]\" doesn't exist}"
396 after cancel $event
398 test timer-8.1 {AfterProc procedure} {
399     set x before
400     proc foo {} {
401         set x untouched
402         after 20 {set x after}
403         after 200
404         update
405         return $x
406     }
407     list [foo] $x
408 } {untouched after}
409 test timer-8.2 {AfterProc procedure} {
410     catch {rename bgerror {}}
411     proc bgerror msg {
412         set ::x $msg
413     }
414     set x empty
415     after 20 {error "After error"}
416     after 200
417     set y $x
418     update
419     catch {rename bgerror {}}
420     list $y $x
421 } {empty {After error}}
423 test timer-8.4 {AfterProc procedure, deleting handler from itself} {
424     foreach i [after info] {
425         after cancel $i
426     }
427     proc foo {} {
428         global x
429         set x {}
430         foreach i [after info] {
431             lappend x [after info $i]
432         }
433         after cancel foo
434     }
435     after 1000 {error "I shouldn't ever have executed"}
436     after idle foo
437     update idletasks
438     set x
439 } {{{error "I shouldn't ever have executed"} timer}}
441 foreach i [after info] {
442     after cancel $i
445 testreport