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