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