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

通讯编程

开发平台:

Visual C++

  1. # Commands covered:  scan
  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-1994 The Regents of the University of California.
  8. # Copyright (c) 1994-1997 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: scan.test,v 1.14.2.1 2004/08/19 21:12:04 dkf Exp $
  15. if {[lsearch [namespace children] ::tcltest] == -1} {
  16.     package require tcltest 2
  17.     namespace import -force ::tcltest::*
  18. }
  19. ::tcltest::testConstraint 64bitInts [expr {0x80000000 > 0}]
  20. test scan-1.1 {BuildCharSet, CharInSet} {
  21.     list [scan foo {%[^o]} x] $x
  22. } {1 f}
  23. test scan-1.2 {BuildCharSet, CharInSet} {
  24.     list [scan ]foo {%[]f]} x] $x
  25. } {1 ]f}
  26. test scan-1.3 {BuildCharSet, CharInSet} {
  27.     list [scan abc-def {%[a-c]} x] $x
  28. } {1 abc}
  29. test scan-1.4 {BuildCharSet, CharInSet} {
  30.     list [scan abc-def {%[a-c]} x] $x
  31. } {1 abc}
  32. test scan-1.5 {BuildCharSet, CharInSet} {
  33.     list [scan -abc-def {%[-ac]} x] $x
  34. } {1 -a}
  35. test scan-1.6 {BuildCharSet, CharInSet} {
  36.     list [scan -abc-def {%[ac-]} x] $x
  37. } {1 -a}
  38. test scan-1.7 {BuildCharSet, CharInSet} {
  39.     list [scan abc-def {%[c-a]} x] $x
  40. } {1 abc}
  41. test scan-1.8 {BuildCharSet, CharInSet} {
  42.     list [scan def-abc {%[^c-a]} x] $x
  43. } {1 def-}
  44. test scan-1.9 {BuildCharSet, CharInSet no match} {
  45.     catch {unset x}
  46.     list [scan {= f} {= %[TF]} x] [info exists x]
  47. } {0 0}
  48. test scan-2.1 {ReleaseCharSet} {
  49.     list [scan abcde {%[abc]} x] $x
  50. } {1 abc}
  51. test scan-2.2 {ReleaseCharSet} {
  52.     list [scan abcde {%[a-c]} x] $x
  53. } {1 abc}
  54. test scan-3.1 {ValidateFormat} {
  55.     list [catch {scan {} {%d%1$d} x} msg] $msg
  56. } {1 {cannot mix "%" and "%n$" conversion specifiers}}
  57. test scan-3.2 {ValidateFormat} {
  58.     list [catch {scan {} {%d%1$d} x} msg] $msg
  59. } {1 {cannot mix "%" and "%n$" conversion specifiers}}
  60. test scan-3.3 {ValidateFormat} {
  61.     list [catch {scan {} {%2$d%d} x} msg] $msg
  62. } {1 {"%n$" argument index out of range}}
  63. test scan-3.4 {ValidateFormat} {
  64.     # degenerate case, before changed from 8.2 to 8.3
  65.     list [catch {scan {} %d} msg] $msg
  66. } {0 {}}
  67. test scan-3.5 {ValidateFormat} {
  68.     list [catch {scan {} {%10c} a} msg] $msg
  69. } {1 {field width may not be specified in %c conversion}}
  70. test scan-3.6 {ValidateFormat} {
  71.     list [catch {scan {} {%*1$d} a} msg] $msg
  72. } {1 {bad scan conversion character "$"}}
  73. test scan-3.7 {ValidateFormat} {
  74.     list [catch {scan {} {%1$d%1$d} a} msg] $msg
  75. } {1 {variable is assigned by multiple "%n$" conversion specifiers}}
  76. test scan-3.8 {ValidateFormat} {
  77.     list [catch {scan {} a x} msg] $msg
  78. } {1 {variable is not assigned by any conversion specifiers}}
  79. test scan-3.9 {ValidateFormat} {
  80.     list [catch {scan {} {%2$s} x y} msg] $msg
  81. } {1 {variable is not assigned by any conversion specifiers}}
  82. test scan-3.10 {ValidateFormat} {
  83.     list [catch {scan {} {%[a} x} msg] $msg
  84. } {1 {unmatched [ in format string}}
  85. test scan-3.11 {ValidateFormat} {
  86.     list [catch {scan {} {%[^a} x} msg] $msg
  87. } {1 {unmatched [ in format string}}
  88. test scan-3.12 {ValidateFormat} {
  89.     list [catch {scan {} {%[]a} x} msg] $msg
  90. } {1 {unmatched [ in format string}}
  91. test scan-3.13 {ValidateFormat} {
  92.     list [catch {scan {} {%[^]a} x} msg] $msg
  93. } {1 {unmatched [ in format string}}
  94. test scan-4.1 {Tcl_ScanObjCmd, argument checks} {
  95.     list [catch {scan} msg] $msg
  96. } {1 {wrong # args: should be "scan string format ?varName varName ...?"}}
  97. test scan-4.2 {Tcl_ScanObjCmd, argument checks} {
  98.     list [catch {scan string} msg] $msg
  99. } {1 {wrong # args: should be "scan string format ?varName varName ...?"}}
  100. test scan-4.3 {Tcl_ScanObjCmd, argument checks} {
  101.     # degenerate case, before changed from 8.2 to 8.3
  102.     list [catch {scan string format} msg] $msg
  103. } {0 {}}
  104. test scan-4.4 {Tcl_ScanObjCmd, whitespace} {
  105.     list [scan {   abc   def   } {%s%s} x y] $x $y
  106. } {2 abc def}
  107. test scan-4.5 {Tcl_ScanObjCmd, whitespace} {
  108.     list [scan {   abc   def   } { %s %s } x y] $x $y
  109. } {2 abc def}
  110. test scan-4.6 {Tcl_ScanObjCmd, whitespace} {
  111.     list [scan {   abc   def   } { %s %s } x y] $x $y
  112. } {2 abc def}
  113. test scan-4.7 {Tcl_ScanObjCmd, literals} {
  114.     # degenerate case, before changed from 8.2 to 8.3
  115.     scan {   abc   def   } { abc def }
  116. } {}
  117. test scan-4.8 {Tcl_ScanObjCmd, literals} {
  118.     set x {}
  119.     list [scan {   abcg} { abc def %1s} x] $x
  120. } {0 {}}
  121. test scan-4.9 {Tcl_ScanObjCmd, literals} {
  122.     list [scan {   abc%defghi} { abc %% def%n } x] $x
  123. } {1 10}
  124. test scan-4.10 {Tcl_ScanObjCmd, assignment suppression} {
  125.     list [scan {   abc   def   } { %*c%s def } x] $x
  126. } {1 bc}
  127. test scan-4.11 {Tcl_ScanObjCmd, XPG3-style} {
  128.     list [scan {   abc   def   } {%2$s %1$s} x y] $x $y
  129. } {2 def abc}
  130. test scan-4.12 {Tcl_ScanObjCmd, width specifiers} {
  131.     list [scan {abc123456789012} {%3s%3d%3f%3[0-9]%s} a b c d e] $a $b $c $d $e
  132. } {5 abc 123 456.0 789 012}
  133. test scan-4.13 {Tcl_ScanObjCmd, width specifiers} {
  134.     list [scan {abc123456789012} {%3s%3d%3f%3[0-9]%s} a b c d e] $a $b $c $d $e
  135. } {5 abc 123 456.0 789 012}
  136. test scan-4.14 {Tcl_ScanObjCmd, underflow} {
  137.     set x {}
  138.     list [scan {a} {a%d} x] $x
  139. } {-1 {}}
  140. test scan-4.15 {Tcl_ScanObjCmd, underflow} {
  141.     set x {}
  142.     list [scan {} {a%d} x] $x
  143. } {-1 {}}
  144. test scan-4.16 {Tcl_ScanObjCmd, underflow} {
  145.     set x {}
  146.     list [scan {ab} {a%d} x] $x
  147. } {0 {}}
  148. test scan-4.17 {Tcl_ScanObjCmd, underflow} {
  149.     set x {}
  150.     list [scan {a   } {a%d} x] $x
  151. } {-1 {}}
  152. test scan-4.18 {Tcl_ScanObjCmd, skipping whitespace} {
  153.     list [scan {  b} {%c%s} x y] $x $y
  154. } {2 32 b}
  155. test scan-4.19 {Tcl_ScanObjCmd, skipping whitespace} {
  156.     list [scan {  b} {%[^b]%s} x y] $x $y
  157. } {2 {  } b}
  158. test scan-4.20 {Tcl_ScanObjCmd, string scanning} {
  159.     list [scan {abc def} {%s} x] $x
  160. } {1 abc}
  161. test scan-4.21 {Tcl_ScanObjCmd, string scanning} {
  162.     list [scan {abc def} {%0s} x] $x
  163. } {1 abc}
  164. test scan-4.22 {Tcl_ScanObjCmd, string scanning} {
  165.     list [scan {abc def} {%2s} x] $x
  166. } {1 ab}
  167. test scan-4.23 {Tcl_ScanObjCmd, string scanning} {
  168.     list [scan {abc def} {%*s%n} x] $x
  169. } {1 3}
  170. test scan-4.24 {Tcl_ScanObjCmd, charset scanning} {
  171.     list [scan {abcdef} {%[a-c]} x] $x
  172. } {1 abc}
  173. test scan-4.25 {Tcl_ScanObjCmd, charset scanning} {
  174.     list [scan {abcdef} {%0[a-c]} x] $x
  175. } {1 abc}
  176. test scan-4.26 {Tcl_ScanObjCmd, charset scanning} {
  177.     list [scan {abcdef} {%2[a-c]} x] $x
  178. } {1 ab}
  179. test scan-4.27 {Tcl_ScanObjCmd, charset scanning} {
  180.     list [scan {abcdef} {%*[a-c]%n} x] $x
  181. } {1 3}
  182. test scan-4.28 {Tcl_ScanObjCmd, character scanning} {
  183.     list [scan {abcdef} {%c} x] $x
  184. } {1 97}
  185. test scan-4.29 {Tcl_ScanObjCmd, character scanning} {
  186.     list [scan {abcdef} {%*c%n} x] $x
  187. } {1 1}
  188. test scan-4.30 {Tcl_ScanObjCmd, base-10 integer scanning} {
  189.     set x {}
  190.     list [scan {1234567890a} {%3d} x] $x
  191. } {1 123}
  192. test scan-4.31 {Tcl_ScanObjCmd, base-10 integer scanning} {
  193.     set x {}
  194.     list [scan {1234567890a} {%d} x] $x
  195. } {1 1234567890}
  196. test scan-4.32 {Tcl_ScanObjCmd, base-10 integer scanning} {
  197.     set x {}
  198.     list [scan {01234567890a} {%d} x] $x
  199. } {1 1234567890}
  200. test scan-4.33 {Tcl_ScanObjCmd, base-10 integer scanning} {
  201.     set x {}
  202.     list [scan {+01234} {%d} x] $x
  203. } {1 1234}
  204. test scan-4.34 {Tcl_ScanObjCmd, base-10 integer scanning} {
  205.     set x {}
  206.     list [scan {-01234} {%d} x] $x
  207. } {1 -1234}
  208. test scan-4.35 {Tcl_ScanObjCmd, base-10 integer scanning} {
  209.     set x {}
  210.     list [scan {a01234} {%d} x] $x
  211. } {0 {}}
  212. test scan-4.36 {Tcl_ScanObjCmd, base-10 integer scanning} {
  213.     set x {}
  214.     list [scan {0x10} {%d} x] $x
  215. } {1 0}
  216. test scan-4.37 {Tcl_ScanObjCmd, base-8 integer scanning} {
  217.     set x {}
  218.     list [scan {012345678} {%o} x] $x
  219. } {1 342391}
  220. test scan-4.38 {Tcl_ScanObjCmd, base-8 integer scanning} {
  221.     set x {}
  222.     list [scan {+1238 -1239 123a} {%o%*s%o%*s%o} x y z] $x $y $z
  223. } {3 83 -83 83}
  224. test scan-4.39 {Tcl_ScanObjCmd, base-16 integer scanning} {
  225.     set x {}
  226.     list [scan {+1238 -123a 0123} {%x%x%x} x y z] $x $y $z
  227. } {3 4664 -4666 291}
  228. test scan-4.40 {Tcl_ScanObjCmd, base-16 integer scanning} {
  229.     # The behavior changed in 8.4a4/8.3.4cvs (6 Feb) to correctly
  230.     # return '1' for 0x1 scanned via %x, to comply with 8.0 and C scanf.
  231.     # Bug #495213
  232.     set x {}
  233.     list [scan {aBcDeF AbCdEf 0x1} {%x%x%x} x y z] $x $y $z
  234. } {3 11259375 11259375 1}
  235. test scan-4.40.1 {Tcl_ScanObjCmd, base-16 integer scanning} {
  236.     set x {}
  237.     list [scan {0xF 0x00A0B 0X0XF} {%x %x %x} x y z] $x $y $z
  238. } {3 15 2571 0}
  239. test scan-4.40.2 {Tcl_ScanObjCmd, base-16 integer scanning} {
  240.     catch {unset x}
  241.     list [scan {xF} {%x} x] [info exists x]
  242. } {0 0}
  243. test scan-4.41 {Tcl_ScanObjCmd, base-unknown integer scanning} {
  244.     set x {}
  245.     list [scan {10 010 0x10} {%i%i%i} x y z] $x $y $z
  246. } {3 10 8 16}
  247. test scan-4.42 {Tcl_ScanObjCmd, base-unknown integer scanning} {
  248.     set x {}
  249.     list [scan {10 010 0X10} {%i%i%i} x y z] $x $y $z
  250. } {3 10 8 16}
  251. test scan-4.43 {Tcl_ScanObjCmd, integer scanning, odd cases} {
  252.     set x {}
  253.     list [scan {+ } {%i} x] $x
  254. } {0 {}}
  255. test scan-4.44 {Tcl_ScanObjCmd, integer scanning, odd cases} {
  256.     set x {}
  257.     list [scan {+} {%i} x] $x
  258. } {-1 {}}
  259. test scan-4.45 {Tcl_ScanObjCmd, integer scanning, odd cases} {
  260.     set x {}
  261.     list [scan {0x} {%i%s} x y] $x $y
  262. } {2 0 x}
  263. test scan-4.46 {Tcl_ScanObjCmd, integer scanning, odd cases} {
  264.     set x {}
  265.     list [scan {0X} {%i%s} x y] $x $y
  266. } {2 0 X}
  267. test scan-4.47 {Tcl_ScanObjCmd, integer scanning, suppressed} {
  268.     set x {}
  269.     list [scan {123def} {%*i%s} x] $x
  270. } {1 def}
  271. test scan-4.48 {Tcl_ScanObjCmd, float scanning} {
  272.     list [scan {1 2 3} {%e %f %g} x y z] $x $y $z
  273. } {3 1.0 2.0 3.0}
  274. test scan-4.49 {Tcl_ScanObjCmd, float scanning} {
  275.     list [scan {.1 0.2 3.} {%e %f %g} x y z] $x $y $z
  276. } {3 0.1 0.2 3.0}
  277. test scan-4.50 {Tcl_ScanObjCmd, float scanning} {
  278.     list [scan {1234567890a} %f x] $x
  279. } {1 1234567890.0}
  280. test scan-4.51 {Tcl_ScanObjCmd, float scanning} {
  281.     list [scan {+123+45} %f x] $x
  282. } {1 123.0}
  283. test scan-4.52 {Tcl_ScanObjCmd, float scanning} {
  284.     list [scan {-123+45} %f x] $x
  285. } {1 -123.0}
  286. test scan-4.53 {Tcl_ScanObjCmd, float scanning} {
  287.     list [scan {1.0e1} %f x] $x
  288. } {1 10.0}
  289. test scan-4.54 {Tcl_ScanObjCmd, float scanning} {
  290.     list [scan {1.0e-1} %f x] $x
  291. } {1 0.1}
  292. test scan-4.55 {Tcl_ScanObjCmd, odd cases} {
  293.     set x {}
  294.     list [scan {+} %f x] $x
  295. } {-1 {}}
  296. test scan-4.56 {Tcl_ScanObjCmd, odd cases} {
  297.     set x {}
  298.     list [scan {1.0e} %f%s x y] $x $y
  299. } {2 1.0 e}
  300. test scan-4.57 {Tcl_ScanObjCmd, odd cases} {
  301.     set x {}
  302.     list [scan {1.0e+} %f%s x y] $x $y
  303. } {2 1.0 e+}
  304. test scan-4.58 {Tcl_ScanObjCmd, odd cases} {
  305.     set x {}
  306.     set y {}
  307.     list [scan {e1} %f%s x y] $x $y
  308. } {0 {} {}}
  309. test scan-4.59 {Tcl_ScanObjCmd, float scanning} {
  310.     list [scan {1.0e-1x} %*f%n x] $x
  311. } {1 6}
  312. test scan-4.60 {Tcl_ScanObjCmd, set errors} {
  313.     set x {}
  314.     set y {}
  315.     catch {unset z}; array set z {}
  316.     set result [list [catch {scan {abc def ghi} {%s%s%s} x z y} msg] 
  317.     $msg $x $y]
  318.     unset z
  319.     set result
  320. } {1 {couldn't set variable "z"} abc ghi}
  321. test scan-4.61 {Tcl_ScanObjCmd, set errors} {
  322.     set x {}
  323.     catch {unset y}; array set y {}
  324.     catch {unset z}; array set z {}
  325.     set result [list [catch {scan {abc def ghi} {%s%s%s} x z y} msg] 
  326.     $msg $x]
  327.     unset y
  328.     unset z
  329.     set result
  330. } {1 {couldn't set variable "z"couldn't set variable "y"} abc}
  331. # procedure that returns the range of integers
  332. proc int_range {} {
  333.     for { set MIN_INT 1 } { $MIN_INT > 0 } {} {
  334. set MIN_INT [expr { $MIN_INT << 1 }]
  335.     }
  336.     set MAX_INT [expr { ~ $MIN_INT }]
  337.     return [list $MIN_INT $MAX_INT]
  338. }
  339. test scan-4.62 {scanning of large and negative octal integers} {
  340.     foreach { MIN_INT MAX_INT } [int_range] {}
  341.     set scanstring [format {%o %o %o} -1 $MIN_INT $MAX_INT]
  342.     list [scan $scanstring {%o %o %o} a b c] 
  343. [expr { $a == -1 }] [expr { $b == $MIN_INT }] [expr { $c == $MAX_INT }]
  344. } {3 1 1 1}
  345. test scan-4.63 {scanning of large and negative hex integers} {
  346.     foreach { MIN_INT MAX_INT } [int_range] {}
  347.     set scanstring [format {%x %x %x} -1 $MIN_INT $MAX_INT]
  348.     list [scan $scanstring {%x %x %x} a b c] 
  349. [expr { $a == -1 }] [expr { $b == $MIN_INT }] [expr { $c == $MAX_INT }]
  350. } {3 1 1 1}
  351. # clean up from last two tests
  352. catch {
  353.     rename int_range {}
  354. }
  355. test scan-5.1 {integer scanning} {
  356.     set a {}; set b {}; set c {}; set d {}
  357.     list [scan "-20 1476 n33 0" "%d %d %d %d" a b c d] $a $b $c $d
  358. } {4 -20 1476 33 0}
  359. test scan-5.2 {integer scanning} {
  360.     set a {}; set b {}; set c {}
  361.     list [scan "-45 16 7890 +10" "%2d %*d %10d %d" a b c] $a $b $c
  362. } {3 -4 16 7890}
  363. test scan-5.3 {integer scanning} {
  364.     set a {}; set b {}; set c {}; set d {}
  365.     list [scan "-45 16 +10 987" "%ld %d %ld %d" a b c d] $a $b $c $d
  366. } {4 -45 16 10 987}
  367. test scan-5.4 {integer scanning} {
  368.     set a {}; set b {}; set c {}; set d {}
  369.     list [scan "14 1ab 62 10" "%d %x %lo %x" a b c d] $a $b $c $d
  370. } {4 14 427 50 16}
  371. test scan-5.5 {integer scanning} {
  372.     set a {}; set b {}; set c {}; set d {}
  373.     list [scan "12345670 1234567890ab cdefg" "%o  %o %x %lx" a b c d] 
  374.     $a $b $c $d
  375. } {4 2739128 342391 561323 52719}
  376. test scan-5.6 {integer scanning} {
  377.     set a {}; set b {}; set c {}; set d {}
  378.     list [scan "ab123-24642" "%2x %3x %3o %2o" a b c d] $a $b $c $d
  379. } {4 171 291 -20 52}
  380. test scan-5.7 {integer scanning} {
  381.     set a {}; set b {}
  382.     list [scan "1234567 234 567  " "%*3x %x %*o %4o" a b] $a $b
  383. } {2 17767 375}
  384. test scan-5.8 {integer scanning} {
  385.     set a {}; set b {}
  386.     list [scan "a 1234" "%d %d" a b] $a $b
  387. } {0 {} {}}
  388. test scan-5.9 {integer scanning} {
  389.     set a {}; set b {}; set c {}; set d {};
  390.     list [scan "12345678" "%2d %2d %2ld %2d" a b c d] $a $b $c $d
  391. } {4 12 34 56 78}
  392. test scan-5.10 {integer scanning} {
  393.     set a {}; set b {}; set c {}; set d {}
  394.     list [scan "1 2 " "%hd %d %d %d" a b c d] $a $b $c $d
  395. } {2 1 2 {} {}}
  396. #
  397. # The behavior for scaning intergers larger than MAX_INT is
  398. # not defined by the ANSI spec.  Some implementations wrap the
  399. # input (-16) some return MAX_INT.
  400. #
  401. test scan-5.11 {integer scanning} {nonPortable} {
  402.     set a {}; set b {};
  403.     list [scan "4294967280 4294967280" "%u %d" a b] $a 
  404.     [expr {$b == -16 || $b == 0x7fffffff}]
  405. } {2 4294967280 1}
  406. test scan-5.12 {integer scanning} {64bitInts} {
  407.     set a {}; set b {}; set c {}
  408.     list [scan "7810179016327718216,6c63546f6c6c6548,661432506755433062510" 
  409.     %ld,%lx,%lo a b c] $a $b $c
  410. } {3 7810179016327718216 7810179016327718216 7810179016327718216}
  411. test scan-5.13 {integer scanning and overflow} {
  412.     # This test used to fail on some 64-bit systems. [Bug 1011860]
  413.     scan {300000000 3000000000 30000000000} {%ld %ld %ld}
  414. } {300000000 3000000000 30000000000}
  415. test scan-6.1 {floating-point scanning} {
  416.     set a {}; set b {}; set c {}; set d {}
  417.     list [scan "2.1 -3.0e8 .99962 a" "%f%g%e%f" a b c d] $a $b $c $d
  418. } {3 2.1 -300000000.0 0.99962 {}}
  419. test scan-6.2 {floating-point scanning} {
  420.     set a {}; set b {}; set c {}; set d {}
  421.     list [scan "-1.2345 +8.2 9" "%3e %3lf %f %f" a b c d] $a $b $c $d
  422. } {4 -1.0 234.0 5.0 8.2}
  423. test scan-6.3 {floating-point scanning} {
  424.     set a {}; set b {}; set c {}
  425.     list [scan "1e00004 332E-4 3e+4" "%Lf %*2e %f %f" a b c] $a $c
  426. } {3 10000.0 30000.0}
  427. #
  428. # Some libc implementations consider 3.e- bad input.  The ANSI
  429. # spec states that digits must follow the - sign.
  430. #
  431. test scan-6.4 {floating-point scanning} {
  432.     set a {}; set b {}; set c {}
  433.     list [scan "1. 47.6 2.e2 3.e-" "%f %*f %f %f" a b c] $a $b $c
  434. } {3 1.0 200.0 3.0}
  435. test scan-6.5 {floating-point scanning} {
  436.     set a {}; set b {}; set c {}; set d {}
  437.     list [scan "4.6 99999.7 876.43e-1 118" "%f %f %f %e" a b c d] $a $b $c $d
  438. } {4 4.6 99999.7 87.643 118.0}
  439. test scan-6.6 {floating-point scanning} {eformat} {
  440.     set a {}; set b {}; set c {}; set d {}
  441.     list [scan "1.2345 697.0e-3 124 .00005" "%f %e %f %e" a b c d] $a $b $c $d
  442. } {4 1.2345 0.697 124.0 5e-05}
  443. test scan-6.7 {floating-point scanning} {
  444.     set a {}; set b {}; set c {}; set d {}
  445.     list [scan "4.6abc" "%f %f %f %f" a b c d] $a $b $c $d
  446. } {1 4.6 {} {} {}}
  447. test scan-6.8 {floating-point scanning} {
  448.     set a {}; set b {}; set c {}; set d {}
  449.     list [scan "4.6 5.2" "%f %f %f %f" a b c d] $a $b $c $d
  450. } {2 4.6 5.2 {} {}}
  451. test scan-7.1 {string and character scanning} {
  452.     set a {}; set b {}; set c {}; set d {}
  453.     list [scan "abc defghijk dum " "%s %3s %20s %s" a b c d] $a $b $c $d
  454. } {4 abc def ghijk dum}
  455. test scan-7.2 {string and character scanning} {
  456.     set a {}; set b {}; set c {}; set d {}
  457.     list [scan "a       bcdef" "%c%c%1s %s" a b c d] $a $b $c $d
  458. } {4 97 32 b cdef}
  459. test scan-7.3 {string and character scanning} {
  460.     set a {}; set b {}; set c {}
  461.     list [scan "123456 test " "%*c%*s %s %s %s" a b c] $a $b $c
  462. } {1 test {} {}}
  463. test scan-7.4 {string and character scanning} {
  464.     set a {}; set b {}; set c {}; set d
  465.     list [scan "ababcd01234  f 123450" {%4[abcd] %4[abcd] %[^abcdef] %[^0]} a b c d] $a $b $c $d
  466. } {4 abab cd {01234  } {f 12345}}
  467. test scan-7.5 {string and character scanning} {
  468.     set a {}; set b {}; set c {}
  469.     list [scan "aaaaaabc aaabcdefg  + +  XYZQR" {%*4[a] %s %*4[a]%s%*4[ +]%c} a b c] $a $b $c
  470. } {3 aabc bcdefg 43}
  471. test scan-7.6 {string and character scanning, unicode} {
  472.     set a {}; set b {}; set c {}; set d {}
  473.     list [scan "abc du00c7fghijk dum " "%s %3s %20s %s" a b c d] $a $b $c $d
  474. } "4 abc du00c7f ghijk dum"
  475. test scan-7.7 {string and character scanning, unicode} {
  476.     set a {}; set b {}
  477.     list [scan "abu00c7cdef" "ab%c%c" a b] $a $b
  478. } "2 199 99"
  479. test scan-7.8 {string and character scanning, unicode} {
  480.     set a {}; set b {}
  481.     list [scan "abufeffdef" "%[abufeff]" a] $a
  482. } "1 abufeff"
  483. test scan-8.1 {error conditions} {
  484.     catch {scan a}
  485. } 1
  486. test scan-8.2 {error conditions} {
  487.     catch {scan a} msg
  488.     set msg
  489. } {wrong # args: should be "scan string format ?varName varName ...?"}
  490. test scan-8.3 {error conditions} {
  491.     list [catch {scan a %D x} msg] $msg
  492. } {1 {bad scan conversion character "D"}}
  493. test scan-8.4 {error conditions} {
  494.     list [catch {scan a %O x} msg] $msg
  495. } {1 {bad scan conversion character "O"}}
  496. test scan-8.5 {error conditions} {
  497.     list [catch {scan a %X x} msg] $msg
  498. } {1 {bad scan conversion character "X"}}
  499. test scan-8.6 {error conditions} {
  500.     list [catch {scan a %F x} msg] $msg
  501. } {1 {bad scan conversion character "F"}}
  502. test scan-8.7 {error conditions} {
  503.     list [catch {scan a %E x} msg] $msg
  504. } {1 {bad scan conversion character "E"}}
  505. test scan-8.8 {error conditions} {
  506.     list [catch {scan a "%d %d" a} msg] $msg
  507. } {1 {different numbers of variable names and field specifiers}}
  508. test scan-8.9 {error conditions} {
  509.     list [catch {scan a "%d %d" a b c} msg] $msg
  510. } {1 {variable is not assigned by any conversion specifiers}}
  511. test scan-8.10 {error conditions} {
  512.     set a {}; set b {}; set c {}; set d {}
  513.     list [expr {[scan "  a" " a %d %d %d %d" a b c d] <= 0}] $a $b $c $d
  514. } {1 {} {} {} {}}
  515. test scan-8.11 {error conditions} {
  516.     set a {}; set b {}; set c {}; set d {}
  517.     list [scan "1 2" "%d %d %d %d" a b c d] $a $b $c $d
  518. } {2 1 2 {} {}}
  519. test scan-8.12 {error conditions} {
  520.     catch {unset a}
  521.     set a(0) 44
  522.     list [catch {scan 44 %d a} msg] $msg
  523. } {1 {couldn't set variable "a"}}
  524. test scan-8.13 {error conditions} {
  525.     catch {unset a}
  526.     set a(0) 44
  527.     list [catch {scan 44 %c a} msg] $msg
  528. } {1 {couldn't set variable "a"}}
  529. test scan-8.14 {error conditions} {
  530.     catch {unset a}
  531.     set a(0) 44
  532.     list [catch {scan 44 %s a} msg] $msg
  533. } {1 {couldn't set variable "a"}}
  534. test scan-8.15 {error conditions} {
  535.     catch {unset a}
  536.     set a(0) 44
  537.     list [catch {scan 44 %f a} msg] $msg
  538. } {1 {couldn't set variable "a"}}
  539. test scan-8.16 {error conditions} {
  540.     catch {unset a}
  541.     set a(0) 44
  542.     list [catch {scan 44 %f a} msg] $msg
  543. } {1 {couldn't set variable "a"}}
  544. catch {unset a}
  545. test scan-8.17 {error conditions} {
  546.     list [catch {scan 44 %2c a} msg] $msg
  547. } {1 {field width may not be specified in %c conversion}}
  548. test scan-8.18 {error conditions} {
  549.     list [catch {scan abc {%[} x} msg] $msg
  550. } {1 {unmatched [ in format string}}
  551. test scan-8.19 {error conditions} {
  552.     list [catch {scan abc {%[^a} x} msg] $msg
  553. } {1 {unmatched [ in format string}}
  554. test scan-8.20 {error conditions} {
  555.     list [catch {scan abc {%[^]a} x} msg] $msg
  556. } {1 {unmatched [ in format string}}
  557. test scan-8.21 {error conditions} {
  558.     list [catch {scan abc {%[]a} x} msg] $msg
  559. } {1 {unmatched [ in format string}}
  560. test scan-9.1 {lots of arguments} {
  561.     scan "10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200" "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d" a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20
  562. } 20
  563. test scan-9.2 {lots of arguments} {
  564.     scan "10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200" "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d" a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20
  565.     set a20
  566. } 200
  567. test scan-10.1 {miscellaneous tests} {
  568.     set a {}
  569.     list [scan ab16c ab%dc a] $a
  570. } {1 16}
  571. test scan-10.2 {miscellaneous tests} {
  572.     set a {}
  573.     list [scan ax16c ab%dc a] $a
  574. } {0 {}}
  575. test scan-10.3 {miscellaneous tests} {
  576.     set a {}
  577.     list [catch {scan ab%c114 ab%%c%d a} msg] $msg $a
  578. } {0 1 114}
  579. test scan-10.4 {miscellaneous tests} {
  580.     set a {}
  581.     list [catch {scan ab%c14 ab%%c%d a} msg] $msg $a
  582. } {0 1 14}
  583. test scan-10.5 {miscellaneous tests} {
  584.     catch {unset arr}
  585.     set arr(2) {}
  586.     list [catch {scan ab%c14 ab%%c%d arr(2)} msg] $msg $arr(2)
  587. } {0 1 14}
  588. test scan-11.1 {alignment in results array (TCL_ALIGN)} {
  589.     scan "123 13.6" "%s %f" a b
  590.     set b
  591. } 13.6
  592. test scan-11.2 {alignment in results array (TCL_ALIGN)} {
  593.     scan "1234567 13.6" "%s %f" a b
  594.     set b
  595. } 13.6
  596. test scan-11.3 {alignment in results array (TCL_ALIGN)} {
  597.     scan "12345678901 13.6" "%s %f" a b
  598.     set b
  599. } 13.6
  600. test scan-11.4 {alignment in results array (TCL_ALIGN)} {
  601.     scan "123456789012345 13.6" "%s %f" a b
  602.     set b
  603. } 13.6
  604. test scan-11.5 {alignment in results array (TCL_ALIGN)} {
  605.     scan "1234567890123456789 13.6" "%s %f" a b
  606.     set b
  607. } 13.6
  608. test scan-12.1 {Tcl_ScanObjCmd, inline case} {
  609.     scan a %c
  610. } 97
  611. test scan-12.2 {Tcl_ScanObjCmd, inline case} {
  612.     scan abc %c%c%c%c
  613. } {97 98 99 {}}
  614. test scan-12.3 {Tcl_ScanObjCmd, inline case} {
  615.     scan abc %s%c
  616. } {abc {}}
  617. test scan-12.4 {Tcl_ScanObjCmd, inline case, underflow} {
  618.     scan abc abc%c
  619. } {}
  620. test scan-12.5 {Tcl_ScanObjCmd, inline case} {
  621.     scan abc bogus%c%c%c
  622. } {{} {} {}}
  623. test scan-12.6 {Tcl_ScanObjCmd, inline case} {
  624.     # degenerate case, behavior changed from 8.2 to 8.3
  625.     list [catch {scan foo foobar} msg] $msg
  626. } {0 {}}
  627. test scan-12.7 {Tcl_ScanObjCmd, inline case lots of arguments} {
  628.     scan "10 20 30 40 50 60 70 80 90 100 110 120 130 140
  629.     150 160 170 180 190 200" 
  630.     "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d"
  631. } {10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 {}}
  632. test scan-13.1 {Tcl_ScanObjCmd, inline XPG case} {
  633.     scan a {%1$c}
  634. } 97
  635. test scan-13.2 {Tcl_ScanObjCmd, inline XPG case} {
  636.     scan abc {%1$c%2$c%3$c%4$c}
  637. } {97 98 99 {}}
  638. test scan-13.3 {Tcl_ScanObjCmd, inline XPG case} {
  639.     list [catch {scan abc {%1$c%1$c}} msg] $msg
  640. } {1 {variable is assigned by multiple "%n$" conversion specifiers}}
  641. test scan-13.4 {Tcl_ScanObjCmd, inline XPG case} {
  642.     scan abc {%2$s%1$c}
  643. } {{} abc}
  644. test scan-13.5 {Tcl_ScanObjCmd, inline XPG case, underflow} {
  645.     scan abc {abc%5$c}
  646. } {}
  647. test scan-13.6 {Tcl_ScanObjCmd, inline XPG case} {
  648.     catch {scan abc {bogus%1$c%5$c%10$c}} msg
  649.     list [llength $msg] $msg
  650. } {10 {{} {} {} {} {} {} {} {} {} {}}}
  651. test scan-13.7 {Tcl_ScanObjCmd, inline XPG case lots of arguments} {
  652.     scan "10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200" {%20$d %18$d %17$d %16$d %15$d %14$d %13$d %12$d %11$d %10$d %9$d %8$d %7$d %6$d %5$d %4$d %3$d %2$d %1$d}
  653. } {190 180 170 160 150 140 130 120 110 100 90 80 70 60 50 40 30 20 {} 10}
  654. test scan-13.8 {Tcl_ScanObjCmd, inline XPG case lots of arguments} {
  655.     set msg [scan "10 20 30" {%100$d %5$d %200$d}]
  656.     list [llength $msg] [lindex $msg 99] [lindex $msg 4] [lindex $msg 199]
  657. } {200 10 20 30}
  658. # cleanup
  659. ::tcltest::cleanupTests
  660. return