summaryrefslogtreecommitdiffstats
path: root/tcllib/modules/grammar_me/me_cpucore.testsuite
diff options
context:
space:
mode:
authorWilliam Joye <wjoye@cfa.harvard.edu>2016-10-27 19:39:39 (GMT)
committerWilliam Joye <wjoye@cfa.harvard.edu>2016-10-27 19:39:39 (GMT)
commitea28451286d3ea4a772fa174483f9a7a66bb1ab3 (patch)
tree6ee9d8a7848333a7ceeee3b13d492e40225f8b86 /tcllib/modules/grammar_me/me_cpucore.testsuite
parentb5ca09bae0d6a1edce939eea03594dd56383f2c8 (diff)
parent7c621da28f07e449ad90c387344f07a453927569 (diff)
downloadblt-ea28451286d3ea4a772fa174483f9a7a66bb1ab3.zip
blt-ea28451286d3ea4a772fa174483f9a7a66bb1ab3.tar.gz
blt-ea28451286d3ea4a772fa174483f9a7a66bb1ab3.tar.bz2
Merge commit '7c621da28f07e449ad90c387344f07a453927569' as 'tcllib'
Diffstat (limited to 'tcllib/modules/grammar_me/me_cpucore.testsuite')
-rw-r--r--tcllib/modules/grammar_me/me_cpucore.testsuite419
1 files changed, 419 insertions, 0 deletions
diff --git a/tcllib/modules/grammar_me/me_cpucore.testsuite b/tcllib/modules/grammar_me/me_cpucore.testsuite
new file mode 100644
index 0000000..786b63c
--- /dev/null
+++ b/tcllib/modules/grammar_me/me_cpucore.testsuite
@@ -0,0 +1,419 @@
+# -*- tcl -*- me_cpucore.test
+# ### ### ### ######### ######### #########
+
+# ### ### ### ######### ######### #########
+## Assembler
+
+test me-cpucore-asm-${impl}-1.0 {asm, wrong args} -body {
+ grammar::me::cpu::core::asm
+} -result {wrong # args: should be "grammar::me::cpu::core::asm code"} \
+ -returnCodes error
+
+test me-cpucore-asm-${impl}-1.1 {asm, wrong args} -body {
+ grammar::me::cpu::core::asm a b
+} -result {wrong # args: should be "grammar::me::cpu::core::asm code"} \
+ -returnCodes error
+
+test me-cpucore-asm-${impl}-2.0 {asm, empty} -body {
+ grammar::me::cpu::core::asm {}
+ # No instructions, empty string pool, no token map
+} -result {{} {} {}}
+
+set n -1
+foreach {cmd cargs expected} $asm_table {
+ set asm [list [linsert $cargs 0 branchlabel $cmd]]
+ incr n
+
+ test me-cpucore-asm-${impl}-3.$n "asm, $cmd" -body {
+ canon_code [grammar::me::cpu::core::asm $asm]
+ } -result $expected
+}
+
+set n -1
+foreach {cmd cargs expected} $badasm_table {
+ set asm [list [linsert $cargs 0 branchlabel $cmd]]
+ incr n
+
+ test me-cpucore-asm-${impl}-4.$n "asm, bad $cmd" -body {
+ grammar::me::cpu::core::asm $asm
+ } -result $expected -returnCodes error
+}
+
+# ### ### ### ######### ######### #########
+## Disassembler
+
+test me-cpucore-disasm-${impl}-1.0 {disasm, wrong args} -body {
+ grammar::me::cpu::core::disasm
+} -result {wrong # args: should be "grammar::me::cpu::core::disasm code"} \
+ -returnCodes error
+
+test me-cpucore-disasm-${impl}-1.1 {disasm, wrong args} -body {
+ grammar::me::cpu::core::disasm a b
+} -result {wrong # args: should be "grammar::me::cpu::core::disasm code"} \
+ -returnCodes error
+
+test me-cpucore-disasm-${impl}-2.0 {disasm, empty} -body {
+ # No instructions, empty string pool, no token map
+ grammar::me::cpu::core::disasm {{} {} {}}
+} -result {}
+
+set n -1
+foreach {cmd cargs code} $asm_table {
+ set asm [list [linsert $cargs 0 branchlabel $cmd]]
+ incr n
+
+ # We have to distinguish between regular instructions and
+ # instruction jumping somewhere. For the latter we have to perform
+ # a bit of fixup to get our expections of the branch labeling
+ # right.
+
+ set pos [lsearch -exact $cargs branchlabel]
+ if {$pos >= 0} {
+ set expected [list [linsert [lreplace $cargs $pos $pos bra0] 0 bra0 $cmd]]
+ } else {
+ set expected [list [linsert $cargs 0 {} $cmd]]
+ }
+
+ test me-cpucore-disasm-${impl}-3.$n "disasm, $cmd" -body {
+ grammar::me::cpu::core::disasm $code
+ } -result $expected
+}
+
+set n -1
+foreach {insns expected} $badmach_table {
+ incr n
+
+ test me-cpucore-disasm-${impl}-4.$n "disasm, error" -body {
+ grammar::me::cpu::core::disasm $insns
+ } -result $expected -returnCodes error
+}
+
+# ### ### ### ######### ######### #########
+## State creation.
+
+test me-cpucore-new-${impl}-1.0 {new, wrong args} -body {
+ grammar::me::cpu::core::new
+} -result {wrong # args: should be "grammar::me::cpu::core::new code"} \
+ -returnCodes error
+
+test me-cpucore-new-${impl}-1.1 {new, wrong args} -body {
+ grammar::me::cpu::core::new a b
+} -result {wrong # args: should be "grammar::me::cpu::core::new code"} \
+ -returnCodes error
+
+test me-cpucore-run-${impl}-2.0 run -setup {
+ set state [grammar::me::cpu::core::new {{} {} {}}]
+} -returnCodes error -body {
+ grammar::me::cpu::core::run state
+} -result {No instructions to execute}
+
+set n -1
+foreach {cmd cargs expected} $asm_table {
+ set asm [list [linsert $cargs 0 branchlabel $cmd]]
+ incr n
+
+ test me-cpucore-new-${impl}-3.$n "new, $cmd, code" -body {
+ grammar::me::cpu::core::code \
+ [grammar::me::cpu::core::new \
+ [canon_code [grammar::me::cpu::core::asm $asm]]]
+ } -result $expected
+
+ test me-cpucore-new-${impl}-4.$n "new, $cmd, state" -body {
+ cpusubst [cpustate \
+ [grammar::me::cpu::core::new \
+ [canon_code [grammar::me::cpu::core::asm $asm]]]] \
+ cd {}
+ } -result {cd {} pc 0 ht 0 eo 0 tc {} at -1 cc {} ok 0 sv {} er {} ls {} as {} ms {} es {} rs {} nc {}}
+}
+
+set n -1
+foreach {insns expected} $badmach_table {
+ incr n
+
+ test me-cpucore-new-${impl}-5.$n "new error" -body {
+ grammar::me::cpu::core::new $insns
+ } -result $expected -returnCodes error
+}
+
+# ### ### ### ######### ######### #########
+## State manipulation - Add tokens
+
+test me-cpucore-put-${impl}-1.0 {put, wrong args} -body {
+ grammar::me::cpu::core::put
+} -result {wrong # args: should be "grammar::me::cpu::core::put statevar tok lex line col"} \
+ -returnCodes error
+
+test me-cpucore-put-${impl}-1.1 {put, wrong args} -body {
+ grammar::me::cpu::core::put a
+} -result {wrong # args: should be "grammar::me::cpu::core::put statevar tok lex line col"} \
+ -returnCodes error
+
+test me-cpucore-put-${impl}-1.2 {put, wrong args} -body {
+ grammar::me::cpu::core::put a b
+} -result {wrong # args: should be "grammar::me::cpu::core::put statevar tok lex line col"} \
+ -returnCodes error
+
+test me-cpucore-put-${impl}-1.3 {put, wrong args} -body {
+ grammar::me::cpu::core::put a b c
+} -result {wrong # args: should be "grammar::me::cpu::core::put statevar tok lex line col"} \
+ -returnCodes error
+
+test me-cpucore-put-${impl}-1.4 {put, wrong args} -body {
+ grammar::me::cpu::core::put a b c d
+} -result {wrong # args: should be "grammar::me::cpu::core::put statevar tok lex line col"} \
+ -returnCodes error
+
+test me-cpucore-put-${impl}-1.5 {put, wrong args} -body {
+ grammar::me::cpu::core::put a b c d e f
+} -result {wrong # args: should be "grammar::me::cpu::core::put statevar tok lex line col"} \
+ -returnCodes error
+
+test me-cpucore-put-${impl}-2.0 put -setup {
+ set base [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ set next $base
+} -body {
+ grammar::me::cpu::core::put next ID ident 1 0
+ grammar::me::cpu::core::put next NUM 12345 1 5
+
+ cpudelta $base $next
+} -result {tc {{ID ident 1 0} {NUM 12345 1 5}}}
+
+test me-cpucore-put-${impl}-3.0 {put after eof} -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ grammar::me::cpu::core::eof state
+} -returnCodes error -body {
+ grammar::me::cpu::core::put state ID ident 1 0
+} -result {Cannot add input data after eof}
+
+# ### ### ### ######### ######### #########
+## State manipulation - Set eof
+
+test me-cpucore-eof-${impl}-1.0 {eof, wrong args} -body {
+ grammar::me::cpu::core::eof
+} -result {wrong # args: should be "grammar::me::cpu::core::eof statevar"} \
+ -returnCodes error
+
+test me-cpucore-eof-${impl}-1.1 {eof, wrong args} -body {
+ grammar::me::cpu::core::eof a b
+} -result {wrong # args: should be "grammar::me::cpu::core::eof statevar"} \
+ -returnCodes error
+
+test me-cpucore-eof-${impl}-2.0 eof -setup {
+ set base [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ set next $base
+} -body {
+ grammar::me::cpu::core::eof next
+ cpudelta $base $next
+} -result {eo 1}
+
+# ### ### ### ######### ######### #########
+## State accessors - line/col retrieval
+
+test me-cpucore-lc-${impl}-1.0 {lc, wrong args} -body {
+ grammar::me::cpu::core::lc
+} -result {wrong # args: should be "grammar::me::cpu::core::lc state loc"} \
+ -returnCodes error
+
+test me-cpucore-lc-${impl}-1.1 {lc, wrong args} -body {
+ grammar::me::cpu::core::lc a
+} -result {wrong # args: should be "grammar::me::cpu::core::lc state loc"} \
+ -returnCodes error
+
+test me-cpucore-lc-${impl}-1.2 {lc, wrong args} -body {
+ grammar::me::cpu::core::lc a b c
+} -result {wrong # args: should be "grammar::me::cpu::core::lc state loc"} \
+ -returnCodes error
+
+test me-cpucore-lc-${impl}-2.0 lc -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ grammar::me::cpu::core::put state NUM 12345 1 5
+} -body {
+ grammar::me::cpu::core::lc $state 0
+} -result {1 5}
+
+test me-cpucore-lc-${impl}-3.0 {lc, bad index} -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ grammar::me::cpu::core::put state NUM 12345 1 5
+} -body {
+ grammar::me::cpu::core::lc $state -1
+} -result {Illegal location -1} -returnCodes error
+
+test me-cpucore-lc-${impl}-3.1 {lc, bad index} -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ grammar::me::cpu::core::put state NUM 12345 1 5
+} -body {
+ grammar::me::cpu::core::lc $state 1
+} -result {Illegal location 1} -returnCodes error
+
+test me-cpucore-lc-${impl}-3.2 {lc, bad index} -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+} -body {
+ grammar::me::cpu::core::lc $state 0
+} -result {Illegal location 0} -returnCodes error
+
+# ### ### ### ######### ######### #########
+## State accessors - Token retrieval
+
+test me-cpucore-tok-${impl}-1.0 {tok, wrong args} -body {
+ grammar::me::cpu::core::tok
+} -result [tcltest::wrongNumArgs grammar::me::cpu::core::tok {state args} 0] \
+ -returnCodes error
+
+test me-cpucore-tok-${impl}-1.1 {tok, wrong args} -body {
+ grammar::me::cpu::core::tok a b c d
+} -result {wrong # args: should be "grammar::me::cpu::core::tok state ?from ?to??"} \
+ -returnCodes error
+
+test me-cpucore-tok-${impl}-2.0 tok -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+} -body {
+ grammar::me::cpu::core::tok $state
+} -result {}
+
+test me-cpucore-tok-${impl}-2.1 tok -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ grammar::me::cpu::core::put state NUM 12345 1 5
+} -body {
+ grammar::me::cpu::core::tok $state
+} -result {{NUM 12345 1 5}}
+
+test me-cpucore-tok-${impl}-2.2 tok -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ grammar::me::cpu::core::put state ID lalal 0 0
+ grammar::me::cpu::core::put state NUM 12345 1 5
+} -body {
+ grammar::me::cpu::core::tok $state
+} -result {{ID lalal 0 0} {NUM 12345 1 5}}
+
+test me-cpucore-tok-${impl}-3.0 tok -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+} -body {
+ grammar::me::cpu::core::tok $state 0
+} -result {Illegal location 0} -returnCodes error
+
+test me-cpucore-tok-${impl}-3.1 tok -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ grammar::me::cpu::core::put state NUM 12345 1 5
+} -body {
+ grammar::me::cpu::core::tok $state -1
+} -result {Illegal location -1} -returnCodes error
+
+test me-cpucore-tok-${impl}-3.2 tok -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ grammar::me::cpu::core::put state NUM 12345 1 5
+} -body {
+ grammar::me::cpu::core::tok $state 1
+} -result {Illegal location 1} -returnCodes error
+
+test me-cpucore-tok-${impl}-3.3 tok -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ grammar::me::cpu::core::put state NUM 12345 1 5
+} -body {
+ grammar::me::cpu::core::tok $state 0
+} -result {{NUM 12345 1 5}}
+
+test me-cpucore-tok-${impl}-3.4 tok -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ grammar::me::cpu::core::put state ID lalal 0 0
+ grammar::me::cpu::core::put state NUM 12345 1 5
+} -body {
+ grammar::me::cpu::core::tok $state 0
+} -result {{ID lalal 0 0}}
+
+test me-cpucore-tok-${impl}-4.0 tok -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ grammar::me::cpu::core::put state NUM 12345 1 5
+} -body {
+ grammar::me::cpu::core::tok $state -1 0
+} -result {Illegal start location -1} -returnCodes error
+
+test me-cpucore-tok-${impl}-4.1 tok -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ grammar::me::cpu::core::put state NUM 12345 1 5
+} -body {
+ grammar::me::cpu::core::tok $state 1 0
+} -result {Illegal start location 1} -returnCodes error
+
+test me-cpucore-tok-${impl}-4.2 tok -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ grammar::me::cpu::core::put state NUM 12345 1 5
+} -body {
+ grammar::me::cpu::core::tok $state 0 -1
+} -result {Illegal end location -1} -returnCodes error
+
+test me-cpucore-tok-${impl}-4.3 tok -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ grammar::me::cpu::core::put state NUM 12345 1 5
+} -body {
+ grammar::me::cpu::core::tok $state 0 1
+} -result {Illegal end location 1} -returnCodes error
+
+test me-cpucore-tok-${impl}-4.4 tok -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ grammar::me::cpu::core::put state ID lalal 0 0
+ grammar::me::cpu::core::put state NUM 12345 1 5
+} -body {
+ grammar::me::cpu::core::tok $state 1 0
+} -result {Illegal empty location range 1 .. 0} -returnCodes error
+
+test me-cpucore-tok-${impl}-4.5 tok -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ grammar::me::cpu::core::put state ID lalal 0 0
+ grammar::me::cpu::core::put state NUM 12345 1 5
+} -body {
+ grammar::me::cpu::core::tok $state 0 1
+} -result {{ID lalal 0 0} {NUM 12345 1 5}}
+
+test me-cpucore-tok-${impl}-4.6 tok -setup {
+ set state [grammar::me::cpu::core::new [canon_code [grammar::me::cpu::core::asm {}]]]
+ grammar::me::cpu::core::put state ID lalal 0 0
+ grammar::me::cpu::core::put state ID lalal 0 0
+} -body {
+ grammar::me::cpu::core::tok $state 0 0
+} -result {{ID lalal 0 0}}
+
+# ### ### ### ######### ######### #########
+## Checking the instruction semantics
+
+test me-cpucore-run-${impl}-1.0 {run, wrong args} -body {
+ grammar::me::cpu::core::run
+} -result {wrong # args: should be "grammar::me::cpu::core::run statevar ?steps?"} \
+ -returnCodes error
+
+test me-cpucore-run-${impl}-1.1 {run, wrong args} -body {
+ grammar::me::cpu::core::run a b c
+} -result {wrong # args: should be "grammar::me::cpu::core::run statevar ?steps?"} \
+ -returnCodes error
+
+set n -1
+foreach {description input eof stepsSetup steps code expectedDelta} $semantics {
+ incr n
+
+ if 0 {
+ puts ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ puts $description
+ puts "INPUT $input"
+ puts "EOF $eof"
+ puts "CODE $stepsSetup $steps $code"
+ puts $expectedDelta
+ }
+
+ test me-cpucore-run-${impl}-2.$n "run $description" -setup {
+ set state [grammar::me::cpu::core::new $code]
+ foreach token $input {
+ eval [linsert $token 0 grammar::me::cpu::core::put state]
+ }
+ if {$eof} {
+ grammar::me::cpu::core::eof state
+ }
+ if {$stepsSetup} {
+ grammar::me::cpu::core::run state $stepsSetup
+ }
+ set save $state
+ } -body {
+ grammar::me::cpu::core::run state $steps
+ cpudelta $save $state
+ } -result $expectedDelta
+}
+
+return