Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 16s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
195 lines
5.2 KiB
Plaintext
195 lines
5.2 KiB
Plaintext
; Tcl-on-SX eval tests
|
|
(define tcl-eval-pass 0)
|
|
(define tcl-eval-fail 0)
|
|
(define tcl-eval-failures (list))
|
|
|
|
(define
|
|
tcl-eval-assert
|
|
(fn
|
|
(label expected actual)
|
|
(if
|
|
(equal? expected actual)
|
|
(set! tcl-eval-pass (+ tcl-eval-pass 1))
|
|
(begin
|
|
(set! tcl-eval-fail (+ tcl-eval-fail 1))
|
|
(append!
|
|
tcl-eval-failures
|
|
(str label ": expected=" (str expected) " got=" (str actual)))))))
|
|
|
|
(define
|
|
tcl-run-eval-tests
|
|
(fn
|
|
()
|
|
(set! tcl-eval-pass 0)
|
|
(set! tcl-eval-fail 0)
|
|
(set! tcl-eval-failures (list))
|
|
(define interp (fn () (make-default-tcl-interp)))
|
|
(define run (fn (src) (tcl-eval-string (interp) src)))
|
|
(define
|
|
ok
|
|
(fn (label actual expected) (tcl-eval-assert label expected actual)))
|
|
(define
|
|
ok?
|
|
(fn (label condition) (tcl-eval-assert label true condition)))
|
|
(tcl-eval-assert "set-result" "hello" (get (run "set x hello") :result))
|
|
(tcl-eval-assert
|
|
"set-stored"
|
|
"hello"
|
|
(tcl-var-get (run "set x hello") "x"))
|
|
(tcl-eval-assert
|
|
"var-sub"
|
|
"hello"
|
|
(tcl-var-get (run "set x hello\nset y $x") "y"))
|
|
(tcl-eval-assert
|
|
"puts"
|
|
"world\n"
|
|
(get (run "set x world\nputs $x") :output))
|
|
(tcl-eval-assert
|
|
"puts-nonewline"
|
|
"hi"
|
|
(get (run "puts -nonewline hi") :output))
|
|
(tcl-eval-assert "incr" "6" (tcl-var-get (run "set x 5\nincr x") "x"))
|
|
(tcl-eval-assert
|
|
"incr-delta"
|
|
"8"
|
|
(tcl-var-get (run "set x 5\nincr x 3") "x"))
|
|
(tcl-eval-assert
|
|
"incr-neg"
|
|
"7"
|
|
(tcl-var-get (run "set x 10\nincr x -3") "x"))
|
|
(tcl-eval-assert
|
|
"append"
|
|
"foobar"
|
|
(tcl-var-get (run "set x foo\nappend x bar") "x"))
|
|
(tcl-eval-assert
|
|
"append-new"
|
|
"hello"
|
|
(tcl-var-get (run "append x hello") "x"))
|
|
(tcl-eval-assert
|
|
"cmdsub-result"
|
|
"6"
|
|
(get (run "set x 5\nset y [incr x]") :result))
|
|
(tcl-eval-assert
|
|
"cmdsub-y"
|
|
"6"
|
|
(tcl-var-get (run "set x 5\nset y [incr x]") "y"))
|
|
(tcl-eval-assert
|
|
"cmdsub-x"
|
|
"6"
|
|
(tcl-var-get (run "set x 5\nset y [incr x]") "x"))
|
|
(tcl-eval-assert
|
|
"multi-cmd"
|
|
"second"
|
|
(get (run "set x first\nset x second") :result))
|
|
(tcl-eval-assert "semi-x" "1" (tcl-var-get (run "set x 1; set y 2") "x"))
|
|
(tcl-eval-assert "semi-y" "2" (tcl-var-get (run "set x 1; set y 2") "y"))
|
|
(tcl-eval-assert
|
|
"braced-nosub"
|
|
"$x"
|
|
(tcl-var-get (run "set x 42\nset y {$x}") "y"))
|
|
(tcl-eval-assert
|
|
"concat-word"
|
|
"foobar"
|
|
(tcl-var-get (run "set x foo\nset y ${x}bar") "y"))
|
|
(tcl-eval-assert
|
|
"set-get"
|
|
"world"
|
|
(get (run "set x world\nset x") :result))
|
|
(tcl-eval-assert
|
|
"puts-channel"
|
|
"hello\n"
|
|
(get (run "puts stdout hello") :output))
|
|
(ok "if-true" (get (run "set x 0\nif {1} {set x 1}") :result) "1")
|
|
(ok "if-false" (get (run "set x 0\nif {0} {set x 1}") :result) "0")
|
|
(ok
|
|
"if-else-t"
|
|
(tcl-var-get (run "if {1} {set x yes} else {set x no}") "x")
|
|
"yes")
|
|
(ok
|
|
"if-else-f"
|
|
(tcl-var-get (run "if {0} {set x yes} else {set x no}") "x")
|
|
"no")
|
|
(ok
|
|
"if-cmp"
|
|
(tcl-var-get
|
|
(run "set x 5\nif {$x > 3} {set r big} else {set r small}")
|
|
"r")
|
|
"big")
|
|
(ok
|
|
"while"
|
|
(tcl-var-get
|
|
(run "set i 0\nset s 0\nwhile {$i < 5} {incr i\nincr s $i}")
|
|
"s")
|
|
"15")
|
|
(ok
|
|
"while-break"
|
|
(tcl-var-get
|
|
(run "set i 0\nwhile {1} {incr i\nif {$i == 3} {break}}")
|
|
"i")
|
|
"3")
|
|
(ok
|
|
"for"
|
|
(tcl-var-get
|
|
(run "set s 0\nfor {set i 1} {$i <= 5} {incr i} {incr s $i}")
|
|
"s")
|
|
"15")
|
|
(ok
|
|
"foreach"
|
|
(tcl-var-get (run "set s 0\nforeach x {1 2 3 4 5} {incr s $x}") "s")
|
|
"15")
|
|
(ok
|
|
"foreach-list"
|
|
(get (run "set acc \"\"\nforeach w {hello world} {append acc $w}") :result)
|
|
"helloworld")
|
|
(ok
|
|
"lappend"
|
|
(tcl-var-get (run "lappend lst a\nlappend lst b\nlappend lst c") "lst")
|
|
"a b c")
|
|
(ok?
|
|
"unset-gone"
|
|
(let
|
|
((i (run "set x 42\nunset x")))
|
|
(let
|
|
((frame (get i :frame)))
|
|
(nil? (get (get frame :locals) "x")))))
|
|
(ok "eval" (tcl-var-get (run "eval {set x hello}") "x") "hello")
|
|
(ok "expr-add" (get (run "expr {3 + 4}") :result) "7")
|
|
(ok "expr-cmp" (get (run "expr {5 > 3}") :result) "1")
|
|
(ok
|
|
"break-stops"
|
|
(tcl-var-get (run "set x 0\nwhile {1} {set x 1\nbreak\nset x 99}") "x")
|
|
"1")
|
|
(ok
|
|
"continue"
|
|
(tcl-var-get
|
|
(run
|
|
"set s 0\nfor {set i 1} {$i <= 5} {incr i} {if {$i == 3} {continue}\nincr s $i}")
|
|
"s")
|
|
"12")
|
|
(ok
|
|
"switch"
|
|
(tcl-var-get
|
|
(run "set x foo\nswitch $x {{foo} {set r yes} {bar} {set r no}}")
|
|
"r")
|
|
"yes")
|
|
(ok
|
|
"switch-default"
|
|
(tcl-var-get
|
|
(run "set x baz\nswitch $x {{foo} {set r yes} default {set r other}}")
|
|
"r")
|
|
"other")
|
|
(ok
|
|
"nested-if"
|
|
(tcl-var-get
|
|
(run
|
|
"set x 5\nif {$x > 10} {set r big} elseif {$x > 3} {set r mid} else {set r small}")
|
|
"r")
|
|
"mid")
|
|
(dict
|
|
"passed"
|
|
tcl-eval-pass
|
|
"failed"
|
|
tcl-eval-fail
|
|
"failures"
|
|
tcl-eval-failures)))
|