source [file dirname [info script]]/testing.tcl test parse-1.1 "Quoted closing bracket" { set x [string length "]"] } {1} test parse-1.2 "Quoted opening bracket" { set x [string length "\["] } {1} test parse-1.3 "Quoted open brace" { set x [string length "\{"] } {1} test parse-1.4 "Quoted open brace via var" { set lb \{ set x [string length "$lb"] } {1} test parse-1.5 "Braced bracket" { set x [string length {]}] } {1} test parse-1.6 "Dict sugar" -body { unset -nocomplain a array set a {a 1 b 2 c 3} set x $a( } -returnCodes error -match glob -result "*" test parse-1.8 "Dict sugar" { unset -nocomplain a array set a {a 1 b 2 c 3} set x $a([set y b]) } 2 test parse-1.9 "Backslash newline" { set x 123;\ set y 456 list $x $y } {123 456} test parse-1.10 "Backslash newline in quotes" { set x "abc\ def" } "abc def" test parse-1.11 "Backslash newline in quotes after var" { set y 1 set x "abc$y\ def" } "abc1 def" test parse-1.12 "Backslash newline in quotes after var" { set y 1 set x "abc$y\ def" } "abc1 def" test parse-1.13 "Newline in quotes" { set y 1 set x "abc def" } "abc\ndef" test parse-1.14 "Newline in quotes after var" { set y 1 set x "abc$y def" } "abc1\ndef" test parse-1.15 "Space in quotes" { set y 1 set x "abc def" } "abc def" test parse-1.16 "Space in quotes after var" { set y 1 set x "abc${y} def" } "abc1 def" test parse-1.17 "Command and var in quotes" { set y 1 set x "[set z 2][set y]" } 21 test parse-1.18 "Command and var in bare context" { set y 1 set x [set z 2][set y] } 21 test parse-1.19 "Lone dollar sign in quotes" { set y 1 set x "6$[set y]" } 6\$1 test parse-1.20 "Command and var in bare context" { set y 1 set x 6$[set y] } 6\$1 test parse-1.21 "Comment" { set y 1 # A comment one a line set x [set y] ;# comment after semicolon } 1 test parse-1.22 "# char" { set y 1 append y # set x "[set y]#" } {1##} test parse-1.23 "newline in command" { set y 1 set z 2 set x [incr y incr z] list $x $y $z } {3 2 3} test parse-1.24 "semicolon in command" { set x [list a; list b c; list d e f] } {d e f} # Note that Tcl complains about the missing brace here # while Jim ignores it test parse-1.25 "missing brace in var" jim { unset -nocomplain a set a 3 set brace \{ set x [subst \$${brace}a] } 3 test parse-1.26 "newline in braced var" { set "a\nb" var1 set x ${a b} } var1 test parse-1.27 "backslash escape in dict sugar" { unset -nocomplain a set a(b\x55d) 5 set x $a(b\x55d) } 5 test parse-1.28 "nested dict sugar" { unset -nocomplain a b set a(V) 5 set b(5) five set x $b($a(V)) } five set dq {"} set script "set x ${dq}hello" test parse-1.29 "missing quote" -constraints jim -body { eval $script } -returnCodes error -match glob -result {missing quote} test parse-1.30 "missing quote" { info complete $script } 0 test parse-1.31 "backslash newline in bare context" { list abc\ 123 } {abc 123} test parse-1.32 "comment as last line of script" { set script {set x 3; # this is a comment} eval $script } 3 test parse-1.33 "upper case hex escapes" { list \x4A \x4F \x3C } {J O <} test parse-1.34 "octal escapes" { list \112 \117 \074 } {J O <} test parse-1.35 "invalid hex escape" { list \xZZ } xZZ test parse-1.36 "unicode escape" jim { list \u00b5 } \xc2\xb5 test parse-1.37 "invalid unicode escape after unicode" jim { list \ub5x } \xc2\xb5x test parse-1.38 "invalid unicode escape" { list \ux } ux test parse-1.39 "octal escape followed by invalid" { list \76x } >x test parse-1.40 "list containing quoted trailing backslash" jim { set x "abc \"def\\" lindex $x 1 } def\\ test parse-1.41 "list containing quoted newline" { set x {abc "def ghi"} lindex $x 1 } def\nghi test parse-1.42 "list containing missing quote" jim { set x {abc "def} lindex $x 1 } def test parse-1.43 "list containing trailing backslash" { set x "abc def\\" lindex $x 1 } def\\ test parse-1.44 "list creation" { list "a{ }d" } {{a{ }d}} test parse-1.45 "spaces before expr function args" { expr {round (3.2)} } 3 test parse-1.46 "expr function missing paren" { catch {expr {round 3.2}} } 1 test parse-1.47 "backslash newline in quotes" { # spaces set x "abc\ def" } "abc def" test parse-1.48 "backslash newline in quotes" { # tabs set x "abc\ def" } "abc def" test parse-1.49 "backslash newline in quotes" { # tabs plus newline set x "abc\ def" } "abc \ndef" test parse-1.50 "backslash newline in quotes" { # tabs plus newline set x "abc\ def" } "abc def" test parse-1.51 "special chars in dict sugar" { unset -nocomplain a set a(x$) 5 array names a } {{x$}} test parse-1.52 "special chars in dict sugar" { set x $a(x$) } 5 test parse-1.53 "special chars in dict sugar" { unset -nocomplain a set a(x\[) 5 array names a } {{x[}} test parse-1.54 "special chars in dict sugar" { set x $a(x\[) } 5 test parse-1.55 "special chars in dict sugar" { unset -nocomplain a set a(x\() 5 array names a } {x(} test parse-1.56 "special chars in dict sugar" { set x $a(x\() } 5 test parse-1.57 "special chars in dict sugar" { unset -nocomplain a set a(x() 5 array names a } {x(} test parse-1.58 "special chars in dict sugar" { set x $a(x() } 5 test parse-1.59 "special chars in dict sugar" { unset -nocomplain a set a(x") 5 lindex [array names a] 0 } {x"} test parse-1.60 "special chars in dict sugar" { set x $a(x") } 5 test parse-1.61 "quote in command" { set x [list \\" x] lindex $x end } x test parse-1.62 "quoted orphan dollar sign" { set x "x$" } {x$} test parse-1.63 "unquoted dollar sign" { set x x$ } {x$} test parse-1.64 "backslash in comment" { set x 0 # comment \ incr x incr x } 1 test parse-1.65 "double backslash in comment" { set x 0 # comment \\ incr x incr x } 2 test parse-1.66 {backslash newline} { proc "abc def" {x} { incr x; return $x } set x ["abc\ def" 4] } {5} test parse-1.67 {missing quote in command} -body { set x ["abc\ def] } -returnCodes error -match regexp -result {missing ("|quote)} test parse-1.68 {missing quote} -body { set x "abc\ line without quote } -returnCodes error -match regexp -result {missing ("|quote)} test parse-1.69 {comment with trailing backslash} { set x "#abc \\" eval $x } {} test parse-1.70 {info complete, missing quotes} { set v 1 set result {} # missing leading quote is ok foreach p { {"abc} {"abc$v} {abc"} {abc$v"} {"abc$v"} } { lappend result [info complete $p] } set result } {0 0 1 1 1} testreport