# -*- tcl -*- me_cpu.test
# ### ### ### ######### ######### #########
# ### ### ### ######### ######### #########
## Cpu creation.
test me-cpu-new-${impl}-1.0 {new, wrong args} -body {
grammar::me::cpu cpu
} -result {Error in constructor: wrong # args: should be "::grammar::me::cpu::Snit_constructor type selfns win self code_"} \
-returnCodes error
test me-cpu-new-${impl}-1.1 {new, wrong args} -body {
grammar::me::cpu cpu a b
} -result {Error in constructor: wrong # args: should be "::grammar::me::cpu::Snit_constructor type selfns win self code_"} \
-returnCodes error
test me-cpu-run-${impl}-2.0 run -setup {
grammar::me::cpu cpu {{} {} {}}
} -body {
cpu run
} -cleanup {
cpu destroy
} -returnCodes error -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-cpu-new-${impl}-3.$n "new, $cmd, code" -body {
grammar::me::cpu cpu \
[canon_code [grammar::me::cpu::core::asm $asm]]
cpu code
} -cleanup {
cpu destroy
} -result $expected
test me-cpu-new-${impl}-4.$n "new, $cmd, state" -body {
grammar::me::cpu cpu \
[canon_code [grammar::me::cpu::core::asm $asm]]
cpusubst [cpustate cpu] cd {}
} -cleanup {
cpu destroy
} -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-cpu-new-${impl}-5.$n "new error" -body {
grammar::me::cpu cpu $insns
} -result "Error in constructor: $expected" -returnCodes error
}
# ### ### ### ######### ######### #########
## CPU manipulation - Add tokens I
test me-cpu-put-${impl}-1.0 {put, wrong args} -setup {
grammar::me::cpu cpu {{} {} {}}
} -body {
cpu put
} -returnCodes error -cleanup {
cpu destroy
} -result [snitWrongNumArgs cpu ::grammar::me::cpu::Snit_methodput {tok lex line col} 0]
test me-cpu-put-${impl}-1.1 {put, wrong args} -setup {
grammar::me::cpu cpu {{} {} {}}
} -body {
cpu put a
} -returnCodes error -cleanup {
cpu destroy
} -result [snitWrongNumArgs cpu ::grammar::me::cpu::Snit_methodput {tok lex line col} 1]
test me-cpu-put-${impl}-1.2 {put, wrong args} -setup {
grammar::me::cpu cpu {{} {} {}}
} -body {
cpu put a b
} -returnCodes error -cleanup {
cpu destroy
} -result [snitWrongNumArgs cpu ::grammar::me::cpu::Snit_methodput {tok lex line col} 2]
test me-cpu-put-${impl}-1.3 {put, wrong args} -setup {
grammar::me::cpu cpu {{} {} {}}
} -body {
cpu put a b c
} -returnCodes error -cleanup {
cpu destroy
} -result [snitWrongNumArgs cpu ::grammar::me::cpu::Snit_methodput {tok lex line col} 3]
test me-cpu-put-${impl}-1.4 {put, wrong args} -setup {
grammar::me::cpu cpu {{} {} {}}
} -body {
cpu put a b c d e
} -returnCodes error -cleanup {
cpu destroy
} -result [snitTooManyArgs cpu ::grammar::me::cpu::Snit_methodput {tok lex line col}]
test me-cpu-put-${impl}-2.0 put -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
set base [cpustate cpu]
} -body {
cpu put ID ident 1 0
cpu put NUM 12345 1 5
cpudelta $base [cpustate cpu]
} -cleanup {
cpu destroy
unset base
} -result {tc {{ID ident 1 0} {NUM 12345 1 5}}}
test me-cpu-put-${impl}-3.0 {put after eof} -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
cpu eof
} -body {
cpu put ID ident 1 0
} -returnCodes error -cleanup {
cpu destroy
} -result {Cannot add input data after eof}
# ### ### ### ######### ######### #########
## CPU manipulation - Add tokens II
test me-cpu-putstring-${impl}-1.0 {putstring, wrong args} -setup {
grammar::me::cpu cpu {{} {} {}}
} -body {
cpu putstring
} -returnCodes error -cleanup {
cpu destroy
} -result [snitWrongNumArgs cpu ::grammar::me::cpu::Snit_methodputstring {str lvar cvar} 0]
test me-cpu-putstring-${impl}-1.1 {putstring, wrong args} -setup {
grammar::me::cpu cpu {{} {} {}}
} -body {
cpu putstring a
} -returnCodes error -cleanup {
cpu destroy
} -result [snitWrongNumArgs cpu ::grammar::me::cpu::Snit_methodputstring {str lvar cvar} 1]
test me-cpu-putstring-${impl}-1.2 {putstring, wrong args} -setup {
grammar::me::cpu cpu {{} {} {}}
} -body {
cpu putstring a b
} -returnCodes error -cleanup {
cpu destroy
} -result [snitWrongNumArgs cpu ::grammar::me::cpu::Snit_methodputstring {str lvar cvar} 2]
test me-cpu-putstring-${impl}-1.3 {putstring, wrong args} -setup {
grammar::me::cpu cpu {{} {} {}}
} -body {
cpu putstring a b c d
} -returnCodes error -cleanup {
cpu destroy
} -result [snitTooManyArgs cpu ::grammar::me::cpu::Snit_methodputstring {str lvar cvar}]
test me-cpu-putstring-${impl}-2.0 put -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
set base [cpustate cpu]
set l 0
set c 0
} -body {
cpu putstring ID l c
list $l $c [cpudelta $base [cpustate cpu]]
} -cleanup {
cpu destroy
unset base
} -result {0 2 {tc {{I {} 0 0} {D {} 0 1}}}}
test me-cpu-putstring-${impl}-3.0 {put after eof} -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
cpu eof
set l 0
set c 0
} -body {
cpu putstring ID l c
} -returnCodes error -cleanup {
cpu destroy
} -result {Cannot add input data after eof}
# ### ### ### ######### ######### #########
## State manipulation - Set eof
test me-cpu-eof-${impl}-1.0 {eof, wrong args} -setup {
grammar::me::cpu cpu {{} {} {}}
} -body {
cpu eof x
} -returnCodes error -cleanup {
cpu destroy
} -result [snitTooManyArgs cpu ::grammar::me::cpu::Snit_methodeof {}]
test me-cpu-eof-${impl}-2.0 eof -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
set base [cpustate cpu]
} -body {
cpu eof
cpudelta $base [cpustate cpu]
} -cleanup {
cpu destroy
} -result {eo 1}
# ### ### ### ######### ######### #########
## State accessors - line/col retrieval
test me-cpu-lc-${impl}-1.0 {lc, wrong args} -setup {
grammar::me::cpu cpu {{} {} {}}
} -body {
cpu lc
} -returnCodes error -cleanup {
cpu destroy
} -result [snitWrongNumArgs cpu ::grammar::me::cpu::Snit_methodlc {location} 0]
test me-cpu-lc-${impl}-1.1 {lc, wrong args} -setup {
grammar::me::cpu cpu {{} {} {}}
} -body {
cpu lc a b
} -returnCodes error -cleanup {
cpu destroy
} -result [snitTooManyArgs cpu ::grammar::me::cpu::Snit_methodlc {location}]
test me-cpu-lc-${impl}-2.0 lc -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
cpu put NUM 12345 1 5
} -body {
cpu lc 0
} -cleanup {
cpu destroy
} -result {1 5}
test me-cpu-lc-${impl}-3.0 {lc, bad index} -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
cpu put NUM 12345 1 5
} -body {
cpu lc -1
} -returnCodes error -cleanup {
cpu destroy
} -result {Illegal location -1}
test me-cpu-lc-${impl}-3.1 {lc, bad index} -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
cpu put NUM 12345 1 5
} -body {
cpu lc 1
} -returnCodes error -cleanup {
cpu destroy
} -result {Illegal location 1}
test me-cpu-lc-${impl}-3.2 {lc, bad index} -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
} -body {
cpu lc 0
} -returnCodes error -cleanup {
cpu destroy
} -result {Illegal location 0}
# ### ### ### ######### ######### #########
## State accessors - Token retrieval
test me-cpu-tok-${impl}-1.0 {tok, wrong args} -setup {
grammar::me::cpu cpu {{} {} {}}
} -body {
cpu tok a b c
} -returnCodes error -cleanup {
cpu destroy
} -result {wrong # args: should be "grammar::me::cpu::core::tok state ?from ?to??"}
test me-cpu-tok-${impl}-2.0 tok -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
} -body {
cpu tok
} -cleanup {
cpu destroy
} -result {}
test me-cpu-tok-${impl}-2.1 tok -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
cpu put NUM 12345 1 5
} -body {
cpu tok
} -cleanup {
cpu destroy
} -result {{NUM 12345 1 5}}
test me-cpu-tok-${impl}-2.2 tok -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
cpu put ID lalal 0 0
cpu put NUM 12345 1 5
} -body {
cpu tok
} -cleanup {
cpu destroy
} -result {{ID lalal 0 0} {NUM 12345 1 5}}
test me-cpu-tok-${impl}-3.0 tok -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
} -body {
cpu tok 0
} -cleanup {
cpu destroy
} -result {Illegal location 0} -returnCodes error
test me-cpu-tok-${impl}-3.1 tok -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
cpu put NUM 12345 1 5
} -body {
cpu tok -1
} -cleanup {
cpu destroy
} -result {Illegal location -1} -returnCodes error
test me-cpu-tok-${impl}-3.2 tok -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
cpu put NUM 12345 1 5
} -body {
cpu tok 1
} -cleanup {
cpu destroy
} -result {Illegal location 1} -returnCodes error
test me-cpu-tok-${impl}-3.3 tok -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
cpu put NUM 12345 1 5
} -body {
cpu tok 0
} -cleanup {
cpu destroy
} -result {{NUM 12345 1 5}}
test me-cpu-tok-${impl}-3.4 tok -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
cpu put ID lalal 0 0
cpu put NUM 12345 1 5
} -body {
cpu tok 0
} -cleanup {
cpu destroy
} -result {{ID lalal 0 0}}
test me-cpu-tok-${impl}-4.0 tok -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
cpu put NUM 12345 1 5
} -body {
cpu tok -1 0
} -cleanup {
cpu destroy
} -result {Illegal start location -1} -returnCodes error
test me-cpu-tok-${impl}-4.1 tok -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
cpu put NUM 12345 1 5
} -body {
cpu tok 1 0
} -cleanup {
cpu destroy
} -result {Illegal start location 1} -returnCodes error
test me-cpu-tok-${impl}-4.2 tok -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
cpu put NUM 12345 1 5
} -body {
cpu tok 0 -1
} -cleanup {
cpu destroy
} -result {Illegal end location -1} -returnCodes error
test me-cpu-tok-${impl}-4.3 tok -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
cpu put NUM 12345 1 5
} -body {
cpu tok 0 1
} -cleanup {
cpu destroy
} -result {Illegal end location 1} -returnCodes error
test me-cpu-tok-${impl}-4.4 tok -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
cpu put ID lalal 0 0
cpu put NUM 12345 1 5
} -body {
cpu tok 1 0
} -cleanup {
cpu destroy
} -result {Illegal empty location range 1 .. 0} -returnCodes error
test me-cpu-tok-${impl}-4.5 tok -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
cpu put ID lalal 0 0
cpu put NUM 12345 1 5
} -body {
cpu tok 0 1
} -cleanup {
cpu destroy
} -result {{ID lalal 0 0} {NUM 12345 1 5}}
test me-cpu-tok-${impl}-4.6 tok -setup {
grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]]
cpu put ID lalal 0 0
cpu put ID lalal 0 0
} -body {
cpu tok 0 0
} -cleanup {
cpu destroy
} -result {{ID lalal 0 0}}
# ### ### ### ######### ######### #########
## Checking the instruction semantics
test me-cpu-run-${impl}-1.0 {run, wrong args} -setup {
grammar::me::cpu cpu {{} {} {}}
} -body {
cpu run a b
} -returnCodes error -cleanup {
cpu destroy
} -result [snitTooManyArgs cpu ::grammar::me::cpu::Snit_methodrun {?n?}]
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-cpu-run-${impl}-2.$n "run $description" -setup {
grammar::me::cpu cpu $code
foreach token $input {
eval [linsert $token 0 cpu put]
# cpu put {*}$token
}
if {$eof} {cpu eof}
if {$stepsSetup} {cpu run $stepsSetup}
set save [cpustate cpu]
} -body {
cpu run $steps
cpudelta $save [cpustate cpu]
} -cleanup {
cpu destroy
} -result $expectedDelta
}
return