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

通讯编程

开发平台:

Visual C++

  1. # Commands covered:  lsearch
  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: lsearch.test,v 1.10.2.4 2007/12/05 14:54:08 dkf Exp $
  15. if {[lsearch [namespace children] ::tcltest] == -1} {
  16.     package require tcltest
  17.     namespace import -force ::tcltest::*
  18. }
  19. set x {abcd bbcd 123 234 345}
  20. test lsearch-1.1 {lsearch command} {
  21.     lsearch $x 123
  22. } 2
  23. test lsearch-1.2 {lsearch command} {
  24.     lsearch $x 3456
  25. } -1
  26. test lsearch-1.3 {lsearch command} {
  27.     lsearch $x *5
  28. } 4
  29. test lsearch-1.4 {lsearch command} {
  30.     lsearch $x *bc*
  31. } 0
  32. test lsearch-2.1 {search modes} {
  33.     lsearch -exact {xyz bbcc *bc*} *bc*
  34. } 2
  35. test lsearch-2.2 {search modes} {
  36.     lsearch -exact {b.x ^bc xy bcx} ^bc
  37. } 1
  38. test lsearch-2.3 {search modes} {
  39.     lsearch -exact {foo bar cat} ba
  40. } -1
  41. test lsearch-2.4 {search modes} {
  42.     lsearch -exact {foo bar cat} bart
  43. } -1
  44. test lsearch-2.5 {search modes} {
  45.     lsearch -exact {foo bar cat} bar
  46. } 1
  47. test lsearch-2.6 {search modes} {
  48.     list [catch {lsearch -regexp {xyz bbcc *bc*} *bc*} msg] $msg
  49. } {1 {couldn't compile regular expression pattern: quantifier operand invalid}}
  50. test lsearch-2.7 {search modes} {
  51.     lsearch -regexp {b.x ^bc xy bcx} ^bc
  52. } 3
  53. test lsearch-2.8 {search modes} {
  54.     lsearch -glob {xyz bbcc *bc*} *bc*
  55. } 1
  56. test lsearch-2.9 {search modes} {
  57.     lsearch -glob {b.x ^bc xy bcx} ^bc
  58. } 1
  59. test lsearch-2.10 {search modes} {
  60.     list [catch {lsearch -glib {b.x bx xy bcx} b.x} msg] $msg
  61. } {1 {bad option "-glib": must be -all, -ascii, -decreasing, -dictionary, -exact, -glob, -increasing, -inline, -integer, -not, -real, -regexp, -sorted, or -start}}
  62. test lsearch-3.1 {lsearch errors} {
  63.     list [catch lsearch msg] $msg
  64. } {1 {wrong # args: should be "lsearch ?options? list pattern"}}
  65. test lsearch-3.2 {lsearch errors} {
  66.     list [catch {lsearch a} msg] $msg
  67. } {1 {wrong # args: should be "lsearch ?options? list pattern"}}
  68. test lsearch-3.3 {lsearch errors} {
  69.     list [catch {lsearch a b c} msg] $msg
  70. } {1 {bad option "a": must be -all, -ascii, -decreasing, -dictionary, -exact, -glob, -increasing, -inline, -integer, -not, -real, -regexp, -sorted, or -start}}
  71. test lsearch-3.4 {lsearch errors} {
  72.     list [catch {lsearch a b c d} msg] $msg
  73. } {1 {bad option "a": must be -all, -ascii, -decreasing, -dictionary, -exact, -glob, -increasing, -inline, -integer, -not, -real, -regexp, -sorted, or -start}}
  74. test lsearch-3.5 {lsearch errors} {
  75.     list [catch {lsearch "{" b} msg] $msg
  76. } {1 {unmatched open brace in list}}
  77. test lsearch-4.1 {binary data} {
  78.     lsearch -exact [list foo one00two bar] bar
  79. } 2
  80. test lsearch-4.2 {binary data} {
  81.     set x one
  82.     append x x00
  83.     append x two
  84.     lsearch -exact [list foo one00two bar] $x
  85. } 1
  86. # Make a sorted list
  87. set l {}
  88. set l2 {}
  89. for {set i 0} {$i < 100} {incr i} {
  90.     lappend l $i
  91.     lappend l2 [expr {double($i)/2}]
  92. }
  93. set increasingIntegers [lsort -integer $l]
  94. set decreasingIntegers [lsort -decreasing -integer $l]
  95. set increasingDoubles [lsort -real $l2]
  96. set decreasingDoubles [lsort -decreasing -real $l2]
  97. set increasingStrings [lsort {48 6a 18b 22a 21aa 35 36}]
  98. set decreasingStrings [lsort -decreasing {48 6a 18b 22a 21aa 35 36}]
  99. set increasingDictionary [lsort -dictionary {48 6a 18b 22a 21aa 35 36}]
  100. set decreasingDictionary [lsort -dictionary -decreasing $increasingDictionary]
  101. set l {}
  102. for {set i 0} {$i < 10} {incr i} {
  103.     lappend l $i $i $i $i $i
  104. }
  105. set repeatingIncreasingIntegers [lsort -integer $l]
  106. set repeatingDecreasingIntegers [lsort -integer -decreasing $l]
  107. test lsearch-5.1 {binary search} {
  108.     set res {}
  109.     for {set i 0} {$i < 100} {incr i} {
  110. lappend res [lsearch -integer -sorted $increasingIntegers $i]
  111.     }
  112.     set res
  113. } $increasingIntegers
  114. test lsearch-5.2 {binary search} {
  115.     set res {}
  116.     for {set i 0} {$i < 100} {incr i} {
  117. lappend res [lsearch -integer -decreasing -sorted 
  118. $decreasingIntegers $i]
  119.     }
  120.     set res
  121. } $decreasingIntegers
  122. test lsearch-5.3 {binary search finds leftmost occurances} {
  123.     set res {}
  124.     for {set i 0} {$i < 10} {incr i} {
  125. lappend res [lsearch -integer -sorted $repeatingIncreasingIntegers $i]
  126.     }
  127.     set res
  128. } [list 0 5 10 15 20 25 30 35 40 45]
  129. test lsearch-5.4 {binary search -decreasing finds leftmost occurances} {
  130.     set res {}
  131.     for {set i 9} {$i >= 0} {incr i -1} {
  132. lappend res [lsearch -sorted -integer -decreasing 
  133. $repeatingDecreasingIntegers $i]
  134.     }
  135.     set res
  136. } [list 0 5 10 15 20 25 30 35 40 45]
  137. test lsearch-6.1 {integer search} {
  138.     set res {}
  139.     for {set i 0} {$i < 100} {incr i} {
  140. lappend res [lsearch -exact -integer $increasingIntegers $i]
  141.     }
  142.     set res
  143. } [lrange $increasingIntegers 0 99]
  144. test lsearch-6.2 {decreasing integer search} {
  145.     set res {}
  146.     for {set i 0} {$i < 100} {incr i} {
  147. lappend res [lsearch -exact -integer -decreasing 
  148. $decreasingIntegers $i]
  149.     }
  150.     set res
  151. } [lrange $decreasingIntegers 0 99]
  152. test lsearch-6.3 {sorted integer search} {
  153.     set res {}
  154.     for {set i 0} {$i < 100} {incr i} {
  155. lappend res [lsearch -sorted -integer $increasingIntegers $i]
  156.     }
  157.     set res
  158. } [lrange $increasingIntegers 0 99]
  159. test lsearch-6.4 {sorted decreasing integer search} {
  160.     set res {}
  161.     for {set i 0} {$i < 100} {incr i} {
  162. lappend res [lsearch -integer -sorted -decreasing 
  163. $decreasingIntegers $i]
  164.     }
  165.     set res
  166. } [lrange $decreasingIntegers 0 99]
  167. test lsearch-7.1 {double search} {
  168.     set res {}
  169.     for {set i 0} {$i < 100} {incr i} {
  170. lappend res [lsearch -exact -real $increasingDoubles 
  171. [expr {double($i)/2}]]
  172.     }
  173.     set res
  174. } [lrange $increasingIntegers 0 99]
  175. test lsearch-7.2 {decreasing double search} {
  176.     set res {}
  177.     for {set i 0} {$i < 100} {incr i} {
  178. lappend res [lsearch -exact -real -decreasing 
  179. $decreasingDoubles [expr {double($i)/2}]]
  180.     }
  181.     set res
  182. } [lrange $decreasingIntegers 0 99]
  183. test lsearch-7.3 {sorted double search} {
  184.     set res {}
  185.     for {set i 0} {$i < 100} {incr i} {
  186. lappend res [lsearch -sorted -real 
  187. $increasingDoubles [expr {double($i)/2}]]
  188.     }
  189.     set res
  190. } [lrange $increasingIntegers 0 99]
  191. test lsearch-7.4 {sorted decreasing double search} {
  192.     set res {}
  193.     for {set i 0} {$i < 100} {incr i} {
  194. lappend res [lsearch -sorted -real -decreasing 
  195. $decreasingDoubles [expr {double($i)/2}]]
  196.     }
  197.     set res
  198. } [lrange $decreasingIntegers 0 99]
  199. test lsearch-8.1 {dictionary search} {
  200.     set res {}
  201.     foreach val {6a 18b 21aa 22a 35 36 48} {
  202. lappend res [lsearch -exact -dictionary $increasingDictionary $val]
  203.     }
  204.     set res
  205. } [list 0 1 2 3 4 5 6]
  206. test lsearch-8.2 {decreasing dictionary search} {
  207.     set res {}
  208.     foreach val {6a 18b 21aa 22a 35 36 48} {
  209. lappend res [lsearch -exact -dictionary $decreasingDictionary $val]
  210.     }
  211.     set res
  212. } [list 6 5 4 3 2 1 0]
  213. test lsearch-8.3 {sorted dictionary search} {
  214.     set res {}
  215.     foreach val {6a 18b 21aa 22a 35 36 48} {
  216. lappend res [lsearch -sorted -dictionary $increasingDictionary $val]
  217.     }
  218.     set res
  219. } [list 0 1 2 3 4 5 6]
  220. test lsearch-8.4 {decreasing sorted dictionary search} {
  221.     set res {}
  222.     foreach val {6a 18b 21aa 22a 35 36 48} {
  223. lappend res [lsearch -decreasing -sorted -dictionary 
  224. $decreasingDictionary $val]
  225.     }
  226.     set res
  227. } [list 6 5 4 3 2 1 0]
  228. test lsearch-9.1 {ascii search} {
  229.     set res {}
  230.     foreach val {18b 21aa 22a 35 36 48 6a} {
  231. lappend res [lsearch -exact -ascii $increasingStrings $val]
  232.     }
  233.     set res
  234. } [list 0 1 2 3 4 5 6]
  235. test lsearch-9.2 {decreasing ascii search} {
  236.     set res {}
  237.     foreach val {18b 21aa 22a 35 36 48 6a} {
  238. lappend res [lsearch -exact -ascii $decreasingStrings $val]
  239.     }
  240.     set res
  241. } [list 6 5 4 3 2 1 0]
  242. test lsearch-9.3 {sorted ascii search} {
  243.     set res {}
  244.     foreach val {18b 21aa 22a 35 36 48 6a} {
  245. lappend res [lsearch -sorted -ascii $increasingStrings $val]
  246.     }
  247.     set res
  248. } [list 0 1 2 3 4 5 6]
  249. test lsearch-9.4 {decreasing sorted ascii search} {
  250.     set res {}
  251.     foreach val {18b 21aa 22a 35 36 48 6a} {
  252. lappend res [lsearch -decreasing -sorted -ascii 
  253. $decreasingStrings $val]
  254.     }
  255.     set res
  256. } [list 6 5 4 3 2 1 0]
  257. test lsearch-10.1 {offset searching} {
  258.     lsearch -start 2 {a b c a b c} a
  259. } 3
  260. test lsearch-10.2 {offset searching} {
  261.     lsearch -start 2 {a b c d e f} a
  262. } -1
  263. test lsearch-10.3 {offset searching} {
  264.     lsearch -start end-4 {a b c a b c} a
  265. } 3
  266. test lsearch-10.4 {offset searching} {
  267.     list [catch {lsearch -start foobar {a b c a b c} a} msg] $msg
  268. } {1 {bad index "foobar": must be integer or end?-integer?}}
  269. test lsearch-10.5 {offset searching} {
  270.     list [catch {lsearch -start 1 2} msg] $msg
  271. } {1 {missing starting index}}
  272. test lsearch-10.6 {binary search with offset} {
  273.     set res {}
  274.     for {set i 0} {$i < 100} {incr i} {
  275. lappend res [lsearch -integer -start 2 -sorted $increasingIntegers $i]
  276.     }
  277.     set res
  278. } [concat -1 -1 [lrange $increasingIntegers 2 end]]
  279. test lsearch-10.7 {offset searching with an empty list} {
  280.     # Stop bug #694232 from reocurring
  281.     lsearch -start 0 {} x
  282. } -1
  283. test lsearch-10.8 {offset searching past the end of the list} {
  284.     # Stop [Bug 1374778] from reoccurring
  285.     lsearch -start 10 {a b c} c
  286. } -1
  287. test lsearch-10.9 {offset searching past the end of the list} {
  288.     # Stop [Bug 1374778] from reoccurring
  289.     lsearch -start 10 -all {a b c} c
  290. } {}
  291. test lsearch-10.10 {offset searching past the end of the list} {
  292.     # Stop [Bug 1374778] from reoccurring
  293.     lsearch -start 10 -inline {a b c} c
  294. } {}
  295. test lsearch-11.1 {negated searches} {
  296.     lsearch -not {a a a b a a a} a
  297. } 3
  298. test lsearch-11.2 {negated searches} {
  299.     lsearch -not {a a a a a a a} a
  300. } -1
  301. test lsearch-12.1 {return values instead of indices} {
  302.     lsearch -glob -inline {a1 b2 c3 d4} c*
  303. } c3
  304. test lsearch-12.2 {return values instead of indices} {
  305.     lsearch -glob -inline {a1 b2 c3 d4} e*
  306. } {}
  307. test lsearch-13.1 {search for all matches} {
  308.     lsearch -all {a b a c a d} 1
  309. } {}
  310. test lsearch-13.2 {search for all matches} {
  311.     lsearch -all {a b a c a d} a
  312. } {0 2 4}
  313. test lsearch-14.1 {combinations: -all and -inline} {
  314.     lsearch -all -inline -glob {a1 b2 a3 c4 a5 d6} a*
  315. } {a1 a3 a5}
  316. test lsearch-14.2 {combinations: -all, -inline and -not} {
  317.     lsearch -all -inline -not -glob {a1 b2 a3 c4 a5 d6} a*
  318. } {b2 c4 d6}
  319. test lsearch-14.3 {combinations: -all and -not} {
  320.     lsearch -all -not -glob {a1 b2 a3 c4 a5 d6} a*
  321. } {1 3 5}
  322. test lsearch-14.4 {combinations: -inline and -not} {
  323.     lsearch -inline -not -glob {a1 b2 a3 c4 a5 d6} a*
  324. } {b2}
  325. test lsearch-14.5 {combinations: -start, -all and -inline} {
  326.     lsearch -start 2 -all -inline -glob {a1 b2 a3 c4 a5 d6} a*
  327. } {a3 a5}
  328. test lsearch-14.6 {combinations: -start, -all, -inline and -not} {
  329.     lsearch -start 2 -all -inline -not -glob {a1 b2 a3 c4 a5 d6} a*
  330. } {c4 d6}
  331. test lsearch-14.7 {combinations: -start, -all and -not} {
  332.     lsearch -start 2 -all -not -glob {a1 b2 a3 c4 a5 d6} a*
  333. } {3 5}
  334. test lsearch-14.8 {combinations: -start, -inline and -not} {
  335.     lsearch -start 2 -inline -not -glob {a1 b2 a3 c4 a5 d6} a*
  336. } {c4}
  337. test lsearch-15.1 {make sure no shimmering occurs} {
  338.     set x [expr int(sin(0))]
  339.     lsearch -start $x $x $x
  340. } 0
  341. test lsearch-16.1 {lsearch -regexp shared object} {
  342.     set str a
  343.     lsearch -regexp $str $str
  344. } 0
  345. # Bug 1366683
  346. test lsearch-16.2 {lsearch -regexp allows internal backrefs} {
  347.     lsearch -regexp {a aa b} {(.)1}
  348. } 1
  349. test lsearch-21.1 {lsearch shimmering crash} {
  350.     set x 0
  351.     lsearch -exact -integer $x $x
  352. } 0
  353. test lsearch-21.2 {lsearch shimmering crash} {
  354.     set x 0.5
  355.     lsearch -exact -real $x $x
  356. } 0
  357. # cleanup
  358. catch {unset res}
  359. catch {unset increasingIntegers}
  360. catch {unset decreasingIntegers}
  361. catch {unset increasingDoubles}
  362. catch {unset decreasingDoubles}
  363. catch {unset increasingStrings}
  364. catch {unset decreasingStrings}
  365. catch {unset increasingDictionary}
  366. catch {unset decreasingDictionary}
  367. ::tcltest::cleanupTests
  368. return