Fixed a documentation typo
[jimtcl.git] / tests / timer.test
blob26ffa0ac56aa60a259fac7762deedbc19a2f7b21
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}
192 test timer-6.5 {Tcl_AfterCmd procedure, ms argument} {
193     set x before
194     after 60 {set x after}
195     after 40
196     update
197     set y $x
198     after 40
199     update
200     list $y $x
201 } {before after}
202 test timer-6.6 {Tcl_AfterCmd procedure, cancel option} {
203     list [catch {after cancel} msg] $msg
204 } {1 {wrong # args: should be "after cancel id|command"}}
205 test timer-6.7 {Tcl_AfterCmd procedure, cancel option} {
206     after cancel after#1
207 } {}
208 test timer-6.8 {Tcl_AfterCmd procedure, cancel option} {
209     after cancel {foo bar}
210 } {}
211 test timer-6.9 {Tcl_AfterCmd procedure, cancel option} {
212     foreach i [after info] {
213         after cancel $i
214     }
215     set x before
216     set y [after 20 set x after]
217     after cancel $y
218     after 40
219     update
220     set x
221 } {before}
222 test timer-6.10 {Tcl_AfterCmd procedure, cancel option} {
223     foreach i [after info] {
224         after cancel $i
225     }
226     set x before
227     after 20 set x after
228     after cancel set x after
229     after 40
230     update
231     set x
232 } {before}
233 test timer-6.11 {Tcl_AfterCmd procedure, cancel option} {
234     foreach i [after info] {
235         after cancel $i
236     }
237     set x before
238     after 20 set x after
239     set id [after 60 set x after]
240     after cancel $id
241     after 40
242     update
243     set y $x
244     set x cleared
245     after 40
246     update
247     list $y $x
248 } {after cleared}
249 test timer-6.12 {Tcl_AfterCmd procedure, cancel option} {
250     foreach i [after info] {
251         after cancel $i
252     }
253     set x first
254     after idle lappend x second
255     after idle lappend x third
256     set i [after idle lappend x fourth]
257     after cancel {lappend x second}
258     after cancel $i
259     update idletasks
260     set x
261 } {first third}
262 test timer-6.13 {Tcl_AfterCmd procedure, cancel option, multiple arguments for command} {
263     foreach i [after info] {
264         after cancel $i
265     }
266     set x first
267     after idle lappend x second
268     after idle lappend x third
269     set i [after idle lappend x fourth]
270     after cancel lappend x second
271     after cancel $i
272     update idletasks
273     set x
274 } {first third}
275 test timer-6.14 {Tcl_AfterCmd procedure, cancel option, cancel during handler, used to dump core} {
276     foreach i [after info] {
277         after cancel $i
278     }
279     set id [
280         after 20 {
281             set x done
282             after cancel $id
283         }
284     ]
285     vwait x
286 } {}
287 test timer-6.16 {Tcl_AfterCmd procedure, idle option} {
288     list [catch {after idle} msg] $msg
289 } {1 {wrong # args: should be "after idle script ?script ...?"}}
290 test timer-6.17 {Tcl_AfterCmd procedure, idle option} {
291     set x before
292     after idle {set x after}
293     set y $x
294     update idletasks
295     list $y $x
296 } {before after}
297 test timer-6.18 {Tcl_AfterCmd procedure, idle option} {
298     set x before
299     after idle set x after
300     set y $x
301     update idletasks
302     list $y $x
303 } {before after}
305 test timer-6.23 {Tcl_AfterCmd procedure, no option, script with NULL} {
306     foreach i [after info] {
307         after cancel $i
308     }
309     set x "hello world"
310     after 1 "set x ab\0cd"
311     after 10
312     update
313     string length $x
314 } {5}
315 test timer-6.24 {Tcl_AfterCmd procedure, no option, script with NULL} {
316     foreach i [after info] {
317         after cancel $i
318     }
319     set x "hello world"
320     after 1 set x ab\0cd
321     after 10
322     update
323     string length $x
324 } {5}
325 test timer-6.25 {Tcl_AfterCmd procedure, cancel option, script with NULL} {
326     foreach i [after info] {
327         after cancel $i
328     }
329     set x "hello world"
330     after 1 set x ab\0cd
331     after cancel "set x ab\0ef"
332     set x [llength [after info]]
333     foreach i [after info] {
334         after cancel $i
335     }
336     set x
337 } {1}
338 test timer-6.26 {Tcl_AfterCmd procedure, cancel option, script with NULL} {
339     foreach i [after info] {
340         after cancel $i
341     }
342     set x "hello world"
343     after 1 set x ab\0cd
344     after cancel set x ab\0ef
345     set y [llength [after info]]
346     foreach i [after info] {
347         after cancel $i
348     }
349     set y
350 } {1}
351 test timer-6.27 {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.28 {Tcl_AfterCmd procedure, idle option, script with NULL} {
361     foreach i [after info] {
362         after cancel $i
363     }
364     set x "hello world"
365     after idle set x ab\0cd
366     update
367     string length $x
368 } {5}
369 test timer-6.29 {Tcl_AfterCmd procedure, info option, script with NULL} {
370     foreach i [after info] {
371         after cancel $i
372     }
373     set x "hello world"
374     set id junk
375     set id [after 10 set x ab\0cd]
376     update
377     set y [string length [lindex [lindex [after info $id] 0] 2]]
378     foreach i [after info] {
379         after cancel $i
380     }
381     set y
382 } {5}
384 set event [after idle foo bar]
385 scan $event after#%d id
387 test timer-7.1 {GetAfterEvent procedure} {
388     list [catch {after info xfter#$id} msg] $msg
389 } "1 {event \"xfter#$id\" doesn't exist}"
390 test timer-7.2 {GetAfterEvent procedure} {
391     list [catch {after info afterx$id} msg] $msg
392 } "1 {event \"afterx$id\" doesn't exist}"
393 test timer-7.3 {GetAfterEvent procedure} {
394     list [catch {after info after#ab} msg] $msg
395 } {1 {event "after#ab" doesn't exist}}
396 test timer-7.4 {GetAfterEvent procedure} {
397     list [catch {after info after#} msg] $msg
398 } {1 {event "after#" doesn't exist}}
399 test timer-7.5 {GetAfterEvent procedure} {
400     list [catch {after info after#${id}x} msg] $msg
401 } "1 {event \"after#${id}x\" doesn't exist}"
402 test timer-7.6 {GetAfterEvent procedure} {
403     list [catch {after info afterx[expr $id+1]} msg] $msg
404 } "1 {event \"afterx[expr $id+1]\" doesn't exist}"
405 after cancel $event
407 test timer-8.1 {AfterProc procedure} {
408     set x before
409     proc foo {} {
410         set x untouched
411         after 20 {set x after}
412         after 200
413         update
414         return $x
415     }
416     list [foo] $x
417 } {untouched after}
418 test timer-8.2 {AfterProc procedure} {
419     catch {rename bgerror {}}
420     proc bgerror msg {
421         set ::x $msg
422     }
423     set x empty
424     after 20 {error "After error"}
425     after 200
426     set y $x
427     update
428     catch {rename bgerror {}}
429     list $y $x
430 } {empty {After error}}
432 test timer-8.4 {AfterProc procedure, deleting handler from itself} {
433     foreach i [after info] {
434         after cancel $i
435     }
436     proc foo {} {
437         global x
438         set x {}
439         foreach i [after info] {
440             lappend x [after info $i]
441         }
442         after cancel foo
443     }
444     after 1000 {error "I shouldn't ever have executed"}
445     after idle foo
446     update idletasks
447     set x
448 } {{{error "I shouldn't ever have executed"} timer}}
450 foreach i [after info] {
451     after cancel $i
454 testreport