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

通讯编程

开发平台:

Visual C++

  1. # Commands covered:  upvar
  2. #
  3. # This file contains a collection of tests for one or more of the Tcl
  4. # built-in commands.  Sourcing this file into Tcl runs the tests and
  5. # generates output for errors.  No output means no errors were found.
  6. #
  7. # Copyright (c) 1991-1993 The Regents of the University of California.
  8. # Copyright (c) 1994 Sun Microsystems, Inc.
  9. # Copyright (c) 1998-1999 by Scriptics Corporation.
  10. #
  11. # See the file "license.terms" for information on usage and redistribution
  12. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  13. #
  14. # RCS: @(#) $Id: upvar.test,v 1.7 2000/04/10 17:19:05 ericm Exp $
  15. if {[lsearch [namespace children] ::tcltest] == -1} {
  16.     package require tcltest
  17.     namespace import -force ::tcltest::*
  18. }
  19. test upvar-1.1 {reading variables with upvar} {
  20.     proc p1 {a b} {set c 22; set d 33; p2}
  21.     proc p2 {} {upvar a x1 b x2 c x3 d x4; set a abc; list $x1 $x2 $x3 $x4 $a}
  22.     p1 foo bar
  23. } {foo bar 22 33 abc}
  24. test upvar-1.2 {reading variables with upvar} {
  25.     proc p1 {a b} {set c 22; set d 33; p2}
  26.     proc p2 {} {p3}
  27.     proc p3 {} {upvar 2 a x1 b x2 c x3 d x4; set a abc; list $x1 $x2 $x3 $x4 $a}
  28.     p1 foo bar
  29. } {foo bar 22 33 abc}
  30. test upvar-1.3 {reading variables with upvar} {
  31.     proc p1 {a b} {set c 22; set d 33; p2}
  32.     proc p2 {} {p3}
  33.     proc p3 {} {
  34. upvar #1 a x1 b x2 c x3 d x4
  35. set a abc
  36. list $x1 $x2 $x3 $x4 $a
  37.     }
  38.     p1 foo bar
  39. } {foo bar 22 33 abc}
  40. test upvar-1.4 {reading variables with upvar} {
  41.     set x1 44
  42.     set x2 55
  43.     proc p1 {} {p2}
  44.     proc p2 {} {
  45. upvar 2 x1 x1 x2 a
  46. upvar #0 x1 b
  47. set c $b
  48. incr b 3
  49. list $x1 $a $b
  50.     }
  51.     p1
  52. } {47 55 47}
  53. test upvar-1.5 {reading array elements with upvar} {
  54.     proc p1 {} {set a(0) zeroth; set a(1) first; p2}
  55.     proc p2 {} {upvar a(0) x; set x}
  56.     p1
  57. } {zeroth}
  58. test upvar-2.1 {writing variables with upvar} {
  59.     proc p1 {a b} {set c 22; set d 33; p2; list $a $b $c $d}
  60.     proc p2 {} {
  61. upvar a x1 b x2 c x3 d x4
  62. set x1 14
  63. set x4 88
  64.     }
  65.     p1 foo bar
  66. } {14 bar 22 88}
  67. test upvar-2.2 {writing variables with upvar} {
  68.     set x1 44
  69.     set x2 55
  70.     proc p1 {x1 x2} {
  71. upvar #0 x1 a
  72. upvar x2 b
  73. set a $x1
  74. set b $x2
  75.     }
  76.     p1 newbits morebits
  77.     list $x1 $x2
  78. } {newbits morebits}
  79. test upvar-2.3 {writing variables with upvar} {
  80.     catch {unset x1}
  81.     catch {unset x2}
  82.     proc p1 {x1 x2} {
  83. upvar #0 x1 a
  84. upvar x2 b
  85. set a $x1
  86. set b $x2
  87.     }
  88.     p1 newbits morebits
  89.     list [catch {set x1} msg] $msg [catch {set x2} msg] $msg
  90. } {0 newbits 0 morebits}
  91. test upvar-2.4 {writing array elements with upvar} {
  92.     proc p1 {} {set a(0) zeroth; set a(1) first; list [p2] $a(0)}
  93.     proc p2 {} {upvar a(0) x; set x xyzzy}
  94.     p1
  95. } {xyzzy xyzzy}
  96. test upvar-3.1 {unsetting variables with upvar} {
  97.     proc p1 {a b} {set c 22; set d 33; p2; lsort [info vars]}
  98.     proc p2 {} {
  99. upvar 1 a x1 d x2
  100. unset x1 x2
  101.     }
  102.     p1 foo bar
  103. } {b c}
  104. test upvar-3.2 {unsetting variables with upvar} {
  105.     proc p1 {a b} {set c 22; set d 33; p2; lsort [info vars]}
  106.     proc p2 {} {
  107. upvar 1 a x1 d x2
  108. unset x1 x2
  109. set x2 28
  110.     }
  111.     p1 foo bar
  112. } {b c d}
  113. test upvar-3.3 {unsetting variables with upvar} {
  114.     set x1 44
  115.     set x2 55
  116.     proc p1 {} {p2}
  117.     proc p2 {} {
  118. upvar 2 x1 a
  119. upvar #0 x2 b
  120. unset a b
  121.     }
  122.     p1
  123.     list [info exists x1] [info exists x2]
  124. } {0 0}
  125. test upvar-3.4 {unsetting variables with upvar} {
  126.     set x1 44
  127.     set x2 55
  128.     proc p1 {} {
  129. upvar x1 a x2 b
  130. unset a b
  131. set b 118
  132.     }
  133.     p1
  134.     list [info exists x1] [catch {set x2} msg] $msg
  135. } {0 0 118}
  136. test upvar-3.5 {unsetting array elements with upvar} {
  137.     proc p1 {} {
  138. set a(0) zeroth
  139. set a(1) first
  140. set a(2) second
  141. p2
  142. array names a
  143.     }
  144.     proc p2 {} {upvar a(0) x; unset x}
  145.     p1
  146. } {1 2}
  147. test upvar-3.6 {unsetting then resetting array elements with upvar} {
  148.     proc p1 {} {
  149. set a(0) zeroth
  150. set a(1) first
  151. set a(2) second
  152. p2
  153. list [array names a] [catch {set a(0)} msg] $msg
  154.     }
  155.     proc p2 {} {upvar a(0) x; unset x; set x 12345}
  156.     p1
  157. } {{0 1 2} 0 12345}
  158. test upvar-4.1 {nested upvars} {
  159.     set x1 88
  160.     proc p1 {a b} {set c 22; set d 33; p2}
  161.     proc p2 {} {global x1; upvar c x2; p3}
  162.     proc p3 {} {
  163. upvar x1 a x2 b
  164. list $a $b
  165.     }
  166.     p1 14 15
  167. } {88 22}
  168. test upvar-4.2 {nested upvars} {
  169.     set x1 88
  170.     proc p1 {a b} {set c 22; set d 33; p2; list $a $b $c $d}
  171.     proc p2 {} {global x1; upvar c x2; p3}
  172.     proc p3 {} {
  173. upvar x1 a x2 b
  174. set a foo
  175. set b bar
  176.     }
  177.     list [p1 14 15] $x1
  178. } {{14 15 bar 33} foo}
  179. proc tproc {args} {global x; set x [list $args [uplevel info vars]]}
  180. test upvar-5.1 {traces involving upvars} {
  181.     proc p1 {a b} {set c 22; set d 33; trace var c rw tproc; p2}
  182.     proc p2 {} {upvar c x1; set x1 22}
  183.     set x ---
  184.     p1 foo bar
  185.     set x
  186. } {{x1 {} w} x1}
  187. test upvar-5.2 {traces involving upvars} {
  188.     proc p1 {a b} {set c 22; set d 33; trace var c rw tproc; p2}
  189.     proc p2 {} {upvar c x1; set x1}
  190.     set x ---
  191.     p1 foo bar
  192.     set x
  193. } {{x1 {} r} x1}
  194. test upvar-5.3 {traces involving upvars} {
  195.     proc p1 {a b} {set c 22; set d 33; trace var c rwu tproc; p2}
  196.     proc p2 {} {upvar c x1; unset x1}
  197.     set x ---
  198.     p1 foo bar
  199.     set x
  200. } {{x1 {} u} x1}
  201. test upvar-6.1 {retargeting an upvar} {
  202.     proc p1 {} {
  203. set a(0) zeroth
  204. set a(1) first
  205. set a(2) second
  206. p2
  207.     }
  208.     proc p2 {} {
  209. upvar a x
  210. set result {}
  211. foreach i [array names x] {
  212.     upvar a($i) x
  213.     lappend result $x
  214. }
  215. lsort $result
  216.     }
  217.     p1
  218. } {first second zeroth}
  219. test upvar-6.2 {retargeting an upvar} {
  220.     set x 44
  221.     set y abcde
  222.     proc p1 {} {
  223. global x
  224. set result $x
  225. upvar y x
  226. lappend result $x
  227.     }
  228.     p1
  229. } {44 abcde}
  230. test upvar-6.3 {retargeting an upvar} {
  231.     set x 44
  232.     set y abcde
  233.     proc p1 {} {
  234. upvar y x
  235. lappend result $x
  236. global x
  237. lappend result $x
  238.     }
  239.     p1
  240. } {abcde 44}
  241. test upvar-7.1 {upvar to same level} {
  242.     set x 44
  243.     set y 55
  244.     catch {unset uv}
  245.     upvar #0 x uv
  246.     set uv abc
  247.     upvar 0 y uv
  248.     set uv xyzzy
  249.     list $x $y
  250. } {abc xyzzy}
  251. test upvar-7.2 {upvar to same level} {
  252.     set x 1234
  253.     set y 4567
  254.     proc p1 {x y} {
  255. upvar 0 x uv
  256. set uv $y
  257. return "$x $y"
  258.     }
  259.     p1 44 89
  260. } {89 89}
  261. test upvar-7.3 {upvar to same level} {
  262.     set x 1234
  263.     set y 4567
  264.     proc p1 {x y} {
  265. upvar #1 x uv
  266. set uv $y
  267. return "$x $y"
  268.     }
  269.     p1 xyz abc
  270. } {abc abc}
  271. test upvar-7.4 {upvar to same level: tricky problems when deleting variable table} {
  272.     proc tt {} {upvar #1 toto loc;  return $loc}
  273.     list [catch tt msg] $msg
  274. } {1 {can't read "loc": no such variable}}
  275. test upvar-7.5 {potential memory leak when deleting variable table} {
  276.     proc leak {} {
  277. array set foo {1 2 3 4}
  278. upvar 0 foo(1) bar
  279.     }
  280.     leak
  281. } {}
  282. test upvar-8.1 {errors in upvar command} {
  283.     list [catch upvar msg] $msg
  284. } {1 {wrong # args: should be "upvar ?level? otherVar localVar ?otherVar localVar ...?"}}
  285. test upvar-8.2 {errors in upvar command} {
  286.     list [catch {upvar 1} msg] $msg
  287. } {1 {wrong # args: should be "upvar ?level? otherVar localVar ?otherVar localVar ...?"}}
  288. test upvar-8.3 {errors in upvar command} {
  289.     proc p1 {} {upvar a b c}
  290.     list [catch p1 msg] $msg
  291. } {1 {wrong # args: should be "upvar ?level? otherVar localVar ?otherVar localVar ...?"}}
  292. test upvar-8.4 {errors in upvar command} {
  293.     proc p1 {} {upvar 0 b b}
  294.     list [catch p1 msg] $msg
  295. } {1 {can't upvar from variable to itself}}
  296. test upvar-8.5 {errors in upvar command} {
  297.     proc p1 {} {upvar 0 a b; upvar 0 b a}
  298.     list [catch p1 msg] $msg
  299. } {1 {can't upvar from variable to itself}}
  300. test upvar-8.6 {errors in upvar command} {
  301.     proc p1 {} {set a 33; upvar b a}
  302.     list [catch p1 msg] $msg
  303. } {1 {variable "a" already exists}}
  304. test upvar-8.7 {errors in upvar command} {
  305.     proc p1 {} {trace variable a w foo; upvar b a}
  306.     list [catch p1 msg] $msg
  307. } {1 {variable "a" has traces: can't use for upvar}}
  308. test upvar-8.8 {create nested array with upvar} {
  309.     proc p1 {} {upvar x(a) b; set b(2) 44}
  310.     catch {unset x}
  311.     list [catch p1 msg] $msg
  312. } {1 {can't set "b(2)": variable isn't array}}
  313. test upvar-8.9 {upvar won't create namespace variable that refers to procedure variable} {
  314.     catch {eval namespace delete [namespace children :: test_ns_*]}
  315.     catch {rename MakeLink ""}
  316.     namespace eval ::test_ns_1 {}
  317.     proc MakeLink {a} {
  318.         namespace eval ::test_ns_1 {
  319.     upvar a a
  320.         }
  321.         unset ::test_ns_1::a
  322.     }
  323.     list [catch {MakeLink 1} msg] $msg
  324. } {1 {bad variable name "a": upvar won't create namespace variable that refers to procedure variable}}
  325. test upvar-8.10 {upvar will create element alias for new array element} {
  326.     catch {unset upvarArray}
  327.     array set upvarArray {}
  328.     catch {upvar 0 upvarArray(elem) upvarArrayElemAlias}
  329. } {0}
  330. if {[info commands testupvar] != {}} {
  331.     test upvar-9.1 {Tcl_UpVar2 procedure} {
  332. list [catch {testupvar xyz a {} x global} msg] $msg
  333.     } {1 {bad level "xyz"}}
  334.     test upvar-9.2 {Tcl_UpVar2 procedure} {
  335. catch {unset a}
  336. catch {unset x}
  337. set a 44
  338. list [catch {testupvar #0 a 1 x global} msg] $msg
  339.     } {1 {can't access "a(1)": variable isn't array}}
  340.     test upvar-9.3 {Tcl_UpVar2 procedure} {
  341. proc foo {} {
  342.     testupvar 1 a {} x local
  343.     set x
  344. }
  345. catch {unset a}
  346. catch {unset x}
  347. set a 44
  348. foo
  349.     } {44}
  350.     test upvar-9.4 {Tcl_UpVar2 procedure} {
  351. proc foo {} {
  352.     testupvar 1 a {} _up_ global
  353.     list [catch {set x} msg] $msg
  354. }
  355. catch {unset a}
  356. catch {unset _up_}
  357. set a 44
  358. concat [foo] $_up_
  359.     } {1 {can't read "x": no such variable} 44}
  360.     test upvar-9.5 {Tcl_UpVar2 procedure} {
  361. proc foo {} {
  362.     testupvar 1 a b x local
  363.     set x
  364. }
  365. catch {unset a}
  366. catch {unset x}
  367. set a(b) 1234
  368. foo
  369.     } {1234}
  370.     test upvar-9.6 {Tcl_UpVar procedure} {
  371. proc foo {} {
  372.     testupvar 1 a x local
  373.     set x
  374. }
  375. catch {unset a}
  376. catch {unset x}
  377. set a xyzzy
  378. foo
  379.     } {xyzzy}
  380.     test upvar-9.7 {Tcl_UpVar procedure} {
  381. proc foo {} {
  382.     testupvar #0 a(b) x local
  383.     set x
  384. }
  385. catch {unset a}
  386. catch {unset x}
  387. set a(b) 1234
  388. foo
  389.     } {1234}
  390. }
  391. catch {unset a}
  392. # cleanup
  393. ::tcltest::cleanupTests
  394. return