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

通讯编程

开发平台:

Visual C++

  1. # Commands covered:  foreach, continue, break
  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-1997 Sun Microsystems, Inc.
  9. #
  10. # See the file "license.terms" for information on usage and redistribution
  11. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  12. #
  13. # RCS: @(#) $Id: foreach.test,v 1.8.8.3 2007/03/13 16:26:33 dgp Exp $
  14. if {[lsearch [namespace children] ::tcltest] == -1} {
  15.     package require tcltest
  16.     namespace import -force ::tcltest::*
  17. }
  18. catch {unset a}
  19. catch {unset x}
  20. # Basic "foreach" operation.
  21. test foreach-1.1 {basic foreach tests} {
  22.     set a {}
  23.     foreach i {a b c d} {
  24. set a [concat $a $i]
  25.     }
  26.     set a
  27. } {a b c d}
  28. test foreach-1.2 {basic foreach tests} {
  29.     set a {}
  30.     foreach i {a b {{c d} e} {123 {{x}}}} {
  31. set a [concat $a $i]
  32.     }
  33.     set a
  34. } {a b {c d} e 123 {{x}}}
  35. test foreach-1.3 {basic foreach tests} {catch {foreach} msg} 1
  36. test foreach-1.4 {basic foreach tests} {
  37.     catch {foreach} msg
  38.     set msg
  39. } {wrong # args: should be "foreach varList list ?varList list ...? command"}
  40. test foreach-1.5 {basic foreach tests} {catch {foreach i} msg} 1
  41. test foreach-1.6 {basic foreach tests} {
  42.     catch {foreach i} msg
  43.     set msg
  44. } {wrong # args: should be "foreach varList list ?varList list ...? command"}
  45. test foreach-1.7 {basic foreach tests} {catch {foreach i j} msg} 1
  46. test foreach-1.8 {basic foreach tests} {
  47.     catch {foreach i j} msg
  48.     set msg
  49. } {wrong # args: should be "foreach varList list ?varList list ...? command"}
  50. test foreach-1.9 {basic foreach tests} {catch {foreach i j k l} msg} 1
  51. test foreach-1.10 {basic foreach tests} {
  52.     catch {foreach i j k l} msg
  53.     set msg
  54. } {wrong # args: should be "foreach varList list ?varList list ...? command"}
  55. test foreach-1.11 {basic foreach tests} {
  56.     set a {}
  57.     foreach i {} {
  58. set a [concat $a $i]
  59.     }
  60.     set a
  61. } {}
  62. test foreach-1.12 {foreach errors} {
  63.     list [catch {foreach {{a}{b}} {1 2 3} {}} msg] $msg
  64. } {1 {list element in braces followed by "{b}" instead of space}}
  65. test foreach-1.13 {foreach errors} {
  66.     list [catch {foreach a {{1 2}3} {}} msg] $msg
  67. } {1 {list element in braces followed by "3" instead of space}}
  68. catch {unset a}
  69. test foreach-1.14 {foreach errors} {
  70.     catch {unset a}
  71.     set a(0) 44
  72.     list [catch {foreach a {1 2 3} {}} msg] $msg
  73. } {1 {couldn't set loop variable: "a"}}
  74. test foreach-1.15 {foreach errors} {
  75.     list [catch {foreach {} {} {}} msg] $msg
  76. } {1 {foreach varlist is empty}}
  77. catch {unset a}
  78. test foreach-2.1 {parallel foreach tests} {
  79.     set x {}
  80.     foreach {a b} {1 2 3 4} {
  81. append x $b $a
  82.     }
  83.     set x
  84. } {2143}
  85. test foreach-2.2 {parallel foreach tests} {
  86.     set x {}
  87.     foreach {a b} {1 2 3 4 5} {
  88. append x $b $a
  89.     }
  90.     set x
  91. } {21435}
  92. test foreach-2.3 {parallel foreach tests} {
  93.     set x {}
  94.     foreach a {1 2 3} b {4 5 6} {
  95. append x $b $a
  96.     }
  97.     set x
  98. } {415263}
  99. test foreach-2.4 {parallel foreach tests} {
  100.     set x {}
  101.     foreach a {1 2 3} b {4 5 6 7 8} {
  102. append x $b $a
  103.     }
  104.     set x
  105. } {41526378}
  106. test foreach-2.5 {parallel foreach tests} {
  107.     set x {}
  108.     foreach {a b} {a b A B aa bb} c {c C cc CC} {
  109. append x $a $b $c
  110.     }
  111.     set x
  112. } {abcABCaabbccCC}
  113. test foreach-2.6 {parallel foreach tests} {
  114.     set x {}
  115.     foreach a {1 2 3} b {1 2 3} c {1 2 3} d {1 2 3} e {1 2 3} {
  116. append x $a $b $c $d $e
  117.     }
  118.     set x
  119. } {111112222233333}
  120. test foreach-2.7 {parallel foreach tests} {
  121.     set x {}
  122.     foreach a {} b {1 2 3} c {1 2} d {1 2 3 4} e {{1 2}} {
  123. append x $a $b $c $d $e
  124.     }
  125.     set x
  126. } {1111 2222334}
  127. test foreach-2.8 {foreach only sets vars if repeating loop} {
  128.     proc foo {} {
  129.         set rgb {65535 0 0}
  130.         foreach {r g b} [set rgb] {}
  131.         return "r=$r, g=$g, b=$b"
  132.     }
  133.     foo
  134. } {r=65535, g=0, b=0}
  135. test foreach-2.9 {foreach only supports local scalar variables} {
  136.     proc foo {} {
  137.         set x {}
  138.         foreach {a(3)} {1 2 3 4} {lappend x [set {a(3)}]}
  139.         set x
  140.     }
  141.     foo
  142. } {1 2 3 4}
  143. test foreach-3.1 {compiled foreach backward jump works correctly} {
  144.     catch {unset x}
  145.     proc foo {arrayName} {
  146.         upvar 1 $arrayName a
  147.         set l {}
  148.         foreach member [array names a] {
  149.             lappend l [list $member [set a($member)]]
  150.         }
  151.         return $l
  152.     }
  153.     array set x {0 zero 1 one 2 two 3 three}
  154.     lsort [foo x]
  155. } [lsort {{0 zero} {1 one} {2 two} {3 three}}]
  156. test foreach-4.1 {noncompiled foreach and shared variable or value list objects that are converted to another type} {
  157.     catch {unset x}
  158.     foreach {12.0} {a b c} {
  159.         set x 12.0  
  160.         set x [expr $x + 1]
  161.     }
  162.     set x
  163. } 13.0
  164. # Check "continue".
  165. test foreach-5.1 {continue tests} {catch continue} 4
  166. test foreach-5.2 {continue tests} {
  167.     set a {}
  168.     foreach i {a b c d} {
  169. if {[string compare $i "b"] == 0} continue
  170. set a [concat $a $i]
  171.     }
  172.     set a
  173. } {a c d}
  174. test foreach-5.3 {continue tests} {
  175.     set a {}
  176.     foreach i {a b c d} {
  177. if {[string compare $i "b"] != 0} continue
  178. set a [concat $a $i]
  179.     }
  180.     set a
  181. } {b}
  182. test foreach-5.4 {continue tests} {catch {continue foo} msg} 1
  183. test foreach-5.5 {continue tests} {
  184.     catch {continue foo} msg
  185.     set msg
  186. } {wrong # args: should be "continue"}
  187. # Check "break".
  188. test foreach-6.1 {break tests} {catch break} 3
  189. test foreach-6.2 {break tests} {
  190.     set a {}
  191.     foreach i {a b c d} {
  192. if {[string compare $i "c"] == 0} break
  193. set a [concat $a $i]
  194.     }
  195.     set a
  196. } {a b}
  197. test foreach-6.3 {break tests} {catch {break foo} msg} 1
  198. test foreach-6.4 {break tests} {
  199.     catch {break foo} msg
  200.     set msg
  201. } {wrong # args: should be "break"}
  202. # Check for bug #406709 
  203. test foreach-6.5 {break tests} {
  204.     proc a {} {
  205. set a 1
  206. foreach b b {list [concat a; break]; incr a}
  207. incr a
  208.     }
  209.     a
  210. } {2}
  211. # Test for incorrect "double evaluation" semantics
  212. test foreach-7.1 {delayed substitution of body} {
  213.     proc foo {} {
  214.        set a 0
  215.        foreach a [list 1 2 3] "
  216.            set x $a
  217.        "
  218.        set x
  219.     }
  220.     foo
  221. } {0}
  222. # [Bug 1671138]; infinite loop with empty var list in bytecompiled version
  223. test foreach-9.1 {compiled empty var list} {
  224.     proc foo {} {
  225. foreach {} x {
  226.     error "reached body"
  227. }
  228.     }
  229.     list [catch { foo } msg] $msg
  230. } {1 {foreach varlist is empty}}
  231. test foreach-10.1 {foreach: [Bug 1671087]} -setup {
  232.     proc demo {} {
  233.         set vals {1 2 3 4}
  234.         trace add variable x write {string length $vals ;# }
  235.         foreach {x y} $vals {format $y}
  236.     }
  237. } -body {
  238.     demo
  239. } -cleanup {
  240.     rename demo {}
  241. } -result {}
  242. # cleanup
  243. catch {unset a}
  244. catch {unset x}
  245. ::tcltest::cleanupTests
  246. return