timer.test
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:14k
源码类别:

通讯编程

开发平台:

Visual C++

  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.
  5. #
  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.
  9. #
  10. # Copyright (c) 1997 by Sun Microsystems, Inc.
  11. # Copyright (c) 1998-1999 by Scriptics Corporation.
  12. #
  13. # See the file "license.terms" for information on usage and redistribution
  14. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  15. #
  16. # RCS: @(#) $Id: timer.test,v 1.7.22.2 2005/11/09 21:46:20 kennykb Exp $
  17. if {[lsearch [namespace children] ::tcltest] == -1} {
  18.     package require tcltest 2
  19.     namespace import -force ::tcltest::*
  20. }
  21. test timer-1.1 {Tcl_CreateTimerHandler procedure} {
  22.     foreach i [after info] {
  23. after cancel $i
  24.     }
  25.     set x ""
  26.     foreach i {100 200 1000 50 150} {
  27. after $i lappend x $i
  28.     }
  29.     after 200
  30.     update
  31.     set x
  32. } {50 100 150 200}
  33. test timer-2.1 {Tcl_DeleteTimerHandler procedure} {
  34.     foreach i [after info] {
  35. after cancel $i
  36.     }
  37.     set x ""
  38.     foreach i {100 200 300 50 150} {
  39. after $i lappend x $i
  40.     }
  41.     after cancel lappend x 150
  42.     after cancel lappend x 50
  43.     after 200
  44.     update
  45.     set x
  46. } {100 200}
  47. # No tests for Tcl_ServiceTimer or ResetTimer, since it is already tested
  48. # above.
  49. test timer-3.1 {TimerHandlerEventProc procedure: event masks} {
  50.     set x start
  51.     after 100 { set x fired }
  52.     update idletasks
  53.     set result $x
  54.     after 200
  55.     update
  56.     lappend result $x
  57. } {start fired}
  58. test timer-3.2 {TimerHandlerEventProc procedure: multiple timers} {
  59.     foreach i [after info] {
  60. after cancel $i
  61.     }
  62.     foreach i {200 600 1000} {
  63. after $i lappend x $i
  64.     }
  65.     after 200
  66.     set result ""
  67.     set x ""
  68.     update
  69.     lappend result $x
  70.     after 400
  71.     update
  72.     lappend result $x
  73.     after 400
  74.     update
  75.     lappend result $x
  76. } {200 {200 600} {200 600 1000}}
  77. test timer-3.3 {TimerHandlerEventProc procedure: reentrant timer deletion} {
  78.     foreach i [after info] {
  79. after cancel $i
  80.     }
  81.     set x {}
  82.     after 100 lappend x 100
  83.     set i [after 300 lappend x 300]
  84.     after 200 after cancel $i
  85.     after 400
  86.     update
  87.     set x
  88. } 100
  89. test timer-3.4 {TimerHandlerEventProc procedure: all expired timers fire} {
  90.     foreach i [after info] {
  91. after cancel $i
  92.     }
  93.     set x {}
  94.     after 100 lappend x a
  95.     after 200 lappend x b
  96.     after 300 lappend x c
  97.     after 300
  98.     vwait x
  99.     set x
  100. } {a b c}
  101. test timer-3.5 {TimerHandlerEventProc procedure: reentrantly added timers don't fire} {
  102.     foreach i [after info] {
  103. after cancel $i
  104.     }
  105.     set x {}
  106.     after 100 {lappend x a; after 0 lappend x b}
  107.     after 100
  108.     vwait x
  109.     set x
  110. } a
  111. test timer-3.6 {TimerHandlerEventProc procedure: reentrantly added timers don't fire} {
  112.     foreach i [after info] {
  113. after cancel $i
  114.     }
  115.     set x {}
  116.     after 100 {lappend x a; after 100 lappend x b; after 100}
  117.     after 100
  118.     vwait x
  119.     set result $x
  120.     vwait x
  121.     lappend result $x
  122. } {a {a b}}
  123. # No tests for Tcl_DoWhenIdle:  it's already tested by other tests
  124. # below.
  125. test timer-4.1 {Tcl_CancelIdleCall procedure} {
  126.     foreach i [after info] {
  127. after cancel $i
  128.     }
  129.     set x before
  130.     set y before
  131.     set z before
  132.     after idle set x after1
  133.     after idle set y after2
  134.     after idle set z after3
  135.     after cancel set y after2
  136.     update idletasks
  137.     concat $x $y $z
  138. } {after1 before after3}
  139. test timer-4.2 {Tcl_CancelIdleCall procedure} {
  140.     foreach i [after info] {
  141. after cancel $i
  142.     }
  143.     set x before
  144.     set y before
  145.     set z before
  146.     after idle set x after1
  147.     after idle set y after2
  148.     after idle set z after3
  149.     after cancel set x after1
  150.     update idletasks
  151.     concat $x $y $z
  152. } {before after2 after3}
  153. test timer-5.1 {Tcl_ServiceIdle, self-rescheduling handlers} {
  154.     foreach i [after info] {
  155. after cancel $i
  156.     }
  157.     set x 1
  158.     set y 23
  159.     after idle {incr x; after idle {incr x; after idle {incr x}}}
  160.     after idle {incr y}
  161.     vwait x
  162.     set result "$x $y"
  163.     update idletasks
  164.     lappend result $x
  165. } {2 24 4}
  166. test timer-6.1 {Tcl_AfterCmd procedure, basics} {
  167.     list [catch {after} msg] $msg
  168. } {1 {wrong # args: should be "after option ?arg arg ...?"}}
  169. test timer-6.2 {Tcl_AfterCmd procedure, basics} {
  170.     list [catch {after 2x} msg] $msg
  171. } {1 {expected integer but got "2x"}}
  172. test timer-6.3 {Tcl_AfterCmd procedure, basics} {
  173.     list [catch {after gorp} msg] $msg
  174. } {1 {bad argument "gorp": must be cancel, idle, info, or a number}}
  175. test timer-6.4 {Tcl_AfterCmd procedure, ms argument} {
  176.     set x before
  177.     after 400 {set x after}
  178.     after 200
  179.     update
  180.     set y $x
  181.     after 400
  182.     update
  183.     list $y $x
  184. } {before after}
  185. test timer-6.5 {Tcl_AfterCmd procedure, ms argument} {
  186.     set x before
  187.     after 300 set x after
  188.     after 200
  189.     update
  190.     set y $x
  191.     after 200
  192.     update
  193.     list $y $x
  194. } {before after}
  195. test timer-6.6 {Tcl_AfterCmd procedure, cancel option} {
  196.     list [catch {after cancel} msg] $msg
  197. } {1 {wrong # args: should be "after cancel id|command"}}
  198. test timer-6.7 {Tcl_AfterCmd procedure, cancel option} {
  199.     after cancel after#1
  200. } {}
  201. test timer-6.8 {Tcl_AfterCmd procedure, cancel option} {
  202.     after cancel {foo bar}
  203. } {}
  204. test timer-6.9 {Tcl_AfterCmd procedure, cancel option} {
  205.     foreach i [after info] {
  206. after cancel $i
  207.     }
  208.     set x before
  209.     set y [after 100 set x after]
  210.     after cancel $y
  211.     after 200
  212.     update
  213.     set x
  214. } {before}
  215. test timer-6.10 {Tcl_AfterCmd procedure, cancel option} {
  216.     foreach i [after info] {
  217. after cancel $i
  218.     }
  219.     set x before
  220.     after 100 set x after
  221.     after cancel {set x after}
  222.     after 200
  223.     update
  224.     set x
  225. } {before}
  226. test timer-6.11 {Tcl_AfterCmd procedure, cancel option} {
  227.     foreach i [after info] {
  228. after cancel $i
  229.     }
  230.     set x before
  231.     after 100 set x after
  232.     set id [after 300 set x after]
  233.     after cancel $id
  234.     after 200
  235.     update
  236.     set y $x
  237.     set x cleared
  238.     after 200
  239.     update
  240.     list $y $x
  241. } {after cleared}
  242. test timer-6.12 {Tcl_AfterCmd procedure, cancel option} {
  243.     foreach i [after info] {
  244. after cancel $i
  245.     }
  246.     set x first
  247.     after idle lappend x second
  248.     after idle lappend x third
  249.     set i [after idle lappend x fourth]
  250.     after cancel {lappend x second}
  251.     after cancel $i
  252.     update idletasks
  253.     set x
  254. } {first third}
  255. test timer-6.13 {Tcl_AfterCmd procedure, cancel option, multiple arguments for command} {
  256.     foreach i [after info] {
  257. after cancel $i
  258.     }
  259.     set x first
  260.     after idle lappend x second
  261.     after idle lappend x third
  262.     set i [after idle lappend x fourth]
  263.     after cancel lappend x second
  264.     after cancel $i
  265.     update idletasks
  266.     set x
  267. } {first third}
  268. test timer-6.14 {Tcl_AfterCmd procedure, cancel option, cancel during handler, used to dump core} {
  269.     foreach i [after info] {
  270. after cancel $i
  271.     }
  272.     set id [
  273. after 100 {
  274.     set x done
  275.     after cancel $id
  276. }
  277.     ]
  278.     vwait x
  279. } {}
  280. test timer-6.15 {Tcl_AfterCmd procedure, cancel option, multiple interps} {
  281.     foreach i [after info] {
  282. after cancel $i
  283.     }
  284.     interp create x
  285.     x eval {set a before; set b before; after idle {set a a-after};
  286.     after idle {set b b-after}}
  287.     set result [llength [x eval after info]]
  288.     lappend result [llength [after info]]
  289.     after cancel {set b b-after}
  290.     set a aaa
  291.     set b bbb
  292.     x eval {after cancel set a a-after}
  293.     update idletasks
  294.     lappend result $a $b [x eval {list $a $b}]
  295.     interp delete x
  296.     set result
  297. } {2 0 aaa bbb {before b-after}}
  298. test timer-6.16 {Tcl_AfterCmd procedure, idle option} {
  299.     list [catch {after idle} msg] $msg
  300. } {1 {wrong # args: should be "after idle script script ..."}}
  301. test timer-6.17 {Tcl_AfterCmd procedure, idle option} {
  302.     set x before
  303.     after idle {set x after}
  304.     set y $x
  305.     update idletasks
  306.     list $y $x
  307. } {before after}
  308. test timer-6.18 {Tcl_AfterCmd procedure, idle option} {
  309.     set x before
  310.     after idle set x after
  311.     set y $x
  312.     update idletasks
  313.     list $y $x
  314. } {before after}
  315. set event1 [after idle event 1]
  316. set event2 [after 1000 event 2]
  317. interp create x
  318. set childEvent [x eval {after idle event in child}]
  319. test timer-6.19 {Tcl_AfterCmd, info option} {
  320.     lsort [after info]
  321. } [lsort "$event1 $event2"]
  322. test timer-6.20 {Tcl_AfterCmd, info option} {
  323.     list [catch {after info a b} msg] $msg
  324. } {1 {wrong # args: should be "after info ?id?"}}
  325. test timer-6.21 {Tcl_AfterCmd, info option} {
  326.     list [catch {after info $childEvent} msg] $msg
  327. } "1 {event "$childEvent" doesn't exist}"
  328. test timer-6.22 {Tcl_AfterCmd, info option} {
  329.     list [after info $event1] [after info $event2]
  330. } {{{event 1} idle} {{event 2} timer}}
  331. after cancel $event1
  332. after cancel $event2
  333. interp delete x
  334. test timer-6.23 {Tcl_AfterCmd procedure, no option, script with NULL} {
  335.     foreach i [after info] {
  336. after cancel $i
  337.     }
  338.     set x "hello world"
  339.     after 1 "set x abcd"
  340.     after 10
  341.     update
  342.     string length $x
  343. } {5}
  344. test timer-6.24 {Tcl_AfterCmd procedure, no option, script with NULL} {
  345.     foreach i [after info] {
  346. after cancel $i
  347.     }
  348.     set x "hello world"
  349.     after 1 set x abcd
  350.     after 10
  351.     update
  352.     string length $x
  353. } {5}
  354. test timer-6.25 {Tcl_AfterCmd procedure, cancel option, script with NULL} {
  355.     foreach i [after info] {
  356. after cancel $i
  357.     }
  358.     set x "hello world"
  359.     after 1 set x abcd
  360.     after cancel "set x abef"
  361.     set x [llength [after info]]
  362.     foreach i [after info] {
  363. after cancel $i
  364.     }
  365.     set x
  366. } {1}
  367. test timer-6.26 {Tcl_AfterCmd procedure, cancel option, script with NULL} {
  368.     foreach i [after info] {
  369. after cancel $i
  370.     }
  371.     set x "hello world"
  372.     after 1 set x abcd
  373.     after cancel set x abef
  374.     set y [llength [after info]]
  375.     foreach i [after info] {
  376. after cancel $i
  377.     }
  378.     set y
  379. } {1}
  380. test timer-6.27 {Tcl_AfterCmd procedure, idle option, script with NULL} {
  381.     foreach i [after info] {
  382. after cancel $i
  383.     }
  384.     set x "hello world"
  385.     after idle "set x abcd"
  386.     update
  387.     string length $x
  388. } {5}
  389. test timer-6.28 {Tcl_AfterCmd procedure, idle option, script with NULL} {
  390.     foreach i [after info] {
  391. after cancel $i
  392.     }
  393.     set x "hello world"
  394.     after idle set x abcd
  395.     update
  396.     string length $x
  397. } {5}
  398. test timer-6.29 {Tcl_AfterCmd procedure, info option, script with NULL} {
  399.     foreach i [after info] {
  400. after cancel $i
  401.     }
  402.     set x "hello world"
  403.     set id junk
  404.     set id [after 10 set x abcd]
  405.     update
  406.     set y [string length [lindex [lindex [after info $id] 0] 2]]
  407.     foreach i [after info] {
  408. after cancel $i
  409.     }
  410.     set y
  411. } {5}
  412. set event [after idle foo bar]
  413. scan $event after#%d id
  414. test timer-7.1 {GetAfterEvent procedure} {
  415.     list [catch {after info xfter#$id} msg] $msg
  416. } "1 {event "xfter#$id" doesn't exist}"
  417. test timer-7.2 {GetAfterEvent procedure} {
  418.     list [catch {after info afterx$id} msg] $msg
  419. } "1 {event "afterx$id" doesn't exist}"
  420. test timer-7.3 {GetAfterEvent procedure} {
  421.     list [catch {after info after#ab} msg] $msg
  422. } {1 {event "after#ab" doesn't exist}}
  423. test timer-7.4 {GetAfterEvent procedure} {
  424.     list [catch {after info after#} msg] $msg
  425. } {1 {event "after#" doesn't exist}}
  426. test timer-7.5 {GetAfterEvent procedure} {
  427.     list [catch {after info after#${id}x} msg] $msg
  428. } "1 {event "after#${id}x" doesn't exist}"
  429. test timer-7.6 {GetAfterEvent procedure} {
  430.     list [catch {after info afterx[expr $id+1]} msg] $msg
  431. } "1 {event "afterx[expr $id+1]" doesn't exist}"
  432. after cancel $event
  433. test timer-8.1 {AfterProc procedure} {
  434.     set x before
  435.     proc foo {} {
  436. set x untouched
  437. after 100 {set x after}
  438. after 200
  439. update
  440. return $x
  441.     }
  442.     list [foo] $x
  443. } {untouched after}
  444. test timer-8.2 {AfterProc procedure} {
  445.     catch {rename bgerror {}}
  446.     proc bgerror msg {
  447. global x errorInfo
  448. set x [list $msg $errorInfo]
  449.     }
  450.     set x empty
  451.     after 100 {error "After error"}
  452.     after 200
  453.     set y $x
  454.     update
  455.     catch {rename bgerror {}}
  456.     list $y $x
  457. } {empty {{After error} {After error
  458.     while executing
  459. "error "After error""
  460.     ("after" script)}}}
  461. test timer-8.3 {AfterProc procedure, deleting handler from itself} {
  462.     foreach i [after info] {
  463. after cancel $i
  464.     }
  465.     proc foo {} {
  466. global x
  467. set x {}
  468. foreach i [after info] {
  469.     lappend x [after info $i]
  470. }
  471. after cancel foo
  472.     }
  473.     after idle foo
  474.     after 1000 {error "I shouldn't ever have executed"}
  475.     update idletasks
  476.     set x
  477. } {{{error "I shouldn't ever have executed"} timer}}
  478. test timer-8.4 {AfterProc procedure, deleting handler from itself} {
  479.     foreach i [after info] {
  480. after cancel $i
  481.     }
  482.     proc foo {} {
  483. global x
  484. set x {}
  485. foreach i [after info] {
  486.     lappend x [after info $i]
  487. }
  488. after cancel foo
  489.     }
  490.     after 1000 {error "I shouldn't ever have executed"}
  491.     after idle foo
  492.     update idletasks
  493.     set x
  494. } {{{error "I shouldn't ever have executed"} timer}}
  495. foreach i [after info] {
  496.     after cancel $i
  497. }
  498. # No test for FreeAfterPtr, since it is already tested above.
  499. test timer-9.1 {AfterCleanupProc procedure} {
  500.     catch {interp delete x}
  501.     interp create x
  502.     x eval {after 200 {
  503. lappend x after
  504. puts "part 1: this message should not appear"
  505.     }}
  506.     after 200 {lappend x after2}
  507.     x eval {after 200 {
  508. lappend x after3
  509. puts "part 2: this message should not appear"
  510.     }}
  511.     after 200 {lappend x after4}
  512.     x eval {after 200 {
  513. lappend x after5
  514. puts "part 3: this message should not appear"
  515.     }}
  516.     interp delete x
  517.     set x before
  518.     after 300
  519.     update
  520.     set x
  521. } {before after2 after4}
  522. test timer-10.1 {Bug 1016167: [after] overwrites imports} -setup {
  523.     interp create slave
  524.     slave eval namespace export after
  525.     slave eval namespace eval foo namespace import ::after
  526. } -body {
  527.     slave eval foo::after 1
  528.     slave eval namespace origin foo::after
  529. } -cleanup {
  530.     # Bug will cause crash here; would cause failure otherwise
  531.     interp delete slave
  532. } -result ::after
  533. test timer-11.2 {Bug 1350293: [after] negative argument} 
  534.     -body {
  535. set l {}
  536. after 100 {lappend l 100; set done 1}
  537. after -1 {lappend l -1}
  538. vwait done
  539. set l
  540.     } 
  541.     -result {-1 100}
  542. # cleanup
  543. ::tcltest::cleanupTests
  544. return