os/persistentdata/persistentstorage/sqlite3api/TEST/TCL/tcldistribution/tests/proc-old.test
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 # Commands covered:  proc, return, global
     2 #
     3 # This file, proc-old.test, includes the original set of tests for Tcl's
     4 # proc, return, and global commands. There is now a new file proc.test
     5 # that contains tests for the tclProc.c source file.
     6 #
     7 # Sourcing this file into Tcl runs the tests and generates output for
     8 # errors.  No output means no errors were found.
     9 #
    10 # Copyright (c) 1991-1993 The Regents of the University of California.
    11 # Copyright (c) 1994-1997 Sun Microsystems, Inc.
    12 # Copyright (c) 1998-1999 by Scriptics Corporation.
    13 #
    14 # See the file "license.terms" for information on usage and redistribution
    15 # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
    16 #
    17 # RCS: @(#) $Id: proc-old.test,v 1.9.2.1 2003/03/27 21:46:32 msofer Exp $
    18 
    19 if {[lsearch [namespace children] ::tcltest] == -1} {
    20     package require tcltest
    21     namespace import -force ::tcltest::*
    22 }
    23 
    24 catch {rename t1 ""}
    25 catch {rename foo ""}
    26 
    27 proc tproc {} {return a; return b}
    28 test proc-old-1.1 {simple procedure call and return} {tproc} a
    29 proc tproc x {
    30     set x [expr $x+1]
    31     return $x
    32 }
    33 test proc-old-1.2 {simple procedure call and return} {tproc 2} 3
    34 test proc-old-1.3 {simple procedure call and return} {
    35     proc tproc {} {return foo}
    36 } {}
    37 test proc-old-1.4 {simple procedure call and return} {
    38     proc tproc {} {return}
    39     tproc
    40 } {}
    41 proc tproc1 {a}   {incr a; return $a}
    42 proc tproc2 {a b} {incr a; return $a}
    43 test proc-old-1.5 {simple procedure call and return (2 procs with same body but different parameters)} {
    44     list [tproc1 123] [tproc2 456 789]
    45 } {124 457}
    46 test proc-old-1.6 {simple procedure call and return (shared proc body string)} {
    47     set x {}
    48     proc tproc {} {}   ;# body is shared with x
    49     list [tproc] [append x foo]
    50 } {{} foo}
    51 
    52 test proc-old-2.1 {local and global variables} {
    53     proc tproc x {
    54 	set x [expr $x+1]
    55 	return $x
    56     }
    57     set x 42
    58     list [tproc 6] $x
    59 } {7 42}
    60 test proc-old-2.2 {local and global variables} {
    61     proc tproc x {
    62 	set y [expr $x+1]
    63 	return $y
    64     }
    65     set y 18
    66     list [tproc 6] $y
    67 } {7 18}
    68 test proc-old-2.3 {local and global variables} {
    69     proc tproc x {
    70 	global y
    71 	set y [expr $x+1]
    72 	return $y
    73     }
    74     set y 189
    75     list [tproc 6] $y
    76 } {7 7}
    77 test proc-old-2.4 {local and global variables} {
    78     proc tproc x {
    79 	global y
    80 	return [expr $x+$y]
    81     }
    82     set y 189
    83     list [tproc 6] $y
    84 } {195 189}
    85 catch {unset _undefined_}
    86 test proc-old-2.5 {local and global variables} {
    87     proc tproc x {
    88 	global _undefined_
    89 	return $_undefined_
    90     }
    91     list [catch {tproc xxx} msg] $msg
    92 } {1 {can't read "_undefined_": no such variable}}
    93 test proc-old-2.6 {local and global variables} {
    94     set a 114
    95     set b 115
    96     global a b
    97     list $a $b
    98 } {114 115}
    99 
   100 proc do {cmd} {eval $cmd}
   101 test proc-old-3.1 {local and global arrays} {
   102     catch {unset a}
   103     set a(0) 22
   104     list [catch {do {global a; set a(0)}} msg] $msg
   105 } {0 22}
   106 test proc-old-3.2 {local and global arrays} {
   107     catch {unset a}
   108     set a(x) 22
   109     list [catch {do {global a; set a(x) newValue}} msg] $msg $a(x)
   110 } {0 newValue newValue}
   111 test proc-old-3.3 {local and global arrays} {
   112     catch {unset a}
   113     set a(x) 22
   114     set a(y) 33
   115     list [catch {do {global a; unset a(y)}; array names a} msg] $msg
   116 } {0 x}
   117 test proc-old-3.4 {local and global arrays} {
   118     catch {unset a}
   119     set a(x) 22
   120     set a(y) 33
   121     list [catch {do {global a; unset a; info exists a}} msg] $msg \
   122 	    [info exists a]
   123 } {0 0 0}
   124 test proc-old-3.5 {local and global arrays} {
   125     catch {unset a}
   126     set a(x) 22
   127     set a(y) 33
   128     list [catch {do {global a; unset a(y); array names a}} msg] $msg
   129 } {0 x}
   130 catch {unset a}
   131 test proc-old-3.6 {local and global arrays} {
   132     catch {unset a}
   133     set a(x) 22
   134     set a(y) 33
   135     do {global a; do {global a; unset a}; set a(z) 22}
   136     list [catch {array names a} msg] $msg
   137 } {0 z}
   138 test proc-old-3.7 {local and global arrays} {
   139     proc t1 {args} {global info; set info 1}
   140     catch {unset a}
   141     set info {}
   142     do {global a; trace var a(1) w t1}
   143     set a(1) 44
   144     set info
   145 } 1
   146 test proc-old-3.8 {local and global arrays} {
   147     proc t1 {args} {global info; set info 1}
   148     catch {unset a}
   149     trace var a(1) w t1
   150     set info {}
   151     do {global a; trace vdelete a(1) w t1}
   152     set a(1) 44
   153     set info
   154 } {}
   155 test proc-old-3.9 {local and global arrays} {
   156     proc t1 {args} {global info; set info 1}
   157     catch {unset a}
   158     trace var a(1) w t1
   159     do {global a; trace vinfo a(1)}
   160 } {{w t1}}
   161 catch {unset a}
   162 
   163 test proc-old-30.1 {arguments and defaults} {
   164     proc tproc {x y z} {
   165 	return [list $x $y $z]
   166     }
   167     tproc 11 12 13
   168 } {11 12 13}
   169 test proc-old-30.2 {arguments and defaults} {
   170     proc tproc {x y z} {
   171 	return [list $x $y $z]
   172     }
   173     list [catch {tproc 11 12} msg] $msg
   174 } {1 {wrong # args: should be "tproc x y z"}}
   175 test proc-old-30.3 {arguments and defaults} {
   176     proc tproc {x y z} {
   177 	return [list $x $y $z]
   178     }
   179     list [catch {tproc 11 12 13 14} msg] $msg
   180 } {1 {wrong # args: should be "tproc x y z"}}
   181 test proc-old-30.4 {arguments and defaults} {
   182     proc tproc {x {y y-default} {z z-default}} {
   183 	return [list $x $y $z]
   184     }
   185     tproc 11 12 13
   186 } {11 12 13}
   187 test proc-old-30.5 {arguments and defaults} {
   188     proc tproc {x {y y-default} {z z-default}} {
   189 	return [list $x $y $z]
   190     }
   191     tproc 11 12
   192 } {11 12 z-default}
   193 test proc-old-30.6 {arguments and defaults} {
   194     proc tproc {x {y y-default} {z z-default}} {
   195 	return [list $x $y $z]
   196     }
   197     tproc 11
   198 } {11 y-default z-default}
   199 test proc-old-30.7 {arguments and defaults} {
   200     proc tproc {x {y y-default} {z z-default}} {
   201 	return [list $x $y $z]
   202     }
   203     list [catch {tproc} msg] $msg
   204 } {1 {wrong # args: should be "tproc x ?y? ?z?"}}
   205 test proc-old-30.8 {arguments and defaults} {
   206     list [catch {
   207 	proc tproc {x {y y-default} z} {
   208 	    return [list $x $y $z]
   209 	}
   210 	tproc 2 3
   211     } msg] $msg
   212 } {1 {wrong # args: should be "tproc x ?y? z"}}
   213 test proc-old-30.9 {arguments and defaults} {
   214     proc tproc {x {y y-default} args} {
   215 	return [list $x $y $args]
   216     }
   217     tproc 2 3 4 5
   218 } {2 3 {4 5}}
   219 test proc-old-30.10 {arguments and defaults} {
   220     proc tproc {x {y y-default} args} {
   221 	return [list $x $y $args]
   222     }
   223     tproc 2 3
   224 } {2 3 {}}
   225 test proc-old-30.11 {arguments and defaults} {
   226     proc tproc {x {y y-default} args} {
   227 	return [list $x $y $args]
   228     }
   229     tproc 2
   230 } {2 y-default {}}
   231 test proc-old-30.12 {arguments and defaults} {
   232     proc tproc {x {y y-default} args} {
   233 	return [list $x $y $args]
   234     }
   235     list [catch {tproc} msg] $msg
   236 } {1 {wrong # args: should be "tproc x ?y? args"}}
   237 
   238 test proc-old-4.1 {variable numbers of arguments} {
   239     proc tproc args {return $args}
   240     tproc
   241 } {}
   242 test proc-old-4.2 {variable numbers of arguments} {
   243     proc tproc args {return $args}
   244     tproc 1 2 3 4 5 6 7 8
   245 } {1 2 3 4 5 6 7 8}
   246 test proc-old-4.3 {variable numbers of arguments} {
   247     proc tproc args {return $args}
   248     tproc 1 {2 3} {4 {5 6} {{{7}}}} 8
   249 } {1 {2 3} {4 {5 6} {{{7}}}} 8}
   250 test proc-old-4.4 {variable numbers of arguments} {
   251     proc tproc {x y args} {return $args}
   252     tproc 1 2 3 4 5 6 7
   253 } {3 4 5 6 7}
   254 test proc-old-4.5 {variable numbers of arguments} {
   255     proc tproc {x y args} {return $args}
   256     tproc 1 2
   257 } {}
   258 test proc-old-4.6 {variable numbers of arguments} {
   259     proc tproc {x missing args} {return $args}
   260     list [catch {tproc 1} msg] $msg
   261 } {1 {wrong # args: should be "tproc x missing args"}}
   262 
   263 test proc-old-5.1 {error conditions} {
   264     list [catch {proc} msg] $msg
   265 } {1 {wrong # args: should be "proc name args body"}}
   266 test proc-old-5.2 {error conditions} {
   267     list [catch {proc tproc b} msg] $msg
   268 } {1 {wrong # args: should be "proc name args body"}}
   269 test proc-old-5.3 {error conditions} {
   270     list [catch {proc tproc b c d e} msg] $msg
   271 } {1 {wrong # args: should be "proc name args body"}}
   272 test proc-old-5.4 {error conditions} {
   273     list [catch {proc tproc \{xyz {return foo}} msg] $msg
   274 } {1 {unmatched open brace in list}}
   275 test proc-old-5.5 {error conditions} {
   276     list [catch {proc tproc {{} y} {return foo}} msg] $msg
   277 } {1 {procedure "tproc" has argument with no name}}
   278 test proc-old-5.6 {error conditions} {
   279     list [catch {proc tproc {{} y} {return foo}} msg] $msg
   280 } {1 {procedure "tproc" has argument with no name}}
   281 test proc-old-5.7 {error conditions} {
   282     list [catch {proc tproc {{x 1 2} y} {return foo}} msg] $msg
   283 } {1 {too many fields in argument specifier "x 1 2"}}
   284 test proc-old-5.8 {error conditions} {
   285     catch {return}
   286 } 2
   287 test proc-old-5.9 {error conditions} {
   288     list [catch {global} msg] $msg
   289 } {1 {wrong # args: should be "global varName ?varName ...?"}}
   290 proc tproc {} {
   291     set a 22
   292     global a
   293 }
   294 test proc-old-5.10 {error conditions} {
   295     list [catch {tproc} msg] $msg
   296 } {1 {variable "a" already exists}}
   297 test proc-old-5.11 {error conditions} {
   298     catch {rename tproc {}}
   299     catch {
   300 	proc tproc {x {} z} {return foo}
   301     }
   302     list [catch {tproc 1} msg] $msg
   303 } {1 {invalid command name "tproc"}}
   304 test proc-old-5.12 {error conditions} {
   305     proc tproc {} {
   306 	set a 22
   307 	error "error in procedure"
   308 	return
   309     }
   310     list [catch tproc msg] $msg
   311 } {1 {error in procedure}}
   312 test proc-old-5.13 {error conditions} {
   313     proc tproc {} {
   314 	set a 22
   315 	error "error in procedure"
   316 	return
   317     }
   318     catch tproc msg
   319     set errorInfo
   320 } {error in procedure
   321     while executing
   322 "error "error in procedure""
   323     (procedure "tproc" line 3)
   324     invoked from within
   325 "tproc"}
   326 test proc-old-5.14 {error conditions} {
   327     proc tproc {} {
   328 	set a 22
   329 	break
   330 	return
   331     }
   332     catch tproc msg
   333     set errorInfo
   334 } {invoked "break" outside of a loop
   335     (procedure "tproc" line 1)
   336     invoked from within
   337 "tproc"}
   338 test proc-old-5.15 {error conditions} {
   339     proc tproc {} {
   340 	set a 22
   341 	continue
   342 	return
   343     }
   344     catch tproc msg
   345     set errorInfo
   346 } {invoked "continue" outside of a loop
   347     (procedure "tproc" line 1)
   348     invoked from within
   349 "tproc"}
   350 test proc-old-5.16 {error conditions} {
   351     proc foo args {
   352 	global fooMsg
   353 	set fooMsg "foo was called: $args"
   354     }
   355     proc tproc {} {
   356 	set x 44
   357 	trace var x u foo
   358 	while {$x < 100} {
   359 	    error "Nested error"
   360 	}
   361     }
   362     set fooMsg "foo not called"
   363     list [catch tproc msg] $msg $errorInfo $fooMsg
   364 } {1 {Nested error} {Nested error
   365     while executing
   366 "error "Nested error""
   367     (procedure "tproc" line 5)
   368     invoked from within
   369 "tproc"} {foo was called: x {} u}}
   370 
   371 # The tests below will really only be useful when run under Purify or
   372 # some other system that can detect accesses to freed memory...
   373 
   374 test proc-old-6.1 {procedure that redefines itself} {
   375     proc tproc {} {
   376 	proc tproc {} {
   377 	    return 44
   378 	}
   379 	return 45
   380     }
   381     tproc
   382 } 45
   383 test proc-old-6.2 {procedure that deletes itself} {
   384     proc tproc {} {
   385 	rename tproc {}
   386 	return 45
   387     }
   388     tproc
   389 } 45
   390 
   391 proc tproc code {
   392     return -code $code abc
   393 }
   394 test proc-old-7.1 {return with special completion code} {
   395     list [catch {tproc ok} msg] $msg
   396 } {0 abc}
   397 test proc-old-7.2 {return with special completion code} {
   398     list [catch {tproc error} msg] $msg $errorInfo $errorCode
   399 } {1 abc {abc
   400     while executing
   401 "tproc error"} NONE}
   402 test proc-old-7.3 {return with special completion code} {
   403     list [catch {tproc return} msg] $msg
   404 } {2 abc}
   405 test proc-old-7.4 {return with special completion code} {
   406     list [catch {tproc break} msg] $msg
   407 } {3 abc}
   408 test proc-old-7.5 {return with special completion code} {
   409     list [catch {tproc continue} msg] $msg
   410 } {4 abc}
   411 test proc-old-7.6 {return with special completion code} {
   412     list [catch {tproc -14} msg] $msg
   413 } {-14 abc}
   414 test proc-old-7.7 {return with special completion code} {
   415     list [catch {tproc gorp} msg] $msg
   416 } {1 {bad completion code "gorp": must be ok, error, return, break, continue, or an integer}}
   417 test proc-old-7.8 {return with special completion code} {
   418     list [catch {tproc 10b} msg] $msg
   419 } {1 {bad completion code "10b": must be ok, error, return, break, continue, or an integer}}
   420 test proc-old-7.9 {return with special completion code} {
   421     proc tproc2 {} {
   422 	tproc return
   423     }
   424     list [catch tproc2 msg] $msg
   425 } {0 abc}
   426 test proc-old-7.10 {return with special completion code} {
   427     proc tproc2 {} {
   428 	return -code error
   429     }
   430     list [catch tproc2 msg] $msg
   431 } {1 {}}
   432 test proc-old-7.11 {return with special completion code} {
   433     proc tproc2 {} {
   434 	global errorCode errorInfo
   435 	catch {open _bad_file_name r} msg
   436 	return -code error -errorinfo $errorInfo -errorcode $errorCode $msg
   437     }
   438     set msg [list [catch tproc2 msg] $msg $errorInfo $errorCode]
   439     regsub -all [file join {} _bad_file_name] $msg "_bad_file_name" msg
   440     normalizeMsg $msg
   441 } {1 {couldn't open "_bad_file_name": no such file or directory} {couldn't open "_bad_file_name": no such file or directory
   442     while executing
   443 "open _bad_file_name r"
   444     invoked from within
   445 "tproc2"} {posix enoent {no such file or directory}}}
   446 test proc-old-7.12 {return with special completion code} {
   447     proc tproc2 {} {
   448 	global errorCode errorInfo
   449 	catch {open _bad_file_name r} msg
   450 	return -code error -errorcode $errorCode $msg
   451     }
   452     set msg [list [catch tproc2 msg] $msg $errorInfo $errorCode]
   453     regsub -all [file join {} _bad_file_name] $msg "_bad_file_name" msg
   454     normalizeMsg $msg
   455 } {1 {couldn't open "_bad_file_name": no such file or directory} {couldn't open "_bad_file_name": no such file or directory
   456     while executing
   457 "tproc2"} {posix enoent {no such file or directory}}}
   458 test proc-old-7.13 {return with special completion code} {
   459     proc tproc2 {} {
   460 	global errorCode errorInfo
   461 	catch {open _bad_file_name r} msg
   462 	return -code error -errorinfo $errorInfo $msg
   463     }
   464     set msg [list [catch tproc2 msg] $msg $errorInfo $errorCode]
   465     regsub -all [file join {} _bad_file_name] $msg "_bad_file_name" msg
   466     normalizeMsg $msg
   467 } {1 {couldn't open "_bad_file_name": no such file or directory} {couldn't open "_bad_file_name": no such file or directory
   468     while executing
   469 "open _bad_file_name r"
   470     invoked from within
   471 "tproc2"} none}
   472 test proc-old-7.14 {return with special completion code} {
   473     proc tproc2 {} {
   474 	global errorCode errorInfo
   475 	catch {open _bad_file_name r} msg
   476 	return -code error $msg
   477     }
   478     set msg [list [catch tproc2 msg] $msg $errorInfo $errorCode]
   479     regsub -all [file join {} _bad_file_name] $msg "_bad_file_name" msg
   480     normalizeMsg $msg
   481 } {1 {couldn't open "_bad_file_name": no such file or directory} {couldn't open "_bad_file_name": no such file or directory
   482     while executing
   483 "tproc2"} none}
   484 test proc-old-7.15 {return with special completion code} {
   485     list [catch {return -badOption foo message} msg] $msg
   486 } {1 {bad option "-badOption": must be -code, -errorcode, or -errorinfo}}
   487 
   488 test proc-old-8.1 {unset and undefined local arrays} {
   489     proc t1 {} {
   490         foreach v {xxx, yyy} {
   491             catch {unset $v}
   492         }
   493         set yyy(foo) bar
   494     }
   495     t1
   496 } bar
   497 
   498 test proc-old-9.1 {empty command name} {
   499     catch {rename {} ""}
   500     proc t1 {args} {
   501         return
   502     }
   503     set v [t1]
   504     catch {$v}
   505 } 1
   506 
   507 test proc-old-10.1 {ByteCode epoch change during recursive proc execution} {
   508     proc t1 x {
   509         set y 20
   510         rename expr expr.old
   511         rename expr.old expr
   512         if $x then {t1 0} ;# recursive call after foo's code is invalidated
   513         return 20
   514     }
   515     t1 1
   516 } 20
   517 
   518 # cleanup
   519 catch {rename t1 ""}
   520 catch {rename foo ""}
   521 ::tcltest::cleanupTests
   522 return
   523 
   524 
   525 
   526 
   527 
   528 
   529 
   530 
   531 
   532 
   533 
   534