|
|
1.1 root 1: # This file contains contains a collection of tests for the basic
2: # command-parsing mechanisms of Tcl (such as how braces and brackets
3: # and variable substitutions are handled).. If everything is OK
4: # then it finishes silently. If a problem is detected then it
5: # generates a Tcl error with a cryptic message. To trace the error
6: # you'll have to read through the commands in this file.
7: #
8: # $Header: /sprite/src/lib/tcl/tests/RCS/parse.test,v 1.1 90/03/21 13:27:48 ouster Exp $ (Berkeley)
9:
10: proc check {a b num} {
11: if {[string compare $a $b] != 0} {
12: error [format {Parse error %s: wanted "%s", got "%s"} $num $b $a]}
13: }
14:
15: proc fourArgs {a b c d} {
16: global arg1 arg2 arg3 arg4
17: set arg1 $a
18: set arg2 $b
19: set arg3 $c
20: set arg4 $d
21: }
22:
23: proc getArgs args {
24: global argv
25: set argv $args
26: }
27:
28: # Basic argument parsing.
29:
30: fourArgs a b c d
31: check $arg1 a 1.1
32: check $arg2 b 1.2
33: check $arg3 c 1.3
34: check $arg4 d 1.4
35:
36: # Quotes.
37:
38: getArgs "a b c" d
39: check $argv {{a b c} d} 2.1
40: set a 101
41: getArgs "a$a b c"
42: check $argv {{a101 b c}} 2.2
43: set argv "xy[format xabc]"
44: check $argv {xyxabc} 2.3
45: set argv "xy\t"
46: check $argv xy\t 2.4
47: set argv "a b c
48: d e f"
49: check $argv a\ b\tc\nd\ e\ f 2.5
50: set argv a"bcd"e
51: check $argv {a"bcd"e} 2.6
52:
53: # Braces.
54:
55: getArgs {a b c} d
56: check $argv "{a b c} d" 3.1
57: set a 101
58: set argv {a$a b c}
59: set b [index $argv 1 chars]
60: check $b {$} 3.2
61: set argv {a[format xyz] b}
62: check [length $argv chars] 15 3.3
63: set argv {a\nb\}}
64: check [length $argv chars] 6 3.4
65: set argv {{{{}}}}
66: check $argv "{{{}}}" 3.5
67: set argv a{{}}b
68: check $argv "a{{}}b" 3.6
69:
70: # Command substitution.
71:
72: set a [format xyz]
73: check $a xyz 4.1
74: set a a[format xyz]b[format q]
75: check $a axyzbq 4.2
76: set a a[
77: format
78: xyz
79: ]b
80: check $a axyzb 4.3
81:
82: # Variable substitution.
83:
84: set a 123
85: set _123z xx
86: check $a 123 5.1
87: check x$a.b x123.b 5.2
88: check $_123z^ xx^ 5.3
89: check a${a}b a123b 5.4
90: check [catch {$_non_existent_} msg] 1 5.5
91: check $msg {couldn't find variable "_non_existent_"} 5.6
92:
93: # Backslash substitution.
94:
95: proc bsCheck {char num errNum} {
96: scan $char %c value
97: if {$value != $num} {
98: error [format {History error %s: wanted "%s", got "%s"}
99: $errNum $num $value]
100: }
101: }
102:
103: bsCheck \b 0x8 6.1
104: bsCheck \e 0x1b 6.2
105: bsCheck \n 0xa 6.3
106: bsCheck \r 0xd 6.4
107: bsCheck \t 0x9 6.5
108: bsCheck \{ 0x7b 6.6
109: bsCheck \} 0x7d 6.7
110: bsCheck \[ 0x5b 6.8
111: bsCheck \] 0x5d 6.9
112: bsCheck \$ 0x24 6.10
113: bsCheck \ 0x20 6.11
114: bsCheck \; 0x3b 6.12
115: bsCheck \\ 0x5c 6.13
116: bsCheck \Ca 0x1 6.14
117: bsCheck \Ma 0xe1 6.15
118: bsCheck \CMa 0x81 6.16
119: bsCheck \14 0xc 6.17
120: bsCheck \x 0x5c 6.18
121: set a "\a\c\n\]\}"
122: check [length $a chars] 7 6.19
123: set a {\a\c\n\]\}}
124: check [length $a chars] 10 6.20
125:
126: # Semi-colon.
127:
128: set b 0
129: getArgs a;set b 2
130: check $argv a 7.1
131: check $b 2 7.2
132: getArgs a b ; set b 1
133: check $argv {a b} 7.3
134: check $b 1 7.4
135:
136: # The following checks are to ensure that the interpreter's result
137: # gets re-initialized by Tcl_Eval in all the right places.
138:
139: check [concat abc] abc 8.1
140: check [concat abc; set a 2] {} 8.2
141: check [concat abc; set a $a] {} 8.3
142: check [set a [concat abc]] {} 8.4
143:
144: # Syntax errors.
145:
146: check [catch "set a {bcd" msg] 1 9.1
147: check $msg "unmatched brace: 'set a => {bcd'" 9.2
148: check [catch {set a "bcd} msg] 1 9.3
149: check $msg {unmatched quote: 'set a => "bcd'} 9.4
150: check [catch {set a "bcd"xy} msg] 1 9.5
151: check $msg {extra characters after close-quote: 'set a "bcd => "xy'} 9.6
152: check [catch "set a {bcd}xy" msg] 1 9.7
153: check $msg "extra characters after close-brace: 'set a {bcd => }xy'" 9.8
154: check [catch {set a [format abc} msg] 1 9.9
155: check $msg "missing close-bracket: ' => format abc'" 9.10
156: check [catch gorp-a-lot msg] 1 9.11
157: check $msg {"gorp-a-lot" is an invalid command name or ambiguous abbreviation} 9.12
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.